From 354897d76dbaa234b92d61591b5bbeaac220c3b9 Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Wed, 27 May 2015 17:10:56 +0200 Subject: [PATCH] Get rid of netconf session preferences after connect 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 (cherry picked from commit ed824b6afc20ad44f0fc0f955747e715d1fc90a0) --- .../netconf/sal/NetconfDeviceDataBroker.java | 27 ++++++++++++------- .../sal/NetconfDeviceTopologyAdapter.java | 3 ++- .../netconf/sal/tx/AbstractWriteTx.java | 10 +++---- .../sal/tx/WriteCandidateRunningTx.java | 5 ++-- .../netconf/sal/tx/WriteCandidateTx.java | 9 +++---- .../netconf/sal/tx/WriteRunningTx.java | 10 +++---- .../sal/tx/NetconfDeviceWriteOnlyTxTest.java | 6 ++--- 7 files changed, 35 insertions(+), 35 deletions(-) diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceDataBroker.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceDataBroker.java index 8b7ea6caa8..bc6adc6a1f 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceDataBroker.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceDataBroker.java @@ -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); } } diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java index 055beda184..7822ab725f 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java @@ -68,7 +68,8 @@ final class NetconfDeviceTopologyAdapter implements AutoCloseable { public static final Function AVAILABLE_CAPABILITY_TRANSFORMER = new Function() { @Override public String apply(QName qName) { - return qName.toString(); + // intern string representation of a capability to avoid duplicates + return qName.toString().intern(); } }; diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/AbstractWriteTx.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/AbstractWriteTx.java index ccdde08ddc..f896559c1c 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/AbstractWriteTx.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/AbstractWriteTx.java @@ -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(); } diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteCandidateRunningTx.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteCandidateRunningTx.java index b7b213df70..fbd99c5128 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteCandidateRunningTx.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteCandidateRunningTx.java @@ -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 diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteCandidateTx.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteCandidateTx.java index 5deb9e729c..bba3453aa9 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteCandidateTx.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteCandidateTx.java @@ -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 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); } }); } diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteRunningTx.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteRunningTx.java index 080aa60db2..ffc2b0c65c 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteRunningTx.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/WriteRunningTx.java @@ -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 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); } }); } diff --git a/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/NetconfDeviceWriteOnlyTxTest.java b/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/NetconfDeviceWriteOnlyTxTest.java index 7ac616cdb7..6ccd169572 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/NetconfDeviceWriteOnlyTxTest.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/NetconfDeviceWriteOnlyTxTest.java @@ -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.emptySet()), new Long(60000)); + false, 60000L); final CheckedFuture 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.emptySet()), new Long(60000)); + false, 60000L); try { tx.delete(LogicalDatastoreType.CONFIGURATION, yangIId); } catch (final Exception e) { -- 2.36.6