mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-29 16:24:55 +00:00
Merge pull request #14022 from FRRouting/mergify/bp/dev/9.0/pr-14019
fix double lock bug and cmd resume early bugs (backport #14019)
This commit is contained in:
commit
906452c90e
@ -629,6 +629,11 @@ uint mgmt_fe_client_session_count(struct mgmt_fe_client *client)
|
|||||||
return mgmt_sessions_count(&client->sessions);
|
return mgmt_sessions_count(&client->sessions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool mgmt_fe_client_current_msg_short_circuit(struct mgmt_fe_client *client)
|
||||||
|
{
|
||||||
|
return client->client.conn.is_short_circuit;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a new Session for a Frontend Client connection.
|
* Create a new Session for a Frontend Client connection.
|
||||||
*/
|
*/
|
||||||
|
@ -373,6 +373,12 @@ extern void mgmt_fe_client_destroy(struct mgmt_fe_client *client);
|
|||||||
*/
|
*/
|
||||||
extern uint mgmt_fe_client_session_count(struct mgmt_fe_client *client);
|
extern uint mgmt_fe_client_session_count(struct mgmt_fe_client *client);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* True if the current handled message is being short-circuited
|
||||||
|
*/
|
||||||
|
extern bool
|
||||||
|
mgmt_fe_client_current_msg_short_circuit(struct mgmt_fe_client *client);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -3524,6 +3524,7 @@ static void vty_mgmt_ds_lock_notified(struct mgmt_fe_client *client,
|
|||||||
char *errmsg_if_any)
|
char *errmsg_if_any)
|
||||||
{
|
{
|
||||||
struct vty *vty;
|
struct vty *vty;
|
||||||
|
bool is_short_circuit = mgmt_fe_client_current_msg_short_circuit(client);
|
||||||
|
|
||||||
vty = (struct vty *)session_ctx;
|
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;
|
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);
|
vty_mgmt_resume_response(vty, success);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vty_mgmt_set_config_result_notified(
|
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)) {
|
} else if (vty_mgmt_lock_running_inline(vty)) {
|
||||||
vty_out(vty,
|
vty_out(vty,
|
||||||
"%% command failed, could not lock running DS\n");
|
"%% command failed, could not lock running DS\n");
|
||||||
|
vty_mgmt_unlock_candidate_inline(vty);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -231,6 +231,10 @@ struct vty {
|
|||||||
const char *mgmt_req_pending_cmd;
|
const char *mgmt_req_pending_cmd;
|
||||||
bool mgmt_locked_candidate_ds;
|
bool mgmt_locked_candidate_ds;
|
||||||
bool mgmt_locked_running_ds;
|
bool mgmt_locked_running_ds;
|
||||||
|
/* Need to track when we file-lock in vtysh to re-lock on end/conf t
|
||||||
|
* workaround
|
||||||
|
*/
|
||||||
|
bool vtysh_file_locked;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void vty_push_context(struct vty *vty, int node, uint64_t id)
|
static inline void vty_push_context(struct vty *vty, int node, uint64_t id)
|
||||||
|
@ -593,9 +593,8 @@ mgmt_fe_session_handle_lockds_req_msg(struct mgmt_fe_session_ctx *session,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lockds_req->lock) {
|
if (lockds_req->lock) {
|
||||||
if (mgmt_fe_session_write_lock_ds(lockds_req->ds_id,
|
if (mgmt_fe_session_write_lock_ds(lockds_req->ds_id, ds_ctx,
|
||||||
ds_ctx, session)
|
session)) {
|
||||||
!= 0) {
|
|
||||||
fe_adapter_send_lockds_reply(
|
fe_adapter_send_lockds_reply(
|
||||||
session, lockds_req->ds_id, lockds_req->req_id,
|
session, lockds_req->ds_id, lockds_req->req_id,
|
||||||
lockds_req->lock, false,
|
lockds_req->lock, false,
|
||||||
|
15
tests/topotests/mgmt_config/r1/frr.conf
Normal file
15
tests/topotests/mgmt_config/r1/frr.conf
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
debug northbound notifications
|
||||||
|
! debug northbound libyang
|
||||||
|
debug northbound events
|
||||||
|
debug northbound callbacks
|
||||||
|
debug mgmt backend datastore frontend transaction
|
||||||
|
debug mgmt client backend
|
||||||
|
debug mgmt client frontend
|
||||||
|
|
||||||
|
log timestamp precision 6
|
||||||
|
log file frr.log debug
|
||||||
|
|
||||||
|
interface r1-eth0
|
||||||
|
ip address 101.0.0.1/24
|
||||||
|
ipv6 address 2101::1/64
|
||||||
|
exit
|
53
tests/topotests/mgmt_config/test_regression.py
Normal file
53
tests/topotests/mgmt_config/test_regression.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# -*- coding: utf-8 eval: (blacken-mode 1) -*-
|
||||||
|
# SPDX-License-Identifier: ISC
|
||||||
|
#
|
||||||
|
# July 13 2023, Christian Hopps <chopps@labn.net>
|
||||||
|
#
|
||||||
|
# Copyright (c) 2023, LabN Consulting, L.L.C.
|
||||||
|
#
|
||||||
|
"""
|
||||||
|
Test mgmtd regressions
|
||||||
|
|
||||||
|
"""
|
||||||
|
import pytest
|
||||||
|
from lib.topogen import Topogen
|
||||||
|
|
||||||
|
pytestmark = [pytest.mark.staticd]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope="module")
|
||||||
|
def tgen(request):
|
||||||
|
"Setup/Teardown the environment and provide tgen argument to tests"
|
||||||
|
|
||||||
|
topodef = {"s1": ("r1",)}
|
||||||
|
tgen = Topogen(topodef, request.module.__name__)
|
||||||
|
tgen.start_topology()
|
||||||
|
tgen.gears["r1"].load_frr_config("frr.conf")
|
||||||
|
tgen.start_router()
|
||||||
|
yield tgen
|
||||||
|
tgen.stop_topology()
|
||||||
|
|
||||||
|
|
||||||
|
def test_regression_issue_13920(tgen):
|
||||||
|
"""Issue #13920
|
||||||
|
|
||||||
|
ubuntu2204# conf t
|
||||||
|
ubuntu2204(config)# ip route 3.2.4.0/24 6.5.5.11 loop3
|
||||||
|
ubuntu2204(config)# nexthop-group nh2
|
||||||
|
ubuntu2204(config-nh-group)# nexthop 6.5.5.12
|
||||||
|
ubuntu2204(config-nh-group)# exi
|
||||||
|
ubuntu2204(config)# ip route 3.22.4.0/24 6.5.5.12
|
||||||
|
crash
|
||||||
|
"""
|
||||||
|
|
||||||
|
r1 = tgen.gears["r1"]
|
||||||
|
r1.vtysh_multicmd(
|
||||||
|
"""
|
||||||
|
conf t
|
||||||
|
nexthop-group nh2
|
||||||
|
exit
|
||||||
|
ip route 3.22.4.0/24 6.5.5.12
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
output = r1.net.checkRouterCores()
|
||||||
|
assert not output.strip()
|
@ -2356,8 +2356,14 @@ static int vtysh_exit(struct vty *vty)
|
|||||||
if (vty->node == CONFIG_NODE) {
|
if (vty->node == CONFIG_NODE) {
|
||||||
/* resync in case one of the daemons is somewhere else */
|
/* resync in case one of the daemons is somewhere else */
|
||||||
vtysh_execute("end");
|
vtysh_execute("end");
|
||||||
vtysh_execute("configure terminal file-lock");
|
/* NOTE: a rather expensive thing to do, can we avoid it? */
|
||||||
|
|
||||||
|
if (vty->vtysh_file_locked)
|
||||||
|
vtysh_execute("configure terminal file-lock");
|
||||||
|
else
|
||||||
|
vtysh_execute("configure terminal");
|
||||||
}
|
}
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -607,7 +607,8 @@ static int vtysh_read_file(FILE *confp, bool dry_run)
|
|||||||
vty->node = CONFIG_NODE;
|
vty->node = CONFIG_NODE;
|
||||||
|
|
||||||
vtysh_execute_no_pager("enable");
|
vtysh_execute_no_pager("enable");
|
||||||
vtysh_execute_no_pager("configure terminal file-lock");
|
vtysh_execute_no_pager("conf term file-lock");
|
||||||
|
vty->vtysh_file_locked = true;
|
||||||
|
|
||||||
if (!dry_run)
|
if (!dry_run)
|
||||||
vtysh_execute_no_pager("XFRR_start_configuration");
|
vtysh_execute_no_pager("XFRR_start_configuration");
|
||||||
@ -619,6 +620,7 @@ static int vtysh_read_file(FILE *confp, bool dry_run)
|
|||||||
vtysh_execute_no_pager("XFRR_end_configuration");
|
vtysh_execute_no_pager("XFRR_end_configuration");
|
||||||
|
|
||||||
vtysh_execute_no_pager("end");
|
vtysh_execute_no_pager("end");
|
||||||
|
vty->vtysh_file_locked = false;
|
||||||
vtysh_execute_no_pager("disable");
|
vtysh_execute_no_pager("disable");
|
||||||
|
|
||||||
vty_close(vty);
|
vty_close(vty);
|
||||||
|
Loading…
Reference in New Issue
Block a user