From abf8ce663076a89272564b81e26b96c5564a2e58 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Franti=C5=A1ek=20Dvo=C5=99=C3=A1k?= Date: Thu, 19 Jul 2007 19:01:38 +0000 Subject: [PATCH] Dump transformations too (replacing DB.JOBID by new jobids). --- org.glite.jp.client/examples/mill_feed.c | 100 ++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 16 deletions(-) diff --git a/org.glite.jp.client/examples/mill_feed.c b/org.glite.jp.client/examples/mill_feed.c index 3e3b4d4..ca06dad 100644 --- a/org.glite.jp.client/examples/mill_feed.c +++ b/org.glite.jp.client/examples/mill_feed.c @@ -32,13 +32,14 @@ char *user; int do_exit = 0; int perf_regs, perf_dumps; char perf_ts[100]; +char *dump; char **dump_index; size_t dump_tokens; static int register_init(); -static int register_add(const char *jobid); +static int register_add(const char *jobid, char **new_jobid); static void get_time(char *s, size_t maxs, double *t); -static int dump_init(const char *start_jobid); -static int dump_add(const char *filename); +static int dump_init(const char *start_jobid, const char *filenmae); +static int dump_add(const char *filename, const char *jobid); static void dump_done(); @@ -53,14 +54,15 @@ int main(int argc, char *argv[]) { double ts, ts2; int ret; FILE *f; + char *jobid; get_time(perf_ts, sizeof(perf_ts), &ts); snprintf(start_jobid, sizeof(start_jobid), PERF_JOBID_START_PREFIX "%s", perf_ts); snprintf(stop_jobid, sizeof(stop_jobid), PERF_JOBID_STOP_PREFIX "%s", perf_ts); if ((ret = register_init()) != 0) return ret; - if ((ret = dump_init(start_jobid)) != 0) return ret; - if ((ret = register_add(start_jobid)) != 0) return ret; + if ((ret = dump_init(start_jobid, argc > 1 ? argv[1] : NULL)) != 0) return ret; + if ((ret = register_add(start_jobid, NULL)) != 0) return ret; if (signal(SIGINT, handler) == SIG_ERR) { ret = errno; fprintf(stderr, "%s: can't set signal handler: %s\n", __FUNCTION__, strerror(errno)); @@ -69,9 +71,10 @@ int main(int argc, char *argv[]) { printf("%s\n", start_jobid); printf("start: %lf\n", ts); while (!do_exit) { - if ((ret = register_add(NULL)) != 0) return ret; + if ((ret = register_add(NULL, &jobid)) != 0) return ret; if (argc > 1) - if ((ret = dump_add(argv[1])) != 0) return ret; + if ((ret = dump_add(argv[1], jobid)) != 0) return ret; + free(jobid); } asprintf(&fn, PERF_STOP_FILE_FORMAT, perf_ts); if ((f = fopen(fn, "wt")) == NULL) { @@ -84,7 +87,7 @@ int main(int argc, char *argv[]) { fprintf(f, "regs\t%d\n", perf_regs); fprintf(f, "dumps\t%d\n", perf_dumps); fclose(f); - if ((ret = register_add(stop_jobid)) != 0) return ret; + if ((ret = register_add(stop_jobid, NULL)) != 0) return ret; dump_done(); get_time(NULL, -1, &ts2); @@ -130,7 +133,7 @@ static int register_init() { } -static int register_add(const char *jobid) { +static int register_add(const char *jobid, char **new_jobid) { edg_wlc_JobId j; char *tmpjobid, *msg; @@ -142,7 +145,8 @@ static int register_add(const char *jobid) { edg_wlc_JobIdFree(j); } else tmpjobid = strdup(jobid); asprintf(&msg, "%s\n%s", tmpjobid, user); - free(tmpjobid); + if (new_jobid) *new_jobid = tmpjobid; + else free(tmpjobid); if (edg_wll_MaildirStoreMsg(jpreg_dir, BKSERVER, msg) != 0) { fprintf(stderr, "Can't store message: %s\n", lbm_errdesc); return EIO; @@ -154,11 +158,57 @@ static int register_add(const char *jobid) { } -static int dump_init(const char *start_jobid) { - char *env; +static int dump_init(const char *start_jobid, const char *filename) { + char *env, *ptr, *delim; FILE *f; + long ssize; + size_t i, dump_maxtokens, size; + int ret; unlink(PERF_START_FILE); + + dump = NULL; + dump_index = NULL; + dump_tokens = 0; + if (filename) { + if ((f = fopen(filename, "rt")) == NULL) { + fprintf(stderr, "Can't open '%s': %s\n", filename, strerror(errno)); + return EIO; + } + if (fseek(f, 0, SEEK_END) == -1 || (ssize = ftell(f)) == -1 || fseek(f, 0, SEEK_SET) == -1) { + fprintf(stderr, "Can't get position in '%s': %s\n", filename, strerror(errno)); + return EIO; + } + dump = malloc(size = ssize); + if (fread(dump, size, 1, f) != 1) { + ret = errno; + fprintf(stderr, "Error reading %ld bytes from file: %s\n", ssize, strerror(errno)); + return ret; + } + fclose(f); + + dump_maxtokens = 1024; + dump_index = malloc(sizeof(char *) * dump_maxtokens); + i = 0; + ptr = dump; + do { + if (dump_tokens >= dump_maxtokens) { + dump_maxtokens *= 2; + dump_index = realloc(dump_index, sizeof(char *) * dump_maxtokens); + } + delim = strstr(ptr, "DG.JOBID=\""); + if (delim != ptr) { + dump_index[dump_tokens++] = ptr; + if (delim) { + delim[10] = '\0'; + ptr = delim + 11; + } else ptr = NULL; + } + if (ptr) ptr = strchr(ptr, '\"'); + } while (ptr && ptr[0]); + } +//for (i = 0; i < dump_tokens; i++) printf("####%s\n", dump_index[i]); + // FIXME: is it OK? (probably different HEAD and branch) env = getenv("GLITE_LB_EXPORT_DUMPDIR"); if (!env) env = EDG_DUMP_STORAGE; @@ -177,20 +227,38 @@ static int dump_init(const char *start_jobid) { } -static int dump_add(const char *filename) { +static int dump_add(const char *filename, const char *jobid) { char *fn; int ret; + size_t i; + FILE *f; + ret = 0; asprintf(&fn, "%s/mill-test-%s-%06d", dump_dir, perf_ts, perf_dumps); - if ((ret = link(filename, fn)) != 0) { - fprintf(stderr, "Can't link file: %s\n", strerror(errno)); + if ((f = fopen(fn , "wt")) == NULL) { + ret = errno; + fprintf(stderr, "Can't create file '%s': %s\n", fn, strerror(errno)); + goto err; + } + for (i = 0; i < dump_tokens; i++) { + if (fputs(dump_index[i], f) == EOF || (i + 1 < dump_tokens && (fputs(jobid, f) == EOF))) { + ret = errno; + fprintf(stderr, "Can't write to '%s': %s\n", fn, strerror(errno)); + goto err_close; + } } - free(fn); perf_dumps++; +err_close: + fclose(f); +err: + free(fn); return ret; } static void dump_done() { + free(dump_index); + free(dump); + dump_tokens = 0; } -- 1.8.2.3