[Sheepdog] [PATCH 1/2] sdnet: split up __done
Christoph Hellwig
hch at infradead.org
Mon Nov 14 16:48:41 CET 2011
Split the __done function into one helper per operation type given that
there is no shared code between the different types.
Signed-off-by: Christoph Hellwig <hch at lst.de>
Index: sheepdog/sheep/sdnet.c
===================================================================
--- sheepdog.orig/sheep/sdnet.c 2011-11-14 16:39:17.411274667 +0100
+++ sheepdog/sheep/sdnet.c 2011-11-14 16:41:13.821273968 +0100
@@ -76,109 +76,114 @@ static void setup_access_to_local_object
req->local_oid = hdr->oid;
}
-static void __done(struct work *work, int idx)
+static void io_op_done(struct work *work, int idx)
{
struct request *req = container_of(work, struct request, work);
+ struct cpg_event *cevent = &req->cev;
int again = 0;
int copies = sys->nr_sobjs;
if (copies > req->nr_zones)
copies = req->nr_zones;
- if (is_cluster_op(req->op))
- /* request is forwarded to cpg group */
- return;
-
- if (is_local_op(req->op) && has_process_main(req->op))
- req->rp.result = do_process_main(req->op, &req->rq,
- &req->rp, req->data);
-
- if (is_io_op(req->op)) {
- struct cpg_event *cevent = &req->cev;
-
- list_del(&req->r_wlist);
-
- sys->nr_outstanding_io--;
- /*
- * TODO: if the request failed due to epoch unmatch,
- * we should retry here (adds this request to the tail
- * of sys->cpg_event_siblings.
- */
-
- if (!(req->rq.flags & SD_FLAG_CMD_IO_LOCAL) &&
- (req->rp.result == SD_RES_OLD_NODE_VER ||
- req->rp.result == SD_RES_NEW_NODE_VER ||
- req->rp.result == SD_RES_NETWORK_ERROR ||
- req->rp.result == SD_RES_WAIT_FOR_JOIN ||
- req->rp.result == SD_RES_WAIT_FOR_FORMAT)) {
+ list_del(&req->r_wlist);
+ sys->nr_outstanding_io--;
+ /*
+ * TODO: if the request failed due to epoch unmatch,
+ * we should retry here (adds this request to the tail
+ * of sys->cpg_event_siblings.
+ */
+ if (!(req->rq.flags & SD_FLAG_CMD_IO_LOCAL) &&
+ (req->rp.result == SD_RES_OLD_NODE_VER ||
+ req->rp.result == SD_RES_NEW_NODE_VER ||
+ req->rp.result == SD_RES_NETWORK_ERROR ||
+ req->rp.result == SD_RES_WAIT_FOR_JOIN ||
+ req->rp.result == SD_RES_WAIT_FOR_FORMAT)) {
+
+ req->rq.epoch = sys->epoch;
+ setup_ordered_sd_vnode_list(req);
+ setup_access_to_local_objects(req);
+
+ list_add_tail(&cevent->cpg_event_list, &sys->cpg_event_siblings);
+ again = 1;
+ } else if (req->rp.result == SD_RES_SUCCESS && req->check_consistency) {
+ struct sd_obj_req *obj_hdr = (struct sd_obj_req *)&req->rq;
+ uint32_t vdi_id = oid_to_vid(obj_hdr->oid);
+ struct data_object_bmap *bmap, *n;
+ int nr_bmaps = 0;
+
+ if (!is_data_obj(obj_hdr->oid))
+ goto done;
+
+ list_for_each_entry_safe(bmap, n, &sys->consistent_obj_list, list) {
+ nr_bmaps++;
+ if (bmap->vdi_id == vdi_id) {
+ set_bit(data_oid_to_idx(obj_hdr->oid), bmap->dobjs);
+ list_del(&bmap->list);
+ list_add_tail(&bmap->list, &sys->consistent_obj_list);
+ goto done;
+ }
+ }
+ bmap = zalloc(sizeof(*bmap));
+ if (bmap == NULL) {
+ eprintf("failed to allocate memory\n");
+ goto done;
+ }
+ dprintf("allocating a new object map\n");
+ bmap->vdi_id = vdi_id;
+ list_add_tail(&bmap->list, &sys->consistent_obj_list);
+ set_bit(data_oid_to_idx(obj_hdr->oid), bmap->dobjs);
+ if (nr_bmaps >= MAX_DATA_OBJECT_BMAPS) {
+ /* the first entry is the least recently used one */
+ bmap = list_first_entry(&sys->consistent_obj_list,
+ struct data_object_bmap, list);
+ list_del(&bmap->list);
+ free(bmap);
+ }
+ } else if (is_access_local(req->entry, req->nr_vnodes,
+ ((struct sd_obj_req *)&req->rq)->oid, copies) &&
+ req->rp.result == SD_RES_EIO) {
+ eprintf("leaving sheepdog cluster\n");
+ leave_cluster();
+
+ if (req->rq.flags & SD_FLAG_CMD_IO_LOCAL)
+ /* hack to retry */
+ req->rp.result = SD_RES_NETWORK_ERROR;
+ else {
req->rq.epoch = sys->epoch;
setup_ordered_sd_vnode_list(req);
setup_access_to_local_objects(req);
list_add_tail(&cevent->cpg_event_list, &sys->cpg_event_siblings);
again = 1;
- } else if (req->rp.result == SD_RES_SUCCESS && req->check_consistency) {
- struct sd_obj_req *obj_hdr = (struct sd_obj_req *)&req->rq;
- uint32_t vdi_id = oid_to_vid(obj_hdr->oid);
- struct data_object_bmap *bmap, *n;
- int nr_bmaps = 0;
-
- if (!is_data_obj(obj_hdr->oid))
- goto done;
-
- list_for_each_entry_safe(bmap, n, &sys->consistent_obj_list, list) {
- nr_bmaps++;
- if (bmap->vdi_id == vdi_id) {
- set_bit(data_oid_to_idx(obj_hdr->oid), bmap->dobjs);
- list_del(&bmap->list);
- list_add_tail(&bmap->list, &sys->consistent_obj_list);
- goto done;
- }
- }
- bmap = zalloc(sizeof(*bmap));
- if (bmap == NULL) {
- eprintf("failed to allocate memory\n");
- goto done;
- }
- dprintf("allocating a new object map\n");
- bmap->vdi_id = vdi_id;
- list_add_tail(&bmap->list, &sys->consistent_obj_list);
- set_bit(data_oid_to_idx(obj_hdr->oid), bmap->dobjs);
- if (nr_bmaps >= MAX_DATA_OBJECT_BMAPS) {
- /* the first entry is the least recently used one */
- bmap = list_first_entry(&sys->consistent_obj_list,
- struct data_object_bmap, list);
- list_del(&bmap->list);
- free(bmap);
- }
- } else if (is_access_local(req->entry, req->nr_vnodes,
- ((struct sd_obj_req *)&req->rq)->oid, copies) &&
- req->rp.result == SD_RES_EIO) {
- eprintf("leaving sheepdog cluster\n");
- leave_cluster();
-
- if (req->rq.flags & SD_FLAG_CMD_IO_LOCAL)
- /* hack to retry */
- req->rp.result = SD_RES_NETWORK_ERROR;
- else {
- req->rq.epoch = sys->epoch;
- setup_ordered_sd_vnode_list(req);
- setup_access_to_local_objects(req);
-
- list_add_tail(&cevent->cpg_event_list, &sys->cpg_event_siblings);
- again = 1;
- }
}
-done:
- resume_pending_requests();
- resume_recovery_work();
}
+done:
+ resume_pending_requests();
+ resume_recovery_work();
if (!again)
req->done(req);
}
+static void local_op_done(struct work *work, int idx)
+{
+ struct request *req = container_of(work, struct request, work);
+
+ if (has_process_main(req->op)) {
+ req->rp.result = do_process_main(req->op, &req->rq,
+ &req->rp, req->data);
+ }
+
+ req->done(req);
+}
+
+static void cluster_op_done(struct work *work, int idx)
+{
+ /* request is forwarded to cpg group */
+}
+
static void queue_request(struct request *req)
{
struct cpg_event *cevent = &req->cev;
@@ -214,19 +219,22 @@ static void queue_request(struct request
}
}
- if (is_io_op(req->op) || is_local_op(req->op))
+ if (is_io_op(req->op)) {
req->work.fn = store_queue_request;
- else if (is_cluster_op(req->op))
+ req->work.done = io_op_done;
+ } else if (is_local_op(req->op)) {
+ req->work.fn = store_queue_request;
+ req->work.done = local_op_done;
+ } else if (is_cluster_op(req->op)) {
req->work.fn = cluster_queue_request;
- else {
+ req->work.done = cluster_op_done;
+ } else {
eprintf("unknown operation %d\n", hdr->opcode);
rsp->result = SD_RES_SYSTEM_ERROR;
req->done(req);
return;
}
- req->work.done = __done;
-
list_del(&req->r_wlist);
/*
More information about the sheepdog
mailing list