Masanobu Yasui authored on 2008/12/17 07:01:52
Showing 7 changed files
... ...
@@ -1,5 +1,5 @@
1 1
 1.1.0:
2
- - large file transfer Tuning
2
+ - file transfer performance tuning
3 3
  - remote file delete function for makuosan
4 4
  - add --delete option for msync
5 5
  - add --sync   option for msync
... ...
@@ -126,6 +126,16 @@ char *stropcode(mdata *data)
126 126
   return(opcodestrlist[i]);
127 127
 }
128 128
 
129
+char *strackreq(mdata *data)
130
+{
131
+  char *ack = "ack";
132
+  char *req = "req";
133
+  if(data->head.flags & MAKUO_FLAG_ACK){
134
+    return(ack);
135
+  }
136
+  return(req);
137
+}
138
+
129 139
 int md5sum(int fd, unsigned char *digest)
130 140
 {
131 141
   int  rd;
... ...
@@ -714,7 +724,7 @@ int is_reg(char *path)
714 714
   return(0);
715 715
 }
716 716
 
717
-int set_guid(int uid, int gid, gid_t *gids)
717
+int set_guid(uid_t uid, gid_t gid, gid_t *gids)
718 718
 {
719 719
   size_t num;
720 720
 
... ...
@@ -72,11 +72,10 @@
72 72
 /*----- flags -----*/
73 73
 #define MAKUO_FLAG_ACK    1
74 74
 #define MAKUO_FLAG_CRYPT  2
75
-#define MAKUO_FLAG_WAIT   4
76
-#define MAKUO_FLAG_FMARK  8
77
-#define MAKUO_FLAG_DRYRUN 16
78
-#define MAKUO_FLAG_RECURS 32
79
-#define MAKUO_FLAG_SYNC   64
75
+#define MAKUO_FLAG_FMARK  4
76
+#define MAKUO_FLAG_DRYRUN 8
77
+#define MAKUO_FLAG_RECURS 16
78
+#define MAKUO_FLAG_SYNC   32
80 79
 
81 80
 /*----- sendstatus -----*/
82 81
 #define MAKUO_SENDSTATE_STAT       0  /* 更新確認待 */
... ...
@@ -158,8 +157,8 @@ typedef struct
158 158
 typedef struct
159 159
 {
160 160
   mhead head;
161
-  char  data[MAKUO_BUFFER_SIZE];
162
-  char *p;
161
+  uint8_t data[MAKUO_BUFFER_SIZE];
162
+  uint8_t *p;
163 163
 }__attribute__((packed)) mdata;
164 164
 
165 165
 typedef struct excludeitem
... ...
@@ -281,6 +280,7 @@ char    *strsstate(uint8_t n);
281 281
 char    *strrstate(uint8_t n);
282 282
 char    *strmstate(mdata *data);
283 283
 char    *stropcode(mdata *data);
284
+char    *strackreq(mdata *data);
284 285
 void     mprintf(const char *func, mfile *m);
285 286
 void     lprintf(int l, char *fmt, ...);
286 287
 void     cprintf(int l, mcomm *c, char *fmt, ...);
... ...
@@ -301,7 +301,7 @@ void     member_del(mhost *h);
301 301
 int      mrecv(int s);
302 302
 void     msend(int s, mfile *m);
303 303
 void     set_filestat(char *path, uid_t uid, gid_t gid, mode_t mode);
304
-int      set_guid(int uid, int gid, gid_t *gids);
304
+int      set_guid(uid_t uid, gid_t gid, gid_t *gids);
305 305
 int      set_gids(char *groups);
306 306
 int      seq_popmark(mfile *m, int n);
307 307
 int      seq_delmark(mfile *m, uint32_t seq);
... ...
@@ -321,14 +321,14 @@ int      ack_clear(mfile *m, int state);
321 321
 int      ack_check(mfile *m, int state);
322 322
 int      mtimeget(struct timeval *tv);
323 323
 int      mtimeout(struct timeval *tf, uint32_t msec);
324
-int      isexclude(char *fn, excludeitem *exclude, int dir);
325
-excludeitem *mfnmatch(char *str, excludeitem *exclude);
326 324
 int      data_safeget(mdata *data, void *buff, size_t size);
327 325
 int      data_safeget16(mdata *data, uint16_t *buff);
328 326
 int      data_safeget32(mdata *data, uint32_t *buff);
329 327
 int      data_safeset(mdata *data, void *buff, size_t size);
330 328
 int      data_safeset16(mdata *data, uint16_t val);
331 329
 int      data_safeset32(mdata *data, uint32_t val);
330
+int      isexclude(char *fn, excludeitem *exclude, int dir);
332 331
 excludeitem *exclude_add(excludeitem *exclude, char *pattern);
333 332
 excludeitem *exclude_del(excludeitem *e);
333
+excludeitem *mfnmatch(char *str, excludeitem *exclude);
334 334
 
... ...
@@ -37,7 +37,7 @@ mfile *mexec_with_dsync(mcomm *c, char *fn, int dryrun, int recurs, mhost *t)
37 37
 	  strcat(m->fn, fn);
38 38
   }
