Do not retain leaf nodes in containers by default 15/84015/9
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 27 Aug 2019 14:04:55 +0000 (16:04 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 29 Aug 2019 08:23:12 +0000 (10:23 +0200)
commit6d818dcbe5187d15a46cced7893be28df1cec725
treebbf23a9c4bcd5987eeb23211c924b830fc505ea8
parentb617f3a3942d632134760b0ba93de2746efbd526
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>
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