10 #define _XOPEN_SOURCE 700 18 #include "sion_error_handler.h" 23 #define FILENAME_LENGTH 1024 24 #define FILE_MODE_LENGTH 1024 25 #define MAXNULLCNT 1000 29 static void usage(
char *name);
32 int main(
int argc,
char **argv)
34 char infilename[FILENAME_LENGTH];
35 char outfilename[FILENAME_LENGTH];
36 char file_mode[FILE_MODE_LENGTH];
37 char endianness[FILE_MODE_LENGTH];
38 char keyvalue[FILE_MODE_LENGTH];
42 sion_int64 max_chunksize = 0;
43 char *localbuffer = NULL;
44 long localbuffer_size=-1;
45 sion_int64 left, bread, bsumread, bwrote, bsumwrote;
46 sion_int64 *chunksizes = NULL;
47 int *globalranks = NULL;
52 sion_int32 opt_fsblocksize = -1;
53 sion_int32 opt_nfiles = 1;
56 int ntasks, nfiles, onfiles;
58 int sid, outsid, size, blocks;
59 sion_int64 globalskip;
60 sion_int64 start_of_varheader;
61 sion_int64 *sion_chunksizes;
62 sion_int64 *sion_globalranks;
63 sion_int64 *sion_blockcount;
64 sion_int64 *sion_blocksizes;
65 sion_int64 *siondefrag_sum_bytes_per_task;
66 sion_int64 siondefrag_sum_bytes;
67 sion_int64 siondefrag_filesize;
68 sion_int64 siondefrag_sum_chunksizes;
80 if (argv[i][0] ==
'-') {
91 opt_nfiles = atoi(argv[++i]);
94 opt_fsblocksize = atoi(argv[++i]);
97 opt_fsblocksize = atoi(argv[++i]) MB;
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);
117 strcpy(infilename, argv[argc - 2]);
118 strcpy(outfilename, argv[argc - 1]);
120 printf(
"siondefrag: infilename: %-30s\n", infilename);
121 printf(
"siondefrag: outfilename: %-30s\n", outfilename);
126 sid =
sion_open(infilename,
"rb,posix", &ntasks, &nfiles, &chunksizes, &fsblksize, &globalranks, NULL);
130 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
134 printf(
"siondefrag: sid: %d\n", sid);
135 printf(
"siondefrag: filename: %-30s\n", infilename);
136 printf(
"siondefrag: nfiles: %d\n", nfiles);
137 printf(
"siondefrag: fsblksize: %lu bytes (%6.2f MB)\n", (
unsigned long) fsblksize, fsblksize / 1024.0 / 1024.0);
142 sion_get_locations(sid, &size, &blocks, &globalskip, &start_of_varheader, &sion_chunksizes, &sion_globalranks, &sion_blockcount,
145 printf(
"siondefrag: max number of blocks: %d\n", blocks);
148 siondefrag_sum_bytes_per_task = (sion_int64 *) malloc(ntasks *
sizeof(sion_int64));
149 for (rank = 0; rank < size; rank++)
150 siondefrag_sum_bytes_per_task[rank] = 0;
151 for (rank = 0; rank < size; rank++) {
152 for (blknum = 0; blknum < sion_blockcount[rank]; blknum++) {
153 siondefrag_sum_bytes_per_task[rank] += sion_blocksizes[size * blknum + rank];
156 siondefrag_sum_chunksizes = 0;
157 siondefrag_sum_bytes = 0;
158 for (rank = 0; rank < size; rank++) {
159 siondefrag_sum_bytes += siondefrag_sum_bytes_per_task[rank];
160 siondefrag_sum_chunksizes+= sion_chunksizes[rank];
162 printf(
"siondefrag: datasize in file (aggr.): %lld bytes (%6.2f MB)\n", siondefrag_sum_bytes, siondefrag_sum_bytes / 1024.0 / 1024.0);
163 siondefrag_filesize = start_of_varheader + (blocks + 1) * rank *
sizeof(sion_int64);
164 printf(
"siondefrag: start_of_varheader: %lld bytes (%6.2f MB)\n", start_of_varheader, start_of_varheader / 1024.0 / 1024.0);
165 printf(
"siondefrag: size of chunks: %lld bytes (%6.2f MB)\n", siondefrag_sum_chunksizes, siondefrag_sum_chunksizes / 1024.0 / 1024.0);
166 if (siondefrag_filesize > 0) {
167 printf(
"siondefrag: file usage: %8.6f%%\n", (
double) siondefrag_sum_bytes / (
double) siondefrag_sum_chunksizes * 100.0);
171 for (rank = 0; rank < size; rank++) {
172 if (sion_chunksizes[rank] > max_chunksize)
173 max_chunksize = sion_chunksizes[rank];
174 for (blknum = 0; blknum < sion_blockcount[rank]; blknum++) {
175 if (sion_blocksizes[size * blknum + rank] > max_chunksize)
176 max_chunksize = sion_blocksizes[size * blknum + rank];
180 for (rank = 0; rank < size; rank++)
181 chunksizes[rank] = (sion_int64) siondefrag_sum_bytes_per_task[rank];
183 if (opt_fsblocksize != -1)
184 fsblksize = opt_fsblocksize;
186 onfiles = opt_nfiles;
191 sprintf(endianness,
"endianness=big");
193 sprintf(endianness,
"endianness=little");
196 sprintf(keyvalue,
"keyval=none");
198 sprintf(keyvalue,
"keyval=inline");
200 fprintf(stderr,
"unknown keyvalue mode ..., aborting\n");
201 free(siondefrag_sum_bytes_per_task);
210 printf(
"siondefrag: max chunksize: %lld\n", max_chunksize);
211 localbuffer = (
char *) malloc(max_chunksize *
sizeof(
char));
212 if (localbuffer == NULL) {
213 free(siondefrag_sum_bytes_per_task);
214 fprintf(stderr,
"cannot allocate localbuffer of size %lld , aborting ...\n", max_chunksize *
sizeof(
char));
219 sprintf(file_mode,
"wb,posix,%s",endianness);
220 outsid =
sion_open(outfilename, file_mode, &ntasks, &onfiles, &chunksizes, &fsblksize, &globalranks, NULL);
222 printf(
"siondefrag: outsid: %d\n", outsid);
223 printf(
"siondefrag: fsblksize outfile: %lu\n", (
unsigned long) fsblksize);
225 for (rank = 0; rank < size; rank++) {
229 printf(
"siondefrag: ->rank: %d\n", rank);
231 if (rank % 16 == 0) {
232 printf(
"[%d]", rank);
238 printf(
"siondefrag: copy now %lld blocks on rank=%d \n", sion_blockcount[rank], rank);
239 for (blknum = 0; blknum < sion_blockcount[rank]; blknum++) {
245 left = sion_blocksizes[size * blknum + rank];
247 printf(
"siondefrag: copy now block #%d with %lld bytes \n", blknum, left);
251 bread =
sion_fread(localbuffer + bsumread, 1, left, sid);
259 if (nullcount > MAXNULLCNT) {
260 fprintf(stderr,
"timeout on read data , aborting ...\n");
266 left = sion_blocksizes[size * blknum + rank];
269 bwrote =
sion_fwrite(localbuffer + bsumwrote, 1, left, outsid);
277 if (nullcount > MAXNULLCNT) {
278 fprintf(stderr,
"timeout on write data , aborting ...\n");
285 if (!verbose) printf(
"\n");
292 sprintf(file_mode,
"wb,posix,%s,%s",endianness,keyvalue);
293 outsid =
sion_open(outfilename, file_mode, &ntasks, &onfiles, &chunksizes, &fsblksize, &globalranks, NULL);
295 for (rank = 0; rank < size; rank++) {
298 printf(
"siondefrag: ->rank: %d\n", rank);
300 if (rank % 16 == 0) {
301 printf(
"[%d]", rank);
318 if((
long) localbuffer_size< (
long) len) {
319 if(localbuffer_size>0) {
322 localbuffer = (
char *) malloc(len *
sizeof(
char));
323 if (localbuffer == NULL) {
324 fprintf(stderr,
"cannot allocate localbuffer of size %zu , aborting ...\n", len *
sizeof(
char));
325 free(siondefrag_sum_bytes_per_task);
328 localbuffer_size=len;
332 printf(
"siondefrag: copy now key[%12ld] with %zu bytes \n", (
long) key, len);
338 fprintf(stderr,
"cannot read data of key %ld with len %zu, aborting ...\n",(
long) key, (
size_t) len *
sizeof(
char));
339 free(siondefrag_sum_bytes_per_task);
347 fprintf(stderr,
"cannot write data of key %ld with len %zu, aborting ...\n",(
long) key, (
size_t) len *
sizeof(
char));
348 free(siondefrag_sum_bytes_per_task);
359 if (!verbose) printf(
"\n");
362 free(siondefrag_sum_bytes_per_task);
370 void usage(
char *name)
372 fprintf(stderr,
"Usage: %s options <insionfn> <outfn>\n\n", name);
374 fprintf(stderr,
"Creates a new SIONlib file <outfn> from an existing <insionfn>. The\n");
375 fprintf(stderr,
"resulting file has only one chunk. This can be used to make SIONlib\n");
376 fprintf(stderr,
"files less sparse (e.g. by using -q 1 which effectively removes file\n");
377 fprintf(stderr,
"system block alignment).\n\n");
379 fprintf(stderr,
"Options:\n");
380 fprintf(stderr,
" [-Q <fsblksize>] filessystem blocksize for new sion file in MB\n");
381 fprintf(stderr,
" (default from input file)\n");
382 fprintf(stderr,
" [-q <fsblksize>] filessystem blocksize for new sion file in bytes\n");
383 fprintf(stderr,
" [-v] verbose mode\n");
384 fprintf(stderr,
" [-V] show version of SIONlib\n");
385 fprintf(stderr,
" [-h] show this help\n");
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.
#define SION_KEYVAL_INLINE
int sion_close(int sid)
Close a sion file.
int _sion_vcdtype(int sid)
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.
size_t sion_fwrite(const void *data, size_t size, size_t nitems, int sid)
Write data to sion file.
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.
#define SION_FILEDESCRIPTOR
size_t sion_fread(void *data, size_t size, size_t nitems, int sid)
Read data from sion file.
size_t sion_fread_key(void *data, uint64_t key, size_t size, size_t nitems, int sid)
Read data for key.
size_t sion_fwrite_key(const void *data, uint64_t key, size_t size, size_t nitems, int sid)
Writes data for key.
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.