SIONlib  1.7.4
Scalable I/O library for parallel access to task-local files
sion_buddy_common.c
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2019 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 /*
10  *
11  * \brief Internal Functions(parallel)
12  */
13 
14 #define _XOPEN_SOURCE 700
15 
16 #include <stdlib.h>
17 #include <stdio.h>
18 #include <string.h>
19 #include <unistd.h>
20 
21 #include "sion.h"
22 #include "sion_debug.h"
23 #include "sion_error_handler.h"
24 #include "sion_file.h"
25 #include "sion_filedesc.h"
26 #include "sion_fd.h"
27 #include "sion_metadata.h"
28 #include "sion_internal.h"
29 #include "sion_printts.h"
30 
31 #include "sion_buddy_common.h"
32 
33 
34 #define STR_PRT(X) case X: return # X
35 char* _sion_buddy_role_to_str (unsigned int flag) {
36  switch (flag) {
37  STR_PRT(SION_ROLE_NONE);
38  STR_PRT(SION_ROLE_COLLECTOR);
39  STR_PRT(SION_ROLE_WRITER);
40  STR_PRT(SION_ROLE_SENDER);
41  STR_PRT(SION_ROLE_NOWRITER);
42  STR_PRT(SION_ROLE_READER);
43  STR_PRT(SION_ROLE_NOREADER);
44  STR_PRT(SION_ROLE_COLLECTOR_READER);
45  default: return("undef");
46  }
47  return "";
48 }
49 
50 #define DFUNCTION "sion_get_io_info_buddy"
51 /* return list of filenames created and the size of their payload */
52 sion_io_stat_t* sion_get_io_info_buddy(int sid, int roles, int flag) {
53  int loop;
54  _sion_filedesc *sion_filedesc;
55  _sion_filedesc *p_sion_filedesc;
56  sion_io_stat_t *p;
57 
58  int p_sid, i, j, b, p_nf, do_count_size;
59  _sion_generic_buddy *buddies, *buddyptr;
60 
61  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
62  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
63  _sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid);
64  return(NULL);
65  }
66 
67  buddies=sion_filedesc->buddies;
68 
69  /* determine number of files */
70  p_nf= 0;
71 
72  /* run twice: first: count entries, second: store entries */
73  for(loop=0; loop<2; loop++) {
74 
75  if(loop==1) {
76  p=_sion_alloc_io_info(p_nf);
77  if(p==NULL) {
78  _sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_get_io_info_buddy: cannot allocate io info data structure");
79  return(NULL);
80  }
81  p->nfiles=p_nf;
82  }
83 
84 
85 
86  if (sion_filedesc->mode == SION_FILEMODE_WRITE) {
87  int c=0;
88  int collector=0;
89 
90  /* original file */
91  if(roles&SION_ROLE_WRITER) {
92 
93  if(loop==0) {
94  p_nf++;
95  } else {
96  p->names[c]= strdup(sion_filedesc->fname);
97  p->roles[c]=SION_ROLE_WRITER;
98  /* size */
99  DPRINTFP((32, DFUNCTION, sion_filedesc->rank, "BUDDY WRITE start sizes\n"));
100  _sion_print_filedesc(sion_filedesc,1,DFUNCTION,_SION_DEBUG_PRINT_ALL);
101  p->sizes[c]=0;
102  for(j=0;j<=sion_filedesc->lastchunknr;j++) {
103  p->sizes[c]+=sion_filedesc->blocksizes[j];
104  }
105  DPRINTFP((32, DFUNCTION, sion_filedesc->rank, "BUDDY WRITE end sizes --> %d\n", p->sizes[c]));
106  c++;
107  }
108  }
109 
110  /* buddies */
111  for(b=0;b<sion_filedesc->buddylevel;b++) {
112  buddyptr=&buddies[b];
113  do_count_size=0;
114 
115  for(i=0;i<2;i++) {
116  if(i==0) p_sid=buddyptr->buddy_send.sid;
117  if(i==1) p_sid=buddyptr->buddy_coll.sid;
118 
119  if ((p_sid<0) || (_sion_vcdtype(p_sid) != SION_FILEDESCRIPTOR)
120  || !(p_sion_filedesc = _sion_vcdtovcon(p_sid))) {
121  _sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid p_sion_filedesc, aborting %d ...\n", p_sid);
122  return(NULL);
123  }
124  /* filename */
125 
126  /* role */
127  if(i==0) {
128  if(roles&SION_ROLE_SENDER) {
129  if(loop==0) { p_nf++; }
130  else {
131  p->names[c]= strdup(p_sion_filedesc->fname);
132  p->roles[c]=SION_ROLE_SENDER;
133  do_count_size=1;
134  }
135  }
136  } /* i==0 */
137 
138  if(i==1) {
139  p_sid=buddyptr->buddy_coll.sid;
140  if(p_sion_filedesc->rank == collector) {
141 
142  if(roles&SION_ROLE_COLLECTOR) {
143  if(loop==0) {p_nf++; }
144  else {
145  p->names[c]= strdup(p_sion_filedesc->fname);
146  p->roles[c]=SION_ROLE_COLLECTOR;
147  do_count_size=1;
148  }
149  }
150 
151  } else { /* not collector */
152 
153  if(roles&SION_ROLE_NOWRITER) {
154  if(loop==0) { p_nf++; }
155  else {
156  p->names[c]= strdup(p_sion_filedesc->fname);
157  p->roles[c]=SION_ROLE_NOWRITER;
158  do_count_size=1;
159  }
160  }
161 
162  }
163 
164  } /* i==1 */
165 
166  /* size */
167  if(do_count_size) {
168  DPRINTFP((32, DFUNCTION, sion_filedesc->rank, "BUDDY WRITE b=%d i=%d start sizes\n", b, i));
169  _sion_print_filedesc(p_sion_filedesc,1,DFUNCTION,_SION_DEBUG_PRINT_ALL);
170  p->sizes[c]=0;
171  for(j=0;j<=p_sion_filedesc->lastchunknr;j++) {
172  p->sizes[c]+=p_sion_filedesc->blocksizes[j];
173  }
174  DPRINTFP((32, DFUNCTION, sion_filedesc->rank, "BUDDY WRITE b=%d i=%d end sizes --> %d\n", b, i,p->sizes[c]));
175 
176  c++;
177  }
178 
179 
180  } /* for i (buddy actions) */
181 
182  } /* for b (buddy level) */
183 
184  } else { /* READ */
185 
186  }
187  } /* for loop */
188 
189  return (p);
190 }
191 #undef DFUNCTION
Sion File Descriptor Structure.
Definition: sion_filedesc.h:79
int _sion_vcdtype(int sid)
Definition: sion_fd.c:58
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:53
sion_int64 * blocksizes
#define SION_FILEDESCRIPTOR
Definition: sion_fd.h:17
int _sion_print_filedesc(_sion_filedesc *sion_filedesc, int level, char *desc, int flag)
Print the initialized sion file description.
#define SION_FILEMODE_WRITE
Definition: sion_filedesc.h:38
Sion Time Stamp Header.
sion_io_stat_t * _sion_alloc_io_info(int p_nf)
allocates an io_info data structure for nfiles files