diff options
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 8 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handshake.c | 12 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-peer-utils.c | 38 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-peer-utils.h | 2 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-sm.h | 1 | 
5 files changed, 53 insertions, 8 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 524ce35d841..fcdfa608607 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -3152,6 +3152,10 @@ glusterd_friend_rpc_create (xlator_t *this, glusterd_peerinfo_t *peerinfo,          gf_uuid_copy (peerctx->peerid, peerinfo->uuid);          peerctx->peername = gf_strdup (peerinfo->hostname); +        peerctx->peerinfo_gen = peerinfo->generation; /* A peerinfos generation +                                                         number can be used to +                                                         uniquely identify a +                                                         peerinfo */          ret = glusterd_transport_inet_options_build (&options,                                                       peerinfo->hostname, @@ -4613,7 +4617,7 @@ glusterd_friend_remove_notify (glusterd_peerctx_t *peerctx)          GF_ASSERT (peerctx);          rcu_read_lock (); -        peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername); +        peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);          if (!peerinfo) {                  gf_log (THIS->name, GF_LOG_DEBUG, "Could not find peer %s(%s). "                          "Peer could have been deleted.", peerctx->peername, @@ -4684,7 +4688,7 @@ __glusterd_peer_rpc_notify (struct rpc_clnt *rpc, void *mydata,          rcu_read_lock (); -        peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername); +        peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);          if (!peerinfo) {                  /* Peerinfo should be available at this point. Not finding it                   * means that something terrible has happened diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c index bc00e99b62f..f1712685dcb 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handshake.c +++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c @@ -1527,7 +1527,7 @@ glusterd_event_connected_inject (glusterd_peerctx_t *peerctx)          rcu_read_lock (); -        peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername); +        peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);          if (!peerinfo) {                  ret = -1;                  gf_log (THIS->name, GF_LOG_ERROR, "Could not find peer %s(%s)", @@ -1621,7 +1621,7 @@ __glusterd_mgmt_hndsk_version_ack_cbk (struct rpc_req *req, struct iovec *iov,          peerctx = frame->local;          rcu_read_lock (); -        peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername); +        peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);          if (!peerinfo) {                  gf_log (this->name, GF_LOG_DEBUG, "Could not find peer %s(%s)",                          peerctx->peername, uuid_utoa (peerctx->peerid)); @@ -1725,7 +1725,7 @@ __glusterd_mgmt_hndsk_version_cbk (struct rpc_req *req, struct iovec *iov,          rcu_read_lock (); -        peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername); +        peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);          if (!peerinfo) {                  ret = -1;                  gf_log (this->name, GF_LOG_DEBUG, "Could not find peer %s(%s)", @@ -1859,7 +1859,7 @@ glusterd_mgmt_handshake (xlator_t *this, glusterd_peerctx_t *peerctx)          rcu_read_lock (); -        peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername); +        peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);          if (!peerinfo) {                  gf_log (THIS->name, GF_LOG_DEBUG, "Could not find peer %s(%s)",                          peerctx->peername, uuid_utoa (peerctx->peerid)); @@ -1988,7 +1988,7 @@ __glusterd_peer_dump_version_cbk (struct rpc_req *req, struct iovec *iov,          rcu_read_lock (); -        peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername); +        peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);          if (!peerinfo) {                  gf_log (this->name, GF_LOG_DEBUG, "Couldn't find peer %s(%s)",                          peerctx->peername, uuid_utoa (peerctx->peerid)); @@ -2109,7 +2109,7 @@ glusterd_peer_dump_version (xlator_t *this, struct rpc_clnt *rpc,          rcu_read_lock (); -        peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername); +        peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);          if (!peerinfo) {                  gf_log (this->name, GF_LOG_DEBUG, "Couldn't find peer %s(%s)",                          peerctx->peername, uuid_utoa (peerctx->peerid)); diff --git a/xlators/mgmt/glusterd/src/glusterd-peer-utils.c b/xlators/mgmt/glusterd/src/glusterd-peer-utils.c index f3241e918f7..9a05941a3f3 100644 --- a/xlators/mgmt/glusterd/src/glusterd-peer-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-peer-utils.c @@ -949,3 +949,41 @@ gd_add_peer_detail_to_dict (glusterd_peerinfo_t *peerinfo, dict_t *friends,  out:          return ret;  } + +/* glusterd_peerinfo_find_by_generation searches for a peer which has the + * generation number @generation and if found returns the pointer to peerinfo + * object. Returns NULL otherwise. + */ +glusterd_peerinfo_t * +glusterd_peerinfo_find_by_generation (uint32_t generation) { +        glusterd_conf_t         *priv = NULL; +        glusterd_peerinfo_t     *entry = NULL; +        glusterd_peerinfo_t     *found = NULL; +        xlator_t                *this = NULL; + +        this = THIS; +        GF_ASSERT (this); + +        priv    = this->private; + +        GF_ASSERT (priv); + +        rcu_read_lock (); +        cds_list_for_each_entry_rcu (entry, &priv->peers, uuid_list) { +                if (entry->generation == generation) { + +                        gf_log (this->name, GF_LOG_DEBUG, +                                 "Friend found... state: %s", +                        glusterd_friend_sm_state_name_get (entry->state.state)); +                        found = entry; /* Probably should be rcu_dereferenced */ +                        break; +                } +        } +        rcu_read_unlock (); + +        if (!found) +                gf_log (this->name, GF_LOG_DEBUG, +                        "Friend with generation: %"PRIu32", not found", +                        generation); +        return found; +} diff --git a/xlators/mgmt/glusterd/src/glusterd-peer-utils.h b/xlators/mgmt/glusterd/src/glusterd-peer-utils.h index 3a1aee7cd15..bd30e335f69 100644 --- a/xlators/mgmt/glusterd/src/glusterd-peer-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-peer-utils.h @@ -82,4 +82,6 @@ gd_add_peer_hostnames_to_dict (glusterd_peerinfo_t *peerinfo, dict_t *dict,  int  gd_add_peer_detail_to_dict (glusterd_peerinfo_t *peerinfo, dict_t *friends,                              int count); +glusterd_peerinfo_t * +glusterd_peerinfo_find_by_generation (uint32_t generation);  #endif /* _GLUSTERD_PEER_UTILS_H */ diff --git a/xlators/mgmt/glusterd/src/glusterd-sm.h b/xlators/mgmt/glusterd/src/glusterd-sm.h index d75baa8d128..60e7514fdae 100644 --- a/xlators/mgmt/glusterd/src/glusterd-sm.h +++ b/xlators/mgmt/glusterd/src/glusterd-sm.h @@ -130,6 +130,7 @@ typedef struct glusterd_peer_ctx_ {          glusterd_peerctx_args_t        args;          uuid_t                         peerid;          char                           *peername; +        uint32_t                       peerinfo_gen;          char                           *errstr;  } glusterd_peerctx_t;  | 
