From 56e1aa5e521c6741656eb9c62e5e647b03b1d945 Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Thu, 5 Jun 2014 19:07:31 +0200 Subject: [PATCH] Bug 1106: Introduced OptimisticLockFailedException Introduced two new Exceptions to InMemoryDOMDataStore: - IncorrectDataStructureException - ConflictingModificationAppliedException. Introduced OptimisticLockFailedException to DataBroker API which is thrown when transaction fails because of ConflictingModificationAppliedException, which is raised when other modification already applied to data tree prevents commit on submitted modification. OptimisticLockFailedException is propagated to the clients also via returned Future and may be present as causeof ExecutionException when get() is invoked on Future. Change-Id: Ia119c9ae4c4ffa9774b45b1d6d54cade7a5b8c32 Signed-off-by: Tony Tkacik --- .../data/OptimisticLockFailedException.java | 34 +++++++++++++++++ .../dom/store/impl/InMemoryDOMDataStore.java | 15 ++++++-- ...nflictingModificationAppliedException.java | 33 ++++++++++++++++ .../md/sal/dom/store/impl/tree/DataTree.java | 2 +- ...ava => DataValidationFailedException.java} | 6 +-- .../tree/IncorrectDataStructureException.java | 33 ++++++++++++++++ .../impl/tree/data/InMemoryDataTree.java | 4 +- .../tree/data/ModificationApplyOperation.java | 6 +-- ...izedNodeContainerModificationStrategy.java | 12 +++--- .../tree/data/SchemaAwareApplyOperation.java | 38 ++++++++++++------- .../data/ValueNodeModificationStrategy.java | 6 +-- 11 files changed, 154 insertions(+), 35 deletions(-) create mode 100644 opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/OptimisticLockFailedException.java create mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ConflictingModificationAppliedException.java rename opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/{DataPreconditionFailedException.java => DataValidationFailedException.java} (85%) create mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/IncorrectDataStructureException.java diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/OptimisticLockFailedException.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/OptimisticLockFailedException.java new file mode 100644 index 0000000000..222289ab6c --- /dev/null +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/OptimisticLockFailedException.java @@ -0,0 +1,34 @@ +package org.opendaylight.controller.md.sal.common.api.data; + +/** +* +* Failure of asynchronous transaction commit caused by failure +* of optimistic locking. +* +* This exception is raised and returned when transaction commit +* failed, because other transaction finished successfully +* and modified same data as failed transaction. +* +* Clients may recover from this error condition by +* retrieving current state and submitting new updated +* transaction. +* +*/ +public class OptimisticLockFailedException extends TransactionCommitFailedException { + + private static final long serialVersionUID = 1L; + + protected OptimisticLockFailedException(final String message, final Throwable cause, final boolean enableSuppression, + final boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public OptimisticLockFailedException(final String message, final Throwable cause) { + super(message, cause); + } + + public OptimisticLockFailedException(final String message) { + super(message); + } + +} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDOMDataStore.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDOMDataStore.java index 10b838a2c6..b0c4274fa5 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDOMDataStore.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/InMemoryDOMDataStore.java @@ -17,12 +17,15 @@ import javax.annotation.concurrent.GuardedBy; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; +import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException; +import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.controller.md.sal.dom.store.impl.SnapshotBackedWriteTransaction.TransactionReadyPrototype; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataPreconditionFailedException; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.ConflictingModificationAppliedException; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTree; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeCandidate; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeModification; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeSnapshot; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataValidationFailedException; import org.opendaylight.controller.md.sal.dom.store.impl.tree.ListenerTree; import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.InMemoryDataTreeFactory; import org.opendaylight.controller.sal.core.spi.data.DOMStore; @@ -302,15 +305,19 @@ public class InMemoryDOMDataStore implements DOMStore, Identifiable, Sch public ListenableFuture canCommit() { return executor.submit(new Callable() { @Override - public Boolean call() { + public Boolean call() throws TransactionCommitFailedException { try { dataTree.validate(modification); LOG.debug("Store Transaction: {} can be committed", transaction.getIdentifier()); return true; - } catch (DataPreconditionFailedException e) { + } catch (ConflictingModificationAppliedException e) { + LOG.warn("Store Tx: {} Conflicting modification for {}.", transaction.getIdentifier(), + e.getPath()); + throw new OptimisticLockFailedException("Optimistic lock failed.",e); + } catch (DataValidationFailedException e) { LOG.warn("Store Tx: {} Data Precondition failed for {}.", transaction.getIdentifier(), e.getPath(), e); - return false; + throw new TransactionCommitFailedException("Data did not pass validation.",e); } } }); diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ConflictingModificationAppliedException.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ConflictingModificationAppliedException.java new file mode 100644 index 0000000000..3625d3356a --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ConflictingModificationAppliedException.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.md.sal.dom.store.impl.tree; + +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; + +/** + * Exception thrown when a proposed change fails validation before being + * applied into the Data Tree because the Data Tree has been modified + * in way that a conflicting + * node is present. + */ +public class ConflictingModificationAppliedException extends DataValidationFailedException { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public ConflictingModificationAppliedException(final InstanceIdentifier path, final String message, final Throwable cause) { + super(path, message, cause); + } + + public ConflictingModificationAppliedException(final InstanceIdentifier path, final String message) { + super(path, message); + } + +} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTree.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTree.java index ee9726a450..4807e15653 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTree.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataTree.java @@ -32,7 +32,7 @@ public interface DataTree { /** * Validate whether a particular modification can be applied to the data tree. */ - void validate(DataTreeModification modification) throws DataPreconditionFailedException; + void validate(DataTreeModification modification) throws DataValidationFailedException; /** * Prepare a modification for commit. diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataPreconditionFailedException.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataValidationFailedException.java similarity index 85% rename from opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataPreconditionFailedException.java rename to opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataValidationFailedException.java index bd24ac5fcf..3683240f57 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataPreconditionFailedException.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/DataValidationFailedException.java @@ -17,7 +17,7 @@ import com.google.common.base.Preconditions; * the datastore has been concurrently modified such that a conflicting * node is present, or the modification is structurally incorrect. */ -public class DataPreconditionFailedException extends Exception { +public class DataValidationFailedException extends Exception { private static final long serialVersionUID = 1L; private final InstanceIdentifier path; @@ -27,7 +27,7 @@ public class DataPreconditionFailedException extends Exception { * @param path Object path which caused this exception * @param message Specific message describing the failure */ - public DataPreconditionFailedException(final InstanceIdentifier path, final String message) { + public DataValidationFailedException(final InstanceIdentifier path, final String message) { this(path, message, null); } /** @@ -37,7 +37,7 @@ public class DataPreconditionFailedException extends Exception { * @param message Specific message describing the failure * @param cause Exception which triggered this failure, may be null */ - public DataPreconditionFailedException(final InstanceIdentifier path, final String message, final Throwable cause) { + public DataValidationFailedException(final InstanceIdentifier path, final String message, final Throwable cause) { super(message, cause); this.path = Preconditions.checkNotNull(path); } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/IncorrectDataStructureException.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/IncorrectDataStructureException.java new file mode 100644 index 0000000000..87482a9156 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/IncorrectDataStructureException.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.md.sal.dom.store.impl.tree; + +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; + +/** + * Exception thrown when a proposed change fails validation before being + * applied into the datastore because of incorrect structure of user supplied + * data. + * + */ +public class IncorrectDataStructureException extends DataValidationFailedException { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public IncorrectDataStructureException(final InstanceIdentifier path, final String message, final Throwable cause) { + super(path, message, cause); + } + + public IncorrectDataStructureException(final InstanceIdentifier path, final String message) { + super(path, message); + } + +} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTree.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTree.java index d3495b542a..4ffa6f91b0 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTree.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTree.java @@ -10,7 +10,7 @@ package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataPreconditionFailedException; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataValidationFailedException; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTree; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeCandidate; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeModification; @@ -81,7 +81,7 @@ final class InMemoryDataTree implements DataTree { } @Override - public void validate(final DataTreeModification modification) throws DataPreconditionFailedException { + public void validate(final DataTreeModification modification) throws DataValidationFailedException { Preconditions.checkArgument(modification instanceof InMemoryDataTreeModification, "Invalid modification class %s", modification.getClass()); final InMemoryDataTreeModification m = (InMemoryDataTreeModification)modification; diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationApplyOperation.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationApplyOperation.java index df03db35be..f72d575194 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationApplyOperation.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationApplyOperation.java @@ -7,7 +7,7 @@ */ package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataPreconditionFailedException; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataValidationFailedException; import org.opendaylight.controller.md.sal.dom.store.impl.tree.StoreTreeNode; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; @@ -87,7 +87,7 @@ interface ModificationApplyOperation extends StoreTreeNode current) throws DataPreconditionFailedException; + void checkApplicable(InstanceIdentifier path, NodeModification modification, Optional current) throws DataValidationFailedException; } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NormalizedNodeContainerModificationStrategy.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NormalizedNodeContainerModificationStrategy.java index 5c6aeace56..1d10ab6ea5 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NormalizedNodeContainerModificationStrategy.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NormalizedNodeContainerModificationStrategy.java @@ -11,7 +11,7 @@ import static com.google.common.base.Preconditions.checkArgument; import java.util.Map; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataPreconditionFailedException; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataValidationFailedException; import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.DataNodeContainerModificationStrategy.ListEntryModificationStrategy; import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.ValueNodeModificationStrategy.LeafSetEntryModificationStrategy; @@ -67,7 +67,7 @@ abstract class NormalizedNodeContainerModificationStrategy extends SchemaAwareAp @Override protected void checkWriteApplicable(final InstanceIdentifier path, final NodeModification modification, - final Optional current) throws DataPreconditionFailedException { + final Optional current) throws DataValidationFailedException { // FIXME: Implement proper write check for replacement of node container // prerequisite is to have transaction chain available for clients // otherwise this will break chained writes to same node. @@ -166,12 +166,12 @@ abstract class NormalizedNodeContainerModificationStrategy extends SchemaAwareAp @Override protected void checkSubtreeModificationApplicable(final InstanceIdentifier path, final NodeModification modification, - final Optional current) throws DataPreconditionFailedException { - checkDataPrecondition(path, current.isPresent(), "Node was deleted by other transaction."); + final Optional current) throws DataValidationFailedException { + checkConflicting(path, current.isPresent(), "Node was deleted by other transaction."); checkChildPreconditions(path, modification, current); } - private void checkChildPreconditions(final InstanceIdentifier path, final NodeModification modification, final Optional current) throws DataPreconditionFailedException { + private void checkChildPreconditions(final InstanceIdentifier path, final NodeModification modification, final Optional current) throws DataValidationFailedException { final TreeNode currentMeta = current.get(); for (NodeModification childMod : modification.getChildren()) { final PathArgument childId = childMod.getIdentifier(); @@ -184,7 +184,7 @@ abstract class NormalizedNodeContainerModificationStrategy extends SchemaAwareAp @Override protected void checkMergeApplicable(final InstanceIdentifier path, final NodeModification modification, - final Optional current) throws DataPreconditionFailedException { + final Optional current) throws DataValidationFailedException { if(current.isPresent()) { checkChildPreconditions(path, modification,current); } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperation.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperation.java index 6ef76adacf..f6006359af 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperation.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperation.java @@ -11,7 +11,9 @@ import static com.google.common.base.Preconditions.checkArgument; import java.util.List; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataPreconditionFailedException; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.ConflictingModificationAppliedException; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataValidationFailedException; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.IncorrectDataStructureException; import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.DataNodeContainerModificationStrategy.ContainerModificationStrategy; import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.DataNodeContainerModificationStrategy.UnkeyedListItemModificationStrategy; @@ -82,9 +84,9 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { return null; } - public static boolean checkDataPrecondition(final InstanceIdentifier path, final boolean condition, final String message) throws DataPreconditionFailedException { + public static boolean checkConflicting(final InstanceIdentifier path, final boolean condition, final String message) throws ConflictingModificationAppliedException { if(!condition) { - throw new DataPreconditionFailedException(path, message); + throw new ConflictingModificationAppliedException(path, message); } return condition; } @@ -109,10 +111,10 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { } } - private static final void checkNotConflicting(final InstanceIdentifier path, final TreeNode original, final TreeNode current) throws DataPreconditionFailedException { - checkDataPrecondition(path, original.getVersion().equals(current.getVersion()), + private static final void checkNotConflicting(final InstanceIdentifier path, final TreeNode original, final TreeNode current) throws ConflictingModificationAppliedException { + checkConflicting(path, original.getVersion().equals(current.getVersion()), "Node was replaced by other transaction."); - checkDataPrecondition(path, original.getSubtreeVersion().equals(current.getSubtreeVersion()), + checkConflicting(path, original.getSubtreeVersion().equals(current.getSubtreeVersion()), "Node children was modified by other transaction"); } @@ -130,7 +132,7 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { } @Override - public final void checkApplicable(final InstanceIdentifier path,final NodeModification modification, final Optional current) throws DataPreconditionFailedException { + public final void checkApplicable(final InstanceIdentifier path,final NodeModification modification, final Optional current) throws DataValidationFailedException { switch (modification.getType()) { case DELETE: checkDeleteApplicable(modification, current); @@ -151,7 +153,7 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { } - protected void checkMergeApplicable(final InstanceIdentifier path, final NodeModification modification, final Optional current) throws DataPreconditionFailedException { + protected void checkMergeApplicable(final InstanceIdentifier path, final NodeModification modification, final Optional current) throws DataValidationFailedException { Optional original = modification.getOriginal(); if (original.isPresent() && current.isPresent()) { /* @@ -166,12 +168,12 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { } } - protected void checkWriteApplicable(final InstanceIdentifier path, final NodeModification modification, final Optional current) throws DataPreconditionFailedException { + protected void checkWriteApplicable(final InstanceIdentifier path, final NodeModification modification, final Optional current) throws DataValidationFailedException { Optional original = modification.getOriginal(); if (original.isPresent() && current.isPresent()) { checkNotConflicting(path, original.get(), current.get()); } else if(original.isPresent()) { - throw new DataPreconditionFailedException(path,"Node was deleted by other transaction."); + throw new ConflictingModificationAppliedException(path,"Node was deleted by other transaction."); } } @@ -216,8 +218,18 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { protected abstract TreeNode applySubtreeChange(ModifiedNode modification, TreeNode currentMeta, Version version); + /** + * + * Checks is supplied {@link NodeModification} is applicable for Subtree Modification. + * + * @param path Path to current node + * @param modification Node modification which should be applied. + * @param current Current state of data tree + * @throws ConflictingModificationAppliedException If subtree was changed in conflicting way + * @throws IncorrectDataStructureException If subtree modification is not applicable (e.g. leaf node). + */ protected abstract void checkSubtreeModificationApplicable(InstanceIdentifier path, final NodeModification modification, - final Optional current) throws DataPreconditionFailedException; + final Optional current) throws DataValidationFailedException; protected abstract void verifyWrittenStructure(NormalizedNode writtenValue); @@ -262,8 +274,8 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { @Override protected void checkSubtreeModificationApplicable(final InstanceIdentifier path, final NodeModification modification, - final Optional current) throws DataPreconditionFailedException { - throw new DataPreconditionFailedException(path, "Subtree modification is not allowed."); + final Optional current) throws IncorrectDataStructureException { + throw new IncorrectDataStructureException(path, "Subtree modification is not allowed."); } } } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ValueNodeModificationStrategy.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ValueNodeModificationStrategy.java index a9f69ac953..900fa320a1 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ValueNodeModificationStrategy.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ValueNodeModificationStrategy.java @@ -9,7 +9,7 @@ package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; import static com.google.common.base.Preconditions.checkArgument; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataPreconditionFailedException; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.IncorrectDataStructureException; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNodeFactory; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; @@ -68,8 +68,8 @@ abstract class ValueNodeModificationStrategy extends S @Override protected void checkSubtreeModificationApplicable(final InstanceIdentifier path, final NodeModification modification, - final Optional current) throws DataPreconditionFailedException { - throw new DataPreconditionFailedException(path, "Subtree modification is not allowed."); + final Optional current) throws IncorrectDataStructureException { + throw new IncorrectDataStructureException(path, "Subtree modification is not allowed."); } public static class LeafSetEntryModificationStrategy extends ValueNodeModificationStrategy { -- 2.36.6