Skip to content

Commit 5d01663

Browse files
committed
Update reader code to make it compatible with older traces
Signed-off-by: Chen Wang <[email protected]>
1 parent 7b9c6ec commit 5d01663

File tree

8 files changed

+152
-32
lines changed

8 files changed

+152
-32
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ include_directories(${PROJECT_BINARY_DIR})
66
#------------------------------------------------------------------------------
77
set(RECORDER_VERSION_MAJOR "2")
88
set(RECORDER_VERSION_MINOR "5")
9-
set(RECORDER_VERSION_PATCH "0")
9+
set(RECORDER_VERSION_PATCH "1")
1010
set(RECORDER_PACKAGE "recorder")
1111
set(RECORDER_PACKAGE_NAME "RECORDER")
1212
set(RECORDER_PACKAGE_VERSION "${RECORDER_VERSION_MAJOR}.${RECORDER_VERSION_MINOR}.${RECORDER_VERSION_PATCH}")

include/recorder-logger.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
*/
2121
#define RECORDER_VERSION_MAJOR 2
2222
#define RECORDER_VERSION_MINOR 5
23-
#define RECORDER_VERSION_PATCH 0
23+
#define RECORDER_VERSION_PATCH 1
2424

2525
#define RECORDER_POSIX 0
2626
#define RECORDER_MPIIO 1

tools/reader-cst-cfg.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,54 @@ void reader_free_cfg(CFG* cfg) {
2121
}
2222
}
2323

