20 #define FILENAME_LENGTH 1024 22 static void usage(
char *name);
24 int main(
int argc,
char **argv)
27 char infilename[FILENAME_LENGTH], fname[FILENAME_LENGTH];
36 int printkeysstat = 0;
37 int printkeyslist = 0;
40 int sid, size, blocks, gblknum, ntasks;
42 sion_int64 globalskip;
43 sion_int64 start_of_varheader;
44 sion_int64 *sion_chunksizes;
45 sion_int64 *sion_globalranks;
46 sion_int64 *sion_blockcount;
47 sion_int64 *sion_blocksizes;
48 sion_int64 *sion_currentpos;
49 sion_int64 *sion_currentblocknr;
50 sion_int64 *siondump_sum_bytes_per_task;
51 sion_int64 siondump_sum_bytes;
52 sion_int64 siondump_sum_chunksizes;
53 sion_int64 siondump_sum_all_fsblocks;
54 sion_int64 siondump_sum_full_fsblocks;
55 sion_int64 siondump_sum_part_fsblocks;
56 sion_int64 siondump_sum_bytes_in_part_fsblocks,blksize;
57 sion_int64 numfullchunks,numemptychunks,numpartlychunks;
58 sion_int64 fullchunkssize,emptychunkssize,partlychunkssize;
60 int mapping_size, nfiles;
69 if (argv[i][0] ==
'-') {
96 fprintf(stderr,
"SIONlib utility %s (Version %d.%dp%d, fileformat version %d)\n", argv[0],
97 SION_MAIN_VERSION,SION_SUB_VERSION,
98 SION_VERSION_PATCHLEVEL,SION_FILEFORMAT_VERSION);
108 strcpy(infilename, argv[argc - 1]);
110 sid =
sion_open(infilename,
"rb,posix", &ntasks, &nfiles, NULL, &fsblksize, NULL, &fp);
113 return(
_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"could not open file, aborting %d ...\n", sid));
118 return(
_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
121 printf(
"siondump: sid: %d\n", sid);
123 printf(
"siondump: filename: %-30s\n", sion_filedesc->
fname);
124 printf(
"siondump: prefix: %-30s\n", sion_filedesc->
prefix);
125 printf(
"siondump: number of tasks: %d\n", ntasks);
128 printf(
"siondump: filesystem blocksize: %lu bytes (%6.2f MB)\n", (
unsigned long) fsblksize, fsblksize / 1024.0 / 1024.0);
129 printf(
"siondump: file set: %s\n", (nfiles > 1) ?
"Yes" :
"No");
130 printf(
"siondump: file number: %d\n", sion_filedesc->
filenumber);
131 printf(
"siondump: number of files: %d\n", sion_filedesc->
nfiles);
132 printf(
"siondump: flag1: %lld (%d+%d)\n", sion_filedesc->
flag1,
133 (
int) ((sion_int64) sion_filedesc->
flag1>>32),
134 (
int) ((sion_int64) sion_filedesc->
flag1 & ~((sion_int64) 1<<32) ) );
135 printf(
"siondump: flag2: %lld\n", sion_filedesc->
flag2);
137 printf(
"siondump: file format version: %d\n", sion_filedesc->
fileversion);
138 printf(
"siondump: file SIONlib version: %d.%dp%d (current %d.%dp%d)\n",
140 SION_MAIN_VERSION,SION_SUB_VERSION,SION_VERSION_PATCHLEVEL);
142 sion_get_locations(sid, &size, &blocks, &globalskip, &start_of_varheader, &sion_chunksizes, &sion_globalranks,
143 &sion_blockcount, &sion_blocksizes);
148 printf(
"siondump: number of blocks: %d\n", blocks);
150 int num_bytes, num_fds;
152 printf(
"siondump: sizeof internal struct: %d bytes %d file descriptors\n", num_bytes, num_fds);
156 siondump_sum_full_fsblocks = 0;
157 siondump_sum_part_fsblocks = 0;
158 siondump_sum_bytes_in_part_fsblocks = 0;
160 numfullchunks=numemptychunks=numpartlychunks=0;
161 fullchunkssize=emptychunkssize=partlychunkssize=0;
163 siondump_sum_bytes_per_task = (sion_int64 *) malloc(ntasks *
sizeof(sion_int64));
164 for (rank = 0; rank < size; rank++) siondump_sum_bytes_per_task[rank] = 0;
166 for (rank = 0; rank < size; rank++) {
167 for (blknum = 0; blknum < sion_blockcount[rank]; blknum++) {
168 blksize=sion_blocksizes[size * blknum + rank];
169 siondump_sum_bytes_per_task[rank] += blksize;
171 if(blksize==sion_chunksizes[rank]) {
172 numfullchunks++;fullchunkssize+=blksize;
175 numpartlychunks++;partlychunkssize+=blksize;
177 numemptychunks++;emptychunkssize+=sion_chunksizes[rank];
181 siondump_sum_full_fsblocks += (int) ( (sion_int64) blksize / (sion_int64) fsblksize );
182 if(blksize - fsblksize * ((sion_int64) (blksize/fsblksize)) > 0) {
183 siondump_sum_bytes_in_part_fsblocks += blksize - fsblksize * ((int) (blksize/fsblksize));
184 siondump_sum_part_fsblocks++;
188 numemptychunks+=(blocks-sion_blockcount[rank]);
189 emptychunkssize+=(blocks-sion_blockcount[rank])*sion_chunksizes[rank];
191 siondump_sum_all_fsblocks = siondump_sum_full_fsblocks + siondump_sum_part_fsblocks;
193 siondump_sum_chunksizes = 0;
194 siondump_sum_bytes = 0;
195 for (rank = 0; rank < size; rank++) {
196 siondump_sum_bytes += siondump_sum_bytes_per_task[rank];
197 siondump_sum_chunksizes+= sion_chunksizes[rank]*sion_blockcount[rank];
200 printf(
"siondump: size of chunks: %12lld bytes (%8.2f MB)\n",
201 siondump_sum_chunksizes,
202 siondump_sum_chunksizes / 1024.0 / 1024.0);
204 printf(
"siondump: datasize in file (aggr.): %12lld bytes (%8.2f MB)\n",
206 siondump_sum_bytes / 1024.0 / 1024.0);
208 printf(
"siondump: size of full chunks: %12lld bytes (%8.2f MB) # %6lld\n",
210 fullchunkssize / 1024.0 / 1024.0, numfullchunks);
212 printf(
"siondump: size of partly filled chunks: %12lld bytes (%8.2f MB) # %6lld\n",
214 partlychunkssize / 1024.0 / 1024.0, numpartlychunks);
216 printf(
"siondump: size of empty chunks: %12lld bytes (%8.2f MB) # %6lld\n",
218 emptychunkssize / 1024.0 / 1024.0,numemptychunks);
220 printf(
"siondump: overhead compared to task-local file: %12lld bytes (%8.2f MB)\n",
221 siondump_sum_chunksizes-siondump_sum_bytes,
222 (siondump_sum_chunksizes-siondump_sum_bytes) / 1024.0 / 1024.0);
224 if (siondump_sum_chunksizes > 0) {
225 printf(
"siondump: file usage (user data/chunk size): %14.6f%%\n",
226 (
double) siondump_sum_bytes / (
double) siondump_sum_chunksizes * 100.0);
230 printf(
"siondump: fsblocks, size of used blocks: %12lld bytes (%8.2f MB, %ld blocks)\n",
231 siondump_sum_all_fsblocks * (sion_int64) fsblksize,
232 siondump_sum_all_fsblocks * (sion_int64) fsblksize / 1024.0 / 1024.0,(
long) siondump_sum_all_fsblocks);
234 printf(
"siondump: fsblocks, size of fully used locks: %12lld bytes (%8.2f MB, %ld blocks)\n",
235 siondump_sum_full_fsblocks*fsblksize,
236 siondump_sum_full_fsblocks*fsblksize / 1024.0 / 1024.0,
237 (
long) siondump_sum_full_fsblocks);
239 printf(
"siondump: fsblocks, size of partly used blocks: %12lld bytes of %12lld bytes (%6.2f MB of %6.2f MB, %ld blocks)\n",
240 siondump_sum_bytes_in_part_fsblocks,
241 siondump_sum_part_fsblocks*fsblksize,
242 siondump_sum_bytes_in_part_fsblocks / 1024.0 / 1024.0,
243 siondump_sum_part_fsblocks*fsblksize / 1024.0 / 1024.0,
244 (
long) siondump_sum_part_fsblocks);
246 if (siondump_sum_chunksizes > 0) {
247 printf(
"siondump: fsblocks, used fsblocks/chunk size: %14.6f%%\n",
248 (
double) siondump_sum_all_fsblocks*fsblksize / (
double) siondump_sum_chunksizes * 100.0);
251 if ((siondump_sum_all_fsblocks*fsblksize) > 0) {
252 printf(
"siondump: fsblocks, user data/used blocks: %14.6f%%\n",
253 (
double) siondump_sum_bytes / (
double) (siondump_sum_all_fsblocks*fsblksize) * 100.0);
261 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
262 for (gblknum = 0; gblknum < blocks; gblknum += 10) {
264 for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
265 printf(
"BLK%03d ", blknum);
268 for (rank = 0; rank < size; rank++) {
270 printf(
"Task %02d: size=%8.2f MB glblrnk=%4lld #blks=%2lld lsz=%8.2f MB: ", rank, siondump_sum_bytes_per_task[rank] / 1024.0 / 1024.0,
271 sion_globalranks[rank], sion_blockcount[rank], sion_chunksizes[rank] / 1024.0 / 1024.0);
272 for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
273 printf(
" %6.2f MB ", (
long) sion_blocksizes[size * blknum + rank] / 1024.0 / 1024.0);
276 printf(
"Task %02d: size=%10ld B glblrnk=%4lld #blks=%2lld lsz=%10ld B: ", rank, (
long) siondump_sum_bytes_per_task[rank],
277 sion_globalranks[rank], sion_blockcount[rank], (
long) sion_chunksizes[rank]);
278 for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
279 printf(
"%9ld ", (
long) sion_blocksizes[size * blknum + rank]);
287 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
300 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
301 for (rank = 0; rank < size; rank++) {
309 printf(
"Task %02d: key[%02d]=%8ld: #blocks=%6d totalsize=%10ld\n",rank, i++, (
long) key, (
int) keystat.num_blocks, (
long) keystat.total_size);
313 fprintf(stderr,
"on rank %d: error sid = %d\n",rank,sid);
316 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
329 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
330 for (rank = 0; rank < size; rank++) {
334 printf(
"Task %02d:",rank);
336 if (((i%5)==0) && (i>0)) printf(
"\n :");
337 printf(
" [%02d:k=<%ld>,size=%ld]",i++, (
long) key, (
long) value_size);
342 fprintf(stderr,
"on rank %d: error sid = %d\n",rank,sid);
345 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
349 if (sion_filedesc->
nfiles > 1) {
350 printf(
"------------------------------------------------------------\n");
351 printf(
"siondump: number of files: %d\n", sion_filedesc->
nfiles);
352 for (i = 0; i < sion_filedesc->
nfiles; ++i) {
353 if(i>0) sprintf(fname,
"%s.%06d", sion_filedesc->
prefix, i);
354 else sprintf(fname,
"%s", sion_filedesc->
prefix);
355 printf(
"siondump: file %3d: %s \n", i + 1, fname);
357 printf(
"------------------------------------------------------------\n");
361 printf(
" mapping: ");
362 for (i = 0; i < mapping_size; ++i) {
363 printf(
"[%05d -> (f%03d,t%03d)] ", i, mapping[i*2+0],mapping[i*2+1]);
364 if(i%16==15) printf(
"\n ");
367 printf(
"------------------------------------------------------------\n");
378 void usage(
char *name)
380 fprintf(stderr,
"Usage: %s options <sionfn>\n\n", name);
382 fprintf(stderr,
"Dump meta data information of SIONlib file <sionfn>.\n\n");
384 fprintf(stderr,
"Options:\n");
385 fprintf(stderr,
" [-a] print all information about all blocks\n");
386 fprintf(stderr,
" [-m] print all mapping information\n");
387 fprintf(stderr,
" [-l] print all sizes in number of bytes\n");
388 fprintf(stderr,
" [-k] print key-value statistic for each task\n");
389 fprintf(stderr,
" [-K] print key-value list for each task\n");
390 fprintf(stderr,
" [-S] print size of internal data structure in memory\n");
391 fprintf(stderr,
" [-V] show version number of SIONlib\n");
392 fprintf(stderr,
" [-v] verbose mode\n");
393 fprintf(stderr,
" [-h] show this help\n");
int sion_key_list_iterator_next(int sid, uint64_t *keyptr)
Forward to next key.
Sion File Descriptor Structure.
int sion_get_endianness(void)
Return endianness.
int sion_get_file_endianness(int sid)
Returns edianness of data in file sid.
int sion_fread_key_iterator_next(int sid, uint64_t *key, size_t *size)
Forward to next key.
sion_int32 filesionpatchlevel
int sion_close(int sid)
Close a sion file.
int _sion_vcdtype(int sid)
int sion_get_current_locations(int sid, int *ntasks, sion_int64 **sion_currentpos, sion_int64 **sion_currentblocknr)
Returns current position in file and pointer fiels containing chunk sizes.
int sion_get_locations(int sid, int *ntasks, int *maxchunks, sion_int64 *globalskip, sion_int64 *start_of_varheader, sion_int64 **sion_chunksizes, sion_int64 **sion_globalranks, sion_int64 **sion_blockcount, sion_int64 **sion_blocksizes)
Returns pointers to internal fields.
int sion_get_mapping(int sid, int *mapping_size, sion_int32 **mapping, int *numfiles)
Returns pointers to the internal field mapping.
char * sion_keyval_type_to_str(int type)
Returns key value mode as string.
void * _sion_vcdtovcon(int sid)
int sion_seek(int sid, int rank, int currentblocknr, sion_int64 posinblk)
Function to set the file pointer to a new position.
int sion_fread_key_iterator_reset(int sid)
Resets key iterator.
int _sion_errorprint(int rc, int level, const char *format,...)
Internal SION error.
int sion_get_sizeof(int sid, int *numbytes, int *numfds)
Function returns size of internal data structure for sid.
int sion_key_list_iterator_reset(int sid)
Resets key iterator.
#define SION_FILEDESCRIPTOR
int sion_key_full_scan(int sid)
Performs a full scan of all meta data in current file.
sion_int32 filesionversion
int sion_open(char *fname, const char *file_mode, int *ntasks, int *nfiles, sion_int64 **chunksizes, sion_int32 *fsblksize, int **globalranks, FILE **fileptr)
Open a sion file in serial mode.
int sion_key_get_stat(int sid, uint64_t key, sion_key_stat_t *stat)
get statistics about key
#define SION_CURRENT_CHUNK