diff options
author | Renato Westphal <renato@opensourcerouting.org> | 2019-04-18 16:55:52 +0200 |
---|---|---|
committer | Renato Westphal <renato@opensourcerouting.org> | 2019-04-18 16:56:45 +0200 |
commit | ccd43ada1791793602cbdff3973fae3ca692e6bf (patch) | |
tree | 16b3e19d28fb4d04178229cf861e1e7fccf618f9 /lib/yang.h | |
parent | .gitignore: ignore core dumps (diff) | |
download | frr-ccd43ada1791793602cbdff3973fae3ca692e6bf.tar.xz frr-ccd43ada1791793602cbdff3973fae3ca692e6bf.zip |
lib: rework management of user pointers in the northbound layer
Introduce a hash table to keep track of user pointers associated
to configuration entries. The previous strategy was to embed
the user pointers inside libyang data nodes, but this solution
incurred a substantial performance overhead. The user pointers
embedded in candidate configurations could be lost while the
configuration was being edited, so they needed to be regenerated
before the candidate could be committed. This was done by the
nb_candidate_restore_priv_pointers() function, which was extremely
expensive for large configurations. The new hash table solves this
performance problem.
The yang_dnode_[gs]et_entry() functions were renamed and moved from
yang.[ch] to northbound.[ch], which is a more appropriate place
for them. This patch also introduces the nb_running_unset_entry()
function, the counterpart of nb_running_set_entry() (unsetting
user pointers was done automatically before, now it needs to be
done manually).
As a consequence of these changes, we shouldn't need support for
libyang private pointers anymore (-DENABLE_LYD_PRIV=ON). But it's
probably a good idea to keep requiring this feature as we might
need it in the future for other things (e.g. disable configuration
settings without removing them).
Fixes #4136.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Diffstat (limited to 'lib/yang.h')
-rw-r--r-- | lib/yang.h | 45 |
1 files changed, 0 insertions, 45 deletions
diff --git a/lib/yang.h b/lib/yang.h index 15f0ec7ae..6f8c84ab6 100644 --- a/lib/yang.h +++ b/lib/yang.h @@ -403,51 +403,6 @@ extern bool yang_dnode_is_default_recursive(const struct lyd_node *dnode); extern void yang_dnode_change_leaf(struct lyd_node *dnode, const char *value); /* - * Set the libyang private pointer to a user pointer. Can only be used on YANG - * lists and containers. - * - * dnode - * libyang data node to operate on. - * - * entry - * Arbitrary user-specified pointer. - */ -extern void yang_dnode_set_entry(const struct lyd_node *dnode, void *entry); - -/* - * Find the user pointer associated to the given libyang data node. - * - * The data node is traversed by following the parent pointers until an user - * pointer is found or until the root node is reached. - * - * dnode - * libyang data node to operate on. - * - * abort_if_not_found - * When set to true, abort the program if no user pointer is found. - * - * As a rule of thumb, this parameter should be set to true in the following - * scenarios: - * - Calling this function from any northbound configuration callback during - * the NB_EV_APPLY phase. - * - Calling this function from a 'delete' northbound configuration callback - * during any phase. - * - * In both the above cases, the libyang data node should contain an user - * pointer except when there's a bug in the code, in which case it's better - * to abort the program right away and eliminate the need for unnecessary - * NULL checks. - * - * In all other cases, this parameter should be set to false and the caller - * should check if the function returned NULL or not. - * - * Returns: - * User pointer if found, NULL otherwise. - */ -extern void *yang_dnode_get_entry(const struct lyd_node *dnode, - bool abort_if_not_found); - -/* * Create a new libyang data node. * * ly_ctx |