From: Robert Varga Date: Mon, 26 Aug 2019 20:44:30 +0000 (+0200) Subject: Deduplicate MapNode key leaf values X-Git-Tag: release/magnesium~115 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=76b19a3323d73115a126f17bd17d893c5ebdba83;hp=4990e19129d20069b5bbacaab60bb75907882eaf Deduplicate MapNode key leaf values When we are encountering a leaf node inside a MapEntryNode, it can be a leaf corresponding to a key -- in which case its value is already present in NodeIdentifierWithPredicates and we do want to de-duplicate those objects. JIRA: CONTROLLER-1908 Change-Id: I2ed65c311f9921aa77c9f23bd1f7681d7f11355a Signed-off-by: Robert Varga --- diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/LithiumNormalizedNodeInputStreamReader.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/LithiumNormalizedNodeInputStreamReader.java index 552f1e96a2..e069d901d1 100755 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/LithiumNormalizedNodeInputStreamReader.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/LithiumNormalizedNodeInputStreamReader.java @@ -155,10 +155,28 @@ class LithiumNormalizedNodeInputStreamReader extends ForwardingDataInput impleme } private void streamLeaf(final NormalizedNodeStreamWriter writer) throws IOException { + startLeaf(writer); + endLeaf(writer, readObject()); + } + + // Leaf inside a MapEntryNode, it can potentially be a key leaf, in which case we want to de-duplicate values. + private void streamLeaf(final NormalizedNodeStreamWriter writer, final NodeIdentifierWithPredicates entryId) + throws IOException { + final NodeIdentifier identifier = startLeaf(writer); + final Object value = readObject(); + final Object entryValue = entryId.getValue(identifier.getNodeType()); + endLeaf(writer, entryValue == null ? value : entryValue); + } + + private NodeIdentifier startLeaf(final NormalizedNodeStreamWriter writer) throws IOException { final NodeIdentifier identifier = readNodeIdentifier(); LOG.trace("Streaming leaf node {}", identifier); writer.startLeafNode(identifier); - writer.scalarValue(readObject()); + return identifier; + } + + private static void endLeaf(final NormalizedNodeStreamWriter writer, final Object value) throws IOException { + writer.scalarValue(value); writer.endNode(); } @@ -215,7 +233,17 @@ class LithiumNormalizedNodeInputStreamReader extends ForwardingDataInput impleme final NodeIdentifierWithPredicates entryIdentifier = readNormalizedNodeWithPredicates(); LOG.trace("Streaming map entry node {}", entryIdentifier); writer.startMapEntryNode(entryIdentifier, NormalizedNodeStreamWriter.UNKNOWN_SIZE); - commonStreamContainer(writer); + + // Same loop as commonStreamContainer(), but ... + for (byte nodeType = input.readByte(); nodeType != NodeTypes.END_NODE; nodeType = input.readByte()) { + if (nodeType == NodeTypes.LEAF_NODE) { + // ... leaf nodes may need de-duplication + streamLeaf(writer, entryIdentifier); + } else { + streamNormalizedNode(writer, nodeType); + } + } + writer.endNode(); } private void streamUnkeyedList(final NormalizedNodeStreamWriter writer) throws IOException {