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