diff options
author | Igor Ryzhov <iryzhov@nfware.com> | 2024-02-02 23:42:58 +0100 |
---|---|---|
committer | Igor Ryzhov <iryzhov@nfware.com> | 2024-02-07 17:37:29 +0100 |
commit | 0db4d555e98f90da320a802be67b75757eb78abc (patch) | |
tree | aab58927a2e3f0470694763d37a51c55f6a249bb /mgmtd/mgmt_fe_adapter.c | |
parent | Merge pull request #10151 from pguibert6WIND/ensure_routing_protocols_good_bw (diff) | |
download | frr-0db4d555e98f90da320a802be67b75757eb78abc.tar.xz frr-0db4d555e98f90da320a802be67b75757eb78abc.zip |
mgmtd, vtysh: fix possible conflict when reading the config
When FRR starts, after mgmtd is initialized, backend clients connect to
it and request their config. To supply the config, mgmtd creates a
configuration transaction. At the same time, `vtysh -b` tries to read
the startup config and configure mgmtd, which also creates a
configuration transaction. If these two actions happen at the exact same
time, there's a conflict between them, because only a single
configuration translaction is allowed. Because of that, vtysh fails and
the config is completely ignored.
When starting the config reading, vtysh locks candidate and running
datastores in mgmtd. This commit adds locking of running datastore when
initializing the backend client. It allows to retry locking on the vtysh
side and read the config only when the lock is aquired instead of
failing.
This change also prevents running datastore from being changed during
initialization of backend clients. This could lead to a desynchronized
state between mgmtd and backends.
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
Diffstat (limited to 'mgmtd/mgmt_fe_adapter.c')
-rw-r--r-- | mgmtd/mgmt_fe_adapter.c | 3 |
1 files changed, 0 insertions, 3 deletions
diff --git a/mgmtd/mgmt_fe_adapter.c b/mgmtd/mgmt_fe_adapter.c index 001da7680..ec8e77335 100644 --- a/mgmtd/mgmt_fe_adapter.c +++ b/mgmtd/mgmt_fe_adapter.c @@ -711,9 +711,6 @@ mgmt_fe_session_handle_setcfg_req_msg(struct mgmt_fe_session_ctx *session, } if (session->cfg_txn_id == MGMTD_TXN_ID_NONE) { - /* as we have the lock no-one else should have a config txn */ - assert(!mgmt_config_txn_in_progress()); - /* Start a CONFIG Transaction (if not started already) */ session->cfg_txn_id = mgmt_create_txn(session->session_id, MGMTD_TXN_TYPE_CONFIG); |