From: Donald Sharp Date: Wed, 25 Oct 2017 14:47:55 +0000 (-0400) Subject: zebra: Allow user to specify work-queue processing hold time X-Git-Tag: frr-4.0-dev~175^2~2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=3a30f50f3ff40888caddc75b04f915fa0d5456c4;p=matthieu%2Ffrr.git zebra: Allow user to specify work-queue processing hold time Allow the user to modify the work-queue processing hold time from 10ms to a value from (0-10000). Make the command hidden as that it's a semi-dangerous command and it could cause issues. Signed-off-by: Donald Sharp --- diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index d46e0730ee..b5c2bc6dae 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -57,12 +57,6 @@ DEFINE_HOOK(rib_update, (struct route_node * rn, const char *reason), /* Should we allow non Quagga processes to delete our routes */ extern int allow_delete; -/* Hold time for RIB process, should be very minimal. - * it is useful to able to set it otherwise for testing, hence exported - * as global here for test-rig code. - */ -int rib_process_hold_time = 10; - /* Each route type's string and default distance value. */ static const struct { int key; @@ -1899,7 +1893,7 @@ static void rib_queue_init(struct zebra_t *zebra) zebra->ribq->spec.completion_func = &meta_queue_process_complete; /* XXX: TODO: These should be runtime configurable via vty */ zebra->ribq->spec.max_retries = 3; - zebra->ribq->spec.hold = rib_process_hold_time; + zebra->ribq->spec.hold = ZEBRA_RIB_PROCESS_HOLD_TIME; if (!(zebra->mq = meta_queue_new())) { zlog_err("%s: could not initialise meta queue!", __func__); diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index d86cc88b42..21a3331f33 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -44,6 +44,7 @@ #include "lib/json.h" #include "zebra/zebra_vxlan.h" #include "zebra/zebra_vty_clippy.c" +#include "zebra/zserv.h" extern int allow_delete; @@ -2695,6 +2696,32 @@ DEFUN (ip_zebra_import_table_distance, return ret; } +DEFUN_HIDDEN (zebra_workqueue_timer, + zebra_workqueue_timer_cmd, + "zebra work-queue (0-10000)", + ZEBRA_STR + "Work Queue\n" + "Time in milliseconds\n") +{ + uint32_t timer = strtoul(argv[2]->arg, NULL, 10); + zebrad.ribq->spec.hold = timer; + + return CMD_SUCCESS; +} + +DEFUN_HIDDEN (no_zebra_workqueue_timer, + no_zebra_workqueue_timer_cmd, + "no zebra work-queue [(0-10000)]", + NO_STR + ZEBRA_STR + "Work Queue\n" + "Time in milliseconds\n") +{ + zebrad.ribq->spec.hold = ZEBRA_RIB_PROCESS_HOLD_TIME; + + return CMD_SUCCESS; +} + DEFUN (no_ip_zebra_import_table, no_ip_zebra_import_table_cmd, "no ip import-table (1-252) [distance (1-255)] [route-map NAME]", @@ -2740,6 +2767,9 @@ static int config_write_protocol(struct vty *vty) if (zebra_rnh_ipv6_default_route) vty_out(vty, "ipv6 nht resolve-via-default\n"); + if (zebrad.ribq->spec.hold != ZEBRA_RIB_PROCESS_HOLD_TIME) + vty_out(vty, "zebra work-queue %u\n", zebrad.ribq->spec.hold); + enum multicast_mode ipv4_multicast_mode = multicast_mode_ipv4_get(); if (ipv4_multicast_mode != MCAST_NO_CONFIG) @@ -2781,6 +2811,8 @@ void zebra_vty_init(void) install_element(CONFIG_NODE, &ip_route_cmd); install_element(CONFIG_NODE, &ip_zebra_import_table_distance_cmd); install_element(CONFIG_NODE, &no_ip_zebra_import_table_cmd); + install_element(CONFIG_NODE, &zebra_workqueue_timer_cmd); + install_element(CONFIG_NODE, &no_zebra_workqueue_timer_cmd); install_element(VIEW_NODE, &show_vrf_cmd); install_element(VIEW_NODE, &show_ip_route_cmd); diff --git a/zebra/zserv.h b/zebra/zserv.h index f661572d53..d847526f2e 100644 --- a/zebra/zserv.h +++ b/zebra/zserv.h @@ -132,6 +132,7 @@ struct zebra_t { u_int32_t rtm_table_default; /* rib work queue */ + #define ZEBRA_RIB_PROCESS_HOLD_TIME 10 struct work_queue *ribq; struct meta_queue *mq;