[sheepdog] [PATCH v3 1/5] sheep: restructure sd_vnode
Liu Yuan
namei.unix at gmail.com
Wed Sep 11 08:24:53 CEST 2013
- remove duplicate fields that sd_node has
- point to sd_node directly instead of using index
This will allow changing the structure of sd_node for later patch.
Signed-off-by: Liu Yuan <namei.unix at gmail.com>
---
dog/vdi.c | 15 +++++++++------
include/sheep.h | 26 ++++++++------------------
sheep/gateway.c | 4 ++--
sheep/recovery.c | 3 +--
sheep/sheep_priv.h | 2 +-
5 files changed, 21 insertions(+), 29 deletions(-)
diff --git a/dog/vdi.c b/dog/vdi.c
index 231a3a4..a31d8c5 100644
--- a/dog/vdi.c
+++ b/dog/vdi.c
@@ -948,7 +948,7 @@ static int do_track_object(uint64_t oid, uint8_t nr_copies)
logs[i].nr_nodes, vnodes);
oid_to_vnodes(vnodes, vnodes_nr, oid, nr_copies, vnode_buf);
for (j = 0; j < nr_copies; j++) {
- const struct node_id *n = &vnode_buf[j]->nid;
+ const struct node_id *n = &vnode_buf[j]->node->nid;
printf("%s\n", addr_to_str(n->addr, n->port));
}
@@ -1357,7 +1357,8 @@ static void *read_object_from(const struct sd_vnode *vnode, uint64_t oid)
hdr.obj.oid = oid;
- ret = dog_exec_req(vnode->nid.addr, vnode->nid.port, &hdr, buf);
+ ret = dog_exec_req(vnode->node->nid.addr, vnode->node->nid.port,
+ &hdr, buf);
if (ret < 0)
exit(EXIT_SYSFAIL);
@@ -1394,7 +1395,8 @@ static void write_object_to(const struct sd_vnode *vnode, uint64_t oid,
hdr.data_length = get_objsize(oid);
hdr.obj.oid = oid;
- ret = dog_exec_req(vnode->nid.addr, vnode->nid.port, &hdr, buf);
+ ret = dog_exec_req(vnode->node->nid.addr, vnode->node->nid.port,
+ &hdr, buf);
if (ret < 0)
exit(EXIT_SYSFAIL);
@@ -1475,8 +1477,8 @@ static void vdi_hash_check_work(struct work *work)
hdr.obj.oid = info->oid;
hdr.obj.tgt_epoch = sd_epoch;
- ret = dog_exec_req(vcw->vnode->nid.addr, vcw->vnode->nid.port, &hdr,
- NULL);
+ ret = dog_exec_req(vcw->vnode->node->nid.addr,
+ vcw->vnode->node->nid.port, &hdr, NULL);
if (ret < 0)
exit(EXIT_SYSFAIL);
@@ -1491,7 +1493,8 @@ static void vdi_hash_check_work(struct work *work)
break;
default:
sd_err("failed to read %" PRIx64 " from %s, %s", info->oid,
- addr_to_str(vcw->vnode->nid.addr, vcw->vnode->nid.port),
+ addr_to_str(vcw->vnode->node->nid.addr,
+ vcw->vnode->node->nid.port),
sd_strerror(rsp->result));
exit(EXIT_FAILURE);
}
diff --git a/include/sheep.h b/include/sheep.h
index d08c86b..bbb7721 100644
--- a/include/sheep.h
+++ b/include/sheep.h
@@ -19,9 +19,7 @@
#include "net.h"
struct sd_vnode {
- struct node_id nid;
- uint16_t node_idx;
- uint32_t zone;
+ const struct sd_node *node;
uint64_t id;
};
@@ -60,7 +58,7 @@ static inline void sd_init_req(struct sd_req *req, uint8_t opcode)
static inline int same_zone(const struct sd_vnode *e, int n1, int n2)
{
- return e[n1].zone == e[n2].zone;
+ return e[n1].node->zone == e[n2].node->zone;
}
/* Get the first vnode's index which is matching the OID */
@@ -147,14 +145,13 @@ static inline const struct sd_vnode *oid_to_vnode(const struct sd_vnode *entries
static inline const struct sd_node *oid_to_node(const struct sd_vnode *entries,
int nr_entries, uint64_t oid,
- int copy_idx,
- const struct sd_node *all_nodes)
+ int copy_idx)
{
const struct sd_vnode *vnode;
vnode = oid_to_vnode(entries, nr_entries, oid, copy_idx);
- return &all_nodes[vnode->node_idx];
+ return vnode->node;
}
static inline void oid_to_vnodes(const struct sd_vnode *entries, int nr_entries,
@@ -179,7 +176,6 @@ static inline void oid_to_vnodes(const struct sd_vnode *entries, int nr_entries,
static inline void oid_to_nodes(const struct sd_vnode *entries, int nr_entries,
uint64_t oid, int nr_copies,
- const struct sd_node *all_nodes,
const struct sd_node **nodes)
{
int i;
@@ -187,7 +183,7 @@ static inline void oid_to_nodes(const struct sd_vnode *entries, int nr_entries,
oid_to_vnodes(entries, nr_entries, oid, nr_copies, vnodes);
for (i = 0; i < nr_copies; i++)
- nodes[i] = &all_nodes[vnodes[i]->node_idx];
+ nodes[i] = vnodes[i]->node;
}
static inline const char *sd_strerror(int err)
@@ -283,22 +279,16 @@ static inline int vnode_cmp(const struct sd_vnode *node1,
return intcmp(node1->id, node2->id);
}
-static inline int node_to_vnodes(const struct sd_node *nodes, int idx,
+static inline int node_to_vnodes(const struct sd_node *n,
struct sd_vnode *vnodes)
{
int nr = 0;
- const struct sd_node *n = nodes + idx;
uint64_t hval = sd_hash(&n->nid, offsetof(typeof(n->nid), io_addr));
for (int i = 0; i < n->nr_vnodes; i++) {
hval = sd_hash_next(hval);
-
vnodes[nr].id = hval;
- memcpy(vnodes[nr].nid.addr, n->nid.addr, sizeof(n->nid.addr));
- vnodes[nr].nid.port = n->nid.port;
- vnodes[nr].node_idx = idx;
- vnodes[nr].zone = n->zone;
-
+ vnodes[nr].node = n;
nr++;
}
@@ -311,7 +301,7 @@ static inline int nodes_to_vnodes(const struct sd_node *nodes, int nr_nodes,
int nr_vnodes = 0;
for (int i = 0; i < nr_nodes; i++)
- nr_vnodes += node_to_vnodes(nodes, i, vnodes + nr_vnodes);
+ nr_vnodes += node_to_vnodes(nodes + i, vnodes + nr_vnodes);
xqsort(vnodes, nr_vnodes, vnode_cmp);
diff --git a/sheep/gateway.c b/sheep/gateway.c
index dc2cc7d..33f04e0 100644
--- a/sheep/gateway.c
+++ b/sheep/gateway.c
@@ -74,7 +74,7 @@ int gateway_read_obj(struct request *req)
* structure.
*/
gateway_init_fwd_hdr(&fwd_hdr, &req->rq);
- ret = sheep_exec_req(&v->nid, &fwd_hdr, req->data);
+ ret = sheep_exec_req(&v->node->nid, &fwd_hdr, req->data);
if (ret != SD_RES_SUCCESS)
continue;
@@ -243,7 +243,7 @@ static int init_target_nodes(struct request *req, uint64_t oid,
nr_to_send = get_req_copy_number(req);
oid_to_nodes(vinfo->vnodes, vinfo->nr_vnodes, oid, nr_to_send,
- vinfo->nodes, target_nodes);
+ target_nodes);
return nr_to_send;
}
diff --git a/sheep/recovery.c b/sheep/recovery.c
index 521661b..6a02adf 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -197,8 +197,7 @@ static int recover_object_from_replica(struct recovery_obj_work *row,
const struct sd_node *node;
int idx = (i + start) % nr_copies;
- node = oid_to_node(old->vnodes, old->nr_vnodes, oid, idx,
- old->nodes);
+ node = oid_to_node(old->vnodes, old->nr_vnodes, oid, idx);
if (invalid_node(node, row->base.cur_vinfo))
continue;
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 3643d12..7796d86 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -385,7 +385,7 @@ int gateway_to_peer_opcode(int opcode);
static inline bool vnode_is_local(const struct sd_vnode *v)
{
- return node_id_cmp(&v->nid, &sys->this_node.nid) == 0;
+ return node_id_cmp(&v->node->nid, &sys->this_node.nid) == 0;
}
static inline bool node_is_local(const struct sd_node *n)
--
1.7.9.5
More information about the sheepdog
mailing list