Do not retain leaf nodes in containers by default 04/89804/3
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 27 Aug 2019 14:04:55 +0000 (16:04 +0200)
committerRobert Varga <nite@hq.sk>
Mon, 13 Jul 2020 18:50:52 +0000 (18:50 +0000)
commitcbe55e17078de036df1fd19f54aee62a389822f3
treebeee906c4181f540550ba200edf4fcda7217f3d2
parent9479347c6c26d144254286caad776f8616527376
Do not retain leaf nodes in containers by default

Leaf nodes are observed to dominate our memory footprint. This
patch modifies immutable implementations of NormalizedNodeContainers
such that they eliminate any leaf nodes when they are stored, retaining
only the encapsulated value. Leaf nodes are then re-created on access
as needed.

Note this changes two aspects of operation:

1) looking up a leaf will yield a new object every time it is invoked,
   hence callers must not rely on on returned objects to be identical.

2) getValue() is operating on the backing map's entrySet() and requires
   its transformation. This means that multiple iterations over values
   will not necessarily yield same objects.

Neither of these violates effective immutability contract of NormalizeNode,
as the returned objects will compare as equal.

This behavior can be switched off at runtime by setting the system property:

    org.opendaylight.yangtools.yang.data.impl.schema.nodes.lazy-leaves=false

JIRA: YANGTOOLS-1019
Change-Id: I00fc3ac0b64290068e8a6e4c8972454729fa9011
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 6d818dcbe5187d15a46cced7893be28df1cec725)
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/AbstractImmutableDataContainerNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableAugmentationNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableChoiceNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableContainerNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUnkeyedListEntryNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableYangModeledAnyXmlNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableDataContainerNode.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/LazyLeafOperations.java [new file with mode: 0644]
yang/yang-data-jaxen/src/test/java/org/opendaylight/yangtools/yang/data/jaxen/DerefXPathFunctionTest.java