Use free-standing transaction in SubscribeToStreamUtil 44/96844/3
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 8 Jul 2021 19:13:49 +0000 (21:13 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 8 Jul 2021 20:25:56 +0000 (22:25 +0200)
There is no point in juggling transaction chains here, just use
a simple free-standing transaction. Also note we do not need a
read-write transaction, so allocate a write-only transaction, which
is generally cheaper.

JIRA: NETCONF-773
Change-Id: Ib9995f664a27a2d29e91c18032d2a02cca6d768d
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/SubscribeToStreamUtil.java
restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/TestUtils.java
restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfStreamsSubscriptionServiceImplTest.java

index 04e91f2af81393ad18a3869b75d9f8b73b2e2688..a9b729f9db734a29039a8d88f9620e983623a425 100644 (file)
@@ -20,11 +20,10 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteOperations;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMNotificationListener;
 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag;
 import org.opendaylight.restconf.common.errors.RestconfError.ErrorType;
@@ -134,10 +133,7 @@ abstract class SubscribeToStreamUtil {
                 String.format("Stream with name %s was not found.", streamName),
                 ErrorType.PROTOCOL, ErrorTag.UNKNOWN_ELEMENT));
 
-        final DOMTransactionChain transactionChain = handlersHolder.getTransactionChainHandler().get();
-        final DOMDataTreeReadWriteTransaction writeTransaction = transactionChain.newReadWriteTransaction();
         final EffectiveModelContext schemaContext = handlersHolder.getSchemaHandler().get();
-
         final URI uri = prepareUriByStreamName(uriInfo, streamName);
         registerToListenNotification(notificationListenerAdapter, handlersHolder.getNotificationServiceHandler());
         notificationListenerAdapter.setQueryParams(
@@ -151,9 +147,10 @@ abstract class SubscribeToStreamUtil {
                     notificationListenerAdapter.getSchemaPath().lastNodeIdentifier(),
                     schemaContext.getNotifications(), notificationQueryParams.getStart(),
                     notificationListenerAdapter.getOutputType(), uri);
+
+        final DOMDataTreeWriteTransaction writeTransaction = handlersHolder.getDataBroker().newWriteOnlyTransaction();
         writeDataToDS(writeTransaction, mapToStreams);
         submitData(writeTransaction);
-        transactionChain.close();
         return uri;
     }
 
@@ -199,20 +196,19 @@ abstract class SubscribeToStreamUtil {
         listener.setCloseVars(handlersHolder.getTransactionChainHandler(), handlersHolder.getSchemaHandler());
 
         final LogicalDatastoreType datastoreType = LogicalDatastoreType.valueOf(datastoreParam);
-        registration(datastoreType, listener, handlersHolder.getDataBroker());
+        final DOMDataBroker dataBroker = handlersHolder.getDataBroker();
+        registration(datastoreType, listener, dataBroker);
 
         final URI uri = prepareUriByStreamName(uriInfo, streamName);
-        final DOMTransactionChain transactionChain = handlersHolder.getTransactionChainHandler().get();
-        final DOMDataTreeReadWriteTransaction writeTransaction = transactionChain.newReadWriteTransaction();
         final EffectiveModelContext schemaContext = handlersHolder.getSchemaHandler().get();
         final String serializedPath = IdentifierCodec.serialize(listener.getPath(), schemaContext);
 
         final MapEntryNode mapToStreams =
             RestconfMappingNodeUtil.mapDataChangeNotificationStreamByIetfRestconfMonitoring(listener.getPath(),
                 notificationQueryParams.getStart(), listener.getOutputType(), uri, schemaContext, serializedPath);
+        final DOMDataTreeWriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
         writeDataToDS(writeTransaction, mapToStreams);
         submitData(writeTransaction);
-        transactionChain.close();
         return uri;
     }
 
@@ -223,7 +219,7 @@ abstract class SubscribeToStreamUtil {
             mapToStreams);
     }
 
