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();
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));
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) {
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);
}
-static int register_add(const char *jobid) {
+static int register_add(const char *jobid, char **new_jobid) {
edg_wlc_JobId j;
char *tmpjobid, *msg;
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;
}
-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;
}
-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;
}