diff options
author | Raghavendra G <rgowdapp@redhat.com> | 2013-12-23 14:54:05 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-01-25 09:10:12 -0800 |
commit | f05607fe05f7189dc65a6f328f83db0cbb946426 (patch) | |
tree | b4c7b1730a8b64a9d26833be7dbfa20ff68f62d0 /xlators/features/quota/src/quota-enforcer-client.c | |
parent | a10100a4b8501d15c83b416b932d8d786ea550fb (diff) |
mgmt/glusterd: make sure quota enforcer has established connection with quotad before marking quota as enabled.
without this patch there is a window of time when quota is marked as
enabled in quota-enforcer, but connection to quotad wouldn't have been
established. Any checklimit done during this period can result in a
failed fop because of unavailability of quotad.
Change-Id: I0d509fabc434dd55ce9ec59157123524197fcc80
Signed-off-by: Raghavendra G <rgowdapp@redhat.com>
BUG: 969461
Signed-off-by: Raghavendra G <rgowdapp@redhat.com>
Reviewed-on: http://review.gluster.org/6572
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/features/quota/src/quota-enforcer-client.c')
-rw-r--r-- | xlators/features/quota/src/quota-enforcer-client.c | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/xlators/features/quota/src/quota-enforcer-client.c b/xlators/features/quota/src/quota-enforcer-client.c index bfea5e42014..7d8ab937d1e 100644 --- a/xlators/features/quota/src/quota-enforcer-client.c +++ b/xlators/features/quota/src/quota-enforcer-client.c @@ -295,6 +295,37 @@ quota_enforcer_notify (struct rpc_clnt *rpc, void *mydata, return ret; } +int +quota_enforcer_blocking_connect (rpc_clnt_t *rpc) +{ + dict_t *options = NULL; + int ret = -1; + + options = dict_new (); + if (options == NULL) + goto out; + + ret = dict_set_str (options, "non-blocking-io", "no"); + if (ret) + goto out; + + rpc->conn.trans->reconfigure (rpc->conn.trans, options); + + rpc_clnt_start (rpc); + + ret = dict_set_str (options, "non-blocking-io", "yes"); + if (ret) + goto out; + + rpc->conn.trans->reconfigure (rpc->conn.trans, options); + + ret = 0; +out: + dict_unref (options); + + return ret; +} + //Returns a started rpc_clnt. Creates a new rpc_clnt if quota_priv doesn't have //one already struct rpc_clnt * @@ -309,9 +340,13 @@ quota_enforcer_init (xlator_t *this, dict_t *options) gf_log (this->name, GF_LOG_TRACE, "quota enforcer clnt already " "inited"); //Turns out to be a NOP if the clnt is already connected. - rpc_clnt_start (priv->rpc_clnt); + ret = quota_enforcer_blocking_connect (priv->rpc_clnt); + if (ret) + goto out; + return priv->rpc_clnt; } + priv->quota_enforcer = "a_enforcer_clnt; ret = dict_set_str (options, "transport.address-family", "unix"); @@ -339,7 +374,11 @@ quota_enforcer_init (xlator_t *this, dict_t *options) goto out; } - rpc_clnt_start (rpc); + ret = quota_enforcer_blocking_connect (rpc); + if (ret) + goto out; + + ret = 0; out: if (ret) { if (rpc) |