-    private static void submitData(final DOMDataTreeReadWriteTransaction readWriteTransaction) {
+    private static void submitData(final DOMDataTreeWriteTransaction readWriteTransaction) {
         try {
             readWriteTransaction.commit().get();
         } catch (final InterruptedException | ExecutionException e) {
index 2a0030ea1b8fee4bc62dea37f62a8c16bc37ecd0..6b33acabc570c3bee76ed1a9623a593865e872a8 100644 (file)
@@ -37,7 +37,6 @@ import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
-import org.mockito.Mockito;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
@@ -277,7 +276,7 @@ public final class TestUtils {
 
         doReturn(mockChain).when(mockDataBroker).createTransactionChain(any());
         SchemaContextHandler schemaContextHandler = new SchemaContextHandler(
-                new TransactionChainHandler(mockDataBroker), Mockito.mock(DOMSchemaService.class));
+                new TransactionChainHandler(mockDataBroker), mock(DOMSchemaService.class));
         schemaContextHandler.onModelContextUpdated(schemaContext);
         return schemaContextHandler;
     }
index 8a9575071adf596b84637a8d13ed688a59392a2f..7a3e4f0853ad4a85ef6e2cb170180b55e602d937 100644 (file)
@@ -11,7 +11,6 @@ import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableClassToInstanceMap;
 import java.io.FileNotFoundException;
@@ -19,12 +18,8 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.MultivaluedHashMap;
 import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriInfo;
 import org.junit.AfterClass;
@@ -33,12 +28,10 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
@@ -78,15 +71,12 @@ public class RestconfStreamsSubscriptionServiceImplTest {
     private TransactionChainHandler transactionHandler;
     private SchemaContextHandler schemaHandler;
 
-    @SuppressWarnings("unchecked")
     @Before
     public void setUp() throws FileNotFoundException, URISyntaxException {
         final DOMTransactionChain domTx = mock(DOMTransactionChain.class);
         final DOMDataTreeWriteTransaction wTx = mock(DOMDataTreeWriteTransaction.class);
-        when(domTx.newWriteOnlyTransaction()).thenReturn(wTx);
-        final DOMDataTreeReadWriteTransaction rwTx = mock(DOMDataTreeReadWriteTransaction.class);
-        doReturn(CommitInfo.emptyFluentFuture()).when(rwTx).commit();
-        when(domTx.newReadWriteTransaction()).thenReturn(rwTx);
+        doReturn(wTx).when(domTx).newWriteOnlyTransaction();
+        doReturn(wTx).when(dataBroker).newWriteOnlyTransaction();
         doReturn(CommitInfo.emptyFluentFuture()).when(wTx).commit();
 
         doReturn(domTx).when(dataBroker).createTransactionChain(any());
@@ -101,16 +91,11 @@ public class RestconfStreamsSubscriptionServiceImplTest {
         doReturn(ImmutableClassToInstanceMap.of(DOMDataTreeChangeService.class, dataTreeChangeService))
                 .when(dataBroker).getExtensions();
 
-        final MultivaluedMap<String, String> map = mock(MultivaluedMap.class);
-        final Set<Entry<String, List<String>>> set = new HashSet<>();
-        when(map.entrySet()).thenReturn(set);
-        when(this.uriInfo.getQueryParameters()).thenReturn(map);
-        final UriBuilder baseUriBuilder = new LocalUriInfo().getBaseUriBuilder();
-        when(uriInfo.getBaseUriBuilder()).thenReturn(baseUriBuilder);
-        final URI uri = new URI("http://127.0.0.1/" + URI);
-        when(uriInfo.getAbsolutePath()).thenReturn(uri);
-        this.schemaHandler.onModelContextUpdated(
-                YangParserTestUtils.parseYangFiles(TestRestconfUtils.loadFiles("/notifications")));
+        doReturn(new MultivaluedHashMap<>()).when(uriInfo).getQueryParameters();
+        doReturn(new LocalUriInfo().getBaseUriBuilder()).when(uriInfo).getBaseUriBuilder();
+        doReturn(new URI("http://127.0.0.1/" + URI)).when(uriInfo).getAbsolutePath();
+        schemaHandler.onModelContextUpdated(
+            YangParserTestUtils.parseYangFiles(TestRestconfUtils.loadFiles("/notifications")));
         configurationWs = new Configuration(0, 100, 10, false);
         configurationSse = new Configuration(0, 100, 10, true);
     }
@@ -131,8 +116,8 @@ public class RestconfStreamsSubscriptionServiceImplTest {
         final Map<String, ListenerAdapter> listenersByStreamNameSetter = new HashMap<>();
         final ListenerAdapter adapter = mock(ListenerAdapter.class);
         final YangInstanceIdentifier yiid = mock(YangInstanceIdentifier.class);
-        Mockito.when(adapter.getPath()).thenReturn(yiid);
-        Mockito.when(adapter.getOutputType()).thenReturn("JSON");
+        doReturn(yiid).when(adapter).getPath();
+        doReturn("JSON").when(adapter).getOutputType();
         listenersByStreamNameSetter.put(
                 "data-change-event-subscription/toaster:toaster/toasterStatus/datastore=OPERATIONAL/scope=ONE",
                 adapter);