Get rid of netconf session preferences after connect 95/21295/2
authorMaros Marsalek <mmarsale@cisco.com>
Wed, 27 May 2015 15:10:56 +0000 (17:10 +0200)
committerGerrit Code Review <gerrit@opendaylight.org>
Thu, 28 May 2015 15:51:01 +0000 (15:51 +0000)
Memory usage improvement for sal-netconf-connector: The preferences object was
kept inside the data broker during the entire lifetime of a netconf connector.
This is not necessary as it only needs 3 boolean values from it.

+ intern String representation of capabilities written into datastore.

Change-Id: I46363a3dc079350ccb1db4840b31fdd5342798d3
Signed-off-by: Maros Marsalek <mmarsale@cisco.com>
opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceDataBroker.java
opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java
opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/AbstractWriteTx.java
opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteCandidateRunningTx.java
opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteCandidateTx.java
opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteRunningTx.java
opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/NetconfDeviceWriteOnlyTxTest.java

index 8b7ea6caa8cb6370a8830c3da12643a3c38269b3..bc6adc6a1f8301188f9d6a16b4038e2da6b504b3 100644 (file)
@@ -35,14 +35,21 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 final class NetconfDeviceDataBroker implements DOMDataBroker {
     private final RemoteDeviceId id;
     private final NetconfBaseOps netconfOps;
-    private final NetconfSessionPreferences netconfSessionPreferences;
-    private final long defaultRequestTimeoutMillis;
+    private final long requestTimeoutMillis;
 
-    public NetconfDeviceDataBroker(final RemoteDeviceId id, final SchemaContext schemaContext, final DOMRpcService rpc, final NetconfSessionPreferences netconfSessionPreferences, long defaultRequestTimeoutMillis) {
+    private final boolean rollbackSupport;
+    private boolean candidateSupported;
+    private boolean runningWritable;
+
+    public NetconfDeviceDataBroker(final RemoteDeviceId id, final SchemaContext schemaContext, final DOMRpcService rpc, final NetconfSessionPreferences netconfSessionPreferences, long requestTimeoutMillis) {
         this.id = id;
         this.netconfOps = new NetconfBaseOps(rpc, schemaContext);
-        this.netconfSessionPreferences = netconfSessionPreferences;
-        this.defaultRequestTimeoutMillis = defaultRequestTimeoutMillis;
+        this.requestTimeoutMillis = requestTimeoutMillis;
+        // get specific attributes from netconf preferences and get rid of it
+        // no need to keep the entire preferences object, its quite big with all the capability QNames
+        candidateSupported = netconfSessionPreferences.isCandidateSupported();
+        runningWritable = netconfSessionPreferences.isRunningWritable();
+        rollbackSupport = netconfSessionPreferences.isRollbackSupported();
     }
 
     @Override
@@ -57,14 +64,14 @@ final class NetconfDeviceDataBroker implements DOMDataBroker {
 
     @Override
     public DOMDataWriteTransaction newWriteOnlyTransaction() {
-        if(netconfSessionPreferences.isCandidateSupported()) {
-            if(netconfSessionPreferences.isRunningWritable()) {
-                return new WriteCandidateRunningTx(id, netconfOps, netconfSessionPreferences, defaultRequestTimeoutMillis);
+        if(candidateSupported) {
+            if(runningWritable) {
+                return new WriteCandidateRunningTx(id, netconfOps, rollbackSupport, requestTimeoutMillis);
             } else {
-                return new WriteCandidateTx(id, netconfOps, netconfSessionPreferences, defaultRequestTimeoutMillis);
+                return new WriteCandidateTx(id, netconfOps, rollbackSupport, requestTimeoutMillis);
             }
         } else {
-            return new WriteRunningTx(id, netconfOps, netconfSessionPreferences, defaultRequestTimeoutMillis);
+            return new WriteRunningTx(id, netconfOps, rollbackSupport, requestTimeoutMillis);
         }
     }
 
index 055beda18493fca129c92e5f256ce9ca344e8e92..7822ab725f6b0eddd596887af580536c462130bb 100644 (file)
@@ -68,7 +68,8 @@ final class NetconfDeviceTopologyAdapter implements AutoCloseable {
     public static final Function<QName, String> AVAILABLE_CAPABILITY_TRANSFORMER = new Function<QName, String>() {
         @Override
         public String apply(QName qName) {
-            return qName.toString();
+            // intern string representation of a capability to avoid duplicates
+            return qName.toString().intern();
         }
     };
 
index ccdde08ddc0efb8b151c0fc598bd87b560eb9dbf..f896559c1c8bc33ef46158c84c4ed8512bedb783 100644 (file)
@@ -12,7 +12,6 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult;
 import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
-import org.opendaylight.controller.sal.connect.netconf.listener.NetconfSessionPreferences;
 import org.opendaylight.controller.sal.connect.netconf.util.NetconfBaseOps;
 import org.opendaylight.controller.sal.connect.util.RemoteDeviceId;
 import org.opendaylight.yangtools.yang.common.RpcResult;
@@ -24,18 +23,17 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 public abstract class AbstractWriteTx implements DOMDataWriteTransaction {
 
     private final long defaultRequestTimeoutMillis;
-
     protected final RemoteDeviceId id;
     protected final NetconfBaseOps netOps;
-    protected final NetconfSessionPreferences netconfSessionPreferences;
+    protected final boolean rollbackSupport;
     // Allow commit to be called only once
     protected boolean finished = false;
 
-    public AbstractWriteTx(final NetconfBaseOps netOps, final RemoteDeviceId id, final NetconfSessionPreferences netconfSessionPreferences, long defaultRequestTimeoutMillis) {
+    public AbstractWriteTx(final long requestTimeoutMillis, final NetconfBaseOps netOps, final RemoteDeviceId id, final boolean rollbackSupport) {
+        this.defaultRequestTimeoutMillis = requestTimeoutMillis;
         this.netOps = netOps;
         this.id = id;
-        this.netconfSessionPreferences = netconfSessionPreferences;
-        this.defaultRequestTimeoutMillis = defaultRequestTimeoutMillis;
+        this.rollbackSupport = rollbackSupport;
         init();
     }
 
index b7b213df70148ff07911356801d6ea7a318119b5..fbd99c5128bd00340f2d4ae368f1b7703eeb9fe8 100644 (file)
@@ -12,7 +12,6 @@ import com.google.common.base.Function;
 import com.google.common.util.concurrent.ListenableFuture;
 import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult;
 import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
-import org.opendaylight.controller.sal.connect.netconf.listener.NetconfSessionPreferences;
 import org.opendaylight.controller.sal.connect.netconf.util.NetconfBaseOps;
 import org.opendaylight.controller.sal.connect.netconf.util.NetconfRpcFutureCallback;
 import org.opendaylight.controller.sal.connect.util.RemoteDeviceId;
@@ -30,8 +29,8 @@ public class WriteCandidateRunningTx extends WriteCandidateTx {
 
     private static final Logger LOG  = LoggerFactory.getLogger(WriteCandidateRunningTx.class);
 
-    public WriteCandidateRunningTx(final RemoteDeviceId id, final NetconfBaseOps netOps, final NetconfSessionPreferences netconfSessionPreferences, long defaultRequestTimeoutMillis) {
-        super(id, netOps, netconfSessionPreferences, defaultRequestTimeoutMillis);
+    public WriteCandidateRunningTx(final RemoteDeviceId id, final NetconfBaseOps netOps, final boolean rollbackSupport, long requestTimeoutMillis) {
+        super(id, netOps, rollbackSupport, requestTimeoutMillis);
     }
 
     @Override
index 5deb9e729c7cfdb8754e86b39de4aabac4feb458..bba3453aa93eb80155b58672b3341cd875ebb374 100644 (file)
@@ -17,7 +17,6 @@ import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult;
 import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
-import org.opendaylight.controller.sal.connect.netconf.listener.NetconfSessionPreferences;
 import org.opendaylight.controller.sal.connect.netconf.util.NetconfBaseOps;
 import org.opendaylight.controller.sal.connect.netconf.util.NetconfRpcFutureCallback;
 import org.opendaylight.controller.sal.connect.util.RemoteDeviceId;
@@ -69,8 +68,8 @@ public class WriteCandidateTx extends AbstractWriteTx {
         }
     };
 
-    public WriteCandidateTx(final RemoteDeviceId id, final NetconfBaseOps rpc, final NetconfSessionPreferences netconfSessionPreferences, long defaultRequestTimeoutMillis) {
-        super(rpc, id, netconfSessionPreferences, defaultRequestTimeoutMillis);
+    public WriteCandidateTx(final RemoteDeviceId id, final NetconfBaseOps rpc, final boolean rollbackSupport, long requestTimeoutMillis) {
+        super(requestTimeoutMillis, rpc, id, rollbackSupport);
     }
 
     @Override
@@ -187,9 +186,9 @@ public class WriteCandidateTx extends AbstractWriteTx {
             public ListenableFuture<DOMRpcResult> apply(final NetconfBaseOps input) {
                         return defaultOperation.isPresent()
                                 ? input.editConfigCandidate(new NetconfRpcFutureCallback("Edit candidate", id), editStructure, defaultOperation.get(),
-                                netconfSessionPreferences.isRollbackSupported())
+                                rollbackSupport)
                                 : input.editConfigCandidate(new NetconfRpcFutureCallback("Edit candidate", id), editStructure,
-                                netconfSessionPreferences.isRollbackSupported());
+                                rollbackSupport);
             }
         });
     }
index 080aa60db2c27bfebb2cf8b036e24f1f5b3fa7e1..ffc2b0c65c48e5f05f78404b70d1c16e78f0dddd 100644 (file)
@@ -17,7 +17,6 @@ import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult;
 import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
-import org.opendaylight.controller.sal.connect.netconf.listener.NetconfSessionPreferences;
 import org.opendaylight.controller.sal.connect.netconf.util.NetconfBaseOps;
 import org.opendaylight.controller.sal.connect.netconf.util.NetconfRpcFutureCallback;
 import org.opendaylight.controller.sal.connect.util.RemoteDeviceId;
@@ -50,9 +49,8 @@ public class WriteRunningTx extends AbstractWriteTx {
     private static final Logger LOG  = LoggerFactory.getLogger(WriteRunningTx.class);
 
     public WriteRunningTx(final RemoteDeviceId id, final NetconfBaseOps netOps,
-                          final NetconfSessionPreferences netconfSessionPreferences,
-                          final long defaultRequestTimeoutMillis) {
-        super(netOps, id, netconfSessionPreferences, defaultRequestTimeoutMillis);
+                          final boolean rollbackSupport, long requestTimeoutMillis) {
+        super(requestTimeoutMillis, netOps, id, rollbackSupport);
     }
 
     @Override
@@ -124,9 +122,9 @@ public class WriteRunningTx extends AbstractWriteTx {
             public ListenableFuture<DOMRpcResult> apply(final NetconfBaseOps input) {
                         return defaultOperation.isPresent()
                                 ? input.editConfigRunning(new NetconfRpcFutureCallback("Edit running", id), editStructure, defaultOperation.get(),
-                                netconfSessionPreferences.isRollbackSupported())
+                                rollbackSupport)
                                 : input.editConfigRunning(new NetconfRpcFutureCallback("Edit running", id), editStructure,
-                                netconfSessionPreferences.isRollbackSupported());
+                                rollbackSupport);
             }
         });
     }
index 7ac616cdb76fd02c87ad0b942f73df9eff0330a3..6ccd169572347271b7314215346111dc200cd4b2 100644 (file)
@@ -13,7 +13,6 @@ import static org.opendaylight.controller.sal.connect.netconf.util.NetconfMessag
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.Futures;
 import java.net.InetSocketAddress;
-import java.util.Collections;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.InOrder;
@@ -24,7 +23,6 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFaile
 import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
 import org.opendaylight.controller.md.sal.dom.spi.DefaultDOMRpcResult;
 import org.opendaylight.controller.sal.connect.netconf.NetconfDevice;
-import org.opendaylight.controller.sal.connect.netconf.listener.NetconfSessionPreferences;
 import org.opendaylight.controller.sal.connect.netconf.util.NetconfBaseOps;
 import org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil;
 import org.opendaylight.controller.sal.connect.util.RemoteDeviceId;
@@ -60,7 +58,7 @@ public class NetconfDeviceWriteOnlyTxTest {
     @Test
     public void testDiscardChanges() {
         final WriteCandidateTx tx = new WriteCandidateTx(id, new NetconfBaseOps(rpc, mock(SchemaContext.class)),
-                NetconfSessionPreferences.fromStrings(Collections.<String>emptySet()), new Long(60000));
+                false, 60000L);
         final CheckedFuture<Void, TransactionCommitFailedException> submitFuture = tx.submit();
         try {
             submitFuture.checkedGet();
@@ -84,7 +82,7 @@ public class NetconfDeviceWriteOnlyTxTest {
                 .when(rpc).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class));
 
         final WriteRunningTx tx = new WriteRunningTx(id, new NetconfBaseOps(rpc, NetconfDevice.INIT_SCHEMA_CTX),
-                NetconfSessionPreferences.fromStrings(Collections.<String>emptySet()), new Long(60000));
+                false, 60000L);
         try {
             tx.delete(LogicalDatastoreType.CONFIGURATION, yangIId);
         } catch (final Exception e) {