summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
Diffstat (limited to 'xlators')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-handler.c33
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-rpc-ops.c21
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-sm.c6
3 files changed, 41 insertions, 19 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c
index f446d2b58c5..6138b592542 100644
--- a/xlators/mgmt/glusterd/src/glusterd-handler.c
+++ b/xlators/mgmt/glusterd/src/glusterd-handler.c
@@ -1667,6 +1667,12 @@ glusterd_handle_friend_update (rpcsvc_request_t *req)
gf_log ("", GF_LOG_INFO, "Received uuid: %s, hostname:%s",
uuid_buf, hostname);
+ if (uuid_is_null (uuid)) {
+ gf_log (this->name, GF_LOG_WARNING, "Updates mustn't "
+ "contain peer with 'null' uuid");
+ continue;
+ }
+
if (!uuid_compare (uuid, priv->uuid)) {
gf_log ("", GF_LOG_INFO, "Received my uuid as Friend");
i++;
@@ -2129,12 +2135,14 @@ glusterd_friend_add (const char *hoststr, int port,
glusterd_peerctx_args_t *args)
{
int ret = 0;
+ xlator_t *this = NULL;
glusterd_conf_t *conf = NULL;
glusterd_peerctx_t *peerctx = NULL;
dict_t *options = NULL;
gf_boolean_t handover = _gf_false;
- conf = THIS->private;
+ this = THIS;
+ conf = this->private;
GF_ASSERT (conf);
GF_ASSERT (hoststr);
@@ -2158,11 +2166,21 @@ glusterd_friend_add (const char *hoststr, int port,
if (ret)
goto out;
+ if (!restore) {
+ ret = glusterd_store_peerinfo (*friend);
+ if (ret) {
+ gf_log (this->name, GF_LOG_ERROR, "Failed to store "
+ "peerinfo");
+
+ goto out;
+ }
+ }
+ list_add_tail (&(*friend)->uuid_list, &conf->peers);
ret = glusterd_rpc_create (&(*friend)->rpc, options,
glusterd_peer_rpc_notify,
peerctx);
if (ret) {
- gf_log ("glusterd", GF_LOG_ERROR, "failed to create rpc for"
+ gf_log (this->name, GF_LOG_ERROR, "failed to create rpc for"
" peer %s", (char*)hoststr);
goto out;
}
@@ -2174,7 +2192,7 @@ out:
*friend = NULL;
}
- gf_log ("glusterd", GF_LOG_INFO, "connect returned %d", ret);
+ gf_log (this->name, GF_LOG_INFO, "connect returned %d", ret);
return ret;
}
@@ -2831,15 +2849,6 @@ glusterd_peer_rpc_notify (struct rpc_clnt *rpc, void *mydata,
{
gf_log (this->name, GF_LOG_DEBUG, "got RPC_CLNT_CONNECT");
peerinfo->connected = 1;
- ret = glusterd_store_peerinfo (peerinfo);
- if (ret) {
- ret = -1;
- gf_log (this->name, GF_LOG_ERROR, "Failed to store "
- "peerinfo");
- break;
- }
-
- list_add_tail (&peerinfo->uuid_list, &conf->peers);
ret = glusterd_peer_handshake (this, rpc, peerctx);
if (ret)
diff --git a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c
index 4e55c383c47..648ab418d15 100644
--- a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c
+++ b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c
@@ -488,21 +488,30 @@ int32_t
glusterd3_1_friend_update_cbk (struct rpc_req *req, struct iovec *iov,
int count, void *myframe)
{
- int ret = -1;
- int32_t op_ret = 0;
- char str[50] = {0,};
+ int ret = -1;
+ gd1_mgmt_friend_update_rsp rsp = {{0}, };
+ xlator_t *this = NULL;
GF_ASSERT (req);
+ this = THIS;
if (-1 == req->rpc_status) {
+ gf_log (this->name, GF_LOG_ERROR, "RPC Error");
goto out;
}
- gf_log ("glusterd", GF_LOG_INFO,
- "Received %s from uuid: %s",
- (op_ret)?"RJT":"ACC", str);
+ ret = xdr_to_generic (*iov, &rsp,
+ (xdrproc_t)xdr_gd1_mgmt_friend_update_rsp);
+ if (ret < 0) {
+ gf_log (this->name, GF_LOG_ERROR, "Failed to serialize friend"
+ " update repsonse");
+ goto out;
+ }
out:
+ gf_log (this->name, GF_LOG_INFO, "Received %s from uuid: %s",
+ (ret)?"RJT":"ACC", uuid_utoa (rsp.uuid));
+
GLUSTERD_STACK_DESTROY (((call_frame_t *)myframe));
return ret;
}
diff --git a/xlators/mgmt/glusterd/src/glusterd-sm.c b/xlators/mgmt/glusterd/src/glusterd-sm.c
index 259c247f401..a53057fab44 100644
--- a/xlators/mgmt/glusterd/src/glusterd-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-sm.c
@@ -478,6 +478,9 @@ glusterd_ac_send_friend_update (glusterd_friend_sm_event_t *event, void *ctx)
goto out;
list_for_each_entry (peerinfo, &priv->peers, uuid_list) {
+ if (!peerinfo->connected || !peerinfo->peer ||
+ peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED)
+ continue;
count++;
snprintf (key, sizeof (key), "friend%d.uuid", count);
dup_buf = gf_strdup (uuid_utoa (peerinfo->uuid));
@@ -497,7 +500,8 @@ glusterd_ac_send_friend_update (glusterd_friend_sm_event_t *event, void *ctx)
goto out;
list_for_each_entry (peerinfo, &priv->peers, uuid_list) {
- if (!peerinfo->connected || !peerinfo->peer)
+ if (!peerinfo->connected || !peerinfo->peer ||
+ peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED)
continue;
ret = dict_set_static_ptr (friends, "peerinfo", peerinfo);