From 87ef072436f327228e132c2547c8c94c2f2150e7 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 21 Dec 2014 01:53:08 +0100 Subject: [PATCH] BUG-2350: improve performance of data tree merges Profiling has revealed that performing a merge on a large subtree results in all pre-existing nodes being verified. The MD-SAL performs an empty merge whenever the user asks for parents to be created -- resulting in up to 75% overhead. Change-Id: I94310b2cb27c8585a8b8c4933ff0f0f658fda9be Signed-off-by: Robert Varga --- .../yang/data/impl/schema/tree/ModifiedNode.java | 13 +++++++++++++ .../schema/tree/OperationWithModification.java | 16 ++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java index ecda366de0..bc6b46d46f 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java @@ -270,6 +270,19 @@ final class ModifiedNode implements StoreTreeNode, Identifiable value) { + final ModifiedNode ret = new ModifiedNode(getIdentifier(), Optional.absent(), false); + ret.write(value); + return ret; + } + public static ModifiedNode createUnmodified(final TreeNode metadataTree, final boolean isOrdered) { return new ModifiedNode(metadataTree.getIdentifier(), Optional.of(metadataTree), isOrdered); } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/OperationWithModification.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/OperationWithModification.java index bcf2101ff0..3293a05b06 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/OperationWithModification.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/OperationWithModification.java @@ -31,13 +31,13 @@ final class OperationWithModification { applyOperation.verifyStructure(modification); } - private void mergeImpl(final NormalizedNode data) { + private void recursiveMerge(final NormalizedNode data) { if (data instanceof NormalizedNodeContainer) { @SuppressWarnings({ "rawtypes", "unchecked" }) NormalizedNodeContainer> dataContainer = (NormalizedNodeContainer) data; for (NormalizedNode child : dataContainer.getValue()) { PathArgument childId = child.getIdentifier(); - forChild(childId).mergeImpl(child); + forChild(childId).recursiveMerge(child); } } @@ -45,8 +45,16 @@ final class OperationWithModification { } void merge(final NormalizedNode data) { - mergeImpl(data); - applyOperation.verifyStructure(modification); + /* + * A merge operation will end up overwriting parts of the tree, retaining others. + * We want to make sure we do not validate the complete resulting structure, but + * rather just what was written. In order to do that, we first pretend the data + * was written, run verification and then perform the merge -- with the explicit + * assumption that adding the newly-validated data with the previously-validated + * data will not result in invalid data. + */ + applyOperation.verifyStructure(modification.asNewlyWritten(data)); + recursiveMerge(data); } void delete() { -- 2.36.6