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