Blob Blame History Raw
From 6d2085143a37b6f765ce2a260f0316f24b043a80 Mon Sep 17 00:00:00 2001
From: Raghavendra G <rgowdapp@redhat.com>
Date: Wed, 1 Jul 2015 16:54:55 +0530
Subject: [PATCH 198/200] protocol/server: fail setvolume if any of xlators is not initialized yet

We can only start recieving fops only when all xlators in graph are
initialized.

upstream-patch: http://review.gluster.org/#/c/11490/1
Change-Id: Id79100bab5878bb2518ed133c1118554fbb35229
BUG: 1235735
Signed-off-by: Raghavendra G <rgowdapp@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/52206
---
 xlators/protocol/server/src/server-handshake.c |   17 +++++++++++++++++
 xlators/protocol/server/src/server.c           |   11 +++++++++++
 xlators/protocol/server/src/server.h           |    2 ++
 3 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/xlators/protocol/server/src/server-handshake.c b/xlators/protocol/server/src/server-handshake.c
index 556b0e2..4aaa933 100644
--- a/xlators/protocol/server/src/server-handshake.c
+++ b/xlators/protocol/server/src/server-handshake.c
@@ -372,6 +372,23 @@ server_setvolume (rpcsvc_request_t *req)
         config_params = dict_copy_with_ref (this->options, NULL);
         conf          = this->private;
 
+        if (conf->parent_up == _gf_false) {
+                /* PARENT_UP indicates that all xlators in graph are inited
+                 * successfully
+                 */
+                op_ret = -1;
+                op_errno = EAGAIN;
+
+                ret = dict_set_str (reply, "ERROR",
+                                    "xlator graph in server is not initialised "
+                                    "yet. Try again later");
+                if (ret < 0)
+                        gf_msg_debug (this->name, 0, "failed to set error: "
+                                      "xlator graph in server is not "
+                                      "initialised yet. Try again later");
+                goto fail;
+        }
+
         buf = memdup (args.dict.dict_val, args.dict.dict_len);
         if (buf == NULL) {
                 op_ret = -1;
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c
index 9e644df..9c10a50 100644
--- a/xlators/protocol/server/src/server.c
+++ b/xlators/protocol/server/src/server.c
@@ -1188,6 +1188,7 @@ notify (xlator_t *this, int32_t event, void *data, ...)
         int32_t          val          = 0;
         dict_t           *dict        = NULL;
         dict_t           *output      = NULL;
+        server_conf_t    *conf        = NULL;
         va_list          ap;
 
         dict = data;
@@ -1208,6 +1209,16 @@ notify (xlator_t *this, int32_t event, void *data, ...)
                 }
                 break;
         }
+
+        case GF_EVENT_PARENT_UP:
+        {
+                conf = this->private;
+
+                conf->parent_up = _gf_true;
+
+                /* fall through and notify the event to children */
+        }
+
         default:
                 default_notify (this, event, data);
                 break;
diff --git a/xlators/protocol/server/src/server.h b/xlators/protocol/server/src/server.h
index dc64edd..6caf449 100644
--- a/xlators/protocol/server/src/server.h
+++ b/xlators/protocol/server/src/server.h
@@ -66,6 +66,8 @@ struct server_conf {
 
         int                     event_threads; /* # of event threads
                                                 * configured */
+
+        gf_boolean_t            parent_up;
 };
 typedef struct server_conf server_conf_t;
 
-- 
1.7.1