diff options
author | Renato Westphal <renato@opensourcerouting.org> | 2019-09-17 02:51:11 +0200 |
---|---|---|
committer | Renato Westphal <renato@opensourcerouting.org> | 2019-09-18 19:35:10 +0200 |
commit | 8685be73e039dcb1b754e1fe21be96f60867219a (patch) | |
tree | 2f2bbd346162ed7672faefd0543211eec4c2ebd1 /isisd | |
parent | lib: introduce new 'pre_validate' northbound callback (diff) | |
download | frr-8685be73e039dcb1b754e1fe21be96f60867219a.tar.xz frr-8685be73e039dcb1b754e1fe21be96f60867219a.zip |
Revert "lib: introduce a read-write lock for northbound configurations"
Adding a lock to protect the global running configuration doesn't
help much since the FRR daemons are not prepared to process
configuration changes in a pthread that is not the main one (a
whole lot of new protections would be necessary to prevent race
conditions).
This means the lock added by commit 83981138 only adds more
complexity for no benefit. Remove it now to simplify the code.
All northbound clients, including the gRPC one, should either run
in the main pthread or use synchronization primitives to process
configuration transactions in the main pthread.
This reverts commit 83981138fe8c1e0a40b8dede74eca65449dda5de.
Diffstat (limited to 'isisd')
-rw-r--r-- | isisd/isis_cli.c | 111 |
1 files changed, 52 insertions, 59 deletions
diff --git a/isisd/isis_cli.c b/isisd/isis_cli.c index bd0628675..37f4dcfab 100644 --- a/isisd/isis_cli.c +++ b/isisd/isis_cli.c @@ -188,14 +188,10 @@ DEFPY(ip_router_isis, ip_router_isis_cmd, "ip router isis WORD$tag", } /* check if the interface is a loopback and if so set it as passive */ - pthread_rwlock_rdlock(&running_config->lock); - { - ifp = nb_running_get_entry(NULL, VTY_CURR_XPATH, false); - if (ifp && if_is_loopback(ifp)) - nb_cli_enqueue_change(vty, "./frr-isisd:isis/passive", - NB_OP_MODIFY, "true"); - } - pthread_rwlock_unlock(&running_config->lock); + ifp = nb_running_get_entry(NULL, VTY_CURR_XPATH, false); + if (ifp && if_is_loopback(ifp)) + nb_cli_enqueue_change(vty, "./frr-isisd:isis/passive", + NB_OP_MODIFY, "true"); return nb_cli_apply_changes(vty, NULL); } @@ -262,14 +258,10 @@ DEFPY(ip6_router_isis, ip6_router_isis_cmd, "ipv6 router isis WORD$tag", } /* check if the interface is a loopback and if so set it as passive */ - pthread_rwlock_rdlock(&running_config->lock); - { - ifp = nb_running_get_entry(NULL, VTY_CURR_XPATH, false); - if (ifp && if_is_loopback(ifp)) - nb_cli_enqueue_change(vty, "./frr-isisd:isis/passive", - NB_OP_MODIFY, "true"); - } - pthread_rwlock_unlock(&running_config->lock); + ifp = nb_running_get_entry(NULL, VTY_CURR_XPATH, false); + if (ifp && if_is_loopback(ifp)) + nb_cli_enqueue_change(vty, "./frr-isisd:isis/passive", + NB_OP_MODIFY, "true"); return nb_cli_apply_changes(vty, NULL); } @@ -410,26 +402,20 @@ DEFPY(no_is_type, no_is_type_cmd, "Act as both a station router and an area router\n" "Act as an area router only\n") { - const char *value; - - pthread_rwlock_rdlock(&running_config->lock); - { - struct isis_area *area; + const char *value = NULL; + struct isis_area *area; - area = nb_running_get_entry(NULL, VTY_CURR_XPATH, false); - - /* - * Put the is-type back to defaults: - * - level-1-2 on first area - * - level-1 for the rest - */ - if (area && listgetdata(listhead(isis->area_list)) == area) - value = "level-1-2"; - else - value = NULL; - } - pthread_rwlock_unlock(&running_config->lock); + area = nb_running_get_entry(NULL, VTY_CURR_XPATH, false); + /* + * Put the is-type back to defaults: + * - level-1-2 on first area + * - level-1 for the rest + */ + if (area && listgetdata(listhead(isis->area_list)) == area) + value = "level-1-2"; + else + value = NULL; nb_cli_enqueue_change(vty, "./is-type", NB_OP_MODIFY, value); return nb_cli_apply_changes(vty, NULL); @@ -1817,45 +1803,52 @@ DEFPY(no_isis_circuit_type, no_isis_circuit_type_cmd, "Level-1-2 adjacencies are formed\n" "Level-2 only adjacencies are formed\n") { - const char *circ_type = NULL; + struct interface *ifp; + struct isis_circuit *circuit; + int is_type; + const char *circ_type; /* * Default value depends on whether the circuit is part of an area, * and the is-type of the area if there is one. So we need to do this * here. */ - pthread_rwlock_rdlock(&running_config->lock); - { - struct interface *ifp; - struct isis_circuit *circuit; + ifp = nb_running_get_entry(NULL, VTY_CURR_XPATH, false); + if (!ifp) + goto def_val; - ifp = nb_running_get_entry(NULL, VTY_CURR_XPATH, false); - if (!ifp) - goto unlock; + circuit = circuit_scan_by_ifp(ifp); + if (!circuit) + goto def_val; - circuit = circuit_scan_by_ifp(ifp); - if (!circuit || circuit->state != C_STATE_UP) - goto unlock; + if (circuit->state == C_STATE_UP) + is_type = circuit->area->is_type; + else + goto def_val; - switch (circuit->area->is_type) { - case IS_LEVEL_1: - circ_type = "level-1"; - break; - case IS_LEVEL_2: - circ_type = "level-2"; - break; - case IS_LEVEL_1_AND_2: - circ_type = "level-1-2"; - break; - } + switch (is_type) { + case IS_LEVEL_1: + circ_type = "level-1"; + break; + case IS_LEVEL_2: + circ_type = "level-2"; + break; + case IS_LEVEL_1_AND_2: + circ_type = "level-1-2"; + break; + default: + return CMD_ERR_NO_MATCH; } -unlock: - pthread_rwlock_unlock(&running_config->lock); - nb_cli_enqueue_change(vty, "./frr-isisd:isis/circuit-type", NB_OP_MODIFY, circ_type); return nb_cli_apply_changes(vty, NULL); + +def_val: + nb_cli_enqueue_change(vty, "./frr-isisd:isis/circuit-type", + NB_OP_MODIFY, NULL); + + return nb_cli_apply_changes(vty, NULL); } void cli_show_ip_isis_circ_type(struct vty *vty, struct lyd_node *dnode, |