@@ -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
0 commit comments