Patchwork [BUG:1582] mgmt/glusterd: add a dict to glusterd commit response.

login
register
Submitter Pavan Sondur
Date 2010-09-10 13:02:29
Message ID <20100910130229.GA7363@gluster.com>
Download mbox | patch
Permalink /patch/4728/
State Accepted
Headers show

Comments

Pavan Sondur - 2010-09-10 13:02:29
Signed-off-by: Pavan Vilas Sondur <pavan@gluster.com>
---
 rpc/xdr/src/glusterd1-xdr.c                  |   49 +++++++++++++++++-
 rpc/xdr/src/glusterd1-xdr.h                  |    4 ++
 xlators/mgmt/glusterd/src/glusterd-handler.c |   70 +++++++++++++++++++++++++-
 xlators/mgmt/glusterd/src/glusterd-op-sm.c   |   34 ++++++++++++
 xlators/mgmt/glusterd/src/glusterd3_1-mops.c |   65 ++++++++++++++++++++++++
 5 files changed, 218 insertions(+), 4 deletions(-)

Patch

diff --git a/rpc/xdr/src/glusterd1-xdr.c b/rpc/xdr/src/glusterd1-xdr.c
index 82d9830..3ddd556 100644
--- a/rpc/xdr/src/glusterd1-xdr.c
+++ b/rpc/xdr/src/glusterd1-xdr.c
@@ -17,7 +17,6 @@ 
   <http://www.gnu.org/licenses/>.
 */
 
