The main process_work now gets a struct request passed to it to simply the
code in all instanes, and a new process_cluster_work is used for the cluster
ops where we can't simplify pass the request.

Recommendations for a better name for process_work_cluster are welcome.

Signed-off-by: Christoph Hellwig <[email protected]>
---
 sheep/group.c      |    4 -
 sheep/ops.c        |  136 ++++++++++++++++++++++++++---------------------------
 sheep/sdnet.c      |    2 
 sheep/sheep_priv.h |    7 +-
 sheep/store.c      |    2 
 5 files changed, 78 insertions(+), 73 deletions(-)

Index: sheepdog/sheep/ops.c
===================================================================
--- sheepdog.orig/sheep/ops.c   2012-05-08 15:44:28.360690304 +0200
+++ sheepdog/sheep/ops.c        2012-05-08 15:44:31.728690272 +0200
@@ -39,24 +39,24 @@ struct sd_op_template {
        int force;
 
        /*
-        * process_work() will be called in the worker thread, and
-        * process_main() will be called in the main thread.
+        * process_work() and process_work_cluster will be called in a
+        * worker thread, and process_main() will be called in the main thread.
         *
-        * If type is SD_OP_TYPE_CLUSTER, it is guaranteed that only
-        * one node processes a cluster operation at the same time.
-        * We can use this for something like distributed locking.
-        * process_work() will be called on the local node, and
-        * process_main() will be called on every nodes.
+        * If type is SD_OP_TYPE_CLUSTER, it is guaranteed that only one node
+        * processes a cluster operation at the same time.  We can use this for
+        * for example to implement distributed locking.  process_work_cluster()
+        * will be called on the local node, and process_main() will be called
+        * on every node.
         *
-        * If type is SD_OP_TYPE_LOCAL, both process_work() and
-        * process_main() will be called on the local node.
+        * If type is SD_OP_TYPE_LOCAL, both process_work() and process_main()
+        * will be called on the local node.
         *
-        * If type is SD_OP_TYPE_IO, neither process_work() nor
-        * process_main() is used because this type of operation is
-        * heavily intertwined with Sheepdog core codes.  We will be
-        * unlikely to add new operations of this type.
+        * If type is SD_OP_TYPE_IO, only process_work() will be called, and it
+        * will be called on the local node.
         */
-       int (*process_work)(const struct sd_req *req, struct sd_rsp *rsp, void 
*data);
+       int (*process_work)(struct request *req);
+       int (*process_work_cluster)(const struct sd_req *req,
+                       struct sd_rsp *rsp, void *data);
        int (*process_main)(const struct sd_req *req, struct sd_rsp *rsp, void 
*data);
 };
 
@@ -319,8 +319,7 @@ static int cluster_get_vdi_attr(const st
        return ret;
 }
 