24+
25+
void reader_decode_cst_2_3(RecorderReader *reader, int rank, CST *cst) {
26+
cst->rank = rank;
27+
char cst_filename[1096] = {0};
28+
sprintf(cst_filename, "%s/%d.cst", reader->logs_dir, rank);
29+
30+
FILE* f = fopen(cst_filename, "rb");
31+
32+
int key_len;
33+
fread(&cst->entries, sizeof(int), 1, f);
34+
35+
cst->cs_list = malloc(cst->entries * sizeof(CallSignature));
36+
37+
for(int i = 0; i < cst->entries; i++) {
38+
fread(&cst->cs_list[i].terminal_id, sizeof(int), 1, f);
39+
fread(&cst->cs_list[i].key_len, sizeof(int), 1, f);
40+
41+
cst->cs_list[i].key = malloc(cst->cs_list[i].key_len);
42+
fread(cst->cs_list[i].key, 1, cst->cs_list[i].key_len, f);
43+
44+
assert(cst->cs_list[i].terminal_id < cst->entries);
45+
}
46+
fclose(f);
47+
}
48+
49+
void reader_decode_cfg_2_3(RecorderReader *reader, int rank, CFG* cfg) {
50+
cfg->rank = rank;
51+
char cfg_filename[1096] = {0};
52+
sprintf(cfg_filename, "%s/%d.cfg", reader->logs_dir, rank);
53+
54+
FILE* f = fopen(cfg_filename, "rb");
55+
56+
fread(&cfg->rules, sizeof(int), 1, f);
57+
58+
cfg->cfg_head = NULL;
59+
for(int i = 0; i < cfg->rules; i++) {
60+
RuleHash *rule = malloc(sizeof(RuleHash));
61+
62+
fread(&(rule->rule_id), sizeof(int), 1, f);
63+
fread(&(rule->symbols), sizeof(int), 1, f);
64+
65+
rule->rule_body = (int*) malloc(sizeof(int)*rule->symbols*2);
66+
fread(rule->rule_body, sizeof(int), rule->symbols*2, f);
67+
HASH_ADD_INT(cfg->cfg_head, rule_id, rule);
68+
}
69+
fclose(f);
70+
}
71+
2472
void reader_decode_cst(int rank, void* buf, CST* cst) {
2573
cst->rank = rank;
2674

tools/reader-private.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ typedef struct IntervalsMap_t {
4848
* recorder_get_cst_cfg() can be used to perform
4949
* custom tasks with CST and CFG
5050
*/
51+
void reader_decode_cst_2_3(RecorderReader *reader, int rank, CST *cst);
52+
void reader_decode_cfg_2_3(RecorderReader *reader, int rank, CFG *cfg);
5153
void reader_decode_cst(int rank, void* buf, CST* cst);
5254
void reader_decode_cfg(int rank, void* buf, CFG* cfg);
5355
void reader_free_cst(CST *cst);

tools/reader.c

Lines changed: 94 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,21 @@ void* read_zlib(FILE* source) {
6565
return decompressed;
6666
}
6767

68-
void check_version(RecorderReader* reader) {
68+
void check_version(RecorderReader* reader, int* v_major, int* v_minor) {
6969
char version_file[1096] = {0};
7070
sprintf(version_file, "%s/VERSION", reader->logs_dir);
7171

7272
FILE* fp = fopen(version_file, "r");
7373
assert(fp != NULL);
7474
int major, minor, patch;
7575
fscanf(fp, "%d.%d.%d", &major, &minor, &patch);
76-
if(major != RECORDER_VERSION_MAJOR || minor != RECORDER_VERSION_MINOR) {
77-
fprintf(stderr, "incompatible version: file=%d.%d.%d != reader=%d.%d.%d\n",
76+
*v_major = major;
77+
*v_minor = minor;
78+
79+
double v1 = major + minor/10.0;
80+
double v2 = RECORDER_VERSION_MAJOR + RECORDER_VERSION_MINOR/10.0;
81+
if (v1 > v2) {
82+
fprintf(stderr, "incompatible version: trace=%d.%d.%d > reader=%d.%d.%d\n",
7883
major, minor, patch, RECORDER_VERSION_MAJOR,
7984
RECORDER_VERSION_MINOR, RECORDER_VERSION_PATCH);
8085
exit(1);
@@ -88,7 +93,34 @@ void read_metadata(RecorderReader* reader) {
8893

8994
FILE* fp = fopen(metadata_file, "rb");
9095
assert(fp != NULL);
91-
fread(&reader->metadata, sizeof(reader->metadata), 1, fp);
96+
if (reader->trace_version_major == 2 && reader->trace_version_minor == 3) {
97+
struct RecorderMetadata_2_3 {
98+
int total_ranks;
99+
double start_ts;
100+
double time_resolution;
101+
int ts_buffer_elements;
102+
int ts_compression_algo; // timestamp compression algorithm
103+
};
104+
struct RecorderMetadata_2_3 metadata_2_3;
105+
fread(&metadata_2_3, sizeof(metadata_2_3), 1, fp);
106+
reader->metadata.total_ranks = metadata_2_3.total_ranks;
107+
reader->metadata.posix_tracing = 1;
108+
reader->metadata.mpi_tracing = 1;
109+
reader->metadata.mpiio_tracing = 1;
110+
reader->metadata.hdf5_tracing = 1;
111+
reader->metadata.store_tid = 1;
112+
reader->metadata.store_call_depth = 1;
113+
reader->metadata.start_ts = metadata_2_3.start_ts;
114+
reader->metadata.time_resolution = metadata_2_3.time_resolution;
115+
reader->metadata.ts_buffer_elements= metadata_2_3.ts_buffer_elements;
116+
reader->metadata.interprocess_compression = 0;
117+
reader->metadata.interprocess_pattern_recognition = 0;
118+
reader->metadata.intraprocess_pattern_recognition = 0;
119+
reader->metadata.ts_compression = 0;
120+
} else {
121+
fread(&reader->metadata, sizeof(reader->metadata), 1, fp);
122+
}
123+
92124

93125
long pos = ftell(fp);
94126
fseek(fp, 0, SEEK_END);
@@ -132,7 +164,7 @@ void recorder_init_reader(const char* logs_dir, RecorderReader *reader) {
132164
reader->hdf5_start_idx = -1;
133165
reader->prev_tstart = 0.0;
134166

135-
check_version(reader);
167+
check_version(reader, &reader->trace_version_major, &reader->trace_version_minor);
136168

137169
read_metadata(reader);
138170

@@ -184,23 +216,33 @@ void recorder_init_reader(const char* logs_dir, RecorderReader *reader) {
184216

185217
} else {
186218
for(int rank = 0; rank < nprocs; rank++) {
187-
char cst_fname[1096] = {0};
188-
sprintf(cst_fname, "%s/%d.cst", reader->logs_dir, rank);
189-
FILE* cst_file = fopen(cst_fname, "rb");
190-
void* buf_cst = read_zlib(cst_file);
191-
reader->csts[rank] = (CST*) malloc(sizeof(CST));
192-
reader_decode_cst(rank, buf_cst, reader->csts[rank]);
193-
free(buf_cst);
194-
fclose(cst_file);
195-
196-
char cfg_fname[1096] = {0};
197-
sprintf(cfg_fname, "%s/%d.cfg", reader->logs_dir, rank);
198-
FILE* cfg_file = fopen(cfg_fname, "rb");
199-
void* buf_cfg = read_zlib(cfg_file);
200-
reader->cfgs[rank] = (CFG*) malloc(sizeof(CFG));
201-
reader_decode_cfg(rank, buf_cfg, reader->cfgs[rank]);
202-
free(buf_cfg);
203-
fclose(cfg_file);
219+
if (reader->trace_version_major == 2 && reader->trace_version_minor == 3) {
220+
reader->csts[rank] = (CST*) malloc(sizeof(CST));
221+
reader_decode_cst_2_3(reader, rank, reader->csts[rank]);
222+
} else {
223+
char cst_fname[1096] = {0};
224+
sprintf(cst_fname, "%s/%d.cst", reader->logs_dir, rank);
225+
FILE* cst_file = fopen(cst_fname, "rb");
226+
void* buf_cst = read_zlib(cst_file);
227+
reader->csts[rank] = (CST*) malloc(sizeof(CST));
228+
reader_decode_cst(rank, buf_cst, reader->csts[rank]);
229+
free(buf_cst);
230+
fclose(cst_file);
231+
}
232+
233+
if (reader->trace_version_major == 2 && reader->trace_version_minor == 3) {
234+
reader->cfgs[rank] = (CFG*) malloc(sizeof(CFG));
235+
reader_decode_cfg_2_3(reader, rank, reader->cfgs[rank]);
236+
} else {
237+
char cfg_fname[1096] = {0};
238+
sprintf(cfg_fname, "%s/%d.cfg", reader->logs_dir, rank);
239+
FILE* cfg_file = fopen(cfg_fname, "rb");
240+
void* buf_cfg = read_zlib(cfg_file);
241+
reader->cfgs[rank] = (CFG*) malloc(sizeof(CFG));
242+
reader_decode_cfg(rank, buf_cfg, reader->cfgs[rank]);
243+
free(buf_cfg);
244+
fclose(cfg_file);
245+
}
204246
}
205247
}
206248
}
@@ -293,16 +335,27 @@ void rule_application(RecorderReader* reader, CFG* cfg, CST* cst, int rule_id, u
293335
}
294336
}
295337

296-
void decode_records_core(RecorderReader *reader, int rank,
297-
void (*user_op)(Record*, void*), void* user_arg, bool free_record) {
338+
// caller must free the timestamp
339+
// buffer after use
340+
uint32_t* read_timestamp_file(RecorderReader* reader, int rank) {
341+
char ts_fname[1096] = {0};
298342

299-
int nprocs = reader->metadata.total_ranks;
300-
CST* cst = reader_get_cst(reader, rank);
301-
CFG* cfg = reader_get_cfg(reader, rank);
343+
if (reader->trace_version_major==2 && reader->trace_version_minor==3) {
344+
sprintf(ts_fname, "%s/%d.ts", reader->logs_dir, rank);
345+
FILE* ts_file = fopen(ts_fname, "rb");
346+
fseek(ts_file, 0, SEEK_END);
347+
long filesize = ftell(ts_file);
348+
fseek(ts_file, 0, SEEK_CUR);
302349

303-
reader->prev_tstart = 0.0;
350+
uint32_t* ts_buf = (uint32_t*) malloc(filesize);
351+
fread(ts_buf, 1, filesize, ts_file);
352+
fclose(ts_file);
353+
354+
return ts_buf;
355+
}
356+
357+
int nprocs = reader->metadata.total_ranks;
304358

305-
char ts_fname[1096] = {0};
306359
sprintf(ts_fname, "%s/recorder.ts", reader->logs_dir);
307360
FILE* ts_file = fopen(ts_fname, "rb");
308361

@@ -329,6 +382,18 @@ void decode_records_core(RecorderReader *reader, int rank,
329382
fread(ts_buf, 1, buf_sizes[rank], ts_file);
330383
}
331384
fclose(ts_file);
385+
}
386+
387+
388+
void decode_records_core(RecorderReader *reader, int rank,
389+
void (*user_op)(Record*, void*), void* user_arg, bool free_record) {
390+
391+
CST* cst = reader_get_cst(reader, rank);
392+
CFG* cfg = reader_get_cfg(reader, rank);
393+
394+
reader->prev_tstart = 0.0;
395+
396+
uint32_t* ts_buf = read_timestamp_file(reader, rank);
332397

333398
rule_application(reader, cfg, cst, -1, ts_buf, user_op, user_arg, free_record);
334399

tools/reader.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ typedef struct RecorderReader_t {
5656
// and cfgs[rank].
5757
CST** csts;
5858
CFG** cfgs;
59+
60+
int trace_version_major;
61+
int trace_version_minor;
5962
} RecorderReader;
6063

6164

tools/recorder-summary.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,12 @@ int main(int argc, char **argv) {
110110

111111
RecorderReader reader;
112112
recorder_init_reader(argv[optind], &reader);
113+
113114
CST* cst = reader_get_cst(&reader, 0);
114115
print_metadata(&reader);
115116
print_statistics(&reader, cst);
117+
printf("here2\n");
118+
fflush(stdout);
116119

117120
if (show_cst) {
118121
print_cst(&reader, cst);

tools/recorder2text.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ int main(int argc, char **argv) {
7171
int end_rank = min(reader.metadata.total_ranks, n*(mpi_rank+1));
7272

7373
for(int rank = start_rank; rank < end_rank; rank++) {
74-
7574
sprintf(textfile_path, formatting_fname, textfile_dir, rank);
7675
FILE* fout = fopen(textfile_path, "w");
7776

0 commit comments

Comments
 (0)