39 39
   
40
-  strcpy(m->mdata.data, m->fn);
40
+  strcpy((char *)(m->mdata.data), m->fn);
41 41
 	m->mdata.head.reqid  = getrid();
42 42
 	m->mdata.head.szdata = strlen(m->fn);
43 43
 	m->mdata.head.opcode = MAKUO_OP_DSYNC;
... ...
@@ -328,10 +328,12 @@ int mexec_send(mcomm *c, int n, int sync)
328 328
         if(*optarg >= '0' && *optarg <='9'){
329 329
           gid = atoi(optarg);
330 330
         }else{
331
-          for(j=0;moption.gids[j];j++){
332
-            if(!strcmp(optarg, moption.grnames[j])){
333
-              gid = moption.gids[j];
334
-              break;
331
+          if(moption.gids){
332
+            for(j=0;moption.gids[j];j++){
333
+              if(!strcmp(optarg, moption.grnames[j])){
334
+                gid = moption.gids[j];
335
+                break;
336
+              }
335 337
             }
336 338
           }
337 339
         }
... ...
@@ -478,7 +480,7 @@ int mexec_send(mcomm *c, int n, int sync)
478 478
   if((m->dryrun == 0) && (gid != -1)){
479 479
     if(m->fs.st_gid != gid){
480 480
       if(lchown(m->fn, -1, gid) == -1){
481
-        lprintf(0, "%s: chown error %d -> %d (%s)\n", __func__, m->fs.st_gid, gid, strerror(errno));
481
+        lprintf(0, "%s: chgrp error (%s) [%d->%d] %s\n", __func__, strerror(errno),  m->fs.st_gid, gid, m->fn);
482 482
       }else{
483 483
         m->fs.st_gid = gid;
484 484
       }
... ...
@@ -779,7 +781,8 @@ int mexec_status(mcomm *c, int n)
779 779
     if(snow > smax){
780 780
       snow = smax;
781 781
     }
782
-    cprintf(0, c, "  (ack) %s %s %s (%u:%u/%u) rid=%d\n", 
782
+    cprintf(0, c, "  (%s) %s %s %s (%u:%u/%u) rid=%d\n",
783
+      strackreq(&(m->mdata)), 
783 784
       stropcode(&(m->mdata)), 
784 785
       strmstate(&(m->mdata)), 
785 786
       m->fn, 
... ...
@@ -187,7 +187,7 @@ static void minit_password(char *filename, int n)
187 187
   }
188 188
   MD5_Init(&ctx);
189 189
   MD5_Update(&ctx, buff, strlen(buff));
190
-  MD5_Final(moption.password[n], &ctx);
190
+  MD5_Final((unsigned char *)(moption.password[n]), &ctx);
191 191
   if(read(f, buff, sizeof(buff))){
192 192
     lprintf(0, "%s: password too long %s\n", __func__, optarg);
193 193
     exit(1);
... ...
@@ -597,7 +597,12 @@ static void mrecv_req_send_data_write(mfile *m, mdata *r)
597 597
   if(write(m->fd, r->data, r->head.szdata) != -1){
598 598
     m->recvcount++;
599 599
   }else{
600
-    lprintf(0, "%s: write error seqno=%d size=%d fd=%d err=%d\n", __func__, (int)r->head.seqno, r->head.szdata, m->fd, errno);
600
+    lprintf(0, "%s: write error (%s) seqno=%d size=%d %s\n",
601
+      __func__,
602
+      strerror(errno), 
603
+      (int)(r->head.seqno), 
604
+      r->head.szdata,
605
+      m->fn);
601 606
     m->mdata.head.ostate = m->mdata.head.nstate;
602 607
     m->mdata.head.nstate = MAKUO_RECVSTATE_WRITEERROR;
603 608
     mrecv_req_send_data_write_error(m, r);
... ...
@@ -611,7 +616,11 @@ static void mrecv_req_send_data_retry(mfile *m, mdata *r)
611 611
   uint32_t  markcnt = m->markcount;
612 612
 
613 613
   lprintf(3, "%s: markcount=%04u recv=%06u size=%06u %s\n",
614
-    __func__, m->markcount, m->recvcount, m->seqnomax,  m->fn);
614
+    __func__,
615
+    m->markcount, 
616
+    m->recvcount, 
617
+    m->seqnomax,  
618
+    m->fn);
615 619
 
616 620
   a = mfins(0);
617 621
   if(!a){
... ...
@@ -661,10 +670,6 @@ static void mrecv_req_send_data(mfile *m, mdata *r)
661 661
   if(m->mdata.head.nstate != MAKUO_RECVSTATE_OPEN){
662 662
     return;
663 663
   }
664
-  if(r->head.flags & MAKUO_FLAG_WAIT){
665
-    mrecv_req_send_data_retry(m, r);
666
-    return;
667
-  }
668 664
   if(m->lickflag){
669 665
     if(seq_delmark(m, r->head.seqno)){
670 666
       mrecv_req_send_data_write(m, r);
... ...
@@ -824,6 +829,8 @@ static mfile *mrecv_req_send_create(mdata *data, struct sockaddr_in *addr)
824 824
   mfile *m;
825 825
   uint16_t fnlen;
826 826
   uint16_t lnlen;
827
+  uint32_t  ldev;
828
+  uint32_t  hdev;
827 829
   uint64_t  rdev;
828 830
 
829 831
   if(data->head.nstate != MAKUO_SENDSTATE_STAT){
... ...
@@ -841,8 +848,7 @@ static mfile *mrecv_req_send_create(mdata *data, struct sockaddr_in *addr)
841 841
   data->p = data->data;
842 842
 
843 843
   /* read mstat */
844
-  memcpy(&fs, data->p, sizeof(fs));
845
-  data->p += sizeof(fs);
844
+  data_safeget(data, &fs, sizeof(fs));
846 845
 
847 846
   /* stat = mstat */
848 847
   m->fs.st_mode  = ntohl(fs.mode);
... ...
@@ -855,21 +861,19 @@ static mfile *mrecv_req_send_create(mdata *data, struct sockaddr_in *addr)
855 855
   lnlen = ntohs(fs.lnlen);
856 856
 
857 857
   /* read filename */
858
-  memcpy(m->fn, data->p, fnlen);
858
+  data_safeget(data, m->fn, fnlen);
859 859
   m->fn[fnlen] = 0;
860
-  data->p += fnlen;
861 860
 
862 861
   /* read linkname */
863
-  memcpy(m->ln, data->p, lnlen);    
862
+  data_safeget(data, m->ln, lnlen);
864 863
   m->ln[lnlen] = 0;
865
-  data->p += lnlen;
866 864
 
867 865
   /* rdev */
868
-  rdev = ntohl(*(uint32_t *)(data->p));
869
-  data->p += sizeof(uint32_t);
870
-  rdev <<= 32;
871
-  rdev |= ntohl(*(uint32_t *)(data->p));
872
-  data->p += sizeof(uint32_t);
866
+  data_safeget32(data, &hdev);
867
+  data_safeget32(data, &ldev);
868
+  rdev  = hdev;
869
+  rdev <<=  32;
870
+  rdev |= ldev;
873 871
   m->fs.st_rdev = (dev_t)rdev;
874 872
 
875 873
   /* Number of blocks */
... ...
@@ -1376,22 +1380,6 @@ static void mrecv_req(mdata *data, struct sockaddr_in *addr)
1376 1376
 * Receive common functions (public)
1377 1377
 *
1378 1378
 *******************************************************************/
1379
-int mrecv(int s)
1380
-{
1381
-  mdata  data;
1382
-  struct sockaddr_in addr;
1383
-  if(mrecv_packet(s, &data, &addr) == -1){
1384
-    return(0);
1385
-  }
1386
-  lprintf(9, "%s: rid=%d %s %s\n", __func__, data.head.reqid, stropcode(&data), strmstate(&data));
1387
-  if(data.head.flags & MAKUO_FLAG_ACK){
1388
-    mrecv_ack(&data, &addr);
1389
-  }else{
1390
-    mrecv_req(&data, &addr);
1391
-  }
1392
-  return(1);
1393
-}
1394
-
1395 1379
 void mrecv_gc()
1396 1380
 {
1397 1381
   mhost *t = members;
... ...
@@ -1435,3 +1423,19 @@ void mrecv_clean()
1435 1435
   while(m=mrecv_mfdel(m));
1436 1436
 }
1437 1437
 
1438
+int mrecv(int s)
1439
+{
1440
+  mdata  data;
1441
+  struct sockaddr_in addr;
1442
+  if(mrecv_packet(s, &data, &addr) == -1){
1443
+    return(0);
1444
+  }
1445
+  lprintf(9, "%s: rid=%d %s %s\n", __func__, data.head.reqid, stropcode(&data), strmstate(&data));
1446
+  if(data.head.flags & MAKUO_FLAG_ACK){
1447
+    mrecv_ack(&data, &addr);
1448
+  }else{
1449
+    mrecv_req(&data, &addr);
1450
+  }
1451
+  return(1);
1452
+}
1453
+
... ...
@@ -77,6 +77,9 @@ static int msend_packet(int s, mdata *data, struct sockaddr_in *addr)
77 77
       return(1);
78 78
     }
79 79
     if(r == -1){
80
+      if(errno == EAGAIN){
81
+        return(-1);
82
+      }
80 83
       if(errno == EINTR){
81 84
         continue;
82 85
       }else{
... ...
@@ -165,8 +168,9 @@ static int msend_retry(mfile *m)
165 165
 /* send & free */
166 166
 static void msend_shot(int s, mfile *m)
167 167
 {
168
-  msend_packet(s, &(m->mdata), &(m->addr));
169
-  msend_mfdel(m);
168
+  if(msend_packet(s, &(m->mdata), &(m->addr)) == 1){
169
+    msend_mfdel(m);
170
+  }
170 171
 }
171 172
 
172 173
 /******************************************************************
... ...
@@ -182,8 +186,8 @@ static void msend_ack_ping(int s, mfile *m)
182 182
 static void msend_ack_send(int s, mfile *m)
183 183
 {
184 184
   if(m->markcount){
185
-    m->mdata.head.szdata = m->marksize * sizeof(uint32_t);
186
-    memcpy(m->mdata.data, m->mark, m->marksize * sizeof(uint32_t));
185
+    m->mdata.head.szdata = 0;
186
+    data_safeset(&(m->mdata), m->mark, m->marksize * sizeof(uint32_t));
187 187
   }
188 188
   msend_shot(s, m);
189 189
 }
... ...
@@ -195,13 +199,11 @@ static void msend_ack_md5(int s, mfile *m)
195 195
 
196 196
 static void msend_ack_dsync(int s, mfile *m)
197 197
 {
198
-  mprintf(__func__, m);
199 198
   msend_shot(s, m);
200 199
 }
201 200
 
202 201
 static void msend_ack_del(int s, mfile *m)
203 202
 {
204
-  mprintf(__func__, m);
205 203
   msend_shot(s, m);
206 204
 }
207 205
 
... ...
@@ -259,7 +261,7 @@ static void msend_req_send_break(int s, mfile *m)
259 259
 static void msend_req_send_stat_init(int s, mfile *m)
260 260
 {
261 261
   mstat    fs;
262
-  uint64_t rdev;
262
+  uint64_t dev;
263 263
 
264 264
   if(!m->comm){
265 265
     msend_mfdel(m);
... ...
@@ -273,7 +275,7 @@ static void msend_req_send_stat_init(int s, mfile *m)
273 273
   m->mdata.head.szdata += strlen(m->ln);
274 274
   m->mdata.head.szdata += sizeof(uint64_t);
275 275
   if(m->mdata.head.szdata > MAKUO_BUFFER_SIZE){
276
-    lprintf(0, "%s: buffer size over size=%d file=%s\n", __func__, m->mdata.head.szdata, m->fn);
276
+    lprintf(0, "%s: buffer size over size=%d file=%s\n",   __func__, m->mdata.head.szdata, m->fn);
277 277
     cprintf(0, m->comm, "error: buffer size over size=%d file=%s\n", m->mdata.head.szdata, m->fn);
278 278
     return;
279 279
   }
... ...
@@ -286,18 +288,14 @@ static void msend_req_send_stat_init(int s, mfile *m)
286 286
   fs.ctime = htonl(m->fs.st_ctime);
287 287
   fs.fnlen = htons(strlen(m->fn));
288 288
   fs.lnlen = htons(strlen(m->ln));
289
-  memcpy(m->mdata.p, &fs, sizeof(fs));
290
-  m->mdata.p += sizeof(fs);
291
-  strcpy(m->mdata.p, m->fn);
292
-  m->mdata.p += strlen(m->fn);
293
-  strcpy(m->mdata.p, m->ln);
294
-  m->mdata.p += strlen(m->ln);
295
-
296
-  rdev = (uint64_t)(m->fs.st_rdev);
297
-  *(uint32_t *)(m->mdata.p) = htonl((uint32_t)(rdev >> 32));
298
-  m->mdata.p += sizeof(uint32_t);
299
-  *(uint32_t *)(m->mdata.p) = htonl((uint32_t)(rdev & 0xFFFFFFFF));
300
-  m->mdata.p += sizeof(uint32_t);
289
+  dev = (uint64_t)(m->fs.st_rdev);
290
+
291
+  m->mdata.head.szdata = 0;
292
+  data_safeset(&(m->mdata), &fs, sizeof(fs));
293
+  data_safeset(&(m->mdata), m->fn, strlen(m->fn));
294
+  data_safeset(&(m->mdata), m->ln, strlen(m->ln));
295
+  data_safeset32(&(m->mdata), (uint32_t)(dev >> 32));
296
+  data_safeset32(&(m->mdata), (uint32_t)(dev & 0xFFFFFFFF));
301 297
   m->sendwait  = 1;
302 298
   m->initstate = 0;
303 299
   ack_clear(m, -1);