SIONlib  1.7.1
Scalable I/O library for parallel access to task-local files
sion_metadata.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 
14 #include <stdlib.h>
15 #include <stdio.h>
16 #include <string.h>
17 #include <time.h>
18 #include <assert.h>
19 
20 #include "sion.h"
21 #include "sion_debug.h"
22 #include "sion_error_handler.h"
23 #include "sion_printts.h"
24 #include "sion_internal.h"
25 #include "sion_file.h"
26 #include "sion_filedesc.h"
27 #include "sion_metadata.h"
28 
29 #define DFUNCTION "_sion_write_header"
30 
37 {
38  int rc = SION_SUCCESS;
39  size_t nwrite;
40  char *lprefix;
41 
42  char *sionstr = SION_ID;
43  sion_uint32 endianness_writeval;
44  sion_int32 sion_version, sion_version_patchlevel, sion_fileformat_version;
45 
46 
47  DPRINTFP((2, DFUNCTION, -1, "enter write\n"));
48  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
49 
50  /* SIONSTR */
51  nwrite = _sion_file_write(sionstr, strlen(sionstr), sion_filedesc->fileptr);
52  if (nwrite != strlen(sionstr)) {
53  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(SIONID) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
54  }
55  DPRINTFP((32, DFUNCTION, -1, " wrote sionstr nwrite=%lu\n", (unsigned long) nwrite));
56 
57  /* endianness */
58  endianness_writeval = sion_filedesc->endianness;
59  nwrite = _sion_file_write(&endianness_writeval, sizeof(endianness_writeval), sion_filedesc->fileptr);
60  if (nwrite != sizeof(endianness_writeval)) {
61  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(endianness) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
62  }
63  DPRINTFP((32, DFUNCTION, -1, " wrote endianness 0x%x nwrite=%lu\n", endianness_writeval, (unsigned long) nwrite));
64 
65  /* VERSION Information */
66  sion_version = 1000 * SION_MAIN_VERSION + SION_SUB_VERSION;
67  sion_version_patchlevel = SION_VERSION_PATCHLEVEL;
68  sion_fileformat_version = SION_FILEFORMAT_VERSION;
69 
70  nwrite = _sion_file_write(&sion_version, sizeof(sion_version), sion_filedesc->fileptr);
71  if (nwrite != sizeof(sion_version)) {
72  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(sion_version) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
73  }
74  DPRINTFP((32, DFUNCTION, -1, " wrote sion_version %ld nwrite=%lu\n", sion_version, (unsigned long) nwrite));
75 
76  nwrite = _sion_file_write(&sion_version_patchlevel, sizeof(sion_version_patchlevel), sion_filedesc->fileptr);
77  if (nwrite != sizeof(sion_version_patchlevel)) {
78  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(sion_version_patchlevel) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
79  }
80  DPRINTFP((32, DFUNCTION, -1, " wrote sion_version_patchlevel %ld nwrite=%lu\n", sion_version_patchlevel, (unsigned long) nwrite));
81 
82  nwrite = _sion_file_write(&sion_fileformat_version, sizeof(sion_fileformat_version), sion_filedesc->fileptr);
83  if (nwrite != sizeof(sion_fileformat_version)) {
84  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(sion_fileformat_version) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
85  }
86  DPRINTFP((32, DFUNCTION, -1, " wrote sion_fileformat_version %ld nwrite=%lu\n", sion_fileformat_version, (unsigned long) nwrite));
87 
88  /* fsblksize */
89  nwrite = _sion_file_write(&sion_filedesc->fsblksize, sizeof(sion_filedesc->fsblksize), sion_filedesc->fileptr);
90  if (nwrite != sizeof(sion_filedesc->fsblksize)) {
91  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(fsblksize) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
92  }
93  DPRINTFP((32, DFUNCTION, -1, " wrote fsblksize %ld nwrite=%lu\n", sion_filedesc->fsblksize, (unsigned long) nwrite));
94 
95  /* ntasks */
96  nwrite = _sion_file_write(&sion_filedesc->ntasks, sizeof(sion_filedesc->ntasks), sion_filedesc->fileptr);
97  if (nwrite != sizeof(sion_filedesc->ntasks)) {
98  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(ntasks) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
99  }
100  DPRINTFP((32, DFUNCTION, -1, " wrote ntasks %ld nwrite=%lu\n", sion_filedesc->ntasks, (unsigned long) nwrite));
101 
102  /* nfiles */
103  nwrite = _sion_file_write(&sion_filedesc->nfiles, sizeof(sion_filedesc->nfiles), sion_filedesc->fileptr);
104  if (nwrite != sizeof(sion_filedesc->nfiles)) {
105  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(nfiles) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
106  }
107  DPRINTFP((32, DFUNCTION, -1, " wrote nfiles %d nwrite=%lu\n", sion_filedesc->nfiles, (unsigned long) nwrite));
108 
109  /* filenumber */
110  nwrite = _sion_file_write(&sion_filedesc->filenumber, sizeof(sion_filedesc->filenumber), sion_filedesc->fileptr);
111  if (nwrite != sizeof(sion_filedesc->filenumber)) {
112  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(filenumber) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
113  }
114  DPRINTFP((32, DFUNCTION, -1, " wrote filenumber %d nwrite=%lu\n", sion_filedesc->filenumber, (unsigned long) nwrite));
115 
116  /* flag1 --> keyval-mode since file format version 5 (upper 32bit) */
117  sion_filedesc->flag1=(sion_int64) sion_filedesc->keyvalmode * 1<<32;
118  nwrite = _sion_file_write(&sion_filedesc->flag1, sizeof(sion_filedesc->flag1), sion_filedesc->fileptr);
119  if (nwrite != sizeof(sion_filedesc->flag1)) {
120  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(flag1) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
121  }
122  DPRINTFP((32, DFUNCTION, -1, " wrote flag1 %lld nwrite=%lu\n", sion_filedesc->flag1, (unsigned long) nwrite));
123 
124  /* flag2 */
125  nwrite = _sion_file_write(&sion_filedesc->flag2, sizeof(sion_filedesc->flag2), sion_filedesc->fileptr);
126  if (nwrite != sizeof(sion_filedesc->flag2)) {
127  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(flag2) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
128  }
129  DPRINTFP((32, DFUNCTION, -1, " wrote flag2 %d nwrite=%lu\n", sion_filedesc->flag2, (unsigned long) nwrite));
130 
131  /* prefix */
132  if (sion_filedesc->prefix==NULL) {
133  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(prefix) to file, data not available, aborting ...\n"));
134  }
135  lprefix = calloc(SION_FILENAME_LENGTH,1);
136  if (lprefix == NULL) {
137  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot allocate temporary memory of size %lu (lprefix), aborting ...\n", (unsigned long) SION_FILENAME_LENGTH));
138  }
139  strncpy(lprefix,sion_filedesc->prefix,SION_FILENAME_LENGTH);
140  nwrite = _sion_file_write(lprefix, SION_FILENAME_LENGTH, sion_filedesc->fileptr);
141  if (nwrite != SION_FILENAME_LENGTH) {
142  free(lprefix);
143  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(lprefix) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
144  }
145  free(lprefix); lprefix=NULL;
146  DPRINTFP((32, DFUNCTION, -1, " wrote prefix =%s\n", sion_filedesc->prefix));
147 
148  /* globalranks */
149  if (sion_filedesc->all_globalranks==NULL) {
150  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(globalranks) to file, data not available, aborting ...\n"));
151  }
152  nwrite = _sion_file_write(sion_filedesc->all_globalranks, sizeof(sion_int64) * sion_filedesc->ntasks, sion_filedesc->fileptr);
153  if (nwrite != sizeof(sion_int64) * sion_filedesc->ntasks) {
154  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(globalranks) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
155  }
156  DPRINTFP((32, DFUNCTION, -1, " wrote globalranks nwrite=%lu\n", (unsigned long) nwrite));
157 
158  /* chunksizes */
159  if (sion_filedesc->all_chunksizes==NULL) {
160  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(chunksizes) to file, data not available, aborting ...\n"));
161  }
162  nwrite = _sion_file_write(sion_filedesc->all_chunksizes, sizeof(sion_int64) * sion_filedesc->ntasks, sion_filedesc->fileptr);
163  if (nwrite != sizeof(sion_int64) * sion_filedesc->ntasks) {
164  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(chunksizes) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
165  }
166  DPRINTFP((32, DFUNCTION, -1, " wrote chunksizes nwrite=%lu\n", (unsigned long) nwrite));
167 
168  _sion_file_flush(sion_filedesc->fileptr);
169  DPRINTFP((2, DFUNCTION, -1, "leave write\n"));
170 
171  return (rc);
172 }
173 #undef DFUNCTION
174 
175 #define DFUNCTION "_sion_write_header_var_info"
176 
183 {
184  int rc = SION_SUCCESS;
185  size_t nwrite;
186 
187  DPRINTFP((2, DFUNCTION, -1, "enter write\n"));
188 
189  _sion_file_flush(sion_filedesc->fileptr);
190  _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->end_of_header);
191  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " after set fp to end_of_header, fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
192 
193  /* maxusedchunks */
194  nwrite = _sion_file_write(&sion_filedesc->maxusedchunks, sizeof(sion_filedesc->maxusedchunks), sion_filedesc->fileptr);
195  if (nwrite != sizeof(sion_filedesc->maxusedchunks)) {
196  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(maxusedchunks) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
197  }
198  DPRINTFP((32, DFUNCTION, -1, " wrote maxusedchunks %d nwrite=%lu\n", sion_filedesc->maxusedchunks, (unsigned long) nwrite));
199 
200  /* start_of_varheader */
201  nwrite = _sion_file_write(&sion_filedesc->start_of_varheader, sizeof(sion_filedesc->start_of_varheader), sion_filedesc->fileptr);
202  if (nwrite != sizeof(sion_filedesc->start_of_varheader)) {
203  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(start_of_varheader) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
204  }
205  DPRINTFP((32, DFUNCTION, -1, " wrote start_of_varheader %d nwrite=%lu\n", sion_filedesc->start_of_varheader, (unsigned long) nwrite));
206 
207  _sion_file_flush(sion_filedesc->fileptr);
208  DPRINTFP((2, DFUNCTION, -1, "leave write\n"));
209 
210  return (rc);
211 }
212 #undef DFUNCTION
213 
214 #define DFUNCTION "_sion_write_header_var_part_blocksizes"
215 
222 {
223  int rc = SION_SUCCESS;
224  size_t nwrite;
225 
226  DPRINTFP((2, DFUNCTION, -1, "enter write\n"));
227 
228  _sion_file_flush(sion_filedesc->fileptr);
229  _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->start_of_varheader);
230  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " after set fp to start_of_varheader, fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
231 
232  /* all_blockcount */
233  nwrite = _sion_file_write(sion_filedesc->all_blockcount, sizeof(sion_int64) * sion_filedesc->ntasks, sion_filedesc->fileptr);
234  if (nwrite != sizeof(sion_int64) * sion_filedesc->ntasks) {
235  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(all_blockcount) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
236  }
237  DPRINTFP((32, DFUNCTION, -1, " wrote all_blockcount field %d elements nwrite=%lu\n", sion_filedesc->ntasks, (unsigned long) nwrite));
238 
239  /* all_blocksizes */
240  nwrite = _sion_file_write(sion_filedesc->all_blocksizes, sizeof(sion_int64) * sion_filedesc->ntasks * sion_filedesc->maxusedchunks, sion_filedesc->fileptr);
241  if (nwrite != sizeof(sion_int64) * sion_filedesc->ntasks * sion_filedesc->maxusedchunks) {
242  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(all_blocksizes) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
243  }
244  DPRINTFP((32, DFUNCTION, -1, " wrote all_blocksizes field %d elements nwrite=%lu\n", sion_filedesc->ntasks * sion_filedesc->maxusedchunks, (unsigned long) nwrite));
245 
246  _sion_file_flush(sion_filedesc->fileptr);
247  DPRINTFP((2, DFUNCTION, -1, "leave write\n"));
248 
249  return (rc);
250 }
251 #undef DFUNCTION
252 
253 #define DFUNCTION "_sion_write_header_var_part_mapping"
254 
263  sion_int32 mapping_size,
264  sion_int32 *mapping )
265 {
266  int rc = SION_SUCCESS, lrank;
267  size_t nwrite;
268  sion_int64 position;
269 
270  DPRINTFP((2, DFUNCTION, -1, "enter write\n"));
271 
272  position=sion_filedesc->start_of_varheader
273  + sion_filedesc->ntasks * sizeof(sion_int64)
274  + sion_filedesc->ntasks * sion_filedesc->maxusedchunks *sizeof(sion_int64);
275 
276  _sion_file_flush(sion_filedesc->fileptr);
277  _sion_file_set_position(sion_filedesc->fileptr, position);
278  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " after set fp to start_of_varheader, fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
279 
280  /* mapping_size */
281  nwrite = _sion_file_write(&mapping_size, sizeof(sion_int32), sion_filedesc->fileptr);
282  if (nwrite != sizeof(sion_int32)) {
283  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(mapping_size) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
284  }
285  DPRINTFP((32, DFUNCTION, -1, " wrote mapping_size=%d elements nwrite=%lu\n", mapping_size, (unsigned long) nwrite));
286 
287  /* mapping */
288  if(mapping_size>0) {
289  nwrite = _sion_file_write(mapping, sizeof(sion_int32) * 2 * mapping_size, sion_filedesc->fileptr);
290  if (nwrite != sizeof(sion_int32) * 2 * mapping_size) {
291  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot write header(mapping) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
292  }
293  DPRINTFP((32, DFUNCTION, -1, " wrote mapping field %d elements nwrite=%lu\n", 2 * mapping_size, (unsigned long) nwrite*2*mapping_size));
294  for (lrank = 0; lrank < mapping_size; lrank++) {
295  DPRINTFP((2048, DFUNCTION, - 1, " mapping[%4d]=(%10ld,%10ld)\n", lrank,mapping[lrank*2],mapping[lrank*2+1]));
296  }
297  } else {
298  DPRINTFP((32, DFUNCTION, -1, " wrote no mapping field\n"));
299  }
300  _sion_file_flush(sion_filedesc->fileptr);
301  DPRINTFP((2, DFUNCTION, -1, "leave write\n"));
302 
303  return (rc);
304 }
305 #undef DFUNCTION
306 
307 
308 #define DFUNCTION "_sion_read_header_fix_part"
309 
316 {
317  int rc = SION_SUCCESS;
318  size_t nread;
319  char *sionstr, *lprefix;
320  sion_uint32 lendianness;
321  sion_int32 lfsblksize;
322  sion_int32 Rsion_version, Rsion_version_patchlevel, Rsion_fileformat_version;
323 
324  DPRINTFP((2, DFUNCTION, -1, "enter read fix_part\n"));
325  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
326 
327  /* SION id string */
328  sionstr = (char *) malloc(strlen(SION_ID) * sizeof(char));
329  nread = _sion_file_read(sionstr, strlen(SION_ID), sion_filedesc->fileptr);
330  if (nread != strlen(SION_ID)) {
331  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_fix_part: cannot read header(SION_ID) from file, aborting ... (%lu!=%lu)\n",
332  (unsigned long) nread, (unsigned long) strlen(SION_ID)));
333  }
334  DPRINTFP((32, DFUNCTION, -1, " sionstr =>%c%c%c%c<\n", sionstr[0], sionstr[1], sionstr[2], sionstr[3]));
335  /* Check if this is a sion file */
336  if (strncmp(sionstr, SION_ID, strlen(SION_ID))) {
337  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: not a sion file(ID: %c%c%c%c)\n", sionstr[0], sionstr[1], sionstr[2], sionstr[3]));
338  }
339  free(sionstr);
340 
341  /* endianness */
342  nread = _sion_file_read(&lendianness, sizeof(lendianness), sion_filedesc->fileptr);
343  if (nread != sizeof(lendianness)) {
344  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header: cannot read header(endianness) from file, aborting ... (%lu!=%lu)\n",(unsigned long) nread, (unsigned long) sizeof(lendianness)));
345  }
346  sion_filedesc->endianness = lendianness;
347  /* Check only first byte. Others are set for symmetry or user data */
348  sion_filedesc->swapbytes = ((sion_filedesc->endianness & 1) != sion_get_endianness());
349  DPRINTFP((32, DFUNCTION, -1, " endianness =0x%x swapbytes=%d\n", sion_filedesc->endianness, sion_filedesc->swapbytes));
350 
351 
352  /* VERSION Information */
353  nread = _sion_file_read(&Rsion_version, sizeof(Rsion_version), sion_filedesc->fileptr);
354  if (nread != sizeof(Rsion_version)) {
355  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_fix_part: cannot read header(sion_version) from file, aborting ... (%lu!=%lu)\n", (unsigned long) nread, (unsigned long) sizeof(Rsion_version)));
356  }
357  sion_swap(&Rsion_version, &Rsion_version, sizeof(Rsion_version), 1, sion_filedesc->swapbytes);
358  sion_filedesc->filesionversion=Rsion_version;
359  DPRINTFP((32, DFUNCTION, -1, " sion_version=%d\n", Rsion_version));
360 
361  nread = _sion_file_read(&Rsion_version_patchlevel, sizeof(Rsion_version_patchlevel), sion_filedesc->fileptr);
362  if (nread != sizeof(Rsion_version_patchlevel)) {
363  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_fix_part: cannot read header(sion_version_patchlevel) from file, aborting ... (%lu!=%lu)\n",
364  (unsigned long) nread, (unsigned long) sizeof(Rsion_version_patchlevel)));
365  }
366  sion_swap(&Rsion_version_patchlevel, &Rsion_version_patchlevel, sizeof(Rsion_version_patchlevel), 1, sion_filedesc->swapbytes);
367  sion_filedesc->filesionpatchlevel=Rsion_version_patchlevel;
368  DPRINTFP((32, DFUNCTION, -1, " sion_version_patchlevel=%d\n", (int) Rsion_version_patchlevel));
369 
370  nread = _sion_file_read(&Rsion_fileformat_version, sizeof(Rsion_fileformat_version), sion_filedesc->fileptr);
371  if (nread != sizeof(Rsion_fileformat_version)) {
372  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_fix_part: cannot read header(sion_fileformat_version) from file, aborting ... (%lu!=%lu)\n",
373  (unsigned long) nread, (unsigned long) sizeof(Rsion_fileformat_version)));
374  }
375  sion_swap(&Rsion_fileformat_version, &Rsion_fileformat_version, sizeof(Rsion_fileformat_version), 1, sion_filedesc->swapbytes);
376  sion_filedesc->fileversion=Rsion_fileformat_version;
377  DPRINTFP((32, DFUNCTION, -1, " sion_fileformat_version=%d\n", (int) Rsion_fileformat_version));
378 
379  if (Rsion_fileformat_version != SION_FILEFORMAT_VERSION) {
380  if(Rsion_fileformat_version<2) {
381  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sionlib: FATAL ERROR: file format version of file differs, aborting ... (%lu!=%lu)\n",
382  (unsigned long) Rsion_fileformat_version, (unsigned long) SION_FILEFORMAT_VERSION));
383  } else {
384  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_WARN,"sionlib: FATAL WARNING: old file format version of file differs, trying to read ... (%lu!=%lu)\n",
385  (unsigned long) Rsion_fileformat_version, (unsigned long) SION_FILEFORMAT_VERSION);
386  }
387  }
388 
389  /* file block size */
390  nread = _sion_file_read(&sion_filedesc->fsblksize, sizeof(lfsblksize), sion_filedesc->fileptr);
391 
392  if (nread != sizeof(sion_filedesc->fsblksize)) {
393  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_fix_part: cannot read header(fsblksize) from file, aborting ... (%lu!=%lu)\n",
394  (unsigned long) nread, (unsigned long) sizeof(sion_filedesc->fsblksize)));
395  }
396  sion_swap(&sion_filedesc->fsblksize, &sion_filedesc->fsblksize, sizeof(sion_filedesc->fsblksize), 1, sion_filedesc->swapbytes);
397  DPRINTFP((32, DFUNCTION, -1, " fsblksize=%d\n", sion_filedesc->fsblksize));
398 
399  /* number of tasks */
400  nread = _sion_file_read(&sion_filedesc->ntasks, sizeof(sion_filedesc->ntasks), sion_filedesc->fileptr);
401  if (nread != sizeof(sion_filedesc->ntasks)) {
402  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_fix_part: cannot read header(ntasks) from file, aborting ... (%lu!=%lu)\n",
403  (unsigned long) nread, (unsigned long) sizeof(sion_filedesc->ntasks)));
404  }
405  sion_swap(&sion_filedesc->ntasks, &sion_filedesc->ntasks, sizeof(sion_filedesc->ntasks), 1, sion_filedesc->swapbytes);
406  DPRINTFP((32, DFUNCTION, -1, " ntasks =%d\n", sion_filedesc->ntasks));
407 
408  /* number of files */
409  nread = _sion_file_read(&sion_filedesc->nfiles, sizeof(sion_filedesc->nfiles), sion_filedesc->fileptr);
410  if (nread != sizeof(sion_filedesc->nfiles)) {
411  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_fix_part: cannot read header(nfiles) from file, aborting ... (%lu!=%lu)\n",
412  (unsigned long) nread, (unsigned long) sizeof(sion_filedesc->nfiles)));
413  }
414  sion_swap(&sion_filedesc->nfiles, &sion_filedesc->nfiles, sizeof(sion_filedesc->nfiles), 1, sion_filedesc->swapbytes);
415  DPRINTFP((32, DFUNCTION, -1, " nfiles =%d\n", sion_filedesc->nfiles));
416 
417  /* current file number */
418  if(sion_filedesc->fileversion>=3) {
419  nread = _sion_file_read(&sion_filedesc->filenumber, sizeof(sion_filedesc->filenumber), sion_filedesc->fileptr);
420  if (nread != sizeof(sion_filedesc->filenumber)) {
421  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_fix_part: cannot read header(filenumber) from file, aborting ... (%lu!=%lu)\n",
422  (unsigned long) nread, (unsigned long) sizeof(sion_filedesc->filenumber)));
423  }
424  sion_swap(&sion_filedesc->filenumber, &sion_filedesc->filenumber, sizeof(sion_filedesc->filenumber), 1, sion_filedesc->swapbytes);
425  } else {
426  sion_filedesc->filenumber = 1;
427  }
428  DPRINTFP((32, DFUNCTION, -1, " filenumber =%d\n", sion_filedesc->filenumber));
429 
430 
431  /* flag1 */
432  if(Rsion_fileformat_version>=3) {
433  nread = _sion_file_read(&sion_filedesc->flag1, sizeof(sion_filedesc->flag1), sion_filedesc->fileptr);
434  if (nread != sizeof(sion_filedesc->flag1)) {
435  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_fix_part: cannot read header(flag1) from file, aborting ... (%lu!=%lu)\n",
436  (unsigned long) nread, (unsigned long) sizeof(sion_filedesc->flag1)));
437  }
438  sion_swap(&sion_filedesc->flag1, &sion_filedesc->flag1, sizeof(sion_filedesc->flag1), 1, sion_filedesc->swapbytes);
439  } else {
440  sion_filedesc->flag1 = _SION_FLAG1_NONE;
441  }
442  DPRINTFP((32, DFUNCTION, -1, " flag1 =%lld\n", sion_filedesc->flag1));
443 
444  if(Rsion_fileformat_version>=5) {
445  /* flag1 --> keyval-mode since file format version 5 (upper 32bit) */
446  sion_filedesc->keyvalmode=sion_filedesc->flag1>>32;
447  DPRINTFP((32, DFUNCTION, -1, " keyvalmode=%d (%s)\n", (int) sion_filedesc->keyvalmode, sion_keyval_type_to_str(sion_filedesc->keyvalmode) ));
448  if(sion_filedesc->keyvalmode==0) {
449  sion_filedesc->keyvalmode=SION_KEYVAL_NONE;
450  DPRINTFP((32, DFUNCTION, -1, " keyvalmode is not set correctly in file, setting default=%d (%s)\n", (int) sion_filedesc->keyvalmode, sion_keyval_type_to_str(sion_filedesc->keyvalmode) ));
451  }
452  } else {
453  sion_filedesc->keyvalmode=SION_KEYVAL_NONE; /* not implemented before version 5 of file format */
454  DPRINTFP((32, DFUNCTION, -1, " file format version <5, setting default keyvalmode=%d (%s)\n", (int) sion_filedesc->keyvalmode, sion_keyval_type_to_str(sion_filedesc->keyvalmode) ));
455  }
456 
457 
458  /* flag2 */
459  if(Rsion_fileformat_version>=3) {
460  nread = _sion_file_read(&sion_filedesc->flag2, sizeof(sion_filedesc->flag2), sion_filedesc->fileptr);
461  if (nread != sizeof(sion_filedesc->flag2)) {
462  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_fix_part: cannot read header(flag2) from file, aborting ... (%lu!=%lu)\n",
463  (unsigned long) nread, (unsigned long) sizeof(sion_filedesc->flag2)));
464  }
465  sion_swap(&sion_filedesc->flag2, &sion_filedesc->flag2, sizeof(sion_filedesc->flag2), 1, sion_filedesc->swapbytes);
466  } else {
467  sion_filedesc->flag2 = _SION_FLAG2_NONE;
468  }
469  DPRINTFP((32, DFUNCTION, -1, " flag2 =%lld\n", sion_filedesc->flag2));
470 
471  /* file name prefix */
472  lprefix = malloc(SION_FILENAME_LENGTH);
473  nread = _sion_file_read(lprefix, SION_FILENAME_LENGTH, sion_filedesc->fileptr);
474  if (nread != SION_FILENAME_LENGTH) {
475  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_fix_part: cannot read header(lprefix) from file, aborting ... (%lu!=%d)\n", (unsigned long) nread, SION_FILENAME_LENGTH));
476  }
477  sion_filedesc->prefix=strdup(lprefix);
478  free(lprefix);
479  DPRINTFP((32, DFUNCTION, -1, " prefix =%s\n", sion_filedesc->prefix));
480 
481 
482  /* */ DPRINTFTS(sion_filedesc->rank, "before purge");
483  _sion_file_purge(sion_filedesc->fileptr);
484  /* */ DPRINTFTS(sion_filedesc->rank, "after purge");
485 
486  sion_filedesc->end_of_header=_sion_file_get_position(sion_filedesc->fileptr);
487 
488  DPRINTFP((2, DFUNCTION, -1, "leave read fix_part\n"));
489 
490  return (rc);
491 }
492 #undef DFUNCTION
493 
494 #define DFUNCTION "_sion_read_header_var_part"
495 
502 {
503  int rc = SION_SUCCESS;
504  size_t nread;
505  sion_int32 Rmaxchunks;
506 
507  DPRINTFP((32, DFUNCTION, -1, "enter read var_part\n"));
508  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
509 
510  /* globalranks */
511  nread = _sion_file_read(sion_filedesc->all_globalranks, sizeof(sion_int64) * sion_filedesc->ntasks, sion_filedesc->fileptr);
512  if (nread != sizeof(sion_int64) * sion_filedesc->ntasks) {
513  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part: cannot read header(globalranks) from file, aborting ... (%d)\n", sion_filedesc->ntasks));
514  }
515  sion_swap(sion_filedesc->all_globalranks, sion_filedesc->all_globalranks, sizeof(sion_int64), sion_filedesc->ntasks, sion_filedesc->swapbytes);
516 
517  /* chunksizes */
518  nread = _sion_file_read(sion_filedesc->all_chunksizes, sizeof(sion_int64) * sion_filedesc->ntasks, sion_filedesc->fileptr);
519  if (nread != sizeof(sion_int64) * sion_filedesc->ntasks) {
520  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part: cannot read header(chunksizes) from file, aborting ... (%d!=%lu)\n", sion_filedesc->ntasks, (unsigned long) nread));
521  }
522  sion_swap(sion_filedesc->all_chunksizes, sion_filedesc->all_chunksizes, sizeof(sion_int64), sion_filedesc->ntasks, sion_filedesc->swapbytes);
523 
524  /* maxchunks -> maxusedchunks */
525  nread = _sion_file_read(&Rmaxchunks, sizeof(Rmaxchunks), sion_filedesc->fileptr);
526  if (nread != sizeof(Rmaxchunks)) {
527  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part: cannot read header(maxchunks) from file, aborting ... (%lu!=%lu)\n",
528  (unsigned long) nread, (unsigned long) sizeof(Rmaxchunks)));
529  }
530  sion_swap(&Rmaxchunks, &Rmaxchunks, sizeof(Rmaxchunks), 1, sion_filedesc->swapbytes);
531  DPRINTFP((32, DFUNCTION, -1, " maxchunks=%d\n", Rmaxchunks));
532 
533  sion_filedesc->maxusedchunks=Rmaxchunks;
534  if(Rmaxchunks>sion_filedesc->maxchunks) _sion_realloc_filedesc_blocklist(sion_filedesc, Rmaxchunks);
535 
536  /* start_of_varheader */
537  nread = _sion_file_read(&sion_filedesc->start_of_varheader, sizeof(sion_filedesc->start_of_varheader), sion_filedesc->fileptr);
538  if (nread != sizeof(sion_filedesc->start_of_varheader)) {
539  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part: cannot read header(start_of_varheader) from file, aborting ... (%lu!=%lu)\n",
540  (unsigned long) nread, (unsigned long) sizeof(sion_filedesc->start_of_varheader)));
541  }
542  if (sion_filedesc->start_of_varheader == 0) {
543  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part: bad value for start_of_varheader (=%lu), aborting ...\n",
544  (unsigned long) sion_filedesc->start_of_varheader));
545  }
546  sion_swap(&sion_filedesc->start_of_varheader, &sion_filedesc->start_of_varheader, sizeof(sion_filedesc->start_of_varheader), 1, sion_filedesc->swapbytes);
547 
548  DPRINTFP((32, DFUNCTION, -1, "leave read var_part start_of_varheader=%lld\n", sion_filedesc->start_of_varheader));
549 
550  return (rc);
551 
552 }
553 #undef DFUNCTION
554 
555 #define DFUNCTION "_sion_rd_hdr_var_prt_blkcnt_to_field"
556 
565  int field_size,
566  sion_int64 *field )
567 {
568  int rc = SION_SUCCESS;
569  size_t nread;
570 
571  DPRINTFP((32, DFUNCTION, -1, "enter\n"));
572  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
573 
574  if (field_size < sion_filedesc->ntasks) {
575  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_blockcount_to_field: cannot read header(blocksizes) field too small, aborting ... (%d<%d)\n", field_size, sion_filedesc->ntasks));
576  }
577  /* set file pointer to start of Meta Block 2 */
578  _sion_file_purge(sion_filedesc->fileptr);
579  _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->start_of_varheader);
580 
581  nread = _sion_file_read(field, sizeof(sion_int64) * sion_filedesc->ntasks, sion_filedesc->fileptr);
582  if (nread != sizeof(sion_int64) * sion_filedesc->ntasks) {
583  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_blockcount_to_field: cannot read blocksizes from meta block 2 of the file, aborting ... (%d,%d)\n", sion_filedesc->ntasks, nread));
584  }
585  sion_swap(field, field, sizeof(sion_int64), sion_filedesc->ntasks, sion_filedesc->swapbytes);
586 
587 
588  DPRINTFP((32, DFUNCTION, -1, "leave \n"));
589 
590  return (rc);
591 
592 }
593 #undef DFUNCTION
594 
595 #define DFUNCTION "_sion_rd_hdr_vr_prt_nxtblksizes_to_field"
596 
606  int field_size,
607  sion_int64 *field )
608 {
609  size_t nread;
610  int rc = SION_SUCCESS;
611 
612  DPRINTFP((32, DFUNCTION, -1, "enter\n"));
613  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
614 
615  if (field_size < sion_filedesc->ntasks) {
616  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_nextblocksizes_to_field: cannot read header(blocksizes) field too small, aborting ... (%d<%d)\n", field_size, sion_filedesc->ntasks));
617  }
618  nread = _sion_file_read(field, sizeof(sion_int64) * sion_filedesc->ntasks, sion_filedesc->fileptr);
619  if (nread != sizeof(sion_int64) * sion_filedesc->ntasks) {
620  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_nextblocksizes_to_field: cannot read blocksizes from meta block 2 of the file, aborting ... (%d,%d)\n", sion_filedesc->ntasks, nread));
621  }
622  sion_swap(field, field, sizeof(sion_int64), sion_filedesc->ntasks, sion_filedesc->swapbytes);
623 
624 
625  DPRINTFP((32, DFUNCTION, -1, "leave \n"));
626 
627  return (rc);
628 
629 }
630 #undef DFUNCTION
631 
632 #define DFUNCTION "_sion_read_header_var_part_blocksizes"
633 
640 {
641  int rc = SION_SUCCESS;
642  size_t nread;
643  int i;
644 
645  DPRINTFP((32, DFUNCTION, -1, "enter read\n"));
646  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
647 
648  _sion_file_purge(sion_filedesc->fileptr);
649  _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->start_of_varheader);
650 
651  /* all_blockcount */
652  nread = _sion_file_read(sion_filedesc->all_blockcount, sizeof(sion_int64) * sion_filedesc->ntasks, sion_filedesc->fileptr);
653  if (nread != sizeof(sion_int64) * sion_filedesc->ntasks) {
654  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_blocksizes: cannot read header from file(sion_blockcount), aborting ... (%d)\n", sion_filedesc->ntasks));
655  }
656  sion_swap(sion_filedesc->all_blockcount, sion_filedesc->all_blockcount, sizeof(sion_int64), sion_filedesc->ntasks, sion_filedesc->swapbytes);
657  for (i = 0; i < sion_filedesc->ntasks; i++)
658  DPRINTFP((2048, DFUNCTION, -1, " read, numblocks on task %02d is %10lld\n", i, sion_filedesc->all_blockcount[i]));
659 
660  /* all_blocksizes */
661  nread = _sion_file_read(sion_filedesc->all_blocksizes, sizeof(sion_int64) * sion_filedesc->ntasks * sion_filedesc->maxusedchunks, sion_filedesc->fileptr);
662  if (nread != sizeof(sion_int64) * sion_filedesc->ntasks * sion_filedesc->maxusedchunks) {
663  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_blocksizes: cannot read header(sion_blocksizes) from file, aborting ... (%lu!=%lu)\n",
664  (unsigned long) sion_filedesc->ntasks * sion_filedesc->maxusedchunks, (unsigned long) nread));
665  }
666  sion_swap(sion_filedesc->all_blocksizes, sion_filedesc->all_blocksizes, sizeof(sion_int64), sion_filedesc->ntasks * sion_filedesc->maxusedchunks, sion_filedesc->swapbytes);
667 
668  for (i = 0; i < sion_filedesc->ntasks; i++)
669  DPRINTFP((2048, DFUNCTION, -1, " read, blocksize[0] on task %02d is %10lld\n", i, sion_filedesc->all_blocksizes[0*sion_filedesc->ntasks+i]));
670 
671  DPRINTFP((32, DFUNCTION, -1, "leave read\n"));
672  return (rc);
673 
674 }
675 
676 #undef DFUNCTION
677 
678 #define DFUNCTION "_sion_read_header_var_part_mapping"
679 
688 {
689  int rc = SION_SUCCESS;
690  size_t nread;
691  sion_int64 position;
692 
693  DPRINTFP((32, DFUNCTION, -1, "enter read\n"));
694 
695  position=sion_filedesc->start_of_varheader
696  + sion_filedesc->ntasks * sizeof(sion_int64)
697  + sion_filedesc->ntasks * sion_filedesc->maxusedchunks *sizeof(sion_int64);
698  _sion_file_purge(sion_filedesc->fileptr);
699  _sion_file_set_position(sion_filedesc->fileptr, position);
700  DPRINTFP((32, DFUNCTION, -1, "calculate position %lld + %d * %d = %lld\n",sion_filedesc->start_of_varheader,sion_filedesc->ntasks,sion_filedesc->maxusedchunks,position ));
701  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
702 
703  /* read mapping_size */
704  nread = _sion_file_read(&sion_filedesc->mapping_size, sizeof(sion_filedesc->mapping_size), sion_filedesc->fileptr);
705  if (nread != sizeof(sion_filedesc->mapping_size)) {
706  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_mapping: cannot read header(mapping_size) from file, aborting ... (%d)\n", nread));
707  }
708  sion_swap(&sion_filedesc->mapping_size,&sion_filedesc->mapping_size, sizeof(sion_filedesc->mapping_size), 1, sion_filedesc->swapbytes);
709  DPRINTFP((32, DFUNCTION, -1, "mapping_size=%ld\n", (long) sion_filedesc->mapping_size));
710 
711  /* allocate mapping vector */
712  sion_filedesc->mapping = (sion_int32 *) malloc(sion_filedesc->mapping_size * 2 * sizeof(sion_int32));
713  if (sion_filedesc->mapping == NULL) {
714  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_mapping: cannot allocate temporary memory of size %lu (mapping), aborting ...\n", (unsigned long) 2 * sion_filedesc->mapping_size * sizeof(sion_int64)));
715  }
716  DPRINTFP((32, DFUNCTION, -1, "alloc mapping vector size=%d (%lu bytes)\n", sion_filedesc->mapping_size, (long) sion_filedesc->mapping_size * 2 * sizeof(sion_int32)));
717 
718  /* read mapping */
719  nread = _sion_file_read(sion_filedesc->mapping, sizeof(sion_int32) * sion_filedesc->mapping_size * 2, sion_filedesc->fileptr);
720  DPRINTFP((32, DFUNCTION, -1, "read mapping, %d \n", nread));
721  if (nread != (sizeof(sion_int32) * sion_filedesc->mapping_size * 2)) {
722  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_mapping: cannot read header(mapping) from file, aborting ... (%d!=%lu)\n", sion_filedesc->mapping_size*2, (unsigned long) nread));
723  }
724  sion_swap(sion_filedesc->mapping,sion_filedesc->mapping, sizeof(sion_int32), sion_filedesc->mapping_size * 2, sion_filedesc->swapbytes);
725 
726  DPRINTFP((32, DFUNCTION, -1, "leave read\n"));
727 
728  return (rc);
729 
730 }
731 #undef DFUNCTION
732 
733 #define DFUNCTION "_sion_read_header_var_part_locations_rank"
734 
740 /* TODO: _sion_filedesc *sion_filedesc -> fileptr */
742 {
743  int rc = SION_SUCCESS;
744  int i, numblocks;
745  size_t nread;
746  sion_int64 position;
747  sion_int64 helpint64;
748 
749  DPRINTFP((32, DFUNCTION, -1, "enter read for rank %d of %d\n",sion_filedesc->rank,sion_filedesc->ntasks));
750 
751  _sion_file_purge(sion_filedesc->fileptr);
752  _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->start_of_varheader);
753 
754  /* read number of blocks */
755  nread = _sion_file_read(&helpint64, sizeof(sion_int64), sion_filedesc->fileptr);
756  sion_swap(&helpint64,&helpint64, sizeof(sion_int64), 1, sion_filedesc->swapbytes);
757  numblocks = helpint64;
758  if (nread != sizeof(sion_int64)) {
759  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_locations_rank: cannot read header(numblocks) from file, aborting ... (%d)\n", sion_filedesc->ntasks));
760  }
761  sion_filedesc->maxusedchunks = numblocks;
762  sion_filedesc->lastchunknr = numblocks-1;
763 
764  /* read blocksizes */
765  for (i = 0; i < numblocks; i++) {
766 
767  position = sion_filedesc->start_of_varheader
768  + (i + 1) * sion_filedesc->ntasks * sizeof(sion_int64)
769  + sion_filedesc->rank * sizeof(sion_int64);
770  _sion_file_purge(sion_filedesc->fileptr);
771  _sion_file_set_position(sion_filedesc->fileptr, position);
772 
773  nread = _sion_file_read(&helpint64, sizeof(sion_int64), sion_filedesc->fileptr);
774  if (nread != sizeof(sion_int64)) {
775  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_locations_rank: cannot read header(blocksizes) from file, aborting ... (%d!=%lu)\n", 1, (unsigned long) nread));
776  }
777  sion_swap(&helpint64,&helpint64, sizeof(sion_int64), 1, sion_filedesc->swapbytes);
778  sion_filedesc->blocksizes[i] = helpint64;
779  DPRINTFP((32, "_sion_read_header_var_part_locations_rank", -1, "read blocksizes[%i], %lld start_of_varheader=%lld\n", i, helpint64, sion_filedesc->start_of_varheader));
780 
781  }
782 
783  DPRINTFP((32, DFUNCTION, -1, "leave read\n"));
784 
785  return (rc);
786 
787 }
788 #undef DFUNCTION
789 
790 #define DFUNCTION "_sion_read_header_var_part_mapping_rank"
791 
800 {
801  int rc = SION_SUCCESS;
802  int msize;
803  size_t nread;
804  sion_int64 position;
805  sion_int32 helpint32;
806 
807  DPRINTFP((32, DFUNCTION, -1, "enter read for rank %d of %d\n",sion_filedesc->rank,sion_filedesc->ntasks));
808 
809  position=sion_filedesc->start_of_varheader
810  + sion_filedesc->ntasks * sizeof(sion_int64)
811  + sion_filedesc->ntasks * sion_filedesc->maxusedchunks *sizeof(sion_int64);
812  _sion_file_purge(sion_filedesc->fileptr);
813  _sion_file_set_position(sion_filedesc->fileptr, position);
814  DPRINTFP((32, DFUNCTION, -1, "calculate position %lld + %d * %d = %lld\n",sion_filedesc->start_of_varheader,sion_filedesc->ntasks,sion_filedesc->maxusedchunks,position ));
815  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
816 
817  /* read mapping_size */
818  nread = _sion_file_read(&helpint32, sizeof(sion_int32), sion_filedesc->fileptr);
819  if (nread != sizeof(sion_int32)) {
820  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_mapping_rank: cannot read header(mapping_size) from file, aborting ... (%d)\n", sion_filedesc->ntasks));
821  }
822  sion_swap(&helpint32,&helpint32, sizeof(sion_int32), 1, sion_filedesc->swapbytes);
823  msize = helpint32;
824  DPRINTFP((32, "_sion_read_header_var_part_mapping_rank", -1, "read mapping_size %d \n", msize));
825 
826  if((sion_filedesc->rank<0) || (sion_filedesc->rank>=msize)) {
827  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_mapping_rank: wrong rank %d not between 0 .. %d aborting ...\n", sion_filedesc->rank,msize));
828  }
829 
830  /* move to position in mapping table for rank */
831  position=sion_filedesc->start_of_varheader
832  + sion_filedesc->ntasks * sizeof(sion_int64)
833  + sion_filedesc->ntasks * sion_filedesc->maxusedchunks *sizeof(sion_int64)
834  + sizeof(sion_int32)
835  + 2*sion_filedesc->rank*sizeof(sion_int32);
836 
837  _sion_file_purge(sion_filedesc->fileptr);
838  _sion_file_set_position(sion_filedesc->fileptr, position);
839 
840  /* allocate mapping vector of length 1 */
841  sion_filedesc->mapping_size=1;
842  /* allocate mapping vector */
843  sion_filedesc->mapping = (sion_int32 *) malloc(sion_filedesc->mapping_size * 2 * sizeof(sion_int32));
844  if (sion_filedesc->mapping == NULL) {
845  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_mapping: cannot allocate temporary memory of size %lu (mapping), aborting ...\n", (unsigned long) 2 * sion_filedesc->mapping_size * sizeof(sion_int64)));
846  }
847  DPRINTFP((32, DFUNCTION, -1, "alloc mapping vector size=%d (%lu bytes)\n", sion_filedesc->mapping_size, (long) sion_filedesc->mapping_size * 2 * sizeof(sion_int32)));
848 
849  /* read mapping for rank */
850  nread = _sion_file_read(sion_filedesc->mapping, sizeof(sion_int32) * sion_filedesc->mapping_size * 2, sion_filedesc->fileptr);
851  DPRINTFP((32, DFUNCTION, -1, "read mapping, %d \n", nread));
852  if (nread != (sizeof(sion_int32) * sion_filedesc->mapping_size * 2)) {
853  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_mapping: cannot read header(mapping) from file, aborting ... (%d!=%lu)\n", sion_filedesc->mapping_size*2, (unsigned long) nread));
854  }
855  sion_swap(sion_filedesc->mapping,sion_filedesc->mapping, sizeof(sion_int32), sion_filedesc->mapping_size * 2, sion_filedesc->swapbytes);
856 
857  DPRINTFP((32, DFUNCTION, -1, "leave read filenumber=%d lrank=%d\n",sion_filedesc->mapping[0], sion_filedesc->mapping[1]));
858 
859  return (rc);
860 
861 }
862 #undef DFUNCTION
863 
864 
865 #define DFUNCTION "_sion_wr_hdr_var_prt_blkcnt_from_field"
866 
875  int field_size,
876  sion_int64 *field )
877 {
878  size_t nwrite;
879  int rc=SION_SUCCESS;
880 
881  DPRINTFP((32, DFUNCTION, -1, "enter\n"));
882  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
883 
884  if (field_size < sion_filedesc->ntasks) {
885  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_read_header_var_part_blockcount_to_field: cannot read header(blocksizes) field too small, aborting ... (%d<%d)\n", field_size, sion_filedesc->ntasks));
886  }
887  /* set file pointer to start of Meta Block 2 */
888  _sion_file_purge(sion_filedesc->fileptr);
889  _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->start_of_varheader);
890 
891  nwrite = _sion_file_write(field, sizeof(sion_int64) * sion_filedesc->ntasks, sion_filedesc->fileptr);
892  if (nwrite != sizeof(sion_int64) * sion_filedesc->ntasks) {
893  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header_var_part_blockcount_from_field: cannot write header(all_blockcount) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
894  }
895  DPRINTFP((32, DFUNCTION, -1, " wrote all_blockcount field %d elements nwrite=%lu\n", sion_filedesc->ntasks, (unsigned long) nwrite));
896 
897  DPRINTFP((32, DFUNCTION, -1, "leave \n"));
898 
899  return (rc);
900 
901 }
902 #undef DFUNCTION
903 
904 #define DFUNCTION "_sion_wr_hdr_vr_prt_nxtblksizes_from_field"
905 
915  int field_size,
916  sion_int64 *field )
917 {
918  int rc=SION_SUCCESS;
919  size_t nwrite;
920 
921  DPRINTFP((32, DFUNCTION, -1, "enter\n"));
922  DPRINTFP((16, DFUNCTION, sion_filedesc->rank, " fileptr is at position %14lld\n", _sion_file_get_position(sion_filedesc->fileptr)));
923 
924  if (field_size < sion_filedesc->ntasks) {
925  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header_var_part_nextblocksizes_from_field: cannot write header(blocksizes) field too small, aborting ... (%d<%d)\n", field_size, sion_filedesc->ntasks));
926  }
927  nwrite = _sion_file_write(field, sizeof(sion_int64) * sion_filedesc->ntasks, sion_filedesc->fileptr);
928  if (nwrite != sizeof(sion_int64) * sion_filedesc->ntasks) {
929  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_write_header_var_part_nextblocksizes_from_field: cannot write header(all_blocksizes) to file, aborting ... (%lu)\n", (unsigned long) nwrite));
930  }
931  DPRINTFP((32, DFUNCTION, -1, " wrote all_blocksizes field %d elements nwrite=%lu\n", sion_filedesc->ntasks, (unsigned long) nwrite));
932 
933  DPRINTFP((32, DFUNCTION, -1, "leave \n"));
934 
935  return (rc);
936 
937 }
938 #undef DFUNCTION
939 
sion_int64 _sion_file_write(const void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Write data to file.
Definition: sion_file.c:148
sion_int64 _sion_file_get_position(_sion_fileptr *sion_fileptr)
Get new position in file.
Definition: sion_file.c:272
sion_int64 _sion_file_set_position(_sion_fileptr *sion_fileptr, sion_int64 startpointer)
Set new position in file.
Definition: sion_file.c:239
Sion File Descriptor Structure.
Definition: sion_filedesc.h:77
#define _SION_FLAG1_NONE
Definition: sion_filedesc.h:17
int sion_get_endianness(void)
Return endianness.
Definition: sion_tools.c:30
sion_int64 * all_blockcount
int _sion_read_header_var_part(_sion_filedesc *sion_filedesc)
Read the second part of SION Meta Block 1.
int _sion_write_header_var_part_mapping(_sion_filedesc *sion_filedesc, sion_int32 mapping_size, sion_int32 *mapping)
Write mapping into the SION Meta Block 2.
int _sion_file_purge(_sion_fileptr *sion_fileptr)
Purge data to file.
Definition: sion_file.c:328
sion_int64 _sion_file_read(void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Read data from file.
Definition: sion_file.c:169
sion_int32 filesionpatchlevel
sion_int64 * all_globalranks
int _sion_write_header(_sion_filedesc *sion_filedesc)
Write the SION Meta Block 1.
Definition: sion_metadata.c:36
#define _SION_FLAG2_NONE
Definition: sion_filedesc.h:18
int _sion_read_header_var_part_mapping(_sion_filedesc *sion_filedesc)
Read the mapping data at end of SION Meta Block 2.
int _sion_realloc_filedesc_blocklist(_sion_filedesc *sion_filedesc, sion_int32 maxchunks)
Increase the memory used by the internal sion structure for the blocklist.
int _sion_read_header_var_part_blocksizes(_sion_filedesc *sion_filedesc)
Read the SION Meta Block 2.
#define SION_KEYVAL_NONE
Definition: sion_const.h:80
char * sion_keyval_type_to_str(int type)
Returns key value mode as string.
int _sion_write_header_var_part_nextblocksizes_from_field(_sion_filedesc *sion_filedesc, int field_size, sion_int64 *field)
Write the next set of blocksizes from Meta Block 2 Assuming that filepointer is at the correct positi...
int _sion_read_header_var_part_blockcount_to_field(_sion_filedesc *sion_filedesc, int field_size, sion_int64 *field)
Read the block sizes from Meta Block 2.
int _sion_read_header_var_part_blocksizes_rank(_sion_filedesc *sion_filedesc)
Read the SION Meta Block 2.
int _sion_write_header_var_part_blocksizes(_sion_filedesc *sion_filedesc)
Write the SION Meta Block 2.
int _sion_write_header_var_info(_sion_filedesc *sion_filedesc)
Write the SION Meta Block 1.
int _sion_read_header_fix_part(_sion_filedesc *sion_filedesc)
Read part of the SION Meta Block 1.
sion_int64 * blocksizes
Definition: sion_filedesc.h:98
int _sion_write_header_var_part_blockcount_from_field(_sion_filedesc *sion_filedesc, int field_size, sion_int64 *field)
Write the block sizes from Meta Block 2.
int _sion_read_header_var_part_mapping_rank(_sion_filedesc *sion_filedesc)
Read the mapping data at end of SION Meta Block 2.
sion_int64 * all_chunksizes
int _sion_read_header_var_part_nextblocksizes_to_field(_sion_filedesc *sion_filedesc, int field_size, sion_int64 *field)
Read the next set of blocksizes from Meta Block 2 Assuming that filepointer is at the correct positio...
sion_int32 filesionversion
Sion Time Stamp Header.
sion_int64 start_of_varheader
sion_int64 * all_blocksizes
int _sion_file_flush(_sion_fileptr *sion_fileptr)
Flush data to file.
Definition: sion_file.c:304
void sion_swap(void *target, void *source, int size, int n, int aflag)
Definition: sion_convert.c:36
#define SION_ID
Definition: sion_metadata.h:12
_sion_fileptr * fileptr
Definition: sion_filedesc.h:80