From cc5934ed5939315ba5d95bfaf052625762107205 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Tue, 30 Jun 2020 08:59:46 -0400 Subject: [PATCH 1/2] vtysh: master is a non-sorted list The commit: a798241265a5808083a06b14ce1637d1ddf6a45a attempted to use sorted master lists to do faster lookups by using a RB Tree. Unfortunately the original code was creating a list->cmp function *but* never using it. If you look at the commit, it clearly shows that the function listnode_add is used to insert but when you look at that function it is a tail push. Fixes: #6573 Namely now this ordering is preserved: bgp as-path access-list originate-only permit ^$ bgp as-path access-list originate-only deny .* Signed-off-by: Donald Sharp --- vtysh/vtysh_config.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/vtysh/vtysh_config.c b/vtysh/vtysh_config.c index abbb111f9d..2ab9dd5a9a 100644 --- a/vtysh/vtysh_config.c +++ b/vtysh/vtysh_config.c @@ -34,7 +34,7 @@ DEFINE_MTYPE_STATIC(MVTYSH, VTYSH_CONFIG_LINE, "Vtysh configuration line") vector configvec; -PREDECL_RBTREE_UNIQ(config_master); +PREDECL_LIST(config_master); struct config { /* Configuration node name. */ @@ -72,11 +72,6 @@ static struct config *config_new(void) return config; } -static int config_cmp(const struct config *c1, const struct config *c2) -{ - return strcmp(c1->name, c2->name); -} - static void config_del(struct config *config) { list_delete(&config->line); @@ -84,13 +79,15 @@ static void config_del(struct config *config) XFREE(MTYPE_VTYSH_CONFIG, config); } -DECLARE_RBTREE_UNIQ(config_master, struct config, rbt_item, config_cmp) +DECLARE_LIST(config_master, struct config, rbt_item) static struct config *config_get(int index, const char *line) { - struct config *config; + struct config *config, *config_loop; struct config_master_head *master; + config = config_loop = NULL; + master = vector_lookup_ensure(configvec, index); if (!master) { @@ -99,8 +96,10 @@ static struct config *config_get(int index, const char *line) vector_set_index(configvec, index, master); } - const struct config config_ref = { .name = (char *)line }; - config = config_master_find(master, &config_ref); + frr_each (config_master, master, config_loop) { + if (strcmp(config_loop->name, line) == 0) + config = config_loop; + } if (!config) { config = config_new(); @@ -109,7 +108,7 @@ static struct config *config_get(int index, const char *line) config->line->cmp = (int (*)(void *, void *))line_cmp; config->name = XSTRDUP(MTYPE_VTYSH_CONFIG_LINE, line); config->index = index; - config_master_add(master, config); + config_master_add_tail(master, config); } return config; } From 3e4d90ec556649e11954f2f56b5282f95e7e013b Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Tue, 30 Jun 2020 09:03:55 -0400 Subject: [PATCH 2/2] vtysh: Improve lookup performance When we find the line we are interested in, stop looking. Signed-off-by: Donald Sharp --- vtysh/vtysh_config.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vtysh/vtysh_config.c b/vtysh/vtysh_config.c index 2ab9dd5a9a..61bcf3b658 100644 --- a/vtysh/vtysh_config.c +++ b/vtysh/vtysh_config.c @@ -97,8 +97,10 @@ static struct config *config_get(int index, const char *line) } frr_each (config_master, master, config_loop) { - if (strcmp(config_loop->name, line) == 0) + if (strcmp(config_loop->name, line) == 0) { config = config_loop; + break; + } } if (!config) {