import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyCollection;
-import static org.mockito.Matchers.anyMap;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyCollection;
+import static org.mockito.ArgumentMatchers.anyMap;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
-import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.ListenableFuture;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import org.mockito.Captor;
import org.mockito.MockitoAnnotations;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
import org.opendaylight.mdsal.dom.api.DOMDataTreeCursorAwareTransaction;
import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
import org.opendaylight.mdsal.dom.api.DOMDataTreeListener;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-public class ShardedDOMDataTreeTest {
-
- private static final Logger LOG = LoggerFactory.getLogger(ShardedDOMDataTreeProducerMultiShardTest.class);
-
- private static SchemaContext schemaContext = null;
-
- static {
- try {
- schemaContext = TestModel.createTestContext();
- } catch (final ReactorException e) {
- LOG.error("Unable to create schema context for TestModel", e);
- }
- }
+public class ShardedDOMDataTreeTest extends AbstractDatastoreTest {
private static final DOMDataTreeIdentifier ROOT_ID =
- new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.EMPTY);
+ new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.empty());
private static final DOMDataTreeIdentifier TEST_ID =
new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, TestModel.TEST_PATH);
new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, TestModel.INNER_CONTAINER_PATH);
private static final YangInstanceIdentifier OUTER_LIST_YID = TestModel.OUTER_LIST_PATH.node(
- new NodeIdentifierWithPredicates(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, 1));
+ NodeIdentifierWithPredicates.of(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, 1));
private static final DOMDataTreeIdentifier OUTER_LIST_ID =
new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, OUTER_LIST_YID);
MockitoAnnotations.initMocks(this);
rootShard = InMemoryDOMDataTreeShard.create(ROOT_ID, executor, 1);
- rootShard.onGlobalContextUpdated(schemaContext);
+ rootShard.onModelContextUpdated(SCHEMA_CONTEXT);
final ShardedDOMDataTree dataTree = new ShardedDOMDataTree();
final DOMDataTreeProducer shardRegProducer = dataTree.createProducer(Collections.singletonList(ROOT_ID));
dataTreeService.createProducer(Collections.singletonList(TEST_ID));
}
+ @Test(expected = IllegalArgumentException.class)
+ public void testProducerPathContentionReverse() throws Exception {
+ dataTreeService.createProducer(Collections.singletonList(TEST_ID));
+ dataTreeService.createProducer(Collections.singletonList(ROOT_ID));
+ }
+
@Test
public void testShardRegistrationClose() throws Exception {
rootShardReg.close();
final InMemoryDOMDataTreeShard newRootShard = InMemoryDOMDataTreeShard.create(ROOT_ID, executor, 1);
- newRootShard.onGlobalContextUpdated(schemaContext);
+ newRootShard.onModelContextUpdated(SCHEMA_CONTEXT);
final DOMDataTreeProducer shardRegProducer = dataTreeService.createProducer(Collections.singletonList(ROOT_ID));
final ListenerRegistration<InMemoryDOMDataTreeShard> newRootShardReg =
- dataTreeService.registerDataTreeShard(ROOT_ID, rootShard, shardRegProducer);
+ dataTreeService.registerDataTreeShard(ROOT_ID, newRootShard, shardRegProducer);
shardRegProducer.close();
final InMemoryDOMDataTreeShard innerShard = InMemoryDOMDataTreeShard.create(INNER_CONTAINER_ID, executor, 1);
- innerShard.onGlobalContextUpdated(schemaContext);
+ innerShard.onModelContextUpdated(SCHEMA_CONTEXT);
final DOMDataTreeProducer shardRegProducer2 =
dataTreeService.createProducer(Collections.singletonList(INNER_CONTAINER_ID));
ListenerRegistration<InMemoryDOMDataTreeShard> innerShardReg =
cursor.write(TEST_ID.getRootIdentifier().getLastPathArgument(), crossShardContainer);
try {
- tx.submit().checkedGet();
+ tx.commit().get();
fail("There's still an open cursor");
} catch (final IllegalStateException e) {
assertTrue(e.getMessage().contains("cursor open"));
}
cursor.close();
- tx.submit().checkedGet();
+ tx.commit().get();
tx = producer.createTransaction(false);
cursor = tx.createCursor(TEST_ID);
cursor.delete(TestModel.INNER_CONTAINER_PATH.getLastPathArgument());
cursor.close();
- tx.submit().checkedGet();
+ tx.commit().get();
verify(mockedDataTreeListener, timeout(1000).times(3)).onDataTreeChanged(captorForChanges.capture(),
captorForSubtrees.capture());
doNothing().when(mockedDataTreeListener).onDataTreeChanged(anyCollection(), anyMap());
InMemoryDOMDataTreeShard testShard = InMemoryDOMDataTreeShard.create(TEST_ID, executor, 1);
- testShard.onGlobalContextUpdated(schemaContext);
+ testShard.onModelContextUpdated(SCHEMA_CONTEXT);
final DOMDataTreeProducer regProducer = dataTreeService.createProducer(Collections.singleton(TEST_ID));
dataTreeService.registerDataTreeShard(TEST_ID, testShard, regProducer);
cursor.write(TEST_ID.getRootIdentifier().getLastPathArgument(), crossShardContainer);
cursor.close();
- tx.submit().checkedGet();
+ tx.commit().get();
tx = producer.createTransaction(false);
cursor = tx.createCursor(TEST_ID);
cursor.delete(TestModel.INNER_CONTAINER_PATH.getLastPathArgument());
cursor.close();
- tx.submit().checkedGet();
+ tx.commit().get();
verify(mockedDataTreeListener, timeout(5000).times(3)).onDataTreeChanged(captorForChanges.capture(),
captorForSubtrees.capture());
@Test
public void testMultipleWritesIntoSingleMapEntry() throws Exception {
- final YangInstanceIdentifier oid1 = TestModel.OUTER_LIST_PATH.node(new NodeIdentifierWithPredicates(
+ final YangInstanceIdentifier oid1 = TestModel.OUTER_LIST_PATH.node(NodeIdentifierWithPredicates.of(
TestModel.OUTER_LIST_QNAME, QName.create(TestModel.OUTER_LIST_QNAME, "id"), 0));
final DOMDataTreeIdentifier outerListPath = new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, oid1);
final DOMDataTreeProducer shardProducer = dataTreeService.createProducer(
Collections.singletonList(outerListPath));
final InMemoryDOMDataTreeShard outerListShard = InMemoryDOMDataTreeShard.create(outerListPath, executor, 1000);
- outerListShard.onGlobalContextUpdated(schemaContext);
+ outerListShard.onModelContextUpdated(SCHEMA_CONTEXT);
final ListenerRegistration<InMemoryDOMDataTreeShard> oid1ShardRegistration =
dataTreeService.registerDataTreeShard(outerListPath, outerListShard, shardProducer);
cursor.write(new NodeIdentifier(TestModel.INNER_LIST_QNAME), innerList);
cursor.close();
- tx.submit().checkedGet();
+ tx.commit().get();
- final ArrayList<CheckedFuture<Void, TransactionCommitFailedException>> futures = new ArrayList<>();
+ final ArrayList<ListenableFuture<?>> futures = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
final Collection<MapEntryNode> innerListMapEntries = createInnerListMapEntries(1000, "run-" + i);
for (final MapEntryNode innerListMapEntry : innerListMapEntries) {
oid1.node(new NodeIdentifier(TestModel.INNER_LIST_QNAME))));
cursor1.write(innerListMapEntry.getIdentifier(), innerListMapEntry);
cursor1.close();
- futures.add(tx1.submit());
+ futures.add(tx1.commit());
}
}
- futures.get(futures.size() - 1).checkedGet();
+ futures.get(futures.size() - 1).get();
}
final Collection<MapEntryNode> ret = new ArrayList<>();
for (int i = 0; i < amount; i++) {
ret.add(ImmutableNodes.mapEntryBuilder()
- .withNodeIdentifier(new NodeIdentifierWithPredicates(TestModel.INNER_LIST_QNAME,
+ .withNodeIdentifier(NodeIdentifierWithPredicates.of(TestModel.INNER_LIST_QNAME,
QName.create(TestModel.OUTER_LIST_QNAME, "name"), Integer.toString(i)))
.withChild(ImmutableNodes
.leafNode(QName.create(TestModel.INNER_LIST_QNAME, "name"), Integer.toString(i)))
public void testLargerSubshardSpace() throws Exception {
final InMemoryDOMDataTreeShard outerListShard = InMemoryDOMDataTreeShard.create(OUTER_LIST_ID, executor, 1, 1);
- outerListShard.onGlobalContextUpdated(schemaContext);
+ outerListShard.onModelContextUpdated(SCHEMA_CONTEXT);
- try (final DOMDataTreeProducer producer =
+ try (DOMDataTreeProducer producer =
dataTreeService.createProducer(Collections.singletonList(OUTER_LIST_ID))) {
dataTreeService.registerDataTreeShard(OUTER_LIST_ID, outerListShard, producer);
}
cursor.write(TestModel.TEST_PATH.getLastPathArgument(), createCrossShardContainer2());
cursor.close();
- tx.submit().checkedGet();
+ tx.commit().get();
final DOMDataTreeListener listener = mock(DOMDataTreeListener.class);
doNothing().when(listener).onDataTreeChanged(any(), any());
dataTreeService.registerListener(listener,
Collections.singletonList(
- new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.EMPTY)),
+ new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.empty())),
false, Collections.emptyList());
verify(listener, times(2)).onDataTreeChanged(any(), any());