Hiding the pruner works against what we want to do, as we need
to be able to control how pruning works. While we are at it, hide
delegate() so that users are forced to hold on to this invariant.
JIRA: CONTROLLER-1923
Change-Id: Iba78b2fd5f775281bf4bc04f449539d185c94f9c
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
import org.opendaylight.controller.cluster.datastore.DataTreeCohortActorRegistry.CohortRegistryCommand;
import org.opendaylight.controller.cluster.datastore.ShardDataTreeCohort.State;
import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats;
import org.opendaylight.controller.cluster.datastore.DataTreeCohortActorRegistry.CohortRegistryCommand;
import org.opendaylight.controller.cluster.datastore.ShardDataTreeCohort.State;
import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats;
+import org.opendaylight.controller.cluster.datastore.node.utils.transformer.ReusableNormalizedNodePruner;
import org.opendaylight.controller.cluster.datastore.persisted.AbortTransactionPayload;
import org.opendaylight.controller.cluster.datastore.persisted.AbstractIdentifiablePayload;
import org.opendaylight.controller.cluster.datastore.persisted.CloseLocalHistoryPayload;
import org.opendaylight.controller.cluster.datastore.persisted.AbortTransactionPayload;
import org.opendaylight.controller.cluster.datastore.persisted.AbstractIdentifiablePayload;
import org.opendaylight.controller.cluster.datastore.persisted.CloseLocalHistoryPayload;
- final DataTreeModification mod = wrapper.apply(dataTree.takeSnapshot().newModification());
+ final DataTreeModification unwrapped = dataTree.takeSnapshot().newModification();
+ final DataTreeModification mod = wrapper.apply(unwrapped);
// delete everything first
mod.delete(YangInstanceIdentifier.empty());
// delete everything first
mod.delete(YangInstanceIdentifier.empty());
- final DataTreeModification unwrapped = unwrap(mod);
dataTree.validate(unwrapped);
DataTreeCandidateTip candidate = dataTree.prepare(unwrapped);
dataTree.commit(candidate);
dataTree.validate(unwrapped);
DataTreeCandidateTip candidate = dataTree.prepare(unwrapped);
dataTree.commit(candidate);
}
private PruningDataTreeModification wrapWithPruning(final DataTreeModification delegate) {
}
private PruningDataTreeModification wrapWithPruning(final DataTreeModification delegate) {
- return new PruningDataTreeModification(delegate, dataTree, dataSchemaContext);
- }
-
- private static DataTreeModification unwrap(final DataTreeModification modification) {
- if (modification instanceof PruningDataTreeModification) {
- return ((PruningDataTreeModification)modification).delegate();
- }
- return modification;
+ return new PruningDataTreeModification(delegate, dataTree,
+ // TODO: we should be able to reuse the pruner, provided we are not reentrant
+ ReusableNormalizedNodePruner.forDataSchemaContext(dataSchemaContext));
@SuppressWarnings("checkstyle:IllegalCatch")
private void applyRecoveryCandidate(final CommitTransactionPayload payload) throws IOException {
final Entry<TransactionIdentifier, DataTreeCandidate> entry = payload.getCandidate();
@SuppressWarnings("checkstyle:IllegalCatch")
private void applyRecoveryCandidate(final CommitTransactionPayload payload) throws IOException {
final Entry<TransactionIdentifier, DataTreeCandidate> entry = payload.getCandidate();
-
- final PruningDataTreeModification mod = wrapWithPruning(dataTree.takeSnapshot().newModification());
+ final DataTreeModification unwrapped = dataTree.takeSnapshot().newModification();
+ final PruningDataTreeModification mod = wrapWithPruning(unwrapped);
DataTreeCandidates.applyToModification(mod, entry.getValue());
mod.ready();
DataTreeCandidates.applyToModification(mod, entry.getValue());
mod.ready();
- final DataTreeModification unwrapped = mod.delegate();
LOG.trace("{}: Applying recovery modification {}", logContext, unwrapped);
try {
LOG.trace("{}: Applying recovery modification {}", logContext, unwrapped);
try {
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModificationCursor;
import org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaValidationFailedException;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModificationCursor;
import org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaValidationFailedException;
-import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private DataTreeModification delegate;
private DataTreeModification delegate;
- private PruningDataTreeModification(final DataTreeModification delegate, final DataTree dataTree,
+ public PruningDataTreeModification(final DataTreeModification delegate, final DataTree dataTree,
final ReusableNormalizedNodePruner pruner) {
this.delegate = requireNonNull(delegate);
this.dataTree = requireNonNull(dataTree);
this.pruner = requireNonNull(pruner);
}
final ReusableNormalizedNodePruner pruner) {
this.delegate = requireNonNull(delegate);
this.dataTree = requireNonNull(dataTree);
this.pruner = requireNonNull(pruner);
}
- public PruningDataTreeModification(final DataTreeModification delegate, final DataTree dataTree,
- final DataSchemaContextTree dataSchemaContext) {
- this(delegate, dataTree, ReusableNormalizedNodePruner.forDataSchemaContext(dataSchemaContext));
- }
-
- public DataTreeModification delegate() {
+ protected DataTreeModification delegate() {
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.controller.cluster.datastore.Shard;
import org.opendaylight.controller.cluster.datastore.ShardDataTree;
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.controller.cluster.datastore.Shard;
import org.opendaylight.controller.cluster.datastore.ShardDataTree;
+import org.opendaylight.controller.cluster.datastore.node.utils.transformer.ReusableNormalizedNodePruner;
import org.opendaylight.controller.md.cluster.datastore.model.CarsModel;
import org.opendaylight.controller.md.cluster.datastore.model.PeopleModel;
import org.opendaylight.controller.md.cluster.datastore.model.SchemaContextHelper;
import org.opendaylight.controller.md.cluster.datastore.model.CarsModel;
import org.opendaylight.controller.md.cluster.datastore.model.PeopleModel;
import org.opendaylight.controller.md.cluster.datastore.model.SchemaContextHelper;
- pruningDataTreeModification = new PruningDataTreeModification(proxyModification, dataTree, CONTEXT_TREE);
+ pruningDataTreeModification = new PruningDataTreeModification(proxyModification, dataTree,
+ // Cannot reuse with parallel tests
+ ReusableNormalizedNodePruner.forDataSchemaContext(CONTEXT_TREE));