summaryrefslogtreecommitdiff
path: root/lib/vty.c
diff options
context:
space:
mode:
authorChristian Hopps <chopps@labn.net>2023-07-14 16:13:54 -0400
committerChristian Hopps <chopps@labn.net>2023-07-14 18:24:30 -0400
commit76835fd55868b485b17c3f9091721335bd466cd8 (patch)
treec4beaf3f0c69ddf8fa72b3b81ac0b025e1ee3f0c /lib/vty.c
parent88236d4e952fa05274d5464236a8df4727a6a1c7 (diff)
lib: mgmtd: only clear pending for the in-progress command
The lock/unlocks are being done short-circuit so they are never pending; however, the handling of the unlock notification was always resuming the command if pending was set. In all cases pending is set for another command. For example implicit commit locks then when notified its done unlocks which was clearing the set-config pending flag and resuming that command incorrectly. Signed-off-by: Christian Hopps <chopps@labn.net>
Diffstat (limited to 'lib/vty.c')
-rw-r--r--lib/vty.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/lib/vty.c b/lib/vty.c
index c9de00a271..23aa2d1f38 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -3524,6 +3524,7 @@ static void vty_mgmt_ds_lock_notified(struct mgmt_fe_client *client,
char *errmsg_if_any)
{
struct vty *vty;
+ bool is_short_circuit = mgmt_fe_client_current_msg_short_circuit(client);
vty = (struct vty *)session_ctx;
@@ -3540,8 +3541,10 @@ static void vty_mgmt_ds_lock_notified(struct mgmt_fe_client *client,
vty->mgmt_locked_running_ds = lock_ds;
}
- if (vty->mgmt_req_pending_cmd)
+ if (!is_short_circuit && vty->mgmt_req_pending_cmd) {
+ assert(!strcmp(vty->mgmt_req_pending_cmd, "MESSAGE_LOCKDS_REQ"));
vty_mgmt_resume_response(vty, success);
+ }
}
static void vty_mgmt_set_config_result_notified(
@@ -3734,6 +3737,7 @@ int vty_mgmt_send_config_data(struct vty *vty, bool implicit_commit)
} else if (vty_mgmt_lock_running_inline(vty)) {
vty_out(vty,
"%% command failed, could not lock running DS\n");
+ vty_mgmt_unlock_candidate_inline(vty);
return -1;
}
}