[Sheepdog] [PATCH 2/3] collie: set the number of copies in SD_READ_OBJ requests
MORITA Kazutaka
morita.kazutaka at lab.ntt.co.jp
Wed Dec 23 19:25:33 CET 2009
The number of copies is used when forwarding requests
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
collie/store.c | 29 ++++++++++-------------------
lib/net.c | 8 ++++----
shepherd/shepherd.c | 5 ++++-
3 files changed, 18 insertions(+), 24 deletions(-)
diff --git a/collie/store.c b/collie/store.c
index aadddc5..7c0f6d1 100644
--- a/collie/store.c
+++ b/collie/store.c
@@ -66,8 +66,9 @@ static int stat_sheep(uint64_t *store_size, uint64_t *store_free)
return SD_RES_SUCCESS;
}
-static int read_from_one(struct cluster_info *cluster, uint64_t oid,
- unsigned *rlen, void *buf, uint64_t offset)
+static int read_from_others(struct cluster_info *cluster, uint64_t oid,
+ unsigned *rlen, void *buf, uint64_t offset,
+ int copies)
{
int i, n, nr, fd, ret;
unsigned wlen;
@@ -80,7 +81,7 @@ static int read_from_one(struct cluster_info *cluster, uint64_t oid,
again:
nr = build_node_list(&cluster->node_list, e);
- for (i = 0; i < nr; i++) {
+ for (i = 0; i < copies; i++) {
n = obj_to_sheep(e, nr, oid, i);
snprintf(name, sizeof(name), "%d.%d.%d.%d",
@@ -93,6 +94,7 @@ again:
memset(&hdr, 0, sizeof(hdr));
hdr.opcode = SD_OP_READ_OBJ;
+ hdr.copies = copies;
hdr.oid = oid;
hdr.epoch = cluster->epoch;
@@ -124,19 +126,6 @@ again:
return -1;
}
-static int read_from_other_sheeps(struct cluster_info *cluster,
- uint64_t oid, char *buf, int copies)
-{
- int ret;
- unsigned int rlen;
-
- rlen = SD_DATA_OBJ_SIZE;
-
- ret = read_from_one(cluster, oid, &rlen, buf, 0);
-
- return ret;
-}
-
static int check_epoch(struct cluster_info *cluster, struct request *req)
{
struct sd_req *hdr = (struct sd_req *)&req->rq;
@@ -173,6 +162,7 @@ void store_queue_request(struct work *work, int idx)
uint32_t req_epoch = hdr->epoch;
struct sd_node_rsp *nrsp = (struct sd_node_rsp *)&req->rp;
int copies;
+ unsigned rlen;
/* use le_to_cpu */
@@ -239,9 +229,10 @@ void store_queue_request(struct work *work, int idx)
if (hdr->flags & SD_FLAG_CMD_COW) {
dprintf("%" PRIu64 "\n", hdr->cow_oid);
- ret = read_from_other_sheeps(cluster,
- hdr->cow_oid, buf,
- hdr->copies);
+ rlen = SD_DATA_OBJ_SIZE;
+ ret = read_from_others(cluster, hdr->cow_oid, &rlen, buf,
+ 0, hdr->copies);
+
if (ret) {
ret = 1;
goto out;
diff --git a/lib/net.c b/lib/net.c
index caf592f..17f0fd6 100644
--- a/lib/net.c
+++ b/lib/net.c
@@ -361,12 +361,11 @@ int write_object(struct sheepdog_node_list_entry *e,
memset(&hdr, 0, sizeof(hdr));
hdr.epoch = node_version;
- if (create) {
+ if (create)
hdr.opcode = SD_OP_CREATE_AND_WRITE_OBJ;
- hdr.copies = nr;
- } else
+ else
hdr.opcode = SD_OP_WRITE_OBJ;
-
+ hdr.copies = nr;
hdr.oid = oid;
hdr.flags = SD_FLAG_CMD_WRITE;
@@ -412,6 +411,7 @@ int read_object(struct sheepdog_node_list_entry *e,
memset(&hdr, 0, sizeof(hdr));
hdr.epoch = node_version;
hdr.opcode = SD_OP_READ_OBJ;
+ hdr.copies = nr;
hdr.oid = oid;
hdr.flags = 0;
diff --git a/shepherd/shepherd.c b/shepherd/shepherd.c
index 9654888..b6129a8 100644
--- a/shepherd/shepherd.c
+++ b/shepherd/shepherd.c
@@ -396,6 +396,8 @@ int parse_vdi(vdi_parser_func_t func, void *data)
return 1;
req.opcode = SD_OP_SO_READ_VDIS;
+ /* TODO: use ANAME_COPIES in the vdi directory */
+ req.copies = 3;
ret = exec_reqs(node_list_entries, nr_nodes, node_list_version,
SD_DIR_OID, (struct sd_req *)&req, buf, 0, DIR_BUF_LEN,nr_nodes);
@@ -411,8 +413,9 @@ int parse_vdi(vdi_parser_func_t func, void *data)
if (!ent->name_len)
break;
+ /* TODO: use ANAME_COPIES in the vdi directory */
ret = read_object(node_list_entries, nr_nodes, node_list_version,
- ent->oid, (void *)&i, sizeof(i), 0, nr_nodes);
+ ent->oid, (void *)&i, sizeof(i), 0, 3);
if (ret == sizeof(i))
func(ent->oid, ent->name, ent->tag, ent->flags, &i, data);
--
1.6.5
More information about the sheepdog
mailing list