[YANGTOOLS-909] MinMaxElementsValidation fails with disappearing list Created: 12/Oct/18  Updated: 13/Oct/18  Resolved: 13/Oct/18

Status: Resolved
Project: yangtools
Component/s: data-impl
Affects Version/s: 2.1.0, 2.1.1
Fix Version/s: 2.1.2

Type: Bug Priority: Highest
Reporter: Robert Varga Assignee: Robert Varga
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

Downstreams report the following problem:

2018-10-11T16:40:34,342 | ERROR | CommitFutures-3  | JobCoordinatorImpl               | 284 - org.opendaylight.infrautils.jobcoordinator-impl - 1.5.0.SNAPSHOT | Job still failed on final retry: JobEntry{key='80b0ade5-e20a-4ddd-9b90-70dfadb80908', mainWorker=org.opendaylight.genius.interfacemanager.servicebindings.flowbased.listeners.FlowBasedServicesInterfaceStateListener$RendererStateInterfaceUnbindWorker$$Lambda$2087/2140116126@14bc2564, rollbackWorker=null, retryCount=3/3, futures=[com.google.common.util.concurrent.AbstractTransformFuture$TransformFuture@1083a32b[status=FAILURE, cause=[TransactionCommitFailedException{message=canCommit encountered an unexpected failure, errorList=[RpcError [message=canCommit encountered an unexpected failure, severity=ERROR, errorType=APPLICATION, tag=operation-failed, applicationTag=null, info=null, cause=com.google.common.base.VerifyException]]}]]]}
org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException: canCommit encountered an unexpected failure
    at org.opendaylight.controller.sal.core.compat.LegacyDOMDataBrokerAdapter$1.newWithCause(LegacyDOMDataBrokerAdapter.java:75) ~[242:org.opendaylight.controller.sal-core-compat:1.9.0.SNAPSHOT]
    at org.opendaylight.controller.sal.core.compat.LegacyDOMDataBrokerAdapter$1.newWithCause(LegacyDOMDataBrokerAdapter.java:64) ~[242:org.opendaylight.controller.sal-core-compat:1.9.0.SNAPSHOT]
    at org.opendaylight.yangtools.util.concurrent.ExceptionMapper.apply(ExceptionMapper.java:106) ~[426:org.opendaylight.yangtools.util:2.1.1]
    at org.opendaylight.controller.sal.core.compat.LegacyDOMDataBrokerAdapter$DOMDataTransactionAdapter$1.onFailure(LegacyDOMDataBrokerAdapter.java:300) [242:org.opendaylight.controller.sal-core-compat:1.9.0.SNAPSHOT]
    at com.google.common.util.concurrent.Futures$CallbackListener.run(Futures.java:1349) [33:com.google.guava:25.1.0.jre]
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:398) [33:com.google.guava:25.1.0.jre]
    at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1024) [33:com.google.guava:25.1.0.jre]
    at com.google.common.util.concurrent.AbstractFuture.complete(AbstractFuture.java:866) [33:com.google.guava:25.1.0.jre]
    at com.google.common.util.concurrent.AbstractFuture.setException(AbstractFuture.java:711) [33:com.google.guava:25.1.0.jre]
    at com.google.common.util.concurrent.AbstractTransformFuture.run(AbstractTransformFuture.java:93) [33:com.google.guava:25.1.0.jre]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:?]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:?]
    at java.lang.Thread.run(Thread.java:748) [?:?]
Caused by: com.google.common.base.VerifyException
    at com.google.common.base.Verify.verify(Verify.java:100) ~[33:com.google.guava:25.1.0.jre]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.MinMaxElementsValidation.checkMinMaxElements(MinMaxElementsValidation.java:80) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.MinMaxElementsValidation.checkTouchApplicable(MinMaxElementsValidation.java:110) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.checkApplicable(SchemaAwareApplyOperation.java:130) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.checkChildPreconditions(AbstractNodeContainerModificationStrategy.java:304) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.checkTouchApplicable(AbstractNodeContainerModificationStrategy.java:286) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.checkApplicable(SchemaAwareApplyOperation.java:130) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.checkChildPreconditions(AbstractNodeContainerModificationStrategy.java:304) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.checkTouchApplicable(AbstractNodeContainerModificationStrategy.java:286) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.checkApplicable(SchemaAwareApplyOperation.java:130) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.UnorderedMapModificationStrategy.lambda$checkApplicable$1(UnorderedMapModificationStrategy.java:45) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.AutomaticLifecycleMixin.checkApplicable(AutomaticLifecycleMixin.java:111) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.UnorderedMapModificationStrategy.checkApplicable(UnorderedMapModificationStrategy.java:45) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.checkChildPreconditions(AbstractNodeContainerModificationStrategy.java:304) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.checkTouchApplicable(AbstractNodeContainerModificationStrategy.java:286) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.checkApplicable(SchemaAwareApplyOperation.java:130) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.StructuralContainerModificationStrategy.lambda$checkApplicable$1(StructuralContainerModificationStrategy.java:44) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.AutomaticLifecycleMixin.checkApplicable(AutomaticLifecycleMixin.java:111) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.StructuralContainerModificationStrategy.checkApplicable(StructuralContainerModificationStrategy.java:44) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.checkChildPreconditions(AbstractNodeContainerModificationStrategy.java:304) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.checkTouchApplicable(AbstractNodeContainerModificationStrategy.java:286) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaAwareApplyOperation.checkApplicable(SchemaAwareApplyOperation.java:130) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.RootModificationApplyOperation.checkApplicable(RootModificationApplyOperation.java:71) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]
    at org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractDataTreeTip.validate(AbstractDataTreeTip.java:38) ~[431:org.opendaylight.yangtools.yang-data-impl:2.1.1]

This turns out to be an invalid assumption in MinMaxElementsValidation, which needs to be able to deal with the data disappearing after application



 Comments   
Comment by Robert Varga [ 12/Oct/18 ]

Eliminating the verification here is easy, but writing the UT I came across another problem, where MinMaxElements.apply() would violate TOUCH precondition of metadata being present. A bit more investigation is needed.

Comment by Robert Varga [ 12/Oct/18 ]

The fix has a hole around disappearing list, such as when it is one of the alternatives.

Generated at Wed Feb 07 20:54:39 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.