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