diff options
author | Atin Mukherjee <amukherj@redhat.com> | 2019-03-18 16:08:04 +0530 |
---|---|---|
committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2019-04-09 11:06:46 +0000 |
commit | 9f415235f6a05280824900c59a8c926fff423cdf (patch) | |
tree | faa812f384489b630e519d44564250bab96c33ab /xlators/mgmt/glusterd/src/glusterd-op-sm.c | |
parent | b399d33d575bb2e2cb7af5232e96a091d4768682 (diff) |
glusterd: fix txn-id mem leak
This commit ensures the following:
1. Don't send commit op request to the remote nodes when gluster v
status all is executed as for the status all transaction the local
commit gets the name of the volumes and remote commit ops are
technically a no-op. So no need for additional rpc requests.
2. In op state machine flow, if the transaction is in staged state and
op_info.skip_locking is true, then no need to set the txn id in the
priv->glusterd_txn_opinfo dictionary which never gets freed.
Fixes: bz#1694612
Change-Id: Ib6a9300ea29633f501abac2ba53fb72ff648c822
Signed-off-by: Atin Mukherjee <amukherj@redhat.com>
(cherry picked from commit 34e010d64905b7387de57840d3fb16a326853c9b)
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-op-sm.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index 0944cc648bf..f52e9d3bc41 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -5655,6 +5655,9 @@ glusterd_op_ac_stage_op(glusterd_op_sm_event_t *event, void *ctx) dict_t *dict = NULL; xlator_t *this = NULL; uuid_t *txn_id = NULL; + glusterd_op_info_t txn_op_info = { + {0}, + }; this = THIS; GF_ASSERT(this); @@ -5689,6 +5692,7 @@ glusterd_op_ac_stage_op(glusterd_op_sm_event_t *event, void *ctx) ret = -1; goto out; } + ret = glusterd_get_txn_opinfo(&event->txn_id, &txn_op_info); ret = dict_set_bin(rsp_dict, "transaction_id", txn_id, sizeof(*txn_id)); if (ret) { @@ -5707,6 +5711,12 @@ out: gf_msg_debug(this->name, 0, "Returning with %d", ret); + /* for no volname transactions, the txn_opinfo needs to be cleaned up + * as there's no unlock event triggered + */ + if (txn_op_info.skip_locking) + ret = glusterd_clear_txn_opinfo(txn_id); + if (rsp_dict) dict_unref(rsp_dict); @@ -8160,12 +8170,16 @@ glusterd_op_sm() "Unable to clear " "transaction's opinfo"); } else { - ret = glusterd_set_txn_opinfo(&event->txn_id, &opinfo); - if (ret) - gf_msg(this->name, GF_LOG_ERROR, 0, - GD_MSG_TRANS_OPINFO_SET_FAIL, - "Unable to set " - "transaction's opinfo"); + if (!(event_type == GD_OP_EVENT_STAGE_OP && + opinfo.state.state == GD_OP_STATE_STAGED && + opinfo.skip_locking)) { + ret = glusterd_set_txn_opinfo(&event->txn_id, &opinfo); + if (ret) + gf_msg(this->name, GF_LOG_ERROR, 0, + GD_MSG_TRANS_OPINFO_SET_FAIL, + "Unable to set " + "transaction's opinfo"); + } } glusterd_destroy_op_event_ctx(event); |