diff options
author | Igor Ryzhov <iryzhov@nfware.com> | 2024-01-25 12:51:58 +0100 |
---|---|---|
committer | Christian Hopps <chopps@labn.net> | 2024-01-26 18:34:46 +0100 |
commit | 771c8f3b2add1172ea656b51d089db2c6d4042d1 (patch) | |
tree | 90506da6645af47a0f017815f27eab73d19ae60a /mgmtd/mgmt_txn.c | |
parent | mgmtd: fix log type (diff) | |
download | frr-771c8f3b2add1172ea656b51d089db2c6d4042d1.tar.xz frr-771c8f3b2add1172ea656b51d089db2c6d4042d1.zip |
mgmtd: cleanup txn without scheduling
If the transaction is not cleaned up immediately, it can be still
referenced by some threds. If it's a commit thread and it's executed
before the actual cleanup, mgmtd crashes because of the missing
commit_cfg_req.
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
Diffstat (limited to '')
-rw-r--r-- | mgmtd/mgmt_txn.c | 29 |
1 files changed, 3 insertions, 26 deletions
diff --git a/mgmtd/mgmt_txn.c b/mgmtd/mgmt_txn.c index f04dec07b..9ab476716 100644 --- a/mgmtd/mgmt_txn.c +++ b/mgmtd/mgmt_txn.c @@ -32,7 +32,6 @@ enum mgmt_txn_event { MGMTD_TXN_PROC_GETTREE, MGMTD_TXN_COMMITCFG_TIMEOUT, MGMTD_TXN_GETTREE_TIMEOUT, - MGMTD_TXN_CLEANUP }; PREDECL_LIST(mgmt_txn_reqs); @@ -281,6 +280,8 @@ static struct mgmt_master *mgmt_txn_mm; static void mgmt_txn_register_event(struct mgmt_txn_ctx *txn, enum mgmt_txn_event event); +static void mgmt_txn_cleanup_txn(struct mgmt_txn_ctx **txn); + static struct mgmt_txn_be_cfg_batch * mgmt_txn_cfg_batch_alloc(struct mgmt_txn_ctx *txn, enum mgmt_be_client_id id, struct mgmt_be_client_adapter *be_adapter) @@ -409,7 +410,6 @@ static struct mgmt_txn_req *mgmt_txn_req_alloc(struct mgmt_txn_ctx *txn, break; case MGMTD_TXN_COMMITCFG_TIMEOUT: case MGMTD_TXN_GETTREE_TIMEOUT: - case MGMTD_TXN_CLEANUP: break; } @@ -518,7 +518,6 @@ static void mgmt_txn_req_free(struct mgmt_txn_req **txn_req) break; case MGMTD_TXN_COMMITCFG_TIMEOUT: case MGMTD_TXN_GETTREE_TIMEOUT: - case MGMTD_TXN_CLEANUP: break; } @@ -781,7 +780,7 @@ static int mgmt_txn_send_commit_cfg_reply(struct mgmt_txn_ctx *txn, * we need to cleanup by itself. */ if (!txn->session_id) - mgmt_txn_register_event(txn, MGMTD_TXN_CLEANUP); + mgmt_txn_cleanup_txn(&txn); return 0; } @@ -1455,11 +1454,6 @@ static void mgmt_txn_process_commit_cfg(struct event *thread) case MGMTD_COMMIT_PHASE_MAX: break; } - - MGMTD_TXN_DBG("txn-id:%" PRIu64 " session-id: %" PRIu64 - " phase updated to '%s'", - txn->txn_id, txn->session_id, - mgmt_txn_commit_phase_str(txn)); } static void mgmt_init_get_data_reply(struct mgmt_get_data_reply *get_reply) @@ -1539,7 +1533,6 @@ static void mgmt_txn_send_getcfg_reply_data(struct mgmt_txn_req *txn_req, case MGMTD_TXN_PROC_GETTREE: case MGMTD_TXN_GETTREE_TIMEOUT: case MGMTD_TXN_COMMITCFG_TIMEOUT: - case MGMTD_TXN_CLEANUP: MGMTD_TXN_ERR("Invalid Txn-Req-Event %u", txn_req->req_event); break; } @@ -1898,16 +1891,6 @@ static void mgmt_txn_cleanup_all_txns(void) mgmt_txn_cleanup_txn(&txn); } -static void mgmt_txn_cleanup(struct event *thread) -{ - struct mgmt_txn_ctx *txn; - - txn = (struct mgmt_txn_ctx *)EVENT_ARG(thread); - assert(txn); - - mgmt_txn_cleanup_txn(&txn); -} - static void mgmt_txn_register_event(struct mgmt_txn_ctx *txn, enum mgmt_txn_event event) { @@ -1939,11 +1922,6 @@ static void mgmt_txn_register_event(struct mgmt_txn_ctx *txn, MGMTD_TXN_GET_TREE_MAX_DELAY_SEC, &txn->get_tree_timeout); break; - case MGMTD_TXN_CLEANUP: - tv.tv_usec = MGMTD_TXN_CLEANUP_DELAY_USEC; - event_add_timer_tv(mgmt_txn_tm, mgmt_txn_cleanup, txn, &tv, - &txn->clnup); - break; case MGMTD_TXN_PROC_GETTREE: assert(!"code bug do not register this event"); break; @@ -2528,7 +2506,6 @@ int mgmt_txn_notify_error(struct mgmt_be_client_adapter *adapter, case MGMTD_TXN_PROC_GETCFG: case MGMTD_TXN_COMMITCFG_TIMEOUT: case MGMTD_TXN_GETTREE_TIMEOUT: - case MGMTD_TXN_CLEANUP: default: assert(!"non-native req event in native erorr path"); return -1; |