... | ... |
@@ -27,14 +27,14 @@ uint8_t opcodenumlist[]={MAKUO_OP_PING, |
27 | 27 |
MAKUO_OP_DEL, |
28 | 28 |
MAKUO_OPCODE_MAX}; |
29 | 29 |
|
30 |
-char *sstatestrlist[]={"SEND_STAT", |
|
31 |
- "SEND_OPEN", |
|
32 |
- "SEND_DATA", |
|
33 |
- "SEND_MARK", |
|
34 |
- "SEND_CLOSE", |
|
35 |
- "SEND_LAST", |
|
36 |
- "SEND_ERROR", |
|
37 |
- "SEND_BREAK", |
|
30 |
+char *sstatestrlist[]={"SEND_STAT ", |
|
31 |
+ "SEND_OPEN ", |
|
32 |
+ "SEND_DATA ", |
|
33 |
+ "SEND_MARK ", |
|
34 |
+ "SEND_CLOSE ", |
|
35 |
+ "SEND_LAST ", |
|
36 |
+ "SEND_ERROR ", |
|
37 |
+ "SEND_BREAK ", |
|
38 | 38 |
"SEND_UNKNOWN"}; |
39 | 39 |
|
40 | 40 |
uint8_t sstatenumlist[]={MAKUO_SENDSTATE_STAT, |
... | ... |
@@ -47,21 +47,21 @@ uint8_t sstatenumlist[]={MAKUO_SENDSTATE_STAT, |
47 | 47 |
MAKUO_SENDSTATE_BREAK, |
48 | 48 |
MAKUO_STATE_MAX}; |
49 | 49 |
|
50 |
-char *rstatestrlist[] = {"RECV_NONE", |
|
51 |
- "RECV_UPDATE", |
|
52 |
- "RECV_SKIP", |
|
53 |
- "RECV_OPEN", |
|
54 |
- "RECV_MARK", |
|
55 |
- "RECV_CLOSE", |
|
56 |
- "RECV_IGNORE", |
|
50 |
+char *rstatestrlist[] = {"RECV_NONE ", |
|
51 |
+ "RECV_UPDATE ", |
|
52 |
+ "RECV_SKIP ", |
|
53 |
+ "RECV_OPEN ", |
|
54 |
+ "RECV_MARK ", |
|
55 |
+ "RECV_CLOSE ", |
|
56 |
+ "RECV_IGNORE ", |
|
57 | 57 |
"RECV_READONLY", |
58 |
- "RECV_BREAK", |
|
59 |
- "RECV_MD5OK", |
|
60 |
- "RECV_MD5NG", |
|
58 |
+ "RECV_BREAK ", |
|
59 |
+ "RECV_MD5OK ", |
|
60 |
+ "RECV_MD5NG ", |
|
61 | 61 |
"RECV_DELETEOK", |
62 | 62 |
"RECV_DELETENG", |
63 |
- "RECV_OPENERR", |
|
64 |
- "RECV_READERR", |
|
63 |
+ "RECV_OPENERR ", |
|
64 |
+ "RECV_READERR ", |
|
65 | 65 |
"RECV_WRITEERR", |
66 | 66 |
"RECV_CLOSEERR", |
67 | 67 |
"RECV_UNKNOWN"}; |
... | ... |
@@ -55,7 +55,7 @@ |
55 | 55 |
#define MAKUO_MCAST_PORT 5000 |
56 | 56 |
|
57 | 57 |
/*----- timeout -----*/ |
58 |
-#define MAKUO_SEND_TIMEOUT 5000 /* 再送間隔(ms) */ |
|
58 |
+#define MAKUO_SEND_TIMEOUT 500 /* 再送間隔(ms) */ |
|
59 | 59 |
#define MAKUO_SEND_RETRYCNT 120 /* 再送回数 */ |
60 | 60 |
#define MAKUO_PONG_TIMEOUT 180000 /* メンバから除外するまでの時間(ms) */ |
61 | 61 |
#define MAKUO_PONG_INTERVAL 45000 /* PING送信間隔(ms) */ |
... | ... |
@@ -40,7 +40,9 @@ int mexec_scan_cmd(int fd, char *buff) |
40 | 40 |
if(FD_ISSET(fd,&fds)){ |
41 | 41 |
r = write(fd, cmd, size); |
42 | 42 |
if(r == -1){ |
43 |
- lprintf(0, "%s: commend write error! %s", __func__, buff); |
|
43 |
+ lprintf(0, "%s: commend write error! %s", |
|
44 |
+ __func__, |
|
45 |
+ buff); |
|
44 | 46 |
return(-1); |
45 | 47 |
} |
46 | 48 |
size -= r; |
... | ... |
@@ -316,9 +318,13 @@ int mexec_send(mcomm *c, int n) |
316 | 316 |
|
317 | 317 |
if(lstat(fn, &m->fs) == -1){ |
318 | 318 |
cprintf(0, c, "error: file not found %s\n", fn); |
319 |
- lprintf(1, "%s: lstat() error argc=%d cmd=%s\n", __func__, c->argc[n], c->cmdline[n]); |
|
320 |
- for(i=0;i<c->argc[n];i++) |
|
319 |
+ lprintf(1, "%s: lstat() error argc=%d cmd=%s\n", |
|
320 |
+ __func__, |
|
321 |
+ c->argc[n], |
|
322 |
+ c->cmdline[n]); |
|
323 |
+ for(i=0;i<c->argc[n];i++){ |
|
321 | 324 |
lprintf(1, "%s: read error argv[%d]=%s\n", __func__, i, c->parse[n][i]); |
325 |
+ } |
|
322 | 326 |
lprintf(0, "%s: read error file=%s\n", __func__, fn); |
323 | 327 |
mfdel(m); |
324 | 328 |
return(0); |
... | ... |
@@ -698,34 +704,42 @@ int mexec_status(mcomm *c, int n) |
698 | 698 |
mfile *m; |
699 | 699 |
struct tm *t; |
700 | 700 |
|
701 |
- cprintf(0,c,"version : %s\n", PACKAGE_VERSION); |
|
701 |
+ cprintf(0,c,"version: %s\n", PACKAGE_VERSION); |
|
702 | 702 |
if(moption.chroot){ |
703 |
- cprintf(0, c, "chroot : %s/\n", moption.real_dir); |
|
703 |
+ cprintf(0, c, "chroot : %s/\n", moption.real_dir); |
|
704 | 704 |
}else{ |
705 |
- cprintf(0, c, "basedir : %s/\n", moption.base_dir); |
|
705 |
+ cprintf(0, c, "basedir: %s/\n", moption.base_dir); |
|
706 | 706 |
} |
707 | 707 |
count = 0; |
708 | 708 |
for(m=mftop[0];m;m=m->next){ |
709 | 709 |
count++; |
710 | 710 |
} |
711 |
- cprintf(0,c,"send file: %d\n", count); |
|
711 |
+ cprintf(0,c,"send op: %d\n", count); |
|
712 | 712 |
for(m=mftop[0];m;m=m->next){ |
713 | 713 |
uint32_t snow = m->seqnonow; |
714 | 714 |
uint32_t smax = m->seqnomax; |
715 | 715 |
if(snow > smax){ |
716 | 716 |
snow = smax; |
717 | 717 |
} |
718 |
- cprintf(0, c, " %s %s %s (%u:%u/%u)\n", |
|
719 |
- OPCODE(m->mdata.head.opcode), |
|
720 |
- SSTATE(m->mdata.head.nstate), |
|
721 |
- m->fn, |
|
722 |
- m->markcount, snow, smax); |
|
718 |
+ if(m->mdata.head.flags & MAKUO_FLAG_ACK){ |
|
719 |
+ cprintf(0, c, " (ack) %s %s %s (%u:%u/%u)\n", |
|
720 |
+ OPCODE(m->mdata.head.opcode), |
|
721 |
+ RSTATE(m->mdata.head.nstate), |
|
722 |
+ m->fn, |
|
723 |
+ m->markcount, snow, smax); |
|
724 |
+ }else{ |
|
725 |
+ cprintf(0, c, " (req) %s %s %s (%u:%u/%u)\n", |
|
726 |
+ OPCODE(m->mdata.head.opcode), |
|
727 |
+ SSTATE(m->mdata.head.nstate), |
|
728 |
+ m->fn, |
|
729 |
+ m->markcount, snow, smax); |
|
730 |
+ } |
|
723 | 731 |
} |
724 | 732 |
|
725 | 733 |
count = 0; |
726 | 734 |
for(m=mftop[1];m;m=m->next) |
727 | 735 |
count++; |
728 |
- cprintf(0, c, "recv file: %d\n", count); |
|
736 |
+ cprintf(0, c, "recv op: %d\n", count); |
|
729 | 737 |
for(m=mftop[1];m;m=m->next){ |
730 | 738 |
t = localtime(&(m->lastrecv.tv_sec)); |
731 | 739 |
cprintf(0, c, " %s %s %02d:%02d:%02d %s (%d/%d) mark=%d\n", |
... | ... |
@@ -294,7 +294,7 @@ static void mrecv_ack_dsync(mdata *data, struct sockaddr_in *addr) |
294 | 294 |
mhost *t; |
295 | 295 |
mfile *m; |
296 | 296 |
|
297 |
- lprintf(0, "%s:\n", __func__); |
|
297 |
+ lprintf(9, "%s: rid=%d %s\n", __func__, data->head.reqid, RSTATE(data->head.nstate)); |
|
298 | 298 |
mrecv_ack_search(&t, &m, data, addr); |
299 | 299 |
if(data->head.nstate == MAKUO_RECVSTATE_CLOSE){ |
300 | 300 |
mkreq(data, addr, MAKUO_SENDSTATE_LAST); |
... | ... |
@@ -319,7 +319,7 @@ static void mrecv_ack_del(mdata *data, struct sockaddr_in *addr) |
319 | 319 |
uint32_t err; |
320 | 320 |
uint16_t len; |
321 | 321 |
|
322 |
- lprintf(0, "%s: %s\n", __func__, RSTATE(data->head.nstate)); |
|
322 |
+ lprintf(9, "%s: rid=%d %s\n", __func__, data->head.reqid, RSTATE(data->head.nstate)); |
|
323 | 323 |
mrecv_ack_search(&t, &m, data, addr); |
324 | 324 |
if(!t || !m){ |
325 | 325 |
return; |
... | ... |
@@ -333,10 +333,7 @@ static void mrecv_ack_del(mdata *data, struct sockaddr_in *addr) |
333 | 333 |
*s = data->head.nstate; |
334 | 334 |
|
335 | 335 |
if(m->mdata.head.nstate == MAKUO_SENDSTATE_CLOSE){ |
336 |
- m->initstate = 1; |
|
337 |
- m->sendwait = 0; |
|
338 |
- m->mdata.head.nstate = MAKUO_SENDSTATE_STAT; |
|
339 |
- *s = data->head.nstate; |
|
336 |
+ mrecv_mfdel(m); |
|
340 | 337 |
return; |
341 | 338 |
} |
342 | 339 |
|
... | ... |
@@ -347,9 +344,10 @@ static void mrecv_ack_del(mdata *data, struct sockaddr_in *addr) |
347 | 347 |
return; |
348 | 348 |
} |
349 | 349 |
|
350 |
- if(m->mdata.head.nstate == MAKUO_SENDSTATE_STAT){ |
|
350 |
+ if(m->mdata.head.nstate == MAKUO_SENDSTATE_OPEN){ |
|
351 | 351 |
m->initstate = 1; |
352 | 352 |
m->sendwait = 0; |
353 |
+ m->mdata.head.nstate = MAKUO_SENDSTATE_CLOSE; |
|
353 | 354 |
if(data->head.nstate == MAKUO_RECVSTATE_DELETEOK){ |
354 | 355 |
err = 0; |
355 | 356 |
len = strlen(m->fn); |
... | ... |
@@ -1021,9 +1019,13 @@ static void mrecv_req_md5(mdata *data, struct sockaddr_in *addr) |
1021 | 1021 |
} |
1022 | 1022 |
} |
1023 | 1023 |
|
1024 |
-static void dsync_write(int fd, char *base, uint8_t state) |
|
1024 |
+static void dsync_write(int fd, char *base, uint8_t sta, uint16_t len, uint32_t mod) |
|
1025 | 1025 |
{ |
1026 |
- uint16_t len = strlen(base); |
|
1026 |
+ int r; |
|
1027 |
+ size_t s; |
|
1028 |
+ fd_set wfds; |
|
1029 |
+ char buff[PATH_MAX + sizeof(sta) + sizeof(mod) + sizeof(len)]; |
|
1030 |
+ char *p = buff; |
|
1027 | 1031 |
|
1028 | 1032 |
if(!loop_flag){ |
1029 | 1033 |
return; |
... | ... |
@@ -1035,14 +1037,45 @@ static void dsync_write(int fd, char *base, uint8_t state) |
1035 | 1035 |
base += 2; |
1036 | 1036 |
len -= 2; |
1037 | 1037 |
} |
1038 |
- write(fd, &state, sizeof(state)); |
|
1039 |
- write(fd, &len, sizeof(len)); |
|
1040 |
- write(fd, base, len); |
|
1038 |
+ while(*base == '/'){ |
|
1039 |
+ base++; |
|
1040 |
+ len--; |
|
1041 |
+ } |
|
1042 |
+ *(uint8_t *)p = sta; |
|
1043 |
+ p += sizeof(sta); |
|
1044 |
+ *(uint32_t *)p = mod; |
|
1045 |
+ p += sizeof(mod); |
|
1046 |
+ *(uint16_t *)p = len; |
|
1047 |
+ p += sizeof(len); |
|
1048 |
+ memcpy(p, base, len); |
|
1049 |
+ |
|
1050 |
+ p = buff; |
|
1051 |
+ s = sizeof(sta) + sizeof(mod) + sizeof(len) + len; |
|
1052 |
+ while(s){ |
|
1053 |
+ FD_ZERO(&wfds); |
|
1054 |
+ FD_SET(fd,&wfds); |
|
1055 |
+ if(select(1024, NULL, &wfds, NULL, NULL) < 0){ |
|
1056 |
+ if(!loop_flag){ |
|
1057 |
+ return; |
|
1058 |
+ } |
|
1059 |
+ continue; |
|
1060 |
+ } |
|
1061 |
+ if(FD_ISSET(fd,&wfds)){ |
|
1062 |
+ r = write(fd, p, s); |
|
1063 |
+ if(r == -1){ |
|
1064 |
+ return; |
|
1065 |
+ }else{ |
|
1066 |
+ s -= r; |
|
1067 |
+ p += r; |
|
1068 |
+ } |
|
1069 |
+ } |
|
1070 |
+ } |
|
1041 | 1071 |
} |
1042 | 1072 |
|
1043 | 1073 |
static void dsync_scan(int fd, char *base, int recurs) |
1044 | 1074 |
{ |
1045 | 1075 |
DIR *d; |
1076 |
+ uint16_t len; |
|
1046 | 1077 |
struct stat st; |
1047 | 1078 |
struct dirent *dent; |
1048 | 1079 |
char path[PATH_MAX]; |
... | ... |
@@ -1050,21 +1083,22 @@ static void dsync_scan(int fd, char *base, int recurs) |
1050 | 1050 |
if(!loop_flag){ |
1051 | 1051 |
return; |
1052 | 1052 |
} |
1053 |
- if(lstat(base,&st) == -1){ |
|
1054 |
- dsync_write(fd, base, MAKUO_SENDSTATE_ERROR); |
|
1053 |
+ len = strlen(base); |
|
1054 |
+ if(lstat(base, &st) == -1){ |
|
1055 |
+ dsync_write(fd, base, MAKUO_SENDSTATE_ERROR, len, st.st_mode); |
|
1055 | 1056 |
return; |
1056 | 1057 |
} |
1057 | 1058 |
if(S_ISLNK(st.st_mode)){ |
1058 |
- dsync_write(fd, base, MAKUO_SENDSTATE_STAT); |
|
1059 |
+ dsync_write(fd, base, MAKUO_SENDSTATE_STAT, len, st.st_mode); |
|
1059 | 1060 |
return; |
1060 | 1061 |
} |
1061 | 1062 |
if(!S_ISDIR(st.st_mode)){ |
1062 |
- dsync_write(fd, base, MAKUO_SENDSTATE_STAT); |
|
1063 |
+ dsync_write(fd, base, MAKUO_SENDSTATE_STAT, len, st.st_mode); |
|
1063 | 1064 |
return; |
1064 | 1065 |
} |
1065 | 1066 |
d = opendir(base); |
1066 | 1067 |
if(!d){ |
1067 |
- dsync_write(fd, base, MAKUO_SENDSTATE_ERROR); |
|
1068 |
+ dsync_write(fd, base, MAKUO_SENDSTATE_ERROR, len, st.st_mode); |
|
1068 | 1069 |
}else{ |
1069 | 1070 |
while(dent=readdir(d)){ |
1070 | 1071 |
if(!loop_flag) |
... | ... |
@@ -1077,11 +1111,13 @@ static void dsync_scan(int fd, char *base, int recurs) |
1077 | 1077 |
if(recurs){ |
1078 | 1078 |
dsync_scan(fd, path, recurs); |
1079 | 1079 |
}else{ |
1080 |
- dsync_write(fd, path, MAKUO_SENDSTATE_STAT); |
|
1080 |
+ len = strlen(path); |
|
1081 |
+ dsync_write(fd, path, MAKUO_SENDSTATE_STAT, len, st.st_mode); |
|
1081 | 1082 |
} |
1082 | 1083 |
} |
1083 | 1084 |
closedir(d); |
1084 |
- dsync_write(fd, base, MAKUO_SENDSTATE_STAT); |
|
1085 |
+ len = strlen(base); |
|
1086 |
+ dsync_write(fd, base, MAKUO_SENDSTATE_STAT, len, st.st_mode); |
|
1085 | 1087 |
} |
1086 | 1088 |
} |
1087 | 1089 |
|
... | ... |
@@ -1198,23 +1234,68 @@ static void mrecv_req_dsync(mdata *data, struct sockaddr_in *addr) |
1198 | 1198 |
/* |
1199 | 1199 |
* del |
1200 | 1200 |
*/ |
1201 |
-static void mrecv_req_del_stat(mdata *data, struct sockaddr_in *addr) |
|
1201 |
+static void mrecv_req_del_open(mdata *data, struct sockaddr_in *addr) |
|
1202 | 1202 |
{ |
1203 | 1203 |
uint16_t len; |
1204 |
+ uint32_t mod; |
|
1205 |
+ char path[PATH_MAX]; |
|
1204 | 1206 |
char *hn = "unknown host"; |
1205 | 1207 |
mhost *t = member_get(addr); |
1206 | 1208 |
mfile *a = mkack(data, addr, MAKUO_RECVSTATE_DELETENG); |
1209 |
+ mfile *m = NULL; |
|
1210 |
+ mcomm *c = NULL; |
|
1211 |
+ char *p = NULL; |
|
1207 | 1212 |
|
1208 | 1213 |
lprintf(9, "%s:\n", __func__); |
1214 |
+ if(!a){ |
|
1215 |
+ lprintf(0, "%s: arror ack can't create\n", __func__); |
|
1216 |
+ return; |
|
1217 |
+ } |
|
1218 |
+ for(m=mftop[0];m;m=m->next){ |
|
1219 |
+ if((m->comm != NULL) && (m->mdata.head.reqid == data->head.seqno)){ |
|
1220 |
+ c = m->comm; |
|
1221 |
+ break; |
|
1222 |
+ } |
|
1223 |
+ } |
|
1224 |
+ if(!m){ |
|
1225 |
+ return; |
|
1226 |
+ } |
|
1209 | 1227 |
if(t){ |
1210 | 1228 |
hn = t->hostname; |
1211 | 1229 |
} |
1212 | 1230 |
data->p = data->data; |
1231 |
+ mod = ntohl(*(uint32_t *)(data->p)); |
|
1232 |
+ data->p += sizeof(uint32_t); |
|
1213 | 1233 |
len = ntohs(*(uint16_t *)(data->p)); |
1214 | 1234 |
data->p += sizeof(uint16_t); |
1215 | 1235 |
memcpy(a->fn, data->p, len); |
1216 | 1236 |
a->fn[len] = 0; |
1217 | 1237 |
lprintf(9, "%s: fn=%s\n", __func__, a->fn); |
1238 |
+ |
|
1239 |
+ strcpy(path, a->fn); |
|
1240 |
+ if(mfnmatch(path, c->exclude)){ |
|
1241 |
+ return; |
|
1242 |
+ } |
|
1243 |
+ if(S_ISDIR(mod)){ |
|
1244 |
+ strcat(path, "/"); |
|
1245 |
+ if(mfnmatch(path, c->exclude)){ |
|
1246 |
+ return; |
|
1247 |
+ } |
|
1248 |
+ } |
|
1249 |
+ for(p=dirname(path);*p == '/';p++); |
|
1250 |
+ if(*p == 0){ |
|
1251 |
+ return; |
|
1252 |
+ } |
|
1253 |
+ while(strcmp(p, ".")){ |
|
1254 |
+ if(mfnmatch(p, c->exclude)){ |
|
1255 |
+ return; |
|
1256 |
+ } |
|
1257 |
+ strcat(p, "/"); |
|
1258 |
+ if(mfnmatch(p, c->exclude)){ |
|
1259 |
+ return; |
|
1260 |
+ } |
|
1261 |
+ p = dirname(p); |
|
1262 |
+ } |
|
1218 | 1263 |
if(lstat(a->fn, &(a->fs)) == -1 && errno == ENOENT){ |
1219 | 1264 |
a->mdata.head.nstate = MAKUO_RECVSTATE_DELETEOK; |
1220 | 1265 |
lprintf(1, "%s: delete %s:%s\n", __func__, hn, a->fn); |
... | ... |
@@ -1286,10 +1367,9 @@ static void mrecv_req_del_close(mdata *data, struct sockaddr_in *addr) |
1286 | 1286 |
|
1287 | 1287 |
static void mrecv_req_del(mdata *data, struct sockaddr_in *addr) |
1288 | 1288 |
{ |
1289 |
- lprintf(9, "%s:\n", __func__); |
|
1290 | 1289 |
switch(data->head.nstate){ |
1291 |
- case MAKUO_SENDSTATE_STAT: /* 存在確認 */ |
|
1292 |
- mrecv_req_del_stat(data, addr); |
|
1290 |
+ case MAKUO_SENDSTATE_OPEN: /* 存在確認 */ |
|
1291 |
+ mrecv_req_del_open(data, addr); |
|
1293 | 1292 |
break; |
1294 | 1293 |
case MAKUO_SENDSTATE_DATA: /* 結果通知 */ |
1295 | 1294 |
mrecv_req_del_data(data, addr); |
... | ... |
@@ -1304,22 +1384,22 @@ static void mrecv_req(mdata *data, struct sockaddr_in *addr) |
1304 | 1304 |
{ |
1305 | 1305 |
switch(data->head.opcode){ |
1306 | 1306 |
case MAKUO_OP_PING: |
1307 |
- mrecv_req_ping(data, addr); |
|
1307 |
+ mrecv_req_ping(data, addr); |
|
1308 | 1308 |
break; |
1309 | 1309 |
case MAKUO_OP_EXIT: |
1310 |
- mrecv_req_exit(data, addr); |
|
1310 |
+ mrecv_req_exit(data, addr); |
|
1311 | 1311 |
break; |
1312 | 1312 |
case MAKUO_OP_SEND: |
1313 |
- mrecv_req_send(data, addr); |
|
1313 |
+ mrecv_req_send(data, addr); |
|
1314 | 1314 |
break; |
1315 | 1315 |
case MAKUO_OP_MD5: |
1316 |
- mrecv_req_md5(data, addr); |
|
1316 |
+ mrecv_req_md5(data, addr); |
|
1317 | 1317 |
break; |
1318 | 1318 |
case MAKUO_OP_DSYNC: |
1319 | 1319 |
mrecv_req_dsync(data, addr); |
1320 | 1320 |
break; |
1321 | 1321 |
case MAKUO_OP_DEL: |
1322 |
- mrecv_req_del(data, addr); |
|
1322 |
+ mrecv_req_del(data, addr); |
|
1323 | 1323 |
break; |
1324 | 1324 |
default: |
1325 | 1325 |
mkack(data, addr, MAKUO_RECVSTATE_IGNORE); |
... | ... |
@@ -104,8 +104,18 @@ static void msend_retry(mfile *m) |
104 | 104 |
m->retrycnt = MAKUO_SEND_RETRYCNT; |
105 | 105 |
return; |
106 | 106 |
} |
107 |
- lprintf(2, "%s: send retry count=%02d rid=%06d state=%s %s\n", __func__, |
|
108 |
- m->retrycnt, m->mdata.head.reqid, SSTATE(m->mdata.head.nstate), m->fn); |
|
107 |
+ if(m->mdata.head.opcode == MAKUO_OP_DSYNC){ |
|
108 |
+ if(m->mdata.head.nstate == MAKUO_SENDSTATE_CLOSE){ |
|
109 |
+ return; |
|
110 |
+ } |
|
111 |
+ } |
|
112 |
+ lprintf(2, "%s: send retry count=%02d rid=%06d op=%s state=%s %s\n", |
|
113 |
+ __func__, |
|
114 |
+ m->retrycnt, |
|
115 |
+ m->mdata.head.reqid, |
|
116 |
+ OPCODE(m->mdata.head.opcode), |
|
117 |
+ SSTATE(m->mdata.head.nstate), |
|
118 |
+ m->fn); |
|
109 | 119 |
for(t=members;t;t=t->next){ |
110 | 120 |
r = get_hoststate(t, m); |
111 | 121 |
if(!r){ |
... | ... |
@@ -115,19 +125,22 @@ static void msend_retry(mfile *m) |
115 | 115 |
switch(moption.loglevel){ |
116 | 116 |
case 3: |
117 | 117 |
if(*r == MAKUO_RECVSTATE_NONE){ |
118 |
- lprintf(0, "%s: %s %s(%s)\n", __func__, RSTATE(*r), inet_ntoa(t->ad), t->hostname); |
|
118 |
+ lprintf(0, "%s: %s %s(%s)\n", |
|
119 |
+ __func__, |
|
120 |
+ RSTATE(*r), |
|
121 |
+ inet_ntoa(t->ad), |
|
122 |
+ t->hostname); |
|
119 | 123 |
} |
120 | 124 |
break; |
121 | 125 |
default: |
122 |
- lprintf(4, "%s: %s %s(%s)\n", __func__, RSTATE(*r), inet_ntoa(t->ad), t->hostname); |
|
126 |
+ lprintf(4, "%s: %s %s(%s)\n", |
|
127 |
+ __func__, |
|
128 |
+ RSTATE(*r), |
|
129 |
+ inet_ntoa(t->ad), |
|
130 |
+ t->hostname); |
|
123 | 131 |
break; |
124 | 132 |
} |
125 | 133 |
} |
126 |
- if(m->mdata.head.opcode == MAKUO_OP_DSYNC){ |
|
127 |
- if(m->mdata.head.nstate == MAKUO_SENDSTATE_CLOSE){ |
|
128 |
- return; |
|
129 |
- } |
|
130 |
- } |
|
131 | 134 |
m->retrycnt--; |
132 | 135 |
} |
133 | 136 |
|
... | ... |
@@ -188,6 +201,7 @@ static void msend_ack_dsync(int s, mfile *m) |
188 | 188 |
|
189 | 189 |
static void msend_ack_del(int s, mfile *m) |
190 | 190 |
{ |
191 |
+ lprintf(9, "%s:\n", __func__); |
|
191 | 192 |
msend_shot(s, m); |
192 | 193 |
} |
193 | 194 |
|
... | ... |
@@ -769,11 +783,13 @@ static void msend_req_del_mark(int s, mfile *m) |
769 | 769 |
mkack(&(d->mdata), &(d->addr), MAKUO_RECVSTATE_CLOSE); |
770 | 770 |
} |
771 | 771 |
|
772 |
-static void msend_req_del_init(int s, mfile *m) |
|
772 |
+static void msend_req_del_stat(int s, mfile *m) |
|
773 | 773 |
{ |
774 | 774 |
int r; |
775 |
+ mfile *d; |
|
775 | 776 |
uint8_t stat; |
776 | 777 |
uint16_t len; |
778 |
+ uint32_t mod; |
|
777 | 779 |
|
778 | 780 |
lprintf(9, "%s:\n", __func__); |
779 | 781 |
r = read(m->pipe, &stat, sizeof(stat)); |
... | ... |
@@ -791,17 +807,25 @@ static void msend_req_del_init(int s, mfile *m) |
791 | 791 |
return; |
792 | 792 |
} |
793 | 793 |
|
794 |
+ d = mkreq(&(m->mdata), &(m->addr), MAKUO_SENDSTATE_OPEN); |
|
795 |
+ read(m->pipe, &mod, sizeof(mod)); |
|
794 | 796 |
read(m->pipe, &len, sizeof(len)); |
795 |
- read(m->pipe, m->fn, len); |
|
796 |
- m->fn[len] = 0; |
|
797 |
- lprintf(9, "%s: fn=%s\n", __func__, m->fn); |
|
798 |
- |
|
799 |
- m->mdata.p = m->mdata.data; |
|
800 |
- *(uint16_t *)(m->mdata.p) = htons(len); |
|
801 |
- m->mdata.p += sizeof(uint16_t); |
|
802 |
- memcpy(m->mdata.p, m->fn, len); |
|
803 |
- m->mdata.head.szdata = sizeof(len) + len; |
|
804 |
- m->mdata.head.reqid = getrid(); |
|
797 |
+ read(m->pipe, d->fn, len); |
|
798 |
+ d->fn[len] = 0; |
|
799 |
+ d->mdata.p = d->mdata.data; |
|
800 |
+ *(uint32_t *)(d->mdata.p) = htonl(mod); |
|
801 |
+ d->mdata.p += sizeof(mod); |
|
802 |
+ *(uint16_t *)(d->mdata.p) = htons(len); |
|
803 |
+ d->mdata.p += sizeof(len); |
|
804 |
+ memcpy(d->mdata.p, d->fn, len); |
|
805 |
+ d->mdata.head.flags = m->mdata.head.flags; |
|
806 |
+ d->mdata.head.szdata = sizeof(mod) + sizeof(len) + len; |
|
807 |
+ d->mdata.head.reqid = getrid(); |
|
808 |
+ d->initstate = 1; |
|
809 |
+ d->sendwait = 0; |
|
810 |
+ d->dryrun = m->dryrun; |
|
811 |
+ d->recurs = m->recurs; |
|
812 |
+ lprintf(9, "%s: fn=%s rid=%d\n", __func__, d->fn, d->mdata.head.reqid); |
|
805 | 813 |
} |
806 | 814 |
|
807 | 815 |
/*----- del -----*/ |
... | ... |
@@ -815,13 +839,14 @@ static void msend_req_del(int s, mfile *m) |
815 | 815 |
msend_mfdel(m); |
816 | 816 |
return; |
817 | 817 |
} |
818 |
+ if(m->mdata.head.nstate == MAKUO_SENDSTATE_STAT){ |
|
819 |
+ msend_req_del_stat(s, m); |
|
820 |
+ return; |
|
821 |
+ } |
|
818 | 822 |
if(m->initstate){ |
819 | 823 |
m->initstate = 0; |
820 | 824 |
m->sendwait = 1; |
821 | 825 |
ack_clear(m, -1); |
822 |
- if(m->mdata.head.nstate == MAKUO_SENDSTATE_STAT){ |
|
823 |
- msend_req_del_init(s, m); |
|
824 |
- } |
|
825 | 826 |
if(m->mdata.head.nstate == MAKUO_SENDSTATE_MARK){ |
826 | 827 |
msend_req_del_mark(s, m); |
827 | 828 |
return; |