-
 /*
  * Please do not edit this file.
  * It was generated using rpcgen.
@@ -28,7 +27,6 @@ 
 bool_t
 xdr_glusterd_volume_status (XDR *xdrs, glusterd_volume_status *objp)
 {
-
 	 if (!xdr_enum (xdrs, (enum_t *) objp))
 		 return FALSE;
 	return TRUE;
@@ -223,6 +221,51 @@  xdr_gd1_mgmt_commit_op_req (XDR *xdrs, gd1_mgmt_commit_op_req *objp)
 bool_t
 xdr_gd1_mgmt_commit_op_rsp (XDR *xdrs, gd1_mgmt_commit_op_rsp *objp)
 {
+	register int32_t *buf;
+
+	if (xdrs->x_op == XDR_ENCODE) {
+		 if (!xdr_vector (xdrs, (char *)objp->uuid, 16,
+			sizeof (u_char), (xdrproc_t) xdr_u_char))
+			 return FALSE;
+		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT);
+		if (buf == NULL) {
+			 if (!xdr_int (xdrs, &objp->op))
+				 return FALSE;
+			 if (!xdr_int (xdrs, &objp->op_ret))
+				 return FALSE;
+			 if (!xdr_int (xdrs, &objp->op_errno))
+				 return FALSE;
+
+		} else {
+		IXDR_PUT_LONG(buf, objp->op);
+		IXDR_PUT_LONG(buf, objp->op_ret);
+		IXDR_PUT_LONG(buf, objp->op_errno);
+		}
+		 if (!xdr_bytes (xdrs, (char **)&objp->dict.dict_val, (u_int *) &objp->dict.dict_len, ~0))
+			 return FALSE;
+		return TRUE;
+	} else if (xdrs->x_op == XDR_DECODE) {
+		 if (!xdr_vector (xdrs, (char *)objp->uuid, 16,
+			sizeof (u_char), (xdrproc_t) xdr_u_char))
+			 return FALSE;
+		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT);
+		if (buf == NULL) {
+			 if (!xdr_int (xdrs, &objp->op))
+				 return FALSE;
+			 if (!xdr_int (xdrs, &objp->op_ret))
+				 return FALSE;
+			 if (!xdr_int (xdrs, &objp->op_errno))
+				 return FALSE;
+
+		} else {
+		objp->op = IXDR_GET_LONG(buf);
+		objp->op_ret = IXDR_GET_LONG(buf);
+		objp->op_errno = IXDR_GET_LONG(buf);
+		}
+		 if (!xdr_bytes (xdrs, (char **)&objp->dict.dict_val, (u_int *) &objp->dict.dict_len, ~0))
+			 return FALSE;
+	 return TRUE;
+	}
 
 	 if (!xdr_vector (xdrs, (char *)objp->uuid, 16,
 		sizeof (u_char), (xdrproc_t) xdr_u_char))
@@ -233,6 +276,8 @@  xdr_gd1_mgmt_commit_op_rsp (XDR *xdrs, gd1_mgmt_commit_op_rsp *objp)
 		 return FALSE;
 	 if (!xdr_int (xdrs, &objp->op_errno))
 		 return FALSE;
+	 if (!xdr_bytes (xdrs, (char **)&objp->dict.dict_val, (u_int *) &objp->dict.dict_len, ~0))
+		 return FALSE;
 	return TRUE;
 }
 
diff --git a/rpc/xdr/src/glusterd1-xdr.h b/rpc/xdr/src/glusterd1-xdr.h
index 7b208ee..0c738d0 100644
--- a/rpc/xdr/src/glusterd1-xdr.h
+++ b/rpc/xdr/src/glusterd1-xdr.h
@@ -148,6 +148,10 @@  struct gd1_mgmt_commit_op_rsp {
 	int op;
 	int op_ret;
 	int op_errno;
+        struct {
+                u_int dict_len;
+                char *dict_val;
+        } dict;
 };
 typedef struct gd1_mgmt_commit_op_rsp gd1_mgmt_commit_op_rsp;
 
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c
index 6b5b01c..86e0ab5 100644
--- a/xlators/mgmt/glusterd/src/glusterd-handler.c
+++ b/xlators/mgmt/glusterd/src/glusterd-handler.c
@@ -2008,24 +2008,90 @@  glusterd_op_stage_send_resp (rpcsvc_request_t   *req,
         return ret;
 }
 
+static int
+glusterd_fill_rb_commit_rsp (dict_t *rsp_dict)
+{
+        dict_t *dict    = NULL;
+        int32_t port_no = 0;
+        int     ret     = 0;
+
+        dict = glusterd_op_get_ctx (GD_OP_REPLACE_BRICK);
+        if (!dict) {
+                gf_log ("", GF_LOG_ERROR,
+                        "Operation Context is not present");
+                ret = 0;
+                goto out;
+        }
+
+        ret = dict_get_int32 (dict, "src-brick-port", &port_no);
+        if (ret) {
+                gf_log ("", GF_LOG_DEBUG,
+                        "Could not get src-brick-port => this must "
+                        "be a non-source glusterd process");
+                ret = 0;
+                goto out;
+        }
+
+        gf_log ("", GF_LOG_DEBUG,
+                "This is the source glusterd => fill the src port");
+
+        ret = dict_set_int32 (rsp_dict, "src-brick-port", port_no);
+        if (ret) {
+                gf_log ("", GF_LOG_DEBUG,
+                        "Could not set commit rsp dict");
+                goto out;
+        }
+
+out:
+        return ret;
+}
+
 int
 glusterd_op_commit_send_resp (rpcsvc_request_t *req,
                                int32_t op, int32_t status)
 {
-        gd1_mgmt_commit_op_rsp          rsp = {{0}, };
-        int                             ret = -1;
+        dict_t                         *rsp_dict = NULL;
+        gd1_mgmt_commit_op_rsp          rsp      = {{0}, };
+        int                             ret      = -1;
 
         GF_ASSERT (req);
         rsp.op_ret = status;
         glusterd_get_uuid (&rsp.uuid);
         rsp.op = op;
 
+        rsp_dict = dict_new ();
+        if (!rsp_dict) {
+                gf_log ("", GF_LOG_DEBUG,
+                        "Out of memory");
+                ret = -1;
+                goto out;
+        }
+
+        if (op == GD_OP_REPLACE_BRICK) {
+                ret = glusterd_fill_rb_commit_rsp (rsp_dict);
+                if (ret)
+                        goto out;
+        }
+
+        ret = dict_allocate_and_serialize (rsp_dict,
+                                           &rsp.dict.dict_val,
+                                           (size_t *)&rsp.dict.dict_len);
+        if (ret < 0) {
+                gf_log ("", GF_LOG_DEBUG,
+                        "failed to get serialized length of dict");
+                goto out;
+        }
+
+
         ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL,
                                      gd_xdr_serialize_mgmt_commit_op_rsp);
 
         gf_log ("glusterd", GF_LOG_NORMAL,
                 "Responded to commit, ret: %d", ret);
 
+out:
+        if (rsp_dict)
+                dict_unref (rsp_dict);
         return ret;
 }
 
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
index a7cdf7a..c216821 100644
--- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
@@ -2028,6 +2028,7 @@  glusterd_op_replace_brick (gd1_mgmt_stage_op_req *req)
 {
         int                                      ret = 0;
         dict_t                                  *dict = NULL;
+        dict_t                                  *ctx  = NULL;
         gf1_cli_replace_op                       replace_op;
         glusterd_volinfo_t                      *volinfo = NULL;
         char                                    *volname = NULL;
@@ -2106,6 +2107,30 @@  glusterd_op_replace_brick (gd1_mgmt_stage_op_req *req)
                 goto out;
         }
 
+        /* Set src-brick's port number to be used in the maintainance mount
+         * after all commit acks are received.
+         */
+        if (!glusterd_is_local_addr (src_brickinfo->hostname)) {
+                gf_log ("", GF_LOG_NORMAL,
+                        "adding src-brick port no");
+
+                ctx = glusterd_op_get_ctx (GD_OP_REPLACE_BRICK);
+                if (!ctx) {
+                        gf_log ("", GF_LOG_ERROR,
+                                "Operation Context is not present");
+                        ret = -1;
+                        goto out;
+                }
+
+                ret = dict_set_int32 (ctx, "src-brick-port",
+                                      src_brickinfo->port);
+                if (ret) {
+                        gf_log ("", GF_LOG_DEBUG,
+                                "Could not set src-brick port no");
+                        goto out;
+                }
+        }
+
         switch (replace_op) {
         case GF_REPLACE_OP_START:
         {
@@ -2892,6 +2917,7 @@  glusterd_op_ac_rcvd_commit_op_acc (glusterd_op_sm_event_t *event, void *ctx)
 {
         glusterd_volinfo_t     *volinfo = NULL;
         int32_t                 op      = 0;
+        int32_t                 src_port = 0;
         dict_t                 *dict    = NULL;
         char                   *src_brick = NULL;
         char                   *dst_brick = NULL;
@@ -2961,6 +2987,14 @@  glusterd_op_ac_rcvd_commit_op_acc (glusterd_op_sm_event_t *event, void *ctx)
                         goto out;
                 }
 
+                ret = dict_get_int32 (dict, "src-brick-port", &src_port);
+                if (ret) {
+                        gf_log ("", GF_LOG_ERROR, "Unable to get src-brick port");
+                        goto out;
+                }
+
+                src_brickinfo->port = src_port;
+
                 switch (op) {
                 case GF_REPLACE_OP_START:
                         ret = rb_do_operation_start (volinfo, src_brickinfo, dst_brickinfo);
diff --git a/xlators/mgmt/glusterd/src/glusterd3_1-mops.c b/xlators/mgmt/glusterd/src/glusterd3_1-mops.c
index 9d9dc38..c9c1493 100644
--- a/xlators/mgmt/glusterd/src/glusterd3_1-mops.c
+++ b/xlators/mgmt/glusterd/src/glusterd3_1-mops.c
@@ -521,6 +521,48 @@  out:
         return ret;
 }
 
+static int32_t
+glusterd_rb_use_rsp_dict (dict_t *rsp_dict)
+{
+        int32_t  src_port = 0;
+        int      ret      = 0;
+        dict_t  *ctx      = NULL;
+
+        GF_ASSERT (rsp_dict);
+
+        if (rsp_dict) {
+                ret = dict_get_int32 (rsp_dict, "src-brick-port", &src_port);
+                if (ret) {
+                        gf_log ("", GF_LOG_DEBUG,
+                                "src-brick-port not present");
+                        ret = 0;
+                        goto out;
+                }
+
+                if (src_port) {
+                        ctx = glusterd_op_get_ctx (GD_OP_REPLACE_BRICK);
+                        if (!ctx) {
+                                gf_log ("", GF_LOG_ERROR,
+                                        "Operation Context is not present");
+                                ret = 0;
+                                goto out;
+                        }
+
+                        ret = dict_set_int32 (ctx, "src-brick-port",
+                                              src_port);
+                        if (ret) {
+                                gf_log ("", GF_LOG_DEBUG,
+                                        "Could not set src-brick");
+                                goto out;
+                        }
+                }
+        }
+
+out:
+        return ret;
+
+}
+
 int32_t
 glusterd3_1_commit_op_cbk (struct rpc_req *req, struct iovec *iov,
                           int count, void *myframe)
@@ -531,6 +573,7 @@  glusterd3_1_commit_op_cbk (struct rpc_req *req, struct iovec *iov,
         glusterd_op_sm_event_type_t   event_type = GD_OP_EVENT_NONE;
         glusterd_peerinfo_t           *peerinfo = NULL;
         char                          str[50] = {0,};
+        dict_t                        *dict = NULL;
 
 
         GF_ASSERT (req);
@@ -550,6 +593,21 @@  glusterd3_1_commit_op_cbk (struct rpc_req *req, struct iovec *iov,
         }
         uuid_unparse (rsp.uuid, str);
 
+        if (rsp.dict.dict_len) {
+                /* Unserialize the dictionary */
+                dict  = dict_new ();
+
+                ret = dict_unserialize (rsp.dict.dict_val,
+                                        rsp.dict.dict_len,
+                                        &dict);
+                if (ret < 0) {
+                        gf_log ("glusterd", GF_LOG_ERROR,
+                                "failed to "
+                                "unserialize rsp-buffer to dictionary");
+                        goto out;
+                }
+        }
+
         op_ret = rsp.op_ret;
 
         gf_log ("glusterd", GF_LOG_NORMAL,
@@ -566,6 +624,11 @@  glusterd3_1_commit_op_cbk (struct rpc_req *req, struct iovec *iov,
                 event_type = GD_OP_EVENT_RCVD_RJT;
                 opinfo.op_ret = op_ret;
         } else {
+                if (rsp.op == GD_OP_REPLACE_BRICK) {
+                        ret = glusterd_rb_use_rsp_dict (dict);
+                        if (ret)
+                                goto out;
+                }
                 event_type = GD_OP_EVENT_RCVD_ACC;
         }
 
@@ -580,6 +643,8 @@  glusterd3_1_commit_op_cbk (struct rpc_req *req, struct iovec *iov,
 
 
 out:
+        if (dict)
+                dict_unref (dict);
         return ret;
 }