import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateTip;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidates;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
import org.opendaylight.yangtools.yang.data.api.schema.tree.TipProducingDataTree;
import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory;
snapshot.ready();
return new SimpleShardDataTreeCohort(this, snapshot, transaction.getId());
}
+
+ public Optional<NormalizedNode<?, ?>> readNode(YangInstanceIdentifier path) {
+ return dataTree.takeSnapshot().readNode(path);
+ }
+
+ public DataTreeSnapshot takeSnapshot() {
+ return dataTree.takeSnapshot();
+ }
+
+ public DataTreeModification newModification() {
+ return dataTree.takeSnapshot().newModification();
+ }
+
+ public DataTreeCandidate commit(DataTreeModification modification) throws DataValidationFailedException {
+ modification.ready();
+ dataTree.validate(modification);
+ DataTreeCandidateTip candidate = dataTree.prepare(modification);
+ dataTree.commit(candidate);
+ return candidate;
+ }
}
Preconditions.checkState(openTransaction == null, "Transaction %s is open", openTransaction);
if (previousTx == null) {
- return dataTree.getDataTree().takeSnapshot();
+ return dataTree.takeSnapshot();
} else {
return previousTx.getSnapshot();
}
import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidates;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.slf4j.Logger;
*/
class ShardRecoveryCoordinator implements RaftActorRecoveryCohort {
private static final YangInstanceIdentifier ROOT = YangInstanceIdentifier.builder().build();
- private final DataTree store;
+ private final ShardDataTree store;
private final String shardName;
private final Logger log;
private final Set<URI> validNamespaces;
private int size;
ShardRecoveryCoordinator(ShardDataTree store, SchemaContext schemaContext, String shardName, Logger log) {
- this.store = store.getDataTree();
+ this.store = Preconditions.checkNotNull(store);
this.shardName = shardName;
this.log = log;
this.validNamespaces = NormalizedNodePruner.namespaces(schemaContext);
@Override
public void startLogRecoveryBatch(int maxBatchSize) {
log.debug("{}: starting log recovery batch with max size {}", shardName, maxBatchSize);
- transaction = new PruningDataTreeModification(store.takeSnapshot().newModification(), validNamespaces);
+ transaction = new PruningDataTreeModification(store.newModification(), validNamespaces);
size = 0;
}
}
private void commitTransaction(PruningDataTreeModification tx) throws DataValidationFailedException {
- DataTreeModification delegate = tx.getDelegate();
- delegate.ready();
- store.validate(delegate);
- store.commit(store.prepare(delegate));
+ store.commit(tx.getDelegate());
}
/**
log.debug("{}: Applying recovered snapshot", shardName);
final NormalizedNode<?, ?> node = SerializationUtils.deserializeNormalizedNode(snapshotBytes);
- final PruningDataTreeModification tx = new PruningDataTreeModification(store.takeSnapshot().newModification(), validNamespaces);
+ final PruningDataTreeModification tx = new PruningDataTreeModification(store.newModification(), validNamespaces);
tx.write(ROOT, node);
try {
commitTransaction(tx);
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import scala.concurrent.Future;
commitCoordinator.commitModifications(modifications, this);
}
- private boolean hasCandidate(MapEntryNode entity, String candidateName) {
+ private static boolean hasCandidate(MapEntryNode entity, String candidateName) {
return ((MapNode)entity.getChild(CANDIDATE_NODE_ID).get()).getChild(candidateNodeKey(candidateName)).isPresent();
}
private void searchForEntitiesOwnedBy(final String owner, final EntityWalker walker) {
- DataTreeSnapshot snapshot = getDataStore().getDataTree().takeSnapshot();
- Optional<NormalizedNode<?, ?>> possibleEntityTypes = snapshot.readNode(ENTITY_TYPES_PATH);
+ Optional<NormalizedNode<?, ?>> possibleEntityTypes = getDataStore().readNode(ENTITY_TYPES_PATH);
if(!possibleEntityTypes.isPresent()) {
return;
}
}
private void searchForEntities(EntityWalker walker) {
- DataTreeSnapshot snapshot = getDataStore().getDataTree().takeSnapshot();
- Optional<NormalizedNode<?, ?>> possibleEntityTypes = snapshot.readNode(ENTITY_TYPES_PATH);
+ Optional<NormalizedNode<?, ?>> possibleEntityTypes = getDataStore().readNode(ENTITY_TYPES_PATH);
if(!possibleEntityTypes.isPresent()) {
return;
}
}
}
- private Collection<String> getCandidateNames(MapEntryNode entity) {
+ private static Collection<String> getCandidateNames(MapEntryNode entity) {
Collection<MapEntryNode> candidates = ((MapNode)entity.getChild(CANDIDATE_NODE_ID).get()).getValue();
Collection<String> candidateNames = new ArrayList<>(candidates.size());
for(MapEntryNode candidate: candidates) {
}
private String getCurrentOwner(YangInstanceIdentifier entityId) {
- DataTreeSnapshot snapshot = getDataStore().getDataTree().takeSnapshot();
- Optional<NormalizedNode<?, ?>> optionalEntityOwner = snapshot.readNode(entityId.node(ENTITY_OWNER_QNAME));
+ Optional<NormalizedNode<?, ?>> optionalEntityOwner = getDataStore().readNode(entityId.node(ENTITY_OWNER_QNAME));
if(optionalEntityOwner.isPresent()){
return optionalEntityOwner.get().getValue().toString();
}
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateTip;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
public static NormalizedNode<?,?> readStore(final TestActorRef<? extends Shard> shard, final YangInstanceIdentifier id)
throws ExecutionException, InterruptedException {
- return readStore(shard.underlyingActor().getDataStore().getDataTree(), id);
+ return shard.underlyingActor().getDataStore().readNode(id).orNull();
}
public static NormalizedNode<?,?> readStore(final DataTree store, final YangInstanceIdentifier id) {
- final DataTreeSnapshot transaction = store.takeSnapshot();
-
- final Optional<NormalizedNode<?, ?>> optional = transaction.readNode(id);
- final NormalizedNode<?, ?> node = optional.isPresent()? optional.get() : null;
-
- return node;
+ return store.takeSnapshot().readNode(id).orNull();
}
public static void writeToStore(final TestActorRef<Shard> shard, final YangInstanceIdentifier id,
private Optional<NormalizedNode<?,?>> readCars(final ShardDataTree shardDataTree){
final TipProducingDataTree dataTree = shardDataTree.getDataTree();
+ // FIXME: this should not be called here
dataTree.setSchemaContext(peopleSchemaContext);
- final DataTreeSnapshot snapshot = dataTree.takeSnapshot();
-
- final DataTreeModification modification = snapshot.newModification();
-
- return modification.readNode(CarsModel.BASE_PATH);
+ return shardDataTree.readNode(CarsModel.BASE_PATH);
}
private Optional<NormalizedNode<?,?>> readPeople(final ShardDataTree shardDataTree){
final TipProducingDataTree dataTree = shardDataTree.getDataTree();
+ // FIXME: this should not be called here
dataTree.setSchemaContext(peopleSchemaContext);
- final DataTreeSnapshot snapshot = dataTree.takeSnapshot();
-
- final DataTreeModification modification = snapshot.newModification();
-
- return modification.readNode(PeopleModel.BASE_PATH);
+ return shardDataTree.readNode(PeopleModel.BASE_PATH);
}
-
-
- private byte[] createSnapshot(){
+ private static byte[] createSnapshot(){
final TipProducingDataTree dataTree = InMemoryDataTreeFactory.getInstance().create();
dataTree.setSchemaContext(SchemaContextHelper.select(SchemaContextHelper.CARS_YANG, SchemaContextHelper.PEOPLE_YANG));
final ShardDataTree dataStore = shard.underlyingActor().getDataStore();
- final DataTreeModification modification = dataStore.getDataTree().takeSnapshot().newModification();
+ final DataTreeModification modification = dataStore.newModification();
final ContainerNode writeData = ImmutableNodes.containerNode(TestModel.TEST_QNAME);
new WriteModification(TestModel.TEST_PATH, writeData).apply(modification);
final ShardDataTree dataStore = shard.underlyingActor().getDataStore();
- final DataTreeModification modification = dataStore.getDataTree().takeSnapshot().newModification();
+ final DataTreeModification modification = dataStore.newModification();
final ContainerNode writeData = ImmutableNodes.containerNode(TestModel.TEST_QNAME);
new WriteModification(TestModel.TEST_PATH, writeData).apply(modification);
// Ready the third Tx.
final String transactionID3 = "tx3";
- final DataTreeModification modification3 = dataStore.getDataTree().takeSnapshot().newModification();
+ final DataTreeModification modification3 = dataStore.newModification();
new WriteModification(TestModel.TEST2_PATH, ImmutableNodes.containerNode(TestModel.TEST2_QNAME))
.apply(modification3);
modification3.ready();
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateTip;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
static void writeNode(YangInstanceIdentifier path, NormalizedNode<?, ?> node, ShardDataTree shardDataTree)
throws DataValidationFailedException {
- DataTreeModification modification = shardDataTree.getDataTree().takeSnapshot().newModification();
+ DataTreeModification modification = shardDataTree.newModification();
modification.merge(path, node);
commit(shardDataTree, modification);
}
static void deleteNode(YangInstanceIdentifier path, ShardDataTree shardDataTree)
throws DataValidationFailedException {
- DataTreeModification modification = shardDataTree.getDataTree().takeSnapshot().newModification();
+ DataTreeModification modification = shardDataTree.newModification();
modification.delete(path);
commit(shardDataTree, modification);
}
static void commit(ShardDataTree shardDataTree, DataTreeModification modification)
throws DataValidationFailedException {
- modification.ready();
-
- shardDataTree.getDataTree().validate(modification);
- DataTreeCandidateTip candidate = shardDataTree.getDataTree().prepare(modification);
- shardDataTree.getDataTree().commit(candidate);
- shardDataTree.notifyListeners(candidate);
+ shardDataTree.notifyListeners(shardDataTree.commit(modification));
}
static EntityOwnershipChange ownershipChange(final Entity expEntity, final boolean expWasOwner,