[Sheepdog] [PATCH 1/3] fix exec_reqs() for multiple nodes
FUJITA Tomonori
fujita.tomonori at lab.ntt.co.jp
Tue Dec 22 08:36:22 CET 2009
exec_reqs() uses hdr for responses so it breaks hdr.
TODO: we really need to clean up and merge write_object, read_object,
exec_reqs.
Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
---
lib/net.c | 13 +++++++++----
1 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/lib/net.c b/lib/net.c
index 9c17ea7..caf592f 100644
--- a/lib/net.c
+++ b/lib/net.c
@@ -438,7 +438,8 @@ int exec_reqs(struct sheepdog_node_list_entry *e,
char name[128];
int i = 0, n, fd, ret;
int success = 0;
- struct sd_obj_rsp *rsp = (struct sd_obj_rsp *)&hdr;
+ struct sd_req tmp;
+ struct sd_rsp *rsp = (struct sd_rsp *)&tmp;
for (i = 0; i < nr; i++) {
unsigned wlen = wdatalen, rlen = rdatalen;
@@ -455,7 +456,6 @@ int exec_reqs(struct sheepdog_node_list_entry *e,
if (fd < 0)
return -1;
- rsp->result = 0;
hdr->epoch = node_version;
if (wdatalen) {
hdr->flags = SD_FLAG_CMD_WRITE;
@@ -465,18 +465,23 @@ int exec_reqs(struct sheepdog_node_list_entry *e,
else
hdr->data_length = 0;
- ret = exec_req(fd, hdr, data, &wlen, &rlen);
+ memcpy(&tmp, hdr, sizeof(tmp));
+ ret = exec_req(fd, &tmp, data, &wlen, &rlen);
close(fd);
+ rsp = (struct sd_rsp *)&tmp;
if (rdatalen) {
if (!ret) {
- if (rsp->result == SD_RES_SUCCESS)
+ if (rsp->result == SD_RES_SUCCESS) {
+ memcpy(hdr, rsp, sizeof(*rsp));
return rlen;
+ }
}
} else
if (!ret)
success++;
}
+ memcpy(hdr, rsp, sizeof(*rsp));
return !success;
}
--
1.5.6.5
More information about the sheepdog
mailing list