Dump transformations too (replacing DB.JOBID by new jobids).
authorFrantišek Dvořák <valtri@civ.zcu.cz>
Thu, 19 Jul 2007 19:01:38 +0000 (19:01 +0000)
committerFrantišek Dvořák <valtri@civ.zcu.cz>
Thu, 19 Jul 2007 19:01:38 +0000 (19:01 +0000)
org.glite.jp.client/examples/mill_feed.c

index 3e3b4d4..ca06dad 100644 (file)
@@ -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;
 }