non master nodes need to keep the list of unfinished deliver messages
in the case of master failure.

Signed-off-by: FUJITA Tomonori <[email protected]>
---
 collie/group.c |   44 +++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/collie/group.c b/collie/group.c
index bd21cf3..ed9ea4a 100644
--- a/collie/group.c
+++ b/collie/group.c
@@ -813,8 +813,11 @@ static void __sd_deliver_done(struct work *work, int idx)
        list_del(&w->work_deliver_list);
 
        /*
-        * When I finished one message, if I have pending messages, I
-        * need to perform the first of them now.
+        * for the master node, when I finished one message, if I have
+        * pending messages, I need to perform the first of them now.
+        *
+        * for the non master nodes, when I get one finished message,
+        * if I can forget it.
         */
        if (m->done && !list_empty(&sys->work_deliver_siblings)) {
 
@@ -833,8 +836,23 @@ static void __sd_deliver_done(struct work *work, int idx)
        free(w->msg);
        free(w);
 
-       if (n)
+       if (!n)
+               return;
+
+       if (is_master())
                queue_work(dobj_queue, &n->work);
+       else {
+               char name[128];
+               m = n->msg;
+
+               dprintf("op: %d, done: %d, size: %d, from: %s\n",
+               m->op, m->done, m->msg_length,
+                       addr_to_str(name, sizeof(name), m->from.addr, 
m->from.port));
+
+               list_del(&n->work_deliver_list);
+               free(n->msg);
+               free(n);
+       }
 }
 
 static void sd_deliver(cpg_handle_t handle, const struct cpg_name *group_name,
@@ -888,8 +906,24 @@ static void sd_deliver(cpg_handle_t handle, const struct 
cpg_name *group_name,
                         * (__sd_deliver_done is called)
                         */
                        w->work.attr = WORK_ORDERED;
-       } else if (m->op == SD_MSG_JOIN)
-                 w->work.attr = WORK_ORDERED;
+       } else {
+               if (!m->done) {
+                       list_add_tail(&w->work_deliver_list,
+                                     &sys->work_deliver_siblings);
+
+                       /*
+                        * non master nodes just links it to
+                        * work_deliver_siblings.
+                        */
+                       return;
+               }
+
+               /*
+                * __sd_deliver_done() frees requests on
+                * work_deliver_siblings in order.
+                */
+               w->work.attr = WORK_ORDERED;
+       }
 
        queue_work(dobj_queue, &w->work);
 }
-- 
1.6.5

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

Reply via email to