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>
This commit is contained in:
Donald Sharp 2017-10-25 10:47:55 -04:00
parent 41e7fb8030
commit 3a30f50f3f
3 changed files with 34 additions and 7 deletions

View 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__);

View 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);

View 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;