summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2017-10-25 16:47:55 +0200
committerDonald Sharp <sharpd@cumulusnetworks.com>2017-10-25 16:59:05 +0200
commit3a30f50f3ff40888caddc75b04f915fa0d5456c4 (patch)
treec8189405d0d18254bcaa1f37ce5882e281273793
parentlib, ospf6d, ospfd, zebra: Add ZEBRA_STR (diff)
downloadfrr-3a30f50f3ff40888caddc75b04f915fa0d5456c4.tar.xz
frr-3a30f50f3ff40888caddc75b04f915fa0d5456c4.zip
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 <sharpd@cumulusnetworks.com>
-rw-r--r--zebra/zebra_rib.c8
-rw-r--r--zebra/zebra_vty.c32
-rw-r--r--zebra/zserv.h1
3 files changed, 34 insertions, 7 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index d46e0730e..b5c2bc6da 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 d86cc88b4..21a3331f3 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 f661572d5..d847526f2 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;