Optimization: Added mountpoint cache as yang flag YANG_FLAG_MTPOINT_POTENTIAL

Filter state-data w xpath
This commit is contained in:
Olof hagsand 2023-12-11 22:05:16 +01:00
parent 012158fb24
commit e619632ac7
7 changed files with 44 additions and 12 deletions

View file

@ -13,7 +13,12 @@ Expected: February 2024
### Minor features ### Minor features
* Optimization:
* Added mountpoint cache as yang flag `YANG_FLAG_MTPOINT_POTENTIAL`
* Optimized `yang_find`, especially namespace lookup
* Filtered state data if not match xpath
* Added reference count for shared yang-specs (schema mounts) * Added reference count for shared yang-specs (schema mounts)
* Allowed for sharing yspec+modules between several mountpoints
### Corrected Bugs ### Corrected Bugs

View file

@ -393,10 +393,12 @@ clixon_plugin_statedata_all(clicon_handle h,
/* XXX: only for state data and according to with-defaults setting */ /* XXX: only for state data and according to with-defaults setting */
if (xml_defaults_nopresence(x, 2) < 0) if (xml_defaults_nopresence(x, 2) < 0)
goto done; goto done;
if (xpath_first(x, nsc, "%s", xpath) != NULL){
if ((ret = netconf_trymerge(x, yspec, xret)) < 0) if ((ret = netconf_trymerge(x, yspec, xret)) < 0)
goto done; goto done;
if (ret == 0) if (ret == 0)
goto fail; goto fail;
}
if (x){ if (x){
xml_free(x); xml_free(x);
x = NULL; x = NULL;

View file

@ -83,7 +83,14 @@
* leaf z; * leaf z;
* } * }
*/ */
#define YANG_FLAG_MOUNTPOINT 0x100 /* Mark node as ACTUAL populated mount-point #define YANG_FLAG_MTPOINT_POTENTIAL 0x100 /* Mark node as POTENTIAL mount-point, ie it fulfils:
* - is CONTAINER or LIST, AND
* - has YANG schema mount "mount-point" as child element, AND
* - the extension label matches y (see note below)
* Set by ys_populate2
* Read by yang_schema_mount_point
*/
#define YANG_FLAG_MOUNTPOINT 0x200 /* Mark node as ACTUAL populated mount-point
* Set by yang_mount_set * Set by yang_mount_set
* Read by ys_free1 * Read by ys_free1
*/ */

View file

@ -54,6 +54,7 @@
/* /*
* Prototypes * Prototypes
*/ */
int yang_schema_mount_point0(yang_stmt *y);
int yang_schema_mount_point(yang_stmt *y); int yang_schema_mount_point(yang_stmt *y);
int yang_mount_get(yang_stmt *yu, char *xpath, yang_stmt **yspec); int yang_mount_get(yang_stmt *yu, char *xpath, yang_stmt **yspec);
int yang_mount_set(yang_stmt *yu, char *xpath, yang_stmt *yspec); int yang_mount_set(yang_stmt *yu, char *xpath, yang_stmt *yspec);

View file

@ -3017,6 +3017,7 @@ ys_populate2(yang_stmt *ys,
{ {
int retval = -1; int retval = -1;
clicon_handle h = (clicon_handle)arg; clicon_handle h = (clicon_handle)arg;
int ret;
switch(ys->ys_keyword){ switch(ys->ys_keyword){
case Y_LEAF: case Y_LEAF:
@ -3033,6 +3034,11 @@ ys_populate2(yang_stmt *ys,
default: default:
break; break;
} }
/* RFC 8525 Yang schema mount flag for optimization */
if ((ret = yang_schema_mount_point0(ys)) < 0)
goto done;
if (ret == 1)
yang_flag_set(ys, YANG_FLAG_MTPOINT_POTENTIAL);
retval = 0; retval = 0;
done: done:
return retval; return retval;

View file

@ -98,7 +98,7 @@ struct yang_stmt{
Y_TYPE & identity: store all derived Y_TYPE & identity: store all derived
types as <module>:<id> list types as <module>:<id> list
Y_UNIQUE: vector of descendant schema node ids Y_UNIQUE: vector of descendant schema node ids
Y_EXTENSION: vector of instantiated UNKNOWNSo Y_EXTENSION: vector of instantiated UNKNOWNS
Y_UNKNOWN: app-dep: yang-mount-points Y_UNKNOWN: app-dep: yang-mount-points
*/ */
int ys_ref; /* Reference count for free, only YS_SPEC */ int ys_ref; /* Reference count for free, only YS_SPEC */

View file

@ -102,7 +102,7 @@
* @note That this may be a restriction on the usage of "label". The RFC is somewhat unclear. * @note That this may be a restriction on the usage of "label". The RFC is somewhat unclear.
*/ */
int int
yang_schema_mount_point(yang_stmt *y) yang_schema_mount_point0(yang_stmt *y)
{ {
int retval = -1; int retval = -1;
enum rfc_6020 keyw; enum rfc_6020 keyw;
@ -137,6 +137,14 @@ yang_schema_mount_point(yang_stmt *y)
goto done; goto done;
} }
/*! Cached variant of yang_schema_mount_point
*/
int
yang_schema_mount_point(yang_stmt *y)
{
return yang_flag_get(y, YANG_FLAG_MTPOINT_POTENTIAL) ? 1 : 0;
}
/*! Get yangspec mount-point /*! Get yangspec mount-point
* *
* @param[in] y Yang container/list containing unknown node * @param[in] y Yang container/list containing unknown node
@ -431,6 +439,7 @@ find_schema_mounts(cxobj *x,
* "ietf-yang-schema-mount" modules in the mounted schema and specifying * "ietf-yang-schema-mount" modules in the mounted schema and specifying
* the schemas in exactly the same way as the top-level schema. * the schemas in exactly the same way as the top-level schema.
* Alt: see snmp_yang2xml to get instances instead of brute force traverse of whole tree * Alt: see snmp_yang2xml to get instances instead of brute force traverse of whole tree
* @note: Mountpoints must exist in xret on entry
*/ */
static int static int
yang_schema_mount_statedata_yanglib(clicon_handle h, yang_schema_mount_statedata_yanglib(clicon_handle h,
@ -494,7 +503,7 @@ yang_schema_mount_statedata_yanglib(clicon_handle h,
* *
* @param[in] h Clixon handle * @param[in] h Clixon handle
* @param[in] yspec Yang spec * @param[in] yspec Yang spec
* @param[in] xpath XML Xpath * @param[in] xpath XML XPath
* @param[in] nsc XML Namespace context for xpath * @param[in] nsc XML Namespace context for xpath
* @param[in,out] xret Existing XML tree, merge x into this * @param[in,out] xret Existing XML tree, merge x into this
* @param[out] xerr XML error tree, if retval = 0 * @param[out] xerr XML error tree, if retval = 0
@ -556,11 +565,13 @@ yang_schema_mount_statedata(clicon_handle h,
goto done; goto done;
if (ret == 0) if (ret == 0)
goto fail; goto fail;
if (xpath_first(x1, nsc, "%s", xpath) != NULL){
if ((ret = netconf_trymerge(x1, yspec, xret)) < 0) if ((ret = netconf_trymerge(x1, yspec, xret)) < 0)
goto done; goto done;
if (ret == 0) if (ret == 0)
goto fail; goto fail;
} }
}
/* Find mount-points and return yang-library state */ /* Find mount-points and return yang-library state */
if (yang_schema_mount_statedata_yanglib(h, xpath, nsc, xret, xerr) < 0) if (yang_schema_mount_statedata_yanglib(h, xpath, nsc, xret, xerr) < 0)
goto done; goto done;