SIONlib  1.7.4
Scalable I/O library for parallel access to task-local files
siondump.c
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2019 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
10 #define _XOPEN_SOURCE 700
11 
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <ctype.h>
16 
17 #include "sion.h"
18 #include "sion_error_handler.h"
19 #include "sion_internal.h"
20 #include "sion_fd.h"
21 #include "sion_filedesc.h"
22 
23 #define FILENAME_LENGTH 1024
24 
25 static void usage(char *name);
26 
27 int main(int argc, char **argv)
28 {
29  FILE *fp;
30  char infilename[FILENAME_LENGTH], fname[FILENAME_LENGTH];
31  int i, f, rank, blknum;
32 
33  /* options */
34  int printall = 0;
35  int printmap = 0;
36  int printMap = 0;
37  int verbose = 0;
38  int longspec = 0;
39  int printisize = 0;
40  int printkeysstat = 0;
41  int printkeyslist = 0;
42 
43  /* for file infomation */
44  int sid, size, blocks, gblknum, ntasks;
45  sion_int32 fsblksize;
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;
63  _sion_filedesc *sion_filedesc;
64  int mapping_size, nfiles;
65  sion_int32 *mapping;
66 
67  /* parse command line */
68  i = 1;
69  if (argc < 2)
70  usage(argv[0]);
71 
72  while (i < argc) {
73  if (argv[i][0] == '-') {
74  switch (argv[i][1]) {
75  case 'a':
76  printall = 1;
77  break;
78  case 'm':
79  printmap = 1;
80  break;
81  case 'M':
82  printMap = 1;
83  break;
84  case 'v':
85  verbose++;
86  break;
87  case 'l':
88  longspec++;
89  break;
90  case 'k':
91  printkeysstat++;
92  break;
93  case 'K':
94  printkeyslist++;
95  break;
96  case 'S':
97  printisize++;
98  break;
99  case 'h':
100  usage(argv[0]);
101  break;
102  case 'V':
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);
106  exit(1);
107  break;
108  default:
109  usage(argv[0]);
110  }
111  }
112  i++;
113  }
114 
115  strcpy(infilename, argv[argc - 1]);
116 
117  sid = sion_open(infilename, "rb,posix", &ntasks, &nfiles, NULL, &fsblksize, NULL, &fp);
118 
119  if (sid<0) {
120  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"could not open file, aborting %d ...\n", sid));
121  }
122 
123  /* get the sion file structure */
124  if ((_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
125  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
126  }
127 
128  printf("siondump: sid: %d\n", sid);
129  /* printf("siondump: filename: %-30s\n",infilename); */
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);
133  printf("siondump: current endianness: %s\n", (sion_get_endianness())? "big" : "little");
134  printf("siondump: file endianness: %s\n", (sion_get_file_endianness(sid)) ? "big" : "little");
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);
143  printf("siondump: keyval: %d (%s)\n", (int) sion_filedesc->keyvalmode, sion_keyval_type_to_str(sion_filedesc->keyvalmode));
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",
146  (int) sion_filedesc->filesionversion/1000,sion_filedesc->filesionversion%1000,sion_filedesc->filesionpatchlevel,
147  SION_MAIN_VERSION,SION_SUB_VERSION,SION_VERSION_PATCHLEVEL);
148 
149  sion_get_locations(sid, &size, &blocks, &globalskip, &start_of_varheader, &sion_chunksizes, &sion_globalranks,
150  &sion_blockcount, &sion_blocksizes);
151  /* ToDo: data has to be extracted from multifiles */
152  /* printf("siondump: end_of_header: %10lld bytes (%6.2f MB)\n", sion_filedesc->end_of_header, sion_filedesc->end_of_header / 1024.0 / 1024.0); */
153  /* printf("siondump: start_of_data: %10lld bytes (%6.2f MB)\n", sion_filedesc->start_of_data, sion_filedesc->start_of_data / 1024.0 / 1024.0); */
154  /* printf("siondump: start_of_varheader: %10lld bytes (%6.2f MB)\n", start_of_varheader, start_of_varheader / 1024.0 / 1024.0); */
155  printf("siondump: number of blocks: %d\n", blocks);
156  if(printisize) {
157  int num_bytes, num_fds;
158  sion_get_sizeof(sid,&num_bytes, &num_fds);
159  printf("siondump: sizeof internal struct: %d bytes %d file descriptors\n", num_bytes, num_fds);
160  }
161 
162  /* analysis */
163  siondump_sum_full_fsblocks = 0;
164  siondump_sum_part_fsblocks = 0;
165  siondump_sum_bytes_in_part_fsblocks = 0;
166 
167  numfullchunks=numemptychunks=numpartlychunks=0;
168  fullchunkssize=emptychunkssize=partlychunkssize=0;
169 
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;
172 
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;
177 
178  if(blksize==sion_chunksizes[rank]) {
179  numfullchunks++;fullchunkssize+=blksize;
180  } else {
181  if(blksize>0) {
182  numpartlychunks++;partlychunkssize+=blksize;
183  } else {
184  numemptychunks++;emptychunkssize+=sion_chunksizes[rank];
185  }
186  }
187 
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++;
192  }
193  }
194 
195  numemptychunks+=(blocks-sion_blockcount[rank]);
196  emptychunkssize+=(blocks-sion_blockcount[rank])*sion_chunksizes[rank];
197  }
198  siondump_sum_all_fsblocks = siondump_sum_full_fsblocks + siondump_sum_part_fsblocks;
199 
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];
205  }
206 
207  printf("siondump: size of chunks: %12lld bytes (%8.2f MB)\n",
208  siondump_sum_chunksizes,
209  siondump_sum_chunksizes / 1024.0 / 1024.0);
210 
211  printf("siondump: datasize in file (aggr.): %12lld bytes (%8.2f MB)\n",
212  siondump_sum_bytes,
213  siondump_sum_bytes / 1024.0 / 1024.0);
214 
215  printf("siondump: size of full chunks: %12lld bytes (%8.2f MB) # %6lld\n",
216  fullchunkssize,
217  fullchunkssize / 1024.0 / 1024.0, numfullchunks);
218 
219  printf("siondump: size of partly filled chunks: %12lld bytes (%8.2f MB) # %6lld\n",
220  partlychunkssize,
221  partlychunkssize / 1024.0 / 1024.0, numpartlychunks);
222 
223  printf("siondump: size of empty chunks: %12lld bytes (%8.2f MB) # %6lld\n",
224  emptychunkssize,
225  emptychunkssize / 1024.0 / 1024.0,numemptychunks);
226 
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);
230 
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);
234  }
235 
236 
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);
240 
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);
245 
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);
252 
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);
256  }
257 
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);
261  }
262 
263  /* detailed print of block sizes */
264  if (printall) {
265 
266  printf("\n");
267  printf
268  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
269  for (gblknum = 0; gblknum < blocks; gblknum += 10) {
270  printf("%70s", " ");
271  for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
272  printf("BLK%03d ", blknum);
273  }
274  printf("\n");
275  for (rank = 0; rank < size; rank++) {
276  if(!longspec) {
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);
281  }
282  } else {
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]);
287  }
288  }
289  printf("\n");
290  }
291  printf("\n");
292  }
293  printf
294  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
295  }
296 
297  /* detailed list of keys */
298  if (printkeysstat) {
299 
300  uint64_t key;
301  sion_key_stat_t keystat;
302  int i;
303 
304  if((sion_filedesc->keyvalmode!=SION_KEYVAL_NONE) || (sion_filedesc->keyvalmode!=SION_KEYVAL_NONE)) {
305 
306  printf
307  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
308  for (rank = 0; rank < size; rank++) {
310 
311  sion_key_full_scan(sid);
313  i=0;
314  while(sion_key_list_iterator_next(sid,&key)==SION_SUCCESS) {
315  sion_key_get_stat(sid,key,&keystat);
316  printf("Task %02d: key[%02d]=%8ld: #blocks=%6d totalsize=%10ld\n",rank, i++, (long) key, (int) keystat.num_blocks, (long) keystat.total_size);
317  }
318  }
319  } else {
320  fprintf(stderr, "on rank %d: error sid = %d\n",rank,sid);
321  }
322  printf
323  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
324  }
325 
326  /* detailed list of keys */
327  if (printkeyslist) {
328 
329  uint64_t key;
330  size_t value_size;
331  int i;
332 
333  if((sion_filedesc->keyvalmode!=SION_KEYVAL_NONE) || (sion_filedesc->keyvalmode!=SION_KEYVAL_NONE)) {
334 
335  printf
336  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
337  for (rank = 0; rank < size; rank++) {
340  i=0;
341  printf("Task %02d:",rank);
342  while(sion_fread_key_iterator_next(sid,&key,&value_size)==SION_SUCCESS) {
343  if (((i%5)==0) && (i>0)) printf("\n :");
344  printf(" [%02d:k=<%ld>,size=%ld]",i++, (long) key, (long) value_size);
345  }
346  printf("\n");
347  }
348  } else {
349  fprintf(stderr, "on rank %d: error sid = %d\n",rank,sid);
350  }
351  printf
352  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
353  }
354 
355 
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);
363  }
364  printf("------------------------------------------------------------\n");
365 
366  if(printmap) {
367  sion_get_mapping(sid,&mapping_size,&mapping,&nfiles);
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 ");
372  }
373  printf("\n");
374  printf("------------------------------------------------------------\n");
375  }
376  if(printMap) {
377  sion_get_mapping(sid,&mapping_size,&mapping,&nfiles);
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);
383  }
384  }
385  printf("\n");
386  }
387  printf("------------------------------------------------------------\n");
388  }
389  }
390 
391  sion_get_current_locations(sid, &size, &sion_currentpos, &sion_currentblocknr);
392 
393  sion_close(sid);
394 
395  free(siondump_sum_bytes_per_task);
396 
397  return (0);
398 }
399 
400 void usage(char *name)
401 {
402  fprintf(stderr, "Usage: %s options <sionfn>\n\n", name);
403 
404  fprintf(stderr, "Dump meta data information of SIONlib file <sionfn>.\n\n");
405 
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");
417  exit(1);
418 }
int sion_key_list_iterator_next(int sid, uint64_t *keyptr)
Forward to next key.
Sion File Descriptor Structure.
Definition: sion_filedesc.h:79
int sion_get_endianness(void)
Return endianness.
Definition: sion_tools.c:32
int sion_get_file_endianness(int sid)
Returns edianness of data in file sid.
Definition: sion_common.c:253
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.
Definition: sion_serial.c:106
int _sion_vcdtype(int sid)
Definition: sion_fd.c:58
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.
Definition: sion_common.c:307
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.
Definition: sion_common.c:84
#define SION_KEYVAL_NONE
Definition: sion_const.h:79
int sion_get_mapping(int sid, int *mapping_size, sion_int32 **mapping, int *numfiles)
Returns pointers to the internal field mapping.
Definition: sion_common.c:219
char * sion_keyval_type_to_str(int type)
Returns key value mode as string.
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:53
int sion_seek(int sid, int rank, int currentblocknr, sion_int64 posinblk)
Function to set the file pointer to a new position.
Definition: sion_common.c:698
#define SION_CURRENT_POS
Definition: sion_const.h:69
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.
Definition: sion_common.c:1123
int sion_key_list_iterator_reset(int sid)
Resets key iterator.
#define SION_FILEDESCRIPTOR
Definition: sion_fd.h:17
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.
Definition: sion_serial.c:54
int sion_key_get_stat(int sid, uint64_t key, sion_key_stat_t *stat)
get statistics about key
#define SION_CURRENT_CHUNK
Definition: sion_const.h:67