Sheepdog cannot process any I/O requests during the node membership
change to keep strong consistency, so we must return
SD_RES_NEW_NODE_VER instead of adding them to a waitlist queue.

Signed-off-by: MORITA Kazutaka <[email protected]>
---
 sheep/group.c |   24 ++++++++++++++++++++++--
 1 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/sheep/group.c b/sheep/group.c
index 28d211f..5d9409d 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -1227,8 +1227,13 @@ out:
        cpg_event_free(cevent);
        cpg_event_clear_running();
 
-       if (!list_empty(&sys->cpg_event_siblings) && !cpg_event_suspended())
-               start_cpg_event_work();
+       if (!list_empty(&sys->cpg_event_siblings)) {
+               if (cpg_event_joining())
+                       /* io requests need to return SD_RES_NEW_NODE_VER */
+                       start_cpg_event_work();
+               else if (!cpg_event_suspended())
+                       start_cpg_event_work();
+       }
 }
 
 static int check_epoch(struct request *req)
@@ -1318,6 +1323,21 @@ void start_cpg_event_work(void)
        if (cpg_event_joining()) {
                if (!cpg_event_suspended())
                        panic("should not happen\n");
+
+               if (cevent->ctype == CPG_EVENT_REQUEST) {
+                       struct request *req = container_of(cevent, struct 
request, cev);
+                       if (is_io_request(req->rq.opcode) && req->rq.flags & 
SD_FLAG_CMD_DIRECT) {
+                               list_del(&cevent->cpg_event_list);
+
+                               req->rp.result = SD_RES_NEW_NODE_VER;
+
+                               /* TODO: cleanup */
+                               list_add_tail(&req->r_wlist, 
&sys->outstanding_req_list);
+                               sys->nr_outstanding_io++;
+
+                               req->work.done(&req->work, 0);
+                       }
+               }
                return;
        }
 
-- 
1.5.6.5

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

Reply via email to