diff options
author | Krishnan Parthasarathi <kparthas@redhat.com> | 2015-06-27 11:04:25 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2015-08-12 23:12:50 -0700 |
commit | f7668938cd7745d024f3d2884e04cd744d0a69ab (patch) | |
tree | d93c18c1363ea5579891d5bc40420ef7191b8498 | |
parent | 546f66f546a9c9f63c4ee7d3f28fc3a494305263 (diff) |
rpc: add owner xlator argument to rpc_clnt_new
The @owner argument tells RPC layer the xlator that owns
the connection and to which xlator THIS needs be set during
network notifications like CONNECT and DISCONNECT.
Code paths that originate from the head of a (volume) graph and use
STACK_WIND ensure that the RPC local endpoint has the right xlator saved
in the frame of the call (callback pair). This guarantees that the
callback is executed in the right xlator context.
The client handshake process which includes fetching of brick ports from
glusterd, setting lk-version on the brick for the session, don't have
the correct xlator set in their frames. The problem lies with RPC
notifications. It doesn't have the provision to set THIS with the xlator
that is registered with the corresponding RPC programs. e.g,
RPC_CLNT_CONNECT event received by protocol/client doesn't have THIS set
to its xlator. This implies, call(-callbacks) originating from this
thread don't have the right xlator set too.
The fix would be to save the xlator registered with the RPC connection
during rpc_clnt_new. e.g, protocol/client's xlator would be saved with
the RPC connection that it 'owns'. RPC notifications such as CONNECT,
DISCONNECT, etc inherit THIS from the RPC connection's xlator.
Change-Id: I9dea2c35378c511d800ef58f7fa2ea5552f2c409
BUG: 1235582
Signed-off-by: Krishnan Parthasarathi <kparthas@redhat.com>
Reviewed-on: http://review.gluster.org/11436
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
-rw-r--r-- | api/src/glfs-internal.h | 1 | ||||
-rw-r--r-- | api/src/glfs-mgmt.c | 2 | ||||
-rw-r--r-- | cli/src/cli-quotad-client.c | 2 | ||||
-rw-r--r-- | cli/src/cli.c | 2 | ||||
-rw-r--r-- | glusterfsd/src/glusterfsd-mgmt.c | 2 | ||||
-rw-r--r-- | libglusterfs/src/globals.h | 1 | ||||
-rw-r--r-- | rpc/rpc-lib/src/rpc-clnt.c | 19 | ||||
-rw-r--r-- | rpc/rpc-lib/src/rpc-clnt.h | 4 | ||||
-rw-r--r-- | xlators/features/changelog/src/changelog-rpc-common.c | 2 | ||||
-rw-r--r-- | xlators/features/quota/src/quota-enforcer-client.c | 2 | ||||
-rw-r--r-- | xlators/features/snapview-server/src/snapview-server-mgmt.c | 2 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c | 2 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 2 | ||||
-rw-r--r-- | xlators/nfs/server/src/nlm4.c | 2 | ||||
-rw-r--r-- | xlators/protocol/client/src/client.c | 2 |
15 files changed, 33 insertions, 14 deletions
diff --git a/api/src/glfs-internal.h b/api/src/glfs-internal.h index ff8ace9cbb8..7e26a48eea5 100644 --- a/api/src/glfs-internal.h +++ b/api/src/glfs-internal.h @@ -249,7 +249,6 @@ int glfs_first_lookup (xlator_t *subvol); void glfs_process_upcall_event (struct glfs *fs, void *data) GFAPI_PRIVATE(glfs_process_upcall_event, 3.7.0); -#define DECLARE_OLD_THIS xlator_t *old_THIS = NULL #define __GLFS_ENTRY_VALIDATE_FS(fs, label) \ do { \ diff --git a/api/src/glfs-mgmt.c b/api/src/glfs-mgmt.c index d69c3fc1883..48fd618ff68 100644 --- a/api/src/glfs-mgmt.c +++ b/api/src/glfs-mgmt.c @@ -863,7 +863,7 @@ glfs_mgmt_init (struct glfs *fs) if (ret) goto out; - rpc = rpc_clnt_new (options, ctx, THIS->name, 8); + rpc = rpc_clnt_new (options, THIS, THIS->name, 8); if (!rpc) { ret = -1; gf_msg (THIS->name, GF_LOG_WARNING, 0, diff --git a/cli/src/cli-quotad-client.c b/cli/src/cli-quotad-client.c index d00dfac6e60..5be9c80c858 100644 --- a/cli/src/cli-quotad-client.c +++ b/cli/src/cli-quotad-client.c @@ -126,7 +126,7 @@ cli_quotad_clnt_init (xlator_t *this, dict_t *options) if (ret) goto out; - rpc = rpc_clnt_new (options, this->ctx, this->name, 16); + rpc = rpc_clnt_new (options, this, this->name, 16); if (!rpc) goto out; diff --git a/cli/src/cli.c b/cli/src/cli.c index 53c9c3b297b..cc2862c5318 100644 --- a/cli/src/cli.c +++ b/cli/src/cli.c @@ -626,7 +626,7 @@ cli_rpc_init (struct cli_state *state) goto out; } - rpc = rpc_clnt_new (options, this->ctx, this->name, 16); + rpc = rpc_clnt_new (options, this, this->name, 16); if (!rpc) goto out; diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index 4a84ae56a44..459d79fea0e 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -2033,7 +2033,7 @@ glusterfs_mgmt_init (glusterfs_ctx_t *ctx) if (ret) goto out; - rpc = rpc_clnt_new (options, THIS->ctx, THIS->name, 8); + rpc = rpc_clnt_new (options, THIS, THIS->name, 8); if (!rpc) { ret = -1; gf_log (THIS->name, GF_LOG_WARNING, "failed to create rpc clnt"); diff --git a/libglusterfs/src/globals.h b/libglusterfs/src/globals.h index 3f91363a7c9..46c9ca27f6c 100644 --- a/libglusterfs/src/globals.h +++ b/libglusterfs/src/globals.h @@ -61,6 +61,7 @@ /* THIS */ #define THIS (*__glusterfs_this_location()) +#define DECLARE_OLD_THIS xlator_t *old_THIS = THIS xlator_t **__glusterfs_this_location (); xlator_t *glusterfs_this_get (); diff --git a/rpc/rpc-lib/src/rpc-clnt.c b/rpc/rpc-lib/src/rpc-clnt.c index 7bc9010f0b9..11d6cedfe07 100644 --- a/rpc/rpc-lib/src/rpc-clnt.c +++ b/rpc/rpc-lib/src/rpc-clnt.c @@ -810,6 +810,16 @@ out: static void rpc_clnt_destroy (struct rpc_clnt *rpc); +#define RPC_THIS_SAVE(xl) do { \ + old_THIS = THIS ; \ + if (!old_THIS) \ + gf_log_callingfn ("rpc", GF_LOG_CRITICAL, \ + "THIS is not initialised."); \ + THIS = xl; \ +} while (0) + +#define RPC_THIS_RESTORE (THIS = old_THIS) + int rpc_clnt_notify (rpc_transport_t *trans, void *mydata, rpc_transport_event_t event, void *data, ...) @@ -821,6 +831,7 @@ rpc_clnt_notify (rpc_transport_t *trans, void *mydata, rpc_transport_pollin_t *pollin = NULL; struct timespec ts = {0, }; void *clnt_mydata = NULL; + DECLARE_OLD_THIS; conn = mydata; if (conn == NULL) { @@ -830,6 +841,8 @@ rpc_clnt_notify (rpc_transport_t *trans, void *mydata, if (!clnt) goto out; + RPC_THIS_SAVE (clnt->owner); + switch (event) { case RPC_TRANSPORT_DISCONNECT: { @@ -930,6 +943,7 @@ rpc_clnt_notify (rpc_transport_t *trans, void *mydata, } out: + RPC_THIS_RESTORE; return ret; } @@ -1034,11 +1048,13 @@ out: } struct rpc_clnt * -rpc_clnt_new (dict_t *options, glusterfs_ctx_t *ctx, char *name, +rpc_clnt_new (dict_t *options, xlator_t *owner, char *name, uint32_t reqpool_size) { int ret = -1; struct rpc_clnt *rpc = NULL; + glusterfs_ctx_t *ctx = owner->ctx; + rpc = GF_CALLOC (1, sizeof (*rpc), gf_common_mt_rpcclnt_t); if (!rpc) { @@ -1047,6 +1063,7 @@ rpc_clnt_new (dict_t *options, glusterfs_ctx_t *ctx, char *name, pthread_mutex_init (&rpc->lock, NULL); rpc->ctx = ctx; + rpc->owner = owner; if (!reqpool_size) reqpool_size = RPC_CLNT_DEFAULT_REQUEST_COUNT; diff --git a/rpc/rpc-lib/src/rpc-clnt.h b/rpc/rpc-lib/src/rpc-clnt.h index ee46a9a9263..6a4bb40793f 100644 --- a/rpc/rpc-lib/src/rpc-clnt.h +++ b/rpc/rpc-lib/src/rpc-clnt.h @@ -188,9 +188,11 @@ typedef struct rpc_clnt { int refcount; int auth_null; char disabled; + xlator_t *owner; } rpc_clnt_t; -struct rpc_clnt *rpc_clnt_new (dict_t *options, glusterfs_ctx_t *ctx, + +struct rpc_clnt *rpc_clnt_new (dict_t *options, xlator_t *owner, char *name, uint32_t reqpool_size); int rpc_clnt_start (struct rpc_clnt *rpc); diff --git a/xlators/features/changelog/src/changelog-rpc-common.c b/xlators/features/changelog/src/changelog-rpc-common.c index 7d2ec1de988..e8905a87f62 100644 --- a/xlators/features/changelog/src/changelog-rpc-common.c +++ b/xlators/features/changelog/src/changelog-rpc-common.c @@ -53,7 +53,7 @@ changelog_rpc_client_init (xlator_t *this, void *cbkdata, goto dealloc_dict; } - rpc = rpc_clnt_new (options, this->ctx, this->name, 16); + rpc = rpc_clnt_new (options, this, this->name, 16); if (!rpc) goto dealloc_dict; diff --git a/xlators/features/quota/src/quota-enforcer-client.c b/xlators/features/quota/src/quota-enforcer-client.c index 09df3534a75..6f36c081dbc 100644 --- a/xlators/features/quota/src/quota-enforcer-client.c +++ b/xlators/features/quota/src/quota-enforcer-client.c @@ -448,7 +448,7 @@ quota_enforcer_init (xlator_t *this, dict_t *options) if (ret) goto out; - rpc = rpc_clnt_new (options, this->ctx, this->name, 16); + rpc = rpc_clnt_new (options, this, this->name, 16); if (!rpc) { ret = -1; goto out; diff --git a/xlators/features/snapview-server/src/snapview-server-mgmt.c b/xlators/features/snapview-server/src/snapview-server-mgmt.c index 53dd6ff44af..fc2ff2ab10d 100644 --- a/xlators/features/snapview-server/src/snapview-server-mgmt.c +++ b/xlators/features/snapview-server/src/snapview-server-mgmt.c @@ -80,7 +80,7 @@ svs_mgmt_init (xlator_t *this) goto out; } - priv->rpc = rpc_clnt_new (options, this->ctx, this->name, 8); + priv->rpc = rpc_clnt_new (options, this, this->name, 8); if (!priv->rpc) { gf_log (this->name, GF_LOG_ERROR, "failed to initialize RPC"); goto out; diff --git a/xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c b/xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c index fca9323a180..607a0655432 100644 --- a/xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c +++ b/xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c @@ -46,7 +46,7 @@ glusterd_conn_init (glusterd_conn_t *conn, char *sockpath, goto out; /* @options is free'd by rpc_transport when destroyed */ - rpc = rpc_clnt_new (options, this->ctx, (char *)svc->name, 16); + rpc = rpc_clnt_new (options, this, (char *)svc->name, 16); if (!rpc) { ret = -1; goto out; diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 7ead1f5ab70..085a63b4592 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -3291,7 +3291,7 @@ glusterd_rpc_create (struct rpc_clnt **rpc, GF_ASSERT (options); /* TODO: is 32 enough? or more ? */ - new_rpc = rpc_clnt_new (options, this->ctx, this->name, 16); + new_rpc = rpc_clnt_new (options, this, this->name, 16); if (!new_rpc) goto out; diff --git a/xlators/nfs/server/src/nlm4.c b/xlators/nfs/server/src/nlm4.c index 7343fea8cd6..26c45e089b0 100644 --- a/xlators/nfs/server/src/nlm4.c +++ b/xlators/nfs/server/src/nlm4.c @@ -1050,7 +1050,7 @@ nlm4_establish_callback (void *csarg) } /* TODO: is 32 frames in transit enough ? */ - rpc_clnt = rpc_clnt_new (options, cs->nfsx->ctx, "NLM-client", 32); + rpc_clnt = rpc_clnt_new (options, cs->nfsx, "NLM-client", 32); if (rpc_clnt == NULL) { gf_msg (GF_NLM, GF_LOG_ERROR, EINVAL, NFS_MSG_INVALID_ENTRY, "rpc_clnt NULL"); diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c index fcf6e375af8..b8f467622d5 100644 --- a/xlators/protocol/client/src/client.c +++ b/xlators/protocol/client/src/client.c @@ -2281,7 +2281,7 @@ client_init_rpc (xlator_t *this) goto out; } - conf->rpc = rpc_clnt_new (this->options, this->ctx, this->name, 0); + conf->rpc = rpc_clnt_new (this->options, this, this->name, 0); if (!conf->rpc) { gf_msg (this->name, GF_LOG_ERROR, 0, PC_MSG_RPC_INIT_FAILED, "failed to initialize RPC"); |