When we send a vdi operaton to the collie, the following
procedures are executed:

(1) the operation message 'A' is sent to the corosync
(2) __sd_deliver is called with w->msg == 'A'
(3) the completion message 'B' is sent to the corosync
(4) __sd_deliver_done is called with w->msg == 'A'
(5) __sd_deliver is called with w->msg == 'B'
(6) __sd_deliver_done is called with w->msg == 'B'

These must be called in this order.

This patch ensures that (4) is called before (5).

Signed-off-by: MORITA Kazutaka <[email protected]>
---
 collie/group.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/collie/group.c b/collie/group.c
index 5dfd49e..2983f95 100644
--- a/collie/group.c
+++ b/collie/group.c
@@ -848,7 +848,13 @@ static void sd_deliver(cpg_handle_t handle, const struct 
cpg_name *group_name,
                                vprintf(SDOG_DEBUG "%u\n", pid);
 
                        return;
-               }
+               } else
+                       /*
+                        * must be blocked until the message with
+                        * m->done == 0 is completely finished
+                        * (__sd_deliver_done is called)
+                        */
+                       w->work.attr = WORK_ORDERED;
        } else if (m->op == SD_MSG_JOIN)
                  w->work.attr = WORK_ORDERED;
 
-- 
1.5.6.5

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

Reply via email to