]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: Allow user to specify work-queue processing hold time
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 25 Oct 2017 14:47:55 +0000 (10:47 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 25 Oct 2017 14:59:05 +0000 (10:59 -0400)
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 <sharpd@cumulusnetworks.com>
zebra/zebra_rib.c
zebra/zebra_vty.c
zebra/zserv.h

index d46e0730eee9ae7f16eda0bcb3ac56fbbbfc9ff2..b5c2bc6dae58a46fe97e19fe806588d9dcfd35ac 100644 (file)
@@ -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__);
index d86cc88b42a308a801e2ead1d4d7b7a50fa42bf5..21a3331f3345806aac6af47d90db65c1b3e71437 100644 (file)
@@ -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);
index f661572d538e745c0c3eb8bfaa5e5b708eb71599..d847526f2e59501abce21cce7103288436431b36 100644 (file)
@@ -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;