summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-handler.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-handler.c')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-handler.c52
1 files changed, 48 insertions, 4 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c
index 881e84214..0547694ca 100644
--- a/xlators/mgmt/glusterd/src/glusterd-handler.c
+++ b/xlators/mgmt/glusterd/src/glusterd-handler.c
@@ -2415,6 +2415,40 @@ glusterd_brick_rpc_notify (struct rpc_clnt *rpc, void *mydata,
}
int
+glusterd_friend_remove_notify (glusterd_peerinfo_t *peerinfo, rpcsvc_request_t *req)
+{
+ int ret = -1;
+ glusterd_friend_sm_event_t *new_event = NULL;
+
+ ret = glusterd_friend_sm_new_event (GD_FRIEND_EVENT_REMOVE_FRIEND,
+ &new_event);
+ if (!ret) {
+ new_event->peerinfo = peerinfo;
+ ret = glusterd_friend_sm_inject_event (new_event);
+
+ glusterd_friend_sm ();
+ glusterd_op_sm ();
+
+ if (!req) {
+ gf_log (THIS->name, GF_LOG_WARNING,
+ "Unable to find the request for responding "
+ "to User (%s)", peerinfo->hostname);
+ goto out;
+ }
+
+ glusterd_xfer_cli_probe_resp (req, -1, ENOTCONN,
+ peerinfo->hostname, peerinfo->port);
+ } else {
+ gf_log ("glusterd", GF_LOG_ERROR,
+ "Unable to create event for removing peer %s",
+ peerinfo->hostname);
+ }
+
+out:
+ return ret;
+}
+
+int
glusterd_peer_rpc_notify (struct rpc_clnt *rpc, void *mydata,
rpc_clnt_event_t event,
void *data)
@@ -2448,10 +2482,10 @@ glusterd_peer_rpc_notify (struct rpc_clnt *rpc, void *mydata,
}
case RPC_CLNT_DISCONNECT:
+ {
+ gf_log (this->name, GF_LOG_DEBUG, "got RPC_CLNT_DISCONNECT %d",
+ peerinfo->state.state);
- //Inject friend disconnected here
-
- gf_log (this->name, GF_LOG_DEBUG, "got RPC_CLNT_DISCONNECT");
peerinfo->connected = 0;
/*
@@ -2482,9 +2516,19 @@ glusterd_peer_rpc_notify (struct rpc_clnt *rpc, void *mydata,
gf_log (this->name, GF_LOG_ERROR, "Unable"
" to enque local lock flush event.");
+ //Inject friend disconnected here
+ if (peerinfo->state.state == GD_FRIEND_STATE_DEFAULT) {
+ /* Remove the friend as it was the newly requested
+ 'peer' and connection with this peer didn't
+ succeed. we have opportunity to notify user
+ */
+ glusterd_friend_remove_notify (peerinfo,
+ peerctx->args.req);
+ }
+
//default_notify (this, GF_EVENT_CHILD_DOWN, NULL);
break;
-
+ }
default:
gf_log (this->name, GF_LOG_TRACE,
"got some other RPC event %d", event);