16 #include "sion_error_handler.h" 21 #define FILENAME_LENGTH 1024 23 static void usage(
char *name);
25 int main(
int argc,
char **argv)
28 char infilename[FILENAME_LENGTH], fname[FILENAME_LENGTH];
29 int i, f, rank, blknum;
38 int printkeysstat = 0;
39 int printkeyslist = 0;
42 int sid, size, blocks, gblknum, ntasks;
44 sion_int64 globalskip;
45 sion_int64 start_of_varheader;
46 sion_int64 *sion_chunksizes;
47 sion_int64 *sion_globalranks;
48 sion_int64 *sion_blockcount;
49 sion_int64 *sion_blocksizes;
50 sion_int64 *sion_currentpos;
51 sion_int64 *sion_currentblocknr;
52 sion_int64 *siondump_sum_bytes_per_task;
53 sion_int64 siondump_sum_bytes;
54 sion_int64 siondump_sum_chunksizes;
55 sion_int64 siondump_sum_all_fsblocks;
56 sion_int64 siondump_sum_full_fsblocks;
57 sion_int64 siondump_sum_part_fsblocks;
58 sion_int64 siondump_sum_bytes_in_part_fsblocks,blksize;
59 sion_int64 numfullchunks,numemptychunks,numpartlychunks;
60 sion_int64 fullchunkssize,emptychunkssize,partlychunkssize;
62 int mapping_size, nfiles;
71 if (argv[i][0] ==
'-') {
101 fprintf(stderr,
"SIONlib utility %s (Version %d.%dp%d, fileformat version %d)\n", argv[0],
102 SION_MAIN_VERSION,SION_SUB_VERSION,
103 SION_VERSION_PATCHLEVEL,SION_FILEFORMAT_VERSION);
113 strcpy(infilename, argv[argc - 1]);
115 sid =
sion_open(infilename,
"rb,posix", &ntasks, &nfiles, NULL, &fsblksize, NULL, &fp);
118 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"could not open file, aborting %d ...\n", sid));
123 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
126 printf(
"siondump: sid: %d\n", sid);
128 printf(
"siondump: filename: %-30s\n", sion_filedesc->
fname);
129 printf(
"siondump: prefix: %-30s\n", sion_filedesc->
prefix);
130 printf(
"siondump: number of tasks: %d\n", ntasks);
133 printf(
"siondump: filesystem blocksize: %lu bytes (%6.2f MB)\n", (
unsigned long) fsblksize, fsblksize / 1024.0 / 1024.0);
134 printf(
"siondump: file set: %s\n", (nfiles > 1) ?
"Yes" :
"No");
135 printf(
"siondump: file number: %d\n", sion_filedesc->
filenumber);
136 printf(
"siondump: number of files: %d\n", sion_filedesc->
nfiles);
137 printf(
"siondump: flag1: %lld (%d+%d)\n", sion_filedesc->
flag1,
138 (
int) ((sion_int64) sion_filedesc->
flag1>>32),
139 (
int) ((sion_int64) sion_filedesc->
flag1 & ~((sion_int64) 1<<32) ) );
140 printf(
"siondump: flag2: %lld\n", sion_filedesc->
flag2);
142 printf(
"siondump: file format version: %d\n", sion_filedesc->
fileversion);
143 printf(
"siondump: file SIONlib version: %d.%dp%d (current %d.%dp%d)\n",
145 SION_MAIN_VERSION,SION_SUB_VERSION,SION_VERSION_PATCHLEVEL);
147 sion_get_locations(sid, &size, &blocks, &globalskip, &start_of_varheader, &sion_chunksizes, &sion_globalranks,
148 &sion_blockcount, &sion_blocksizes);
153 printf(
"siondump: number of blocks: %d\n", blocks);
155 int num_bytes, num_fds;
157 printf(
"siondump: sizeof internal struct: %d bytes %d file descriptors\n", num_bytes, num_fds);
161 siondump_sum_full_fsblocks = 0;
162 siondump_sum_part_fsblocks = 0;
163 siondump_sum_bytes_in_part_fsblocks = 0;
165 numfullchunks=numemptychunks=numpartlychunks=0;
166 fullchunkssize=emptychunkssize=partlychunkssize=0;
168 siondump_sum_bytes_per_task = (sion_int64 *) malloc(ntasks *
sizeof(sion_int64));
169 for (rank = 0; rank < size; rank++) siondump_sum_bytes_per_task[rank] = 0;
171 for (rank = 0; rank < size; rank++) {
172 for (blknum = 0; blknum < sion_blockcount[rank]; blknum++) {
173 blksize=sion_blocksizes[size * blknum + rank];
174 siondump_sum_bytes_per_task[rank] += blksize;
176 if(blksize==sion_chunksizes[rank]) {
177 numfullchunks++;fullchunkssize+=blksize;
180 numpartlychunks++;partlychunkssize+=blksize;
182 numemptychunks++;emptychunkssize+=sion_chunksizes[rank];
186 siondump_sum_full_fsblocks += (int) ( (sion_int64) blksize / (sion_int64) fsblksize );
187 if(blksize - fsblksize * ((sion_int64) (blksize/fsblksize)) > 0) {
188 siondump_sum_bytes_in_part_fsblocks += blksize - fsblksize * ((int) (blksize/fsblksize));
189 siondump_sum_part_fsblocks++;
193 numemptychunks+=(blocks-sion_blockcount[rank]);
194 emptychunkssize+=(blocks-sion_blockcount[rank])*sion_chunksizes[rank];
196 siondump_sum_all_fsblocks = siondump_sum_full_fsblocks + siondump_sum_part_fsblocks;
198 siondump_sum_chunksizes = 0;
199 siondump_sum_bytes = 0;
200 for (rank = 0; rank < size; rank++) {
201 siondump_sum_bytes += siondump_sum_bytes_per_task[rank];
202 siondump_sum_chunksizes+= sion_chunksizes[rank]*sion_blockcount[rank];
205 printf(
"siondump: size of chunks: %12lld bytes (%8.2f MB)\n",
206 siondump_sum_chunksizes,
207 siondump_sum_chunksizes / 1024.0 / 1024.0);
209 printf(
"siondump: datasize in file (aggr.): %12lld bytes (%8.2f MB)\n",
211 siondump_sum_bytes / 1024.0 / 1024.0);
213 printf(
"siondump: size of full chunks: %12lld bytes (%8.2f MB) # %6lld\n",
215 fullchunkssize / 1024.0 / 1024.0, numfullchunks);
217 printf(
"siondump: size of partly filled chunks: %12lld bytes (%8.2f MB) # %6lld\n",
219 partlychunkssize / 1024.0 / 1024.0, numpartlychunks);
221 printf(
"siondump: size of empty chunks: %12lld bytes (%8.2f MB) # %6lld\n",
223 emptychunkssize / 1024.0 / 1024.0,numemptychunks);
225 printf(
"siondump: overhead compared to task-local file: %12lld bytes (%8.2f MB)\n",
226 siondump_sum_chunksizes-siondump_sum_bytes,
227 (siondump_sum_chunksizes-siondump_sum_bytes) / 1024.0 / 1024.0);
229 if (siondump_sum_chunksizes > 0) {
230 printf(
"siondump: file usage (user data/chunk size): %14.6f%%\n",
231 (
double) siondump_sum_bytes / (
double) siondump_sum_chunksizes * 100.0);
235 printf(
"siondump: fsblocks, size of used blocks: %12lld bytes (%8.2f MB, %ld blocks)\n",
236 siondump_sum_all_fsblocks * (sion_int64) fsblksize,
237 siondump_sum_all_fsblocks * (sion_int64) fsblksize / 1024.0 / 1024.0,(
long) siondump_sum_all_fsblocks);
239 printf(
"siondump: fsblocks, size of fully used blocks: %12lld bytes (%8.2f MB, %ld blocks)\n",
240 siondump_sum_full_fsblocks*fsblksize,
241 siondump_sum_full_fsblocks*fsblksize / 1024.0 / 1024.0,
242 (
long) siondump_sum_full_fsblocks);
244 printf(
"siondump: fsblocks, size of partly used blocks: %12lld bytes of %12lld bytes (%6.2f MB of %6.2f MB, %ld blocks)\n",
245 siondump_sum_bytes_in_part_fsblocks,
246 siondump_sum_part_fsblocks*fsblksize,
247 siondump_sum_bytes_in_part_fsblocks / 1024.0 / 1024.0,
248 siondump_sum_part_fsblocks*fsblksize / 1024.0 / 1024.0,
249 (
long) siondump_sum_part_fsblocks);
251 if (siondump_sum_chunksizes > 0) {
252 printf(
"siondump: fsblocks, used fsblocks/chunk size: %14.6f%%\n",
253 (
double) siondump_sum_all_fsblocks*fsblksize / (
double) siondump_sum_chunksizes * 100.0);
256 if ((siondump_sum_all_fsblocks*fsblksize) > 0) {
257 printf(
"siondump: fsblocks, user data/used blocks: %14.6f%%\n",
258 (
double) siondump_sum_bytes / (
double) (siondump_sum_all_fsblocks*fsblksize) * 100.0);
266 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
267 for (gblknum = 0; gblknum < blocks; gblknum += 10) {
269 for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
270 printf(
"BLK%03d ", blknum);
273 for (rank = 0; rank < size; rank++) {
275 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,
276 sion_globalranks[rank], sion_blockcount[rank], sion_chunksizes[rank] / 1024.0 / 1024.0);
277 for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
278 printf(
" %6.2f MB ", (
long) sion_blocksizes[size * blknum + rank] / 1024.0 / 1024.0);
281 printf(
"Task %02d: size=%10ld B glblrnk=%4lld #blks=%2lld lsz=%10ld B: ", rank, (
long) siondump_sum_bytes_per_task[rank],
282 sion_globalranks[rank], sion_blockcount[rank], (
long) sion_chunksizes[rank]);
283 for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
284 printf(
"%9ld ", (
long) sion_blocksizes[size * blknum + rank]);
292 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
305 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
306 for (rank = 0; rank < size; rank++) {
314 printf(
"Task %02d: key[%02d]=%8ld: #blocks=%6d totalsize=%10ld\n",rank, i++, (
long) key, (
int) keystat.num_blocks, (
long) keystat.total_size);
318 fprintf(stderr,
"on rank %d: error sid = %d\n",rank,sid);
321 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
334 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
335 for (rank = 0; rank < size; rank++) {
339 printf(
"Task %02d:",rank);
341 if (((i%5)==0) && (i>0)) printf(
"\n :");
342 printf(
" [%02d:k=<%ld>,size=%ld]",i++, (
long) key, (
long) value_size);
347 fprintf(stderr,
"on rank %d: error sid = %d\n",rank,sid);
350 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
354 if (sion_filedesc->
nfiles > 1) {
355 printf(
"------------------------------------------------------------\n");
356 printf(
"siondump: number of files: %d\n", sion_filedesc->
nfiles);
357 for (i = 0; i < sion_filedesc->
nfiles; ++i) {
358 if(i>0) sprintf(fname,
"%s.%06d", sion_filedesc->
prefix, i);
359 else sprintf(fname,
"%s", sion_filedesc->
prefix);
360 printf(
"siondump: file %3d: %s \n", i + 1, fname);
362 printf(
"------------------------------------------------------------\n");
366 printf(
" mapping: ");
367 for (i = 0; i < mapping_size; ++i) {
368 printf(
"[%05d -> (f%03d,t%03d)] ", i, mapping[i*2+0],mapping[i*2+1]);
369 if(i%16==15) printf(
"\n ");
372 printf(
"------------------------------------------------------------\n");
376 for (f = 0; f < nfiles; ++f) {
377 printf(
" file[%03d]: ",f);
378 for (i = 0; i < mapping_size; ++i) {
379 if(mapping[i*2+0]==f) {
380 printf(
"%2d:%05d ", mapping[i*2+1], i);
385 printf(
"------------------------------------------------------------\n");
393 free(siondump_sum_bytes_per_task);
398 void usage(
char *name)
400 fprintf(stderr,
"Usage: %s options <sionfn>\n\n", name);
402 fprintf(stderr,
"Dump meta data information of SIONlib file <sionfn>.\n\n");
404 fprintf(stderr,
"Options:\n");
405 fprintf(stderr,
" [-a] print all information about all blocks\n");
406 fprintf(stderr,
" [-m] print all mapping information\n");
407 fprintf(stderr,
" [-M] print all mapping information (table) \n");
408 fprintf(stderr,
" [-l] print all sizes in number of bytes\n");
409 fprintf(stderr,
" [-k] print key-value statistic for each task\n");
410 fprintf(stderr,
" [-K] print key-value list for each task\n");
411 fprintf(stderr,
" [-S] print size of internal data structure in memory\n");
412 fprintf(stderr,
" [-V] show version number of SIONlib\n");
413 fprintf(stderr,
" [-v] verbose mode\n");
414 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_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