10 #define _XOPEN_SOURCE 700 18 #include "sion_error_handler.h" 23 #define FILENAME_LENGTH 1024 25 static void usage(
char *name);
27 int main(
int argc,
char **argv)
30 char infilename[FILENAME_LENGTH], fname[FILENAME_LENGTH];
31 int i, f, rank, blknum;
40 int printkeysstat = 0;
41 int printkeyslist = 0;
44 int sid, size, blocks, gblknum, ntasks;
46 sion_int64 globalskip;
47 sion_int64 start_of_varheader;
48 sion_int64 *sion_chunksizes;
49 sion_int64 *sion_globalranks;
50 sion_int64 *sion_blockcount;
51 sion_int64 *sion_blocksizes;
52 sion_int64 *sion_currentpos;
53 sion_int64 *sion_currentblocknr;
54 sion_int64 *siondump_sum_bytes_per_task;
55 sion_int64 siondump_sum_bytes;
56 sion_int64 siondump_sum_chunksizes;
57 sion_int64 siondump_sum_all_fsblocks;
58 sion_int64 siondump_sum_full_fsblocks;
59 sion_int64 siondump_sum_part_fsblocks;
60 sion_int64 siondump_sum_bytes_in_part_fsblocks,blksize;
61 sion_int64 numfullchunks,numemptychunks,numpartlychunks;
62 sion_int64 fullchunkssize,emptychunkssize,partlychunkssize;
64 int mapping_size, nfiles;
73 if (argv[i][0] ==
'-') {
103 fprintf(stderr,
"SIONlib utility %s (Version %d.%dp%d, fileformat version %d)\n", argv[0],
104 SION_MAIN_VERSION,SION_SUB_VERSION,
105 SION_VERSION_PATCHLEVEL,SION_FILEFORMAT_VERSION);
115 strcpy(infilename, argv[argc - 1]);
117 sid =
sion_open(infilename,
"rb,posix", &ntasks, &nfiles, NULL, &fsblksize, NULL, &fp);
120 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"could not open file, aborting %d ...\n", sid));
125 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
128 printf(
"siondump: sid: %d\n", sid);
130 printf(
"siondump: filename: %-30s\n", sion_filedesc->
fname);
131 printf(
"siondump: prefix: %-30s\n", sion_filedesc->
prefix);
132 printf(
"siondump: number of tasks: %d\n", ntasks);
135 printf(
"siondump: filesystem blocksize: %lu bytes (%6.2f MB)\n", (
unsigned long) fsblksize, fsblksize / 1024.0 / 1024.0);
136 printf(
"siondump: file set: %s\n", (nfiles > 1) ?
"Yes" :
"No");
137 printf(
"siondump: file number: %d\n", sion_filedesc->
filenumber);
138 printf(
"siondump: number of files: %d\n", sion_filedesc->
nfiles);
139 printf(
"siondump: flag1: %lld (%d+%d)\n", sion_filedesc->
flag1,
140 (
int) ((sion_int64) sion_filedesc->
flag1>>32),
141 (
int) ((sion_int64) sion_filedesc->
flag1 & ~((sion_int64) 1<<32) ) );
142 printf(
"siondump: flag2: %lld\n", sion_filedesc->
flag2);
144 printf(
"siondump: file format version: %d\n", sion_filedesc->
fileversion);
145 printf(
"siondump: file SIONlib version: %d.%dp%d (current %d.%dp%d)\n",
147 SION_MAIN_VERSION,SION_SUB_VERSION,SION_VERSION_PATCHLEVEL);
149 sion_get_locations(sid, &size, &blocks, &globalskip, &start_of_varheader, &sion_chunksizes, &sion_globalranks,
150 &sion_blockcount, &sion_blocksizes);
155 printf(
"siondump: number of blocks: %d\n", blocks);
157 int num_bytes, num_fds;
159 printf(
"siondump: sizeof internal struct: %d bytes %d file descriptors\n", num_bytes, num_fds);
163 siondump_sum_full_fsblocks = 0;
164 siondump_sum_part_fsblocks = 0;
165 siondump_sum_bytes_in_part_fsblocks = 0;
167 numfullchunks=numemptychunks=numpartlychunks=0;
168 fullchunkssize=emptychunkssize=partlychunkssize=0;
170 siondump_sum_bytes_per_task = (sion_int64 *) malloc(ntasks *
sizeof(sion_int64));
171 for (rank = 0; rank < size; rank++) siondump_sum_bytes_per_task[rank] = 0;
173 for (rank = 0; rank < size; rank++) {
174 for (blknum = 0; blknum < sion_blockcount[rank]; blknum++) {
175 blksize=sion_blocksizes[size * blknum + rank];
176 siondump_sum_bytes_per_task[rank] += blksize;
178 if(blksize==sion_chunksizes[rank]) {
179 numfullchunks++;fullchunkssize+=blksize;
182 numpartlychunks++;partlychunkssize+=blksize;
184 numemptychunks++;emptychunkssize+=sion_chunksizes[rank];
188 siondump_sum_full_fsblocks += (int) ( (sion_int64) blksize / (sion_int64) fsblksize );
189 if(blksize - fsblksize * ((sion_int64) (blksize/fsblksize)) > 0) {
190 siondump_sum_bytes_in_part_fsblocks += blksize - fsblksize * ((int) (blksize/fsblksize));
191 siondump_sum_part_fsblocks++;
195 numemptychunks+=(blocks-sion_blockcount[rank]);
196 emptychunkssize+=(blocks-sion_blockcount[rank])*sion_chunksizes[rank];
198 siondump_sum_all_fsblocks = siondump_sum_full_fsblocks + siondump_sum_part_fsblocks;
200 siondump_sum_chunksizes = 0;
201 siondump_sum_bytes = 0;
202 for (rank = 0; rank < size; rank++) {
203 siondump_sum_bytes += siondump_sum_bytes_per_task[rank];
204 siondump_sum_chunksizes+= sion_chunksizes[rank]*sion_blockcount[rank];
207 printf(
"siondump: size of chunks: %12lld bytes (%8.2f MB)\n",
208 siondump_sum_chunksizes,
209 siondump_sum_chunksizes / 1024.0 / 1024.0);
211 printf(
"siondump: datasize in file (aggr.): %12lld bytes (%8.2f MB)\n",
213 siondump_sum_bytes / 1024.0 / 1024.0);
215 printf(
"siondump: size of full chunks: %12lld bytes (%8.2f MB) # %6lld\n",
217 fullchunkssize / 1024.0 / 1024.0, numfullchunks);
219 printf(
"siondump: size of partly filled chunks: %12lld bytes (%8.2f MB) # %6lld\n",
221 partlychunkssize / 1024.0 / 1024.0, numpartlychunks);
223 printf(
"siondump: size of empty chunks: %12lld bytes (%8.2f MB) # %6lld\n",
225 emptychunkssize / 1024.0 / 1024.0,numemptychunks);
227 printf(
"siondump: overhead compared to task-local file: %12lld bytes (%8.2f MB)\n",
228 siondump_sum_chunksizes-siondump_sum_bytes,
229 (siondump_sum_chunksizes-siondump_sum_bytes) / 1024.0 / 1024.0);
231 if (siondump_sum_chunksizes > 0) {
232 printf(
"siondump: file usage (user data/chunk size): %14.6f%%\n",
233 (
double) siondump_sum_bytes / (
double) siondump_sum_chunksizes * 100.0);
237 printf(
"siondump: fsblocks, size of used blocks: %12lld bytes (%8.2f MB, %ld blocks)\n",
238 siondump_sum_all_fsblocks * (sion_int64) fsblksize,
239 siondump_sum_all_fsblocks * (sion_int64) fsblksize / 1024.0 / 1024.0,(
long) siondump_sum_all_fsblocks);
241 printf(
"siondump: fsblocks, size of fully used blocks: %12lld bytes (%8.2f MB, %ld blocks)\n",
242 siondump_sum_full_fsblocks*fsblksize,
243 siondump_sum_full_fsblocks*fsblksize / 1024.0 / 1024.0,
244 (
long) siondump_sum_full_fsblocks);
246 printf(
"siondump: fsblocks, size of partly used blocks: %12lld bytes of %12lld bytes (%6.2f MB of %6.2f MB, %ld blocks)\n",
247 siondump_sum_bytes_in_part_fsblocks,
248 siondump_sum_part_fsblocks*fsblksize,
249 siondump_sum_bytes_in_part_fsblocks / 1024.0 / 1024.0,
250 siondump_sum_part_fsblocks*fsblksize / 1024.0 / 1024.0,
251 (
long) siondump_sum_part_fsblocks);
253 if (siondump_sum_chunksizes > 0) {
254 printf(
"siondump: fsblocks, used fsblocks/chunk size: %14.6f%%\n",
255 (
double) siondump_sum_all_fsblocks*fsblksize / (
double) siondump_sum_chunksizes * 100.0);
258 if ((siondump_sum_all_fsblocks*fsblksize) > 0) {
259 printf(
"siondump: fsblocks, user data/used blocks: %14.6f%%\n",
260 (
double) siondump_sum_bytes / (
double) (siondump_sum_all_fsblocks*fsblksize) * 100.0);
268 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
269 for (gblknum = 0; gblknum < blocks; gblknum += 10) {
271 for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
272 printf(
"BLK%03d ", blknum);
275 for (rank = 0; rank < size; rank++) {
277 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,
278 sion_globalranks[rank], sion_blockcount[rank], sion_chunksizes[rank] / 1024.0 / 1024.0);
279 for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
280 printf(
" %6.2f MB ", (
long) sion_blocksizes[size * blknum + rank] / 1024.0 / 1024.0);
283 printf(
"Task %02d: size=%10ld B glblrnk=%4lld #blks=%2lld lsz=%10ld B: ", rank, (
long) siondump_sum_bytes_per_task[rank],
284 sion_globalranks[rank], sion_blockcount[rank], (
long) sion_chunksizes[rank]);
285 for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
286 printf(
"%9ld ", (
long) sion_blocksizes[size * blknum + rank]);
294 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
307 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
308 for (rank = 0; rank < size; rank++) {
316 printf(
"Task %02d: key[%02d]=%8ld: #blocks=%6d totalsize=%10ld\n",rank, i++, (
long) key, (
int) keystat.num_blocks, (
long) keystat.total_size);
320 fprintf(stderr,
"on rank %d: error sid = %d\n",rank,sid);
323 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
336 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
337 for (rank = 0; rank < size; rank++) {
341 printf(
"Task %02d:",rank);
343 if (((i%5)==0) && (i>0)) printf(
"\n :");
344 printf(
" [%02d:k=<%ld>,size=%ld]",i++, (
long) key, (
long) value_size);
349 fprintf(stderr,
"on rank %d: error sid = %d\n",rank,sid);
352 (
"-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
356 if (sion_filedesc->
nfiles > 1) {
357 printf(
"------------------------------------------------------------\n");
358 printf(
"siondump: number of files: %d\n", sion_filedesc->
nfiles);
359 for (i = 0; i < sion_filedesc->
nfiles; ++i) {
360 if(i>0) sprintf(fname,
"%s.%06d", sion_filedesc->
prefix, i);
361 else sprintf(fname,
"%s", sion_filedesc->
prefix);
362 printf(
"siondump: file %3d: %s \n", i + 1, fname);
364 printf(
"------------------------------------------------------------\n");
368 printf(
" mapping: ");
369 for (i = 0; i < mapping_size; ++i) {
370 printf(
"[%05d -> (f%03d,t%03d)] ", i, mapping[i*2+0],mapping[i*2+1]);
371 if(i%16==15) printf(
"\n ");
374 printf(
"------------------------------------------------------------\n");
378 for (f = 0; f < nfiles; ++f) {
379 printf(
" file[%03d]: ",f);
380 for (i = 0; i < mapping_size; ++i) {
381 if(mapping[i*2+0]==f) {
382 printf(
"%2d:%05d ", mapping[i*2+1], i);
387 printf(
"------------------------------------------------------------\n");
395 free(siondump_sum_bytes_per_task);
400 void usage(
char *name)
402 fprintf(stderr,
"Usage: %s options <sionfn>\n\n", name);
404 fprintf(stderr,
"Dump meta data information of SIONlib file <sionfn>.\n\n");
406 fprintf(stderr,
"Options:\n");
407 fprintf(stderr,
" [-a] print all information about all blocks\n");
408 fprintf(stderr,
" [-m] print all mapping information\n");
409 fprintf(stderr,
" [-M] print all mapping information (table) \n");
410 fprintf(stderr,
" [-l] print all sizes in number of bytes\n");
411 fprintf(stderr,
" [-k] print key-value statistic for each task\n");
412 fprintf(stderr,
" [-K] print key-value list for each task\n");
413 fprintf(stderr,
" [-S] print size of internal data structure in memory\n");
414 fprintf(stderr,
" [-V] show version number of SIONlib\n");
415 fprintf(stderr,
" [-v] verbose mode\n");
416 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