-static int local_get_store_list(const struct sd_req *req, struct sd_rsp *rsp,
-                               void *data)
+static int local_get_store_list(struct request *req)
 {
        struct strbuf buf = STRBUF_INIT;
        struct store_driver *driver;
@@ -328,7 +327,7 @@ static int local_get_store_list(const st
        list_for_each_entry(driver, &store_drivers, list) {
                strbuf_addf(&buf, "%s ", driver->name);
        }
-       memcpy(data, buf.buf, buf.len);
+       memcpy(req->data, buf.buf, buf.len);
 
        strbuf_release(&buf);
        return SD_RES_SUCCESS;
@@ -366,11 +365,10 @@ static int local_get_node_list(const str
        return SD_RES_SUCCESS;
 }
 
-static int local_stat_sheep(const struct sd_req *req, struct sd_rsp *rsp,
-                           void *data)
+static int local_stat_sheep(struct request *req)
 {
-       struct sd_node_rsp *node_rsp = (struct sd_node_rsp *)rsp;
-       uint32_t epoch = req->epoch;
+       struct sd_node_rsp *node_rsp = (struct sd_node_rsp *)&req->rp;
+       uint32_t epoch = req->rq.epoch;
 
        return stat_sheep(&node_rsp->store_size, &node_rsp->store_free, epoch);
 }
@@ -386,9 +384,9 @@ static int local_stat_recovery(const str
        return SD_RES_UNKNOWN;
 }
 
-static int local_stat_cluster(const struct sd_req *req, struct sd_rsp *rsp,
-                             void *data)
+static int local_stat_cluster(struct request *req)
 {
+       struct sd_rsp *rsp = &req->rp;
        struct epoch_log *log;
        int i, max_logs;
        uint32_t sys_stat = sys_stat_get(), epoch;
@@ -400,7 +398,7 @@ static int local_stat_cluster(const stru
                if (epoch <= 0)
                        break;
 
-               log = (struct epoch_log *)data + i;
+               log = (struct epoch_log *)req->data + i;
                log->epoch = epoch;
                log->ctime = get_cluster_ctime();
                log->nr_nodes = epoch_log_read(epoch, (char *)log->nodes,
@@ -436,28 +434,27 @@ static int local_stat_cluster(const stru
        }
 }
 
-static int local_kill_node(const struct sd_req *req, struct sd_rsp *rsp,
-                          void *data)
+static int local_kill_node(struct request *req)
 {
        exit(1);
 }
 
-static int local_get_obj_list(const struct sd_req *req, struct sd_rsp *rsp,
-                             void *data)
+static int local_get_obj_list(struct request *req)
 {
-       return get_obj_list((const struct sd_list_req *)req,
-                           (struct sd_list_rsp *)rsp, data);
+       return get_obj_list((const struct sd_list_req *)&req->rq,
+                           (struct sd_list_rsp *)&req->rp, req->data);
 }
 
-static int local_get_epoch(const struct sd_req *req, struct sd_rsp *rsp,
-                          void *data)
+static int local_get_epoch(struct request *req)
 {
-       const struct sd_obj_req *obj_req = (const struct sd_obj_req *)req;
-       struct sd_obj_rsp *obj_rsp = (struct sd_obj_rsp *)rsp;
+       const struct sd_obj_req *obj_req = (const struct sd_obj_req *)&req->rq;
+       struct sd_obj_rsp *obj_rsp = (struct sd_obj_rsp *)&req->rp;
        uint32_t epoch = obj_req->tgt_epoch;
        int len, ret;
+
        dprintf("%d\n", epoch);
-       len = epoch_log_read(epoch, (char *)data, obj_req->data_length);
+
+       len = epoch_log_read(epoch, req->data, obj_req->data_length);
        if (len == -1) {
                ret = SD_RES_NO_TAG;
                obj_rsp->data_length = 0;
@@ -564,15 +561,14 @@ static int cluster_restore(const struct
        return ret;
 }
 
-static int local_get_snap_file(const struct sd_req *req, struct sd_rsp *rsp,
-                           void *data)
+static int local_get_snap_file(struct request *req)
 {
        int ret;
-       struct siocb iocb = { .buf = data };
+       struct siocb iocb = { .buf = req->data };
 
        if (sd_store->get_snap_file) {
                ret = sd_store->get_snap_file(&iocb);
-               rsp->data_length = iocb.length;
+               req->rp.data_length = iocb.length;
        } else
                ret = SD_RES_NO_SUPPORT;
 
@@ -595,9 +591,9 @@ static void flush_vdi_done(struct work *
        free(fw);
 }
 
-static int local_flush_vdi(const struct sd_req *req, struct sd_rsp *rsp, void 
*data)
+static int local_flush_vdi(struct request *req)
 {
-       struct sd_obj_req *hdr = (struct sd_obj_req *)req;
+       struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
        uint64_t oid = hdr->oid;
        uint32_t vid = oid_to_vid(oid);
        struct object_cache *cache = find_object_cache(vid, 0);
@@ -709,9 +705,9 @@ out:
        return ret;
 }
 
-static int store_remove_obj(const struct sd_req *req, struct sd_rsp *rsp, void 
*data)
+static int store_remove_obj(struct request *req)
 {
-       struct sd_obj_req *hdr = (struct sd_obj_req *)req;
+       struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
        uint32_t epoch = hdr->epoch;
        struct strbuf buf = STRBUF_INIT;
        int ret = SD_RES_SUCCESS;
@@ -735,11 +731,10 @@ static int store_remove_obj(const struct
        return ret;
 }
 
-static int store_read_obj(const struct sd_req *req, struct sd_rsp *rsp, void 
*data)
+static int store_read_obj(struct request *req)
 {
-       struct sd_obj_req *hdr = (struct sd_obj_req *)req;
-       struct sd_obj_rsp *rsps = (struct sd_obj_rsp *)rsp;
-       struct request *request = (struct request *)data;
+       struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
+       struct sd_obj_rsp *rsps = (struct sd_obj_rsp *)&req->rp;
        int ret;
        uint32_t epoch = hdr->epoch;
        struct siocb iocb;
@@ -751,7 +746,7 @@ static int store_read_obj(const struct s
        if (ret != SD_RES_SUCCESS)
                return ret;
 
-       iocb.buf = request->data;
+       iocb.buf = req->data;
        iocb.length = hdr->data_length;
        iocb.offset = hdr->offset;
        ret = sd_store->read(hdr->oid, &iocb);
@@ -795,11 +790,9 @@ static int do_write_obj(struct siocb *io
        return ret;
 }
 
-static int store_write_obj(const struct sd_req *req, struct sd_rsp *rsp,
-                          void *data)
+static int store_write_obj(struct request *req)
 {
-       struct sd_obj_req *hdr = (struct sd_obj_req *)req;
-       struct request *request = (struct request *)data;
+       struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
        int ret;
        uint32_t epoch = hdr->epoch;
        struct siocb iocb;
@@ -811,17 +804,15 @@ static int store_write_obj(const struct
        if (ret != SD_RES_SUCCESS)
                return ret;
 
-       ret = do_write_obj(&iocb, hdr, epoch, request->data);
+       ret = do_write_obj(&iocb, hdr, epoch, req->data);
 
        sd_store->close(hdr->oid, &iocb);
        return ret;
 }
 
-static int store_create_and_write_obj(const struct sd_req *req,
-                               struct sd_rsp *rsp, void *data)
+static int store_create_and_write_obj(struct request *req)
 {
-       struct sd_obj_req *hdr = (struct sd_obj_req *)req;
-       struct request *request = (struct request *)data;
+       struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
        struct sd_obj_req cow_hdr;
        int ret;
        uint32_t epoch = hdr->epoch;
@@ -852,21 +843,22 @@ static int store_create_and_write_obj(co
                        goto out;
                }
                if (hdr->data_length != SD_DATA_OBJ_SIZE) {
-                       ret = read_copy_from_replica(request, hdr->epoch, 
hdr->cow_oid, buf);
+                       ret = read_copy_from_replica(req, hdr->epoch,
+                                                    hdr->cow_oid, buf);
                        if (ret != SD_RES_SUCCESS) {
                                eprintf("failed to read cow object\n");
                                goto out;
                        }
                }
 
-               memcpy(buf + hdr->offset, request->data, hdr->data_length);
+               memcpy(buf + hdr->offset, req->data, hdr->data_length);
                memcpy(&cow_hdr, hdr, sizeof(cow_hdr));
                cow_hdr.offset = 0;
                cow_hdr.data_length = SD_DATA_OBJ_SIZE;
 
                ret = do_write_obj(&iocb, &cow_hdr, epoch, buf);
        } else
-               ret = do_write_obj(&iocb, hdr, epoch, request->data);
+               ret = do_write_obj(&iocb, hdr, epoch, req->data);
 
        if (SD_RES_SUCCESS == ret)
                check_and_insert_objlist_cache(hdr->oid);
@@ -882,23 +874,23 @@ static struct sd_op_template sd_ops[] =
        /* cluster operations */
        [SD_OP_NEW_VDI] = {
                .type = SD_OP_TYPE_CLUSTER,
-               .process_work = cluster_new_vdi,
+               .process_work_cluster = cluster_new_vdi,
                .process_main = post_cluster_new_vdi,
        },
 
        [SD_OP_DEL_VDI] = {
                .type = SD_OP_TYPE_CLUSTER,
-               .process_work = cluster_del_vdi,
+               .process_work_cluster = cluster_del_vdi,
        },
 
        [SD_OP_GET_VDI_INFO] = {
                .type = SD_OP_TYPE_CLUSTER,
-               .process_work = cluster_get_vdi_info,
+               .process_work_cluster = cluster_get_vdi_info,
        },
 
        [SD_OP_LOCK_VDI] = {
                .type = SD_OP_TYPE_CLUSTER,
-               .process_work = cluster_get_vdi_info,
+               .process_work_cluster = cluster_get_vdi_info,
        },
 
        [SD_OP_MAKE_FS] = {
@@ -914,7 +906,7 @@ static struct sd_op_template sd_ops[] =
 
        [SD_OP_GET_VDI_ATTR] = {
                .type = SD_OP_TYPE_CLUSTER,
-               .process_work = cluster_get_vdi_attr,
+               .process_work_cluster = cluster_get_vdi_attr,
        },
 
        [SD_OP_RELEASE_VDI] = {
@@ -1074,15 +1066,25 @@ int has_process_work(struct sd_op_templa
        return !!op->process_work;
 }
 
+int has_process_work_cluster(struct sd_op_template *op)
+{
+       return !!op->process_work_cluster;
+}
+
 int has_process_main(struct sd_op_template *op)
 {
        return !!op->process_main;
 }
 
-int do_process_work(struct sd_op_template *op, const struct sd_req *req,
+int do_process_work(struct request *req)
+{
+       return req->op->process_work(req);
+}
+
+int do_process_work_cluster(struct sd_op_template *op, const struct sd_req 
*req,
                    struct sd_rsp *rsp, void *data)
 {
-       return op->process_work(req, rsp, data);
+       return op->process_work_cluster(req, rsp, data);
 }
 
 int do_process_main(struct sd_op_template *op, const struct sd_req *req,
Index: sheepdog/sheep/sdnet.c
===================================================================
--- sheepdog.orig/sheep/sdnet.c 2012-05-08 15:44:29.708690290 +0200
+++ sheepdog/sheep/sdnet.c      2012-05-08 15:44:31.728690272 +0200
@@ -183,7 +183,7 @@ static void do_local_request(struct work
        int ret = SD_RES_SUCCESS;
 
        if (has_process_work(req->op))
-               ret = do_process_work(req->op, &req->rq, &req->rp, req->data);
+               ret = do_process_work(req);
 
        rsp->result = ret;
 }
Index: sheepdog/sheep/sheep_priv.h
===================================================================
--- sheepdog.orig/sheep/sheep_priv.h    2012-05-08 15:44:29.712690290 +0200
+++ sheepdog/sheep/sheep_priv.h 2012-05-08 15:44:31.728690272 +0200
@@ -322,11 +322,14 @@ int is_io_op(struct sd_op_template *op);
 int is_force_op(struct sd_op_template *op);
 int has_process_work(struct sd_op_template *op);
 int has_process_main(struct sd_op_template *op);
-int do_process_work(struct sd_op_template *op, const struct sd_req *req,
-                   struct sd_rsp *rsp, void *data);
+int do_process_work(struct request *req);
 int do_process_main(struct sd_op_template *op, const struct sd_req *req,
                    struct sd_rsp *rsp, void *data);
 
+int has_process_work_cluster(struct sd_op_template *op);
+int do_process_work_cluster(struct sd_op_template *op, const struct sd_req 
*req,
+                           struct sd_rsp *rsp, void *data);
+
 /* Journal */
 struct jrnl_descriptor *jrnl_begin(const void *buf, size_t count, off_t offset,
                                   const char *path, const char *jrnl_dir);
Index: sheepdog/sheep/store.c
===================================================================
--- sheepdog.orig/sheep/store.c 2012-05-08 15:44:28.360690304 +0200
+++ sheepdog/sheep/store.c      2012-05-08 15:44:31.732690271 +0200
@@ -53,7 +53,7 @@ static int do_local_io(struct request *r
        hdr->epoch = epoch;
        dprintf("%x, %" PRIx64" , %u\n", hdr->opcode, hdr->oid, epoch);
 
-       return do_process_work(req->op, &req->rq, &req->rp, req);
+       return do_process_work(req);
 }
 
 static int forward_read_obj_req(struct request *req)
Index: sheepdog/sheep/group.c
===================================================================
--- sheepdog.orig/sheep/group.c 2012-05-08 15:44:29.708690290 +0200
+++ sheepdog/sheep/group.c      2012-05-08 15:44:31.732690271 +0200
@@ -219,7 +219,7 @@ static void do_cluster_op(void *arg)
                data = msg->data;
        else
                data = req->data;
-       ret = do_process_work(req->op, (const struct sd_req *)&msg->req,
+       ret = do_process_work_cluster(req->op, (const struct sd_req *)&msg->req,
                              (struct sd_rsp *)&msg->rsp, data);
 
        msg->rsp.result = ret;
@@ -252,7 +252,7 @@ void do_cluster_request(struct work *wor
 
        list_add_tail(&req->pending_list, &sys->pending_list);
 
-       if (has_process_work(req->op))
+       if (has_process_work_cluster(req->op))
                sys->cdrv->notify(msg, size, do_cluster_op);
        else {
                msg->rsp.result = SD_RES_SUCCESS;

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to