SIONlib  1.7.1
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-2016 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <ctype.h>
14 
15 #include "sion.h"
16 #include "sion_error_handler.h"
17 #include "sion_internal.h"
18 #include "sion_fd.h"
19 #include "sion_filedesc.h"
20 
21 #define FILENAME_LENGTH 1024
22 
23 static void usage(char *name);
24 
25 int main(int argc, char **argv)
26 {
27  FILE *fp;
28  char infilename[FILENAME_LENGTH], fname[FILENAME_LENGTH];
29  int i, f, rank, blknum;
30 
31  /* options */
32  int printall = 0;
33  int printmap = 0;
34  int printMap = 0;
35  int verbose = 0;
36  int longspec = 0;
37  int printisize = 0;
38  int printkeysstat = 0;
39  int printkeyslist = 0;
40 
41  /* for file infomation */
42  int sid, size, blocks, gblknum, ntasks;
43  sion_int32 fsblksize;
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;
61  _sion_filedesc *sion_filedesc;
62  int mapping_size, nfiles;
63  sion_int32 *mapping;
64 
65  /* parse command line */
66  i = 1;
67  if (argc < 2)
68  usage(argv[0]);
69 
70  while (i < argc) {
71  if (argv[i][0] == '-') {
72  switch (argv[i][1]) {
73  case 'a':
74  printall = 1;
75  break;
76  case 'm':
77  printmap = 1;
78  break;
79  case 'M':
80  printMap = 1;
81  break;
82  case 'v':
83  verbose++;
84  break;
85  case 'l':
86  longspec++;
87  break;
88  case 'k':
89  printkeysstat++;
90  break;
91  case 'K':
92  printkeyslist++;
93  break;
94  case 'S':
95  printisize++;
96  break;
97  case 'h':
98  usage(argv[0]);
99  break;
100  case 'V':
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);
104  exit(1);
105  break;
106  default:
107  usage(argv[0]);
108  }
109  }
110  i++;
111  }
112 
113  strcpy(infilename, argv[argc - 1]);
114 
115  sid = sion_open(infilename, "rb,posix", &ntasks, &nfiles, NULL, &fsblksize, NULL, &fp);
116 
117  if (sid<0) {
118  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"could not open file, aborting %d ...\n", sid));
119  }
120 
121  /* get the sion file structure */
122  if ((_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
123  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
124  }
125 
126  printf("siondump: sid: %d\n", sid);
127  /* printf("siondump: filename: %-30s\n",infilename); */
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);
131  printf("siondump: current endianness: %s\n", (sion_get_endianness())? "big" : "little");
132  printf("siondump: file endianness: %s\n", (sion_get_file_endianness(sid)) ? "big" : "little");
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);
141  printf("siondump: keyval: %d (%s)\n", (int) sion_filedesc->keyvalmode, sion_keyval_type_to_str(sion_filedesc->keyvalmode));
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",
144  (int) sion_filedesc->filesionversion/1000,sion_filedesc->filesionversion%1000,sion_filedesc->filesionpatchlevel,
145  SION_MAIN_VERSION,SION_SUB_VERSION,SION_VERSION_PATCHLEVEL);
146 
147  sion_get_locations(sid, &size, &blocks, &globalskip, &start_of_varheader, &sion_chunksizes, &sion_globalranks,
148  &sion_blockcount, &sion_blocksizes);
149  /* ToDo: data has to be extracted from multifiles */
150  /* 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); */
151  /* 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); */
152  /* printf("siondump: start_of_varheader: %10lld bytes (%6.2f MB)\n", start_of_varheader, start_of_varheader / 1024.0 / 1024.0); */
153  printf("siondump: number of blocks: %d\n", blocks);
154  if(printisize) {
155  int num_bytes, num_fds;
156  sion_get_sizeof(sid,&num_bytes, &num_fds);
157  printf("siondump: sizeof internal struct: %d bytes %d file descriptors\n", num_bytes, num_fds);
158  }
159 
160  /* analysis */
161  siondump_sum_full_fsblocks = 0;
162  siondump_sum_part_fsblocks = 0;
163  siondump_sum_bytes_in_part_fsblocks = 0;
164 
165  numfullchunks=numemptychunks=numpartlychunks=0;
166  fullchunkssize=emptychunkssize=partlychunkssize=0;
167 
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;
170 
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;
175 
176  if(blksize==sion_chunksizes[rank]) {
177  numfullchunks++;fullchunkssize+=blksize;
178  } else {
179  if(blksize>0) {
180  numpartlychunks++;partlychunkssize+=blksize;
181  } else {
182  numemptychunks++;emptychunkssize+=sion_chunksizes[rank];
183  }
184  }
185 
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++;
190  }
191  }
192 
193  numemptychunks+=(blocks-sion_blockcount[rank]);
194  emptychunkssize+=(blocks-sion_blockcount[rank])*sion_chunksizes[rank];
195  }
196  siondump_sum_all_fsblocks = siondump_sum_full_fsblocks + siondump_sum_part_fsblocks;
197 
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];
203  }
204 
205  printf("siondump: size of chunks: %12lld bytes (%8.2f MB)\n",
206  siondump_sum_chunksizes,
207  siondump_sum_chunksizes / 1024.0 / 1024.0);
208 
209  printf("siondump: datasize in file (aggr.): %12lld bytes (%8.2f MB)\n",
210  siondump_sum_bytes,
211  siondump_sum_bytes / 1024.0 / 1024.0);
212 
213  printf("siondump: size of full chunks: %12lld bytes (%8.2f MB) # %6lld\n",
214  fullchunkssize,
215  fullchunkssize / 1024.0 / 1024.0, numfullchunks);
216 
217  printf("siondump: size of partly filled chunks: %12lld bytes (%8.2f MB) # %6lld\n",
218  partlychunkssize,
219  partlychunkssize / 1024.0 / 1024.0, numpartlychunks);
220 
221  printf("siondump: size of empty chunks: %12lld bytes (%8.2f MB) # %6lld\n",
222  emptychunkssize,
223  emptychunkssize / 1024.0 / 1024.0,numemptychunks);
224 
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);
228 
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);
232  }
233 
234 
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);
238 
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);
243 
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);
250 
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);
254  }
255 
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);
259  }
260 
261  /* detailed print of block sizes */
262  if (printall) {
263 
264  printf("\n");
265  printf
266  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
267  for (gblknum = 0; gblknum < blocks; gblknum += 10) {
268  printf("%70s", " ");
269  for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
270  printf("BLK%03d ", blknum);
271  }
272  printf("\n");
273  for (rank = 0; rank < size; rank++) {
274  if(!longspec) {
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);
279  }
280  } else {
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]);
285  }
286  }
287  printf("\n");
288  }
289  printf("\n");
290  }
291  printf
292  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
293  }
294 
295  /* detailed list of keys */
296  if (printkeysstat) {
297 
298  uint64_t key;
299  sion_key_stat_t keystat;
300  int i;
301 
302  if((sion_filedesc->keyvalmode!=SION_KEYVAL_NONE) || (sion_filedesc->keyvalmode!=SION_KEYVAL_NONE)) {
303 
304  printf
305  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
306  for (rank = 0; rank < size; rank++) {
308 
309  sion_key_full_scan(sid);
311  i=0;
312  while(sion_key_list_iterator_next(sid,&key)==SION_SUCCESS) {
313  sion_key_get_stat(sid,key,&keystat);
314  printf("Task %02d: key[%02d]=%8ld: #blocks=%6d totalsize=%10ld\n",rank, i++, (long) key, (int) keystat.num_blocks, (long) keystat.total_size);
315  }
316  }
317  } else {
318  fprintf(stderr, "on rank %d: error sid = %d\n",rank,sid);
319  }
320  printf
321  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
322  }
323 
324  /* detailed list of keys */
325  if (printkeyslist) {
326 
327  uint64_t key;
328  size_t value_size;
329  int i;
330 
331  if((sion_filedesc->keyvalmode!=SION_KEYVAL_NONE) || (sion_filedesc->keyvalmode!=SION_KEYVAL_NONE)) {
332 
333  printf
334  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
335  for (rank = 0; rank < size; rank++) {
338  i=0;
339  printf("Task %02d:",rank);
340  while(sion_fread_key_iterator_next(sid,&key,&value_size)==SION_SUCCESS) {
341  if (((i%5)==0) && (i>0)) printf("\n :");
342  printf(" [%02d:k=<%ld>,size=%ld]",i++, (long) key, (long) value_size);
343  }
344  printf("\n");
345  }
346  } else {
347  fprintf(stderr, "on rank %d: error sid = %d\n",rank,sid);
348  }
349  printf
350  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
351  }
352 
353 
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);
361  }
362  printf("------------------------------------------------------------\n");
363 
364  if(printmap) {
365  sion_get_mapping(sid,&mapping_size,&mapping,&nfiles);
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 ");
370  }
371  printf("\n");
372  printf("------------------------------------------------------------\n");
373  }
374  if(printMap) {
375  sion_get_mapping(sid,&mapping_size,&mapping,&nfiles);
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);
381  }
382  }
383  printf("\n");
384  }
385  printf("------------------------------------------------------------\n");
386  }
387  }
388 
389  sion_get_current_locations(sid, &size, &sion_currentpos, &sion_currentblocknr);
390 
391  sion_close(sid);
392 
393  free(siondump_sum_bytes_per_task);
394 
395  return (0);
396 }
397 
398 void usage(char *name)
399 {
400  fprintf(stderr, "Usage: %s options <sionfn>\n\n", name);
401 
402  fprintf(stderr, "Dump meta data information of SIONlib file <sionfn>.\n\n");
403 
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");
415  exit(1);
416 }
int sion_key_list_iterator_next(int sid, uint64_t *keyptr)
Forward to next key.
Sion File Descriptor Structure.
Definition: sion_filedesc.h:77
int sion_get_endianness(void)
Return endianness.
Definition: sion_tools.c:30
int sion_get_file_endianness(int sid)
Returns edianness of data in file sid.
Definition: sion_common.c:255
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:113
int _sion_vcdtype(int sid)
Definition: sion_fd.c:56
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:309
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:86
#define SION_KEYVAL_NONE
Definition: sion_const.h:80
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:221
char * sion_keyval_type_to_str(int type)
Returns key value mode as string.
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:51
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:659
#define SION_CURRENT_POS
Definition: sion_const.h:70
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:1084
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:61
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:68