SIONlib  1.7.1
Scalable I/O library for parallel access to task-local files
sion_dup.c
Go to the documentation of this file.
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 
16 #include <stdlib.h>
17 #include <stdio.h>
18 #include <stdarg.h>
19 #include <string.h>
20 #include <time.h>
21 
22 #include <sys/time.h>
23 
24 #include "sion.h"
25 #include "sion_debug.h"
26 #include "sion_error_handler.h"
27 #include "sion_internal.h"
28 #include "sion_metadata.h"
29 #include "sion_filedesc.h"
30 #include "sion_fd.h"
31 #include "sion_file.h"
32 #include "sion_printts.h"
33 #include "sion_keyvalue.h"
34 
35 #include "sion_dup.h"
36 #include "sion_buffer.h"
37 
38 
39 #define DFUNCTION "_sion_dup"
40 
50 int _sion_dup( int sid, int mode, int rank, uint64_t key ) {
51  int rc = SION_NOT_SUCCESS, new_sid = SION_ID_NOT_VALID;
52  _sion_filedesc *sion_filedesc;
53  _sion_filedesc *new_filedesc;
54 
55  /* */ DPRINTFTS(-1, "enter sion_dup");
56  DPRINTFP((2, DFUNCTION, -1, "enter dup sid=%d\n",sid));
57 
58  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
59  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
60  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN, DFUNCTION ": invalid sion_filedesc, returning %d ...\n", sid));
61  }
62 
63  if (sion_filedesc->mode != SION_FILEMODE_READ) {
64  DPRINTFP((8, DFUNCTION, -1, "invalid opened\n"));
65  return(_sion_errorprint_on_rank(SION_ID_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
66  DFUNCTION "[%2d]: file is not opened in read mode, returning ...", sion_filedesc->rank));
67  }
68 
69  _sion_print_filedesc(sion_filedesc, 512, "_sion_dup_orig ", _SION_DEBUG_PRINT_ALL|_SION_DEBUG_PRINT_RECURSIVE);
70 
71 
72  new_filedesc = _sion_dup_filedesc(sion_filedesc);
73  if (!new_filedesc) {
74  return(_sion_errorprint_on_rank(SION_ID_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank, DFUNCTION"[%2d]: could not duplicate internal data structure, returning ...", sion_filedesc->rank));
75  }
76  /* reset dup_state if only one rank/key is selected */
77  if(mode==SION_DUP_RANK) {
78  new_filedesc->dup_mode = SION_DESCSTATE_DUP_SEL_RANK;
79  new_filedesc->dup_sel_rank = (sion_int32) rank;
80  }
81  if(mode==SION_DUP_RANK_KEY) {
83  new_filedesc->dup_sel_rank = (sion_int32) rank;
84  new_filedesc->dup_sel_key = (sion_uint64) key;
85  }
86 
87  /* New sion file handle */
88  new_sid = _sion_newvcd(new_filedesc, SION_FILEDESCRIPTOR);
89  new_filedesc->sid=new_sid;
90 
91 
92  /* mode PAROPEN: in this mode is only one filedesc structure defined; if a
93  multifile was opened each task is only taking part on one of these
94  files, therefore we have not to duplicate recursive */
95  if (sion_filedesc->state == SION_FILESTATE_PAROPEN) {
96  DPRINTFP((8, DFUNCTION, -1, "file is in state SION_FILESTATE_PAROPEN\n"));
97  rc=_sion_dup_paropen(sion_filedesc, new_filedesc);
98  }
99 
100  /* mode seropen: in this mode a sion file could have multiple filedesc structure when opening a SION multi-file */
101  if (sion_filedesc->state == SION_FILESTATE_SEROPEN) {
102  DPRINTFP((8, DFUNCTION, -1, "file is in state SION_FILESTATE_SEROPEN\n"));
103  /* TODO WF implement */
104  return(_sion_errorprint_on_rank(SION_ID_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
105  DFUNCTION "[%2d]: mode not implemented, aborting ...", sion_filedesc->rank));
106  }
107 
108  /* mode seropenrank: in this mode only a simple filedesc structure is used one file, one task */
109  if (sion_filedesc->state == SION_FILESTATE_SEROPENRANK) {
110  DPRINTFP((8, DFUNCTION, -1, "file is in state SION_FILESTATE_SEROPENRANK\n"));
111  /* TODO WF implement */
112  return(_sion_errorprint_on_rank(SION_ID_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
113  DFUNCTION "[%2d]: mode not implemented, aborting ...", sion_filedesc->rank));
114  }
115 
116  /* mode PAROPEN_MAPPED_MASTER: in this mode the whole structure including sub-datastructures for multifiles have to be duplicated */
117  if (sion_filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
118  DPRINTFP((8, DFUNCTION, -1, "file is in state SION_FILESTATE_PAROPENMAPPEDMASTER\n"));
119  rc=_sion_dup_paropenmappedmaster(sion_filedesc, new_filedesc);
120  }
121 
122 
123  if (rc!=SION_SUCCESS) {
124  return(_sion_errorprint_on_rank(SION_ID_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
125  DFUNCTION "[%2d]: could not duplicate, returning ...", sion_filedesc->rank));
126  }
127 
128 
129  /* set position on selected rank if multiple ranks are available
130  Hints: in the optimized version (to be impl.)
131  this is not needed: only the selected rank is copied */
132  if ( (sion_filedesc->state == SION_FILESTATE_SEROPEN) ||
133  (sion_filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER)
134  ){
135  /* _sion_print_filedesc(new_filedesc, 512, "_sion_dup_clone_before_seek", _SION_DEBUG_PRINT_ALL|_SION_DEBUG_PRINT_RECURSIVE); */
136  sion_seek(new_filedesc->sid,rank,SION_CURRENT_CHUNK,SION_CURRENT_POS);
137  }
138 
139  _sion_print_filedesc(new_filedesc, 512, "_sion_dup_clone", _SION_DEBUG_PRINT_ALL|_SION_DEBUG_PRINT_RECURSIVE);
140 
141  DPRINTFP((2, DFUNCTION, -1, "leave dup sid=%d new_sid=%d\n",sid,new_sid));
142  /* */ DPRINTFTS(-1, "leave sion_dup");
143 
144  return(new_sid);
145 
146 }
147 #undef DFUNCTION
148 
149 #define DFUNCTION "_sion_dedup"
150 
155 int _sion_dedup( int sid ) {
156  int rc = SION_SUCCESS;
157  int filenr, lfile, lrank;
158  _sion_filedesc *sion_filedesc;
159  _sion_filedesc *sion_filedesc_sub;
160 
161  /* */ DPRINTFTS(-1, "enter sion_dedup");
162  DPRINTFP((2, DFUNCTION, -1, "enter dedup sid=%d\n",sid));
163 
164  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
165  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
166  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN, DFUNCTION ": invalid sion_filedesc, returning %d ...\n", sid));
167  }
168 
169  if (sion_filedesc->dup_mode == SION_DESCSTATE_ORIG) {
170  return(_sion_errorprint_on_rank(SION_NOT_SUCCESS,_SION_ERROR_RETURN,sion_filedesc->rank, DFUNCTION "[%2d]: descriptor is not a duplicate, returning ...", sion_filedesc->rank));
171  }
172 
173 #ifdef SION_DEBUG
174  {
175  int numbytes, numfds;
176  sion_get_sizeof(sid, &numbytes, &numfds);
177  DPRINTFP((2, DFUNCTION, -1, "internal data size of sid %2d (%d bytes, %d fds) \n", sid,numbytes, numfds));
178  }
179 #endif
180 
181 
182  /* close all files if multi file */
183  if ( (sion_filedesc->state == SION_FILESTATE_SEROPENMASTER)
184  || (sion_filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER) ) {
185 
186  /* pointer to keyval structure -> all_keyvalptr */
187  if(sion_filedesc->keyvalmode!=SION_KEYVAL_NONE) {
188  lfile=sion_filedesc->filenumber;
189  lrank=sion_filedesc->rank; /* index to local list */
190  sion_filedesc_sub=sion_filedesc->multifiles[lfile];
191  if( (lrank>=0) && (lfile>=0)
192  && (sion_filedesc->keyvalptr!=NULL)
193  && (sion_filedesc_sub->all_keyvalptr!=NULL) ) {
194 
195  DPRINTFP((2, DFUNCTION, -1, "keyvalptr all_keyvalptr[%d] = %x\n",lrank,sion_filedesc->keyvalptr));
196  if(sion_filedesc_sub->all_keyvalptr[lrank]!=NULL) {
197  DPRINTFP((2, DFUNCTION, -1, "WARNING keyvalptr already set all_keyvalptr[%d] = %x new =%x \n",lrank,
198  sion_filedesc_sub->all_keyvalptr[lrank],sion_filedesc->keyvalptr));
199  sion_filedesc_sub->all_keyvalptr[lrank] = sion_filedesc->keyvalptr;
200  }
201  sion_filedesc_sub->all_keyvalptr[lrank] = sion_filedesc->keyvalptr;
202  }
203  }
204 
205  /* close file and free data structure for each sub-file */
206  for(filenr=0;filenr<sion_filedesc->nfiles;filenr++) {
207  sion_filedesc_sub=sion_filedesc->multifiles[filenr];
208 
209  if(sion_filedesc_sub->keyvalmode!=SION_KEYVAL_NONE) {
210  sion_filedesc_sub->keyvalptr = NULL;
211  }
212  if (sion_filedesc_sub->usebuffer) _sion_buffer_flush(sion_filedesc_sub);
213  if (sion_filedesc_sub->fileptr!=NULL) {
214  _sion_file_close(sion_filedesc_sub->fileptr);
215  sion_filedesc_sub->fileptr=NULL;
216  }
217  _sion_free_filedesc(sion_filedesc_sub);
218  sion_filedesc->multifiles[filenr] = NULL;
219  }
220 
221  free(sion_filedesc->multifiles);
222 
223  /* the top-level keyvalptr is a pointer to one of the all_keyvalptr of the subfiles, which are already freed */
224  if(sion_filedesc->keyvalmode!=SION_KEYVAL_NONE) sion_filedesc->keyvalptr = NULL;
225 
226  _sion_freevcd(sid);
227  _sion_free_filedesc(sion_filedesc);
228  sion_filedesc = NULL;
229 
230  } else {
231  /* close file and free data structure */
232  if (sion_filedesc->usebuffer) {
233  _sion_buffer_flush(sion_filedesc);
234  }
235  _sion_file_close(sion_filedesc->fileptr);
236  sion_filedesc->fileptr=NULL;
237  _sion_freevcd(sid);
238  _sion_free_filedesc(sion_filedesc);
239  sion_filedesc = NULL;
240  }
241 
242  DPRINTFP((2, DFUNCTION, -1, "leave dedup sid=%d rc=%d\n",sid,rc));
243  /* */ DPRINTFTS(-1, "leave sion_dedup");
244 
245  return(rc);
246 
247 }
248 #undef DFUNCTION
249 
250 
251 #define DFUNCTION "_sion_dup_paropen"
252 
257 int _sion_dup_paropen( _sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc ) {
258  int rc = SION_SUCCESS;
259 
260  DPRINTFP((2, DFUNCTION, -1, "enter \n"));
261 
262  _sion_dup_blocksizes(sion_filedesc, new_filedesc);
263 
264  /* open again the file */
265  new_filedesc->fileptr=_sion_file_open(new_filedesc->fname,sion_filedesc->fileptr->flags,0);
266  if (!new_filedesc->fileptr) {
267  return(_sion_errorprint_on_rank(SION_ID_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
268  DFUNCTION "[%2d]: could not duplicate fileptr, returning ...", sion_filedesc->rank));
269  }
270 
271  /* set filepointer to position in original descriptor */
272  _sion_file_set_position(new_filedesc->fileptr, new_filedesc->currentpos);
273 
274 
275  /* duplicate keyval structures */
276  if(new_filedesc->keyvalmode!=SION_KEYVAL_NONE) {
277  _sion_dup_keyvalptr(sion_filedesc, new_filedesc);
278  }
279 
280  DPRINTFP((2, DFUNCTION, -1, "leave rc=%d\n",rc));
281 
282  return(rc);
283 
284 }
285 #undef DFUNCTION
286 
287 #define DFUNCTION "_sion_dup_paropenmappedmaster"
288 
293 int _sion_dup_paropenmappedmaster( _sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc ) {
294  int rc = SION_SUCCESS;
295  _sion_filedesc *sion_filedesc_sub;
296  int filenr, lfile, lrank;
297 
298  DPRINTFP((2, DFUNCTION, -1, "enter \n"));
299 
300  /* transfer meta data to corresponding sub datastructure, changes maybe caused by seeks before dup */
301  lfile=sion_filedesc->filenumber;
302  lrank=sion_filedesc->rank; /* index to local list */
303  sion_filedesc_sub=sion_filedesc->multifiles[lfile];
304 
305  sion_filedesc_sub->currentpos = sion_filedesc->currentpos;
306  sion_filedesc_sub->currentblocknr = sion_filedesc->currentblocknr;
307 
308  /* pointer to keyval structure */
309  if(sion_filedesc_sub->keyvalmode!=SION_KEYVAL_NONE) sion_filedesc_sub->keyvalptr = sion_filedesc->keyvalptr;
310 
311  /* store data of current rank on sub datastructure */
312  DPRINTFP((4, DFUNCTION, -1, "store current information lrank=%d lastchunknr=%d\n", lrank,sion_filedesc_sub->lastchunknr));
313  sion_filedesc_sub->all_currentpos[lrank] = sion_filedesc_sub->currentpos;
314  sion_filedesc_sub->all_currentblocknr[lrank] = sion_filedesc_sub->currentblocknr;
315 
316  /* pointer to keyval structure */
317  if(sion_filedesc_sub->keyvalmode!=SION_KEYVAL_NONE) {
318  DPRINTFP((2, DFUNCTION, -1, "keyvalptr all_keyvalptr[%d] = %x\n",lrank,sion_filedesc_sub->keyvalptr));
319  sion_filedesc_sub->all_keyvalptr[lrank] = sion_filedesc_sub->keyvalptr;
320  }
321 
322  _sion_dup_blocksizes(sion_filedesc, new_filedesc);
323 
324  /* allocate vector for all datastructures */
325  new_filedesc->multifiles = (_sion_filedesc **) malloc(sion_filedesc->nfiles * sizeof(_sion_filedesc*));
326  if (new_filedesc->multifiles == NULL) {
327  return(_sion_errorprint(SION_ID_UNDEF,_SION_ERROR_RETURN,"cannot allocate filedescriptor structure vector of size %lu (sion_filedesc), aborting ...\n",
328  (unsigned long) sion_filedesc->nfiles * sizeof(_sion_filedesc*)));
329  }
330 
331  /* create data structure for every multifile */
332  for(filenr=0;filenr<sion_filedesc->nfiles;filenr++) {
333  new_filedesc->multifiles[filenr] = _sion_dup_filedesc(sion_filedesc->multifiles[filenr]);
334 
335  new_filedesc->multifiles[filenr]->dup_mode=new_filedesc->dup_mode;
336  new_filedesc->multifiles[filenr]->dup_sel_rank=new_filedesc->dup_sel_rank;
337  new_filedesc->multifiles[filenr]->dup_sel_key=new_filedesc->dup_sel_key;
338 
339  /* open again the file */
340  if(sion_filedesc->multifiles[filenr]->fileptr!=NULL) { /* only if needed */
341  DPRINTFP((2, DFUNCTION, -1, " open file for multifiles[%d]\n",filenr));
342  new_filedesc->multifiles[filenr]->fileptr=_sion_file_open(sion_filedesc->multifiles[filenr]->fname,
343  sion_filedesc->multifiles[filenr]->fileptr->flags,0);
344  if (!new_filedesc->multifiles[filenr]->fileptr) {
345  return(_sion_errorprint_on_rank(SION_ID_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank, DFUNCTION
346  "[%2d]: could not duplicate fileptr, returning ...", sion_filedesc->rank));
347  }
348 
349  /* set filepointer to position in original descriptor */
350  _sion_file_set_position(new_filedesc->multifiles[filenr]->fileptr, new_filedesc->multifiles[filenr]->currentpos);
351 
352  /* copy further data structures */
353  _sion_dup_blocksizes(sion_filedesc->multifiles[filenr], new_filedesc->multifiles[filenr]);
354 
355  /* copy further all_* structures */
356  _sion_dup_all_ds(sion_filedesc->multifiles[filenr], new_filedesc->multifiles[filenr]);
357 
358  /* duplicate keyval structures */
359  if(new_filedesc->multifiles[filenr]->keyvalmode!=SION_KEYVAL_NONE) {
360  _sion_dup_all_keyvalptr(sion_filedesc->multifiles[filenr], new_filedesc->multifiles[filenr]);
361  }
362 
363  }
364 
365 
366  }
367 
368  /* set file pointer of master, position is already set */
369  lfile=sion_filedesc->filenumber;
370  lrank=sion_filedesc->rank;
371  new_filedesc->fileptr=new_filedesc->multifiles[lfile]->fileptr;
372 
373  if(new_filedesc->keyvalmode!=SION_KEYVAL_NONE) {
374  DPRINTFP((2, DFUNCTION, -1, "set keyvalptr on lfile=%d,lrank=%d to %x\n",lfile,lrank,new_filedesc->keyvalptr));
375  new_filedesc->keyvalptr=new_filedesc->multifiles[lfile]->all_keyvalptr[lrank];
376  }
377  DPRINTFP((2, DFUNCTION, -1, "leave rc=%d\n",rc));
378 
379  return(rc);
380 
381 }
382 #undef DFUNCTION
383 
384 
385 #define DFUNCTION "_sion_dup_blocksizes"
386 
391 int _sion_dup_blocksizes( _sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc ) {
392  int rc = SION_SUCCESS;
393  int i;
394 
395  DPRINTFP((32, DFUNCTION, sion_filedesc->rank, "maxusedchunks=%d maxchunks=%d (%d)\n", sion_filedesc->maxusedchunks,sion_filedesc->maxchunks, MAXCHUNKS));
396 
397  /* realloc array */
398  _sion_realloc_filedesc_blocklist(new_filedesc, new_filedesc->maxusedchunks);
399 
400  /* copy data fields */
401  if(sion_filedesc->blocksizes !=NULL) {
402  for (i = 0; i <= sion_filedesc->lastchunknr; i++) {
403  new_filedesc->blocksizes[i] = sion_filedesc->blocksizes[i];
404  }
405  }
406 
407 
408  return(rc);
409 }
410 #undef DFUNCTION
411 
412 
413 
414 #define DFUNCTION "_sion_dup_all_ds"
415 
420 int _sion_dup_all_ds( _sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc ) {
421  int rc = SION_SUCCESS;
422  int i,ltask;
423 
424  DPRINTFP((32, DFUNCTION, sion_filedesc->rank, "ntasks=%d\n", sion_filedesc->ntasks));
425 
426  /* alloc arrays */
427  _sion_alloc_filedesc_all_chunksizes(new_filedesc);
428  _sion_alloc_filedesc_all_globalranks(new_filedesc);
429  _sion_alloc_filedesc_all_localranks(new_filedesc);
430  _sion_alloc_filedesc_all_startpointers(new_filedesc);
431 
432  _sion_alloc_filedesc_block_arrays(new_filedesc); /* all_blockcount, all_currentpos, all_currentblocknr, all_blocksizes */
433 
434  /* copy data fields */
435  for(ltask=0;ltask<new_filedesc->ntasks;ltask++) {
436  new_filedesc->all_chunksizes[ltask]=sion_filedesc->all_chunksizes[ltask];
437  new_filedesc->all_globalranks[ltask]=sion_filedesc->all_globalranks[ltask];
438  new_filedesc->all_localranks[ltask]=sion_filedesc->all_localranks[ltask];
439  new_filedesc->all_startpointers[ltask]=sion_filedesc->all_startpointers[ltask];
440  new_filedesc->all_currentpos[ltask]=sion_filedesc->all_currentpos[ltask];
441  new_filedesc->all_currentblocknr[ltask]=sion_filedesc->all_currentblocknr[ltask];
442  new_filedesc->all_blockcount[ltask]=sion_filedesc->all_blockcount[ltask];
443  DPRINTFP((32, DFUNCTION, sion_filedesc->rank, " sel all_*[%d]\n", ltask));
444  }
445 
446  DPRINTFP((32, DFUNCTION, sion_filedesc->rank, " sel all_blocksizes[0..%d]\n", new_filedesc->maxchunks * new_filedesc->ntasks));
447  for (i = 0; i < new_filedesc->maxchunks * new_filedesc->ntasks; i++) {
448  /* DPRINTFP((32, DFUNCTION, sion_filedesc->rank, " all_blocksizes[%d] = %ld <- %ld\n", i, (long) new_filedesc->all_blocksizes[i], (long) sion_filedesc->all_blocksizes[i])); */
449  new_filedesc->all_blocksizes[i] = sion_filedesc->all_blocksizes[i];
450  }
451 
452  return(rc);
453 }
454 #undef DFUNCTION
455 
456 #define DFUNCTION "_sion_dup_keyvalptr"
457 
462 int _sion_dup_keyvalptr( _sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc ) {
463  int rc = 0;
464 
465  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
466 
467  rc=_sion_keyval_dup_dataptr(sion_filedesc,new_filedesc);
468 
469  DPRINTFP((2, DFUNCTION, -1, "leave rc=%d\n",rc));
470 
471  return(rc);
472 }
473 #undef DFUNCTION
474 
475 
476 #define DFUNCTION "_sion_dup_all_keyvalptr"
477 
482 int _sion_dup_all_keyvalptr( _sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc ) {
483  int rc = SION_SUCCESS;
484  int ltask;
485  void *savep;
486 
487  DPRINTFP((32, DFUNCTION, sion_filedesc->rank, "ntasks=%d\n", sion_filedesc->ntasks));
488 
489  /* alloc arrays */
490  _sion_alloc_filedesc_all_keyvalptr(new_filedesc);
491 
492  /* dup keyvalptr */
493  savep=sion_filedesc->keyvalptr;
494  for(ltask=0;ltask<new_filedesc->ntasks;ltask++) {
495  if(sion_filedesc->all_keyvalptr[ltask]!=NULL) {
496  sion_filedesc->keyvalptr=sion_filedesc->all_keyvalptr[ltask];
497 
498  _sion_keyval_dup_dataptr(sion_filedesc,new_filedesc);
499 
500  DPRINTFP((2, DFUNCTION, -1, "keyvalptr all_keyvalptr[%d] = %x\n",ltask,new_filedesc->keyvalptr));
501  new_filedesc->all_keyvalptr[ltask]=new_filedesc->keyvalptr;
502 
503  DPRINTFP((32, DFUNCTION, sion_filedesc->rank, " duplicated keyvalptr[%d]\n", ltask));
504 
505  }
506 
507  }
508  sion_filedesc->keyvalptr=savep;
509 
510  return(rc);
511 }
512 #undef DFUNCTION
int _sion_buffer_flush(_sion_filedesc *sion_filedesc)
Flush buffer.
Definition: sion_buffer.c:164
sion_int64 _sion_file_set_position(_sion_fileptr *sion_fileptr, sion_int64 startpointer)
Set new position in file.
Definition: sion_file.c:239
_sion_fileptr * _sion_file_open(const char *fname, unsigned int flags, unsigned int addflags)
Create and open a new file for writing.
Definition: sion_file.c:41
Sion File Descriptor Structure.
Definition: sion_filedesc.h:77
sion_int64 * all_blockcount
#define SION_FILESTATE_SEROPEN
Definition: sion_filedesc.h:25
sion_int64 * all_currentpos
sion_int64 * all_globalranks
#define SION_DUP_RANK_KEY
Definition: sion_const.h:77
sion_int64 * all_currentblocknr
int _sion_realloc_filedesc_blocklist(_sion_filedesc *sion_filedesc, sion_int32 maxchunks)
Increase the memory used by the internal sion structure for the blocklist.
#define SION_DESCSTATE_DUP_SEL_RANK_KEY
Definition: sion_filedesc.h:44
int _sion_dup_all_keyvalptr(_sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc)
Duplicate the keyvalue data structures of sion_filedesc.
Definition: sion_dup.c:482
int _sion_vcdtype(int sid)
Definition: sion_fd.c:56
int _sion_dedup(int sid)
Destroy a duplicated sion file descriptor.
Definition: sion_dup.c:155
#define SION_KEYVAL_NONE
Definition: sion_const.h:80
#define MAXCHUNKS
Definition: sion_common.h:35
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:51
int _sion_dup_paropen(_sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc)
Duplicate sion_filedesc if the file is opened in paropen_mapped_master.
Definition: sion_dup.c:257
int _sion_dup(int sid, int mode, int rank, uint64_t key)
Create a duplicated sion file descriptor.
Definition: sion_dup.c:50
#define SION_DESCSTATE_DUP_SEL_RANK
Definition: sion_filedesc.h:43
#define SION_FILEMODE_READ
Definition: sion_filedesc.h:33
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
sion_int64 * all_startpointers
#define SION_CURRENT_POS
Definition: sion_const.h:70
int _sion_file_close(_sion_fileptr *sion_fileptr)
Close file and destroys fileptr structure.
Definition: sion_file.c:118
int _sion_newvcd(void *data, int type)
Definition: sion_fd.c:41
#define SION_DUP_RANK
Definition: sion_const.h:76
int _sion_dup_keyvalptr(_sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc)
Duplicate the keyvalue data structure of sion_filedesc.
Definition: sion_dup.c:462
#define SION_FILESTATE_PAROPEN
Definition: sion_filedesc.h:24
int sion_get_sizeof(int sid, int *numbytes, int *numfds)
Function returns size of internal data structure for sid.
Definition: sion_common.c:1084
sion_int64 * blocksizes
Definition: sion_filedesc.h:98
int _sion_dup_blocksizes(_sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc)
Duplicate the blocksizes array of sion_filedesc.
Definition: sion_dup.c:391
#define SION_FILESTATE_PAROPENMAPPEDMASTER
Definition: sion_filedesc.h:28
sion_int32 currentblocknr
Definition: sion_filedesc.h:95
int _sion_alloc_filedesc_block_arrays(_sion_filedesc *sion_filedesc)
Allocate memory for the internal sion structure, fields for all chunksizes of all tasks.
#define SION_FILESTATE_SEROPENRANK
Definition: sion_filedesc.h:26
int _sion_dup_paropenmappedmaster(_sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc)
Duplicate sion_filedesc if the file is opened in paropen_mapped_master.
Definition: sion_dup.c:293
#define SION_FILEDESCRIPTOR
Definition: sion_fd.h:17
sion_int64 * all_chunksizes
int _sion_print_filedesc(_sion_filedesc *sion_filedesc, int level, char *desc, int flag)
Print the initialized sion file description.
int _sion_freevcd(int sid)
Definition: sion_fd.c:46
sion_int64 * all_localranks
_sion_filedesc * _sion_dup_filedesc(_sion_filedesc *sion_filedesc)
duplicates a filedesc data structure, not copying/reopen active file pointers
Sion Time Stamp Header.
#define SION_DESCSTATE_ORIG
Definition: sion_filedesc.h:41
#define SION_FILESTATE_SEROPENMASTER
Definition: sion_filedesc.h:27
sion_int64 * all_blocksizes
#define SION_CURRENT_CHUNK
Definition: sion_const.h:68
_sion_filedesc ** multifiles
_sion_fileptr * fileptr
Definition: sion_filedesc.h:80
int _sion_dup_all_ds(_sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc)
Duplicate the all* array of sion_filedesc.
Definition: sion_dup.c:420