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