From e37c603e7d8b4d54a5d55463a1c69ec170898faf Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 2 Dec 2014 15:57:27 +0100 Subject: [PATCH] BUG-2459: reuse EXI Transmogrifier EXI Transmogrifier performs an internal reset whenever we acquire the SAXTransmogrifier. This means that we are free to reuse the instance between individual invocations as long as we can guarantee there are no concurrent access. That is guaranteed by our Handler not being Shared. Change-Id: Iba141915000b016579b273d4413ecd205f8da777 Signed-off-by: Robert Varga --- .../client/NetconfClientSessionTest.java | 2 +- .../nettyutil/AbstractNetconfSession.java | 10 ++++++- .../handler/NetconfMessageToEXIEncoder.java | 28 +++++++++++++++---- .../handler/NetconfEXIHandlersTest.java | 3 +- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/opendaylight/netconf/netconf-client/src/test/java/org/opendaylight/controller/netconf/client/NetconfClientSessionTest.java b/opendaylight/netconf/netconf-client/src/test/java/org/opendaylight/controller/netconf/client/NetconfClientSessionTest.java index e11be554d0..103585cf7e 100644 --- a/opendaylight/netconf/netconf-client/src/test/java/org/opendaylight/controller/netconf/client/NetconfClientSessionTest.java +++ b/opendaylight/netconf/netconf-client/src/test/java/org/opendaylight/controller/netconf/client/NetconfClientSessionTest.java @@ -54,7 +54,7 @@ public class NetconfClientSessionTest { Mockito.doReturn("").when(channelHandler).toString(); NetconfClientSession session = new NetconfClientSession(sessionListener, channel, sessId, caps); - final NetconfMessageToEXIEncoder exiEncoder = new NetconfMessageToEXIEncoder(codec); + final NetconfMessageToEXIEncoder exiEncoder = NetconfMessageToEXIEncoder.create(codec); final NetconfEXIToMessageDecoder exiDecoder = new NetconfEXIToMessageDecoder(codec); session.addExiHandlers(exiDecoder, exiEncoder); session.stopExiCommunication(); diff --git a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/AbstractNetconfSession.java b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/AbstractNetconfSession.java index 8eb792b6cd..13b72bc62c 100644 --- a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/AbstractNetconfSession.java +++ b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/AbstractNetconfSession.java @@ -25,6 +25,7 @@ import org.opendaylight.controller.netconf.nettyutil.handler.exi.EXIParameters; import org.opendaylight.controller.netconf.util.xml.XmlElement; import org.opendaylight.protocol.framework.AbstractProtocolSession; import org.openexi.proc.common.EXIOptionsException; +import org.openexi.sax.TransmogrifierException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -123,7 +124,14 @@ public abstract class AbstractNetconfSession { private static final Logger LOG = LoggerFactory.getLogger(NetconfMessageToEXIEncoder.class); - private final NetconfEXICodec codec; + /** + * This class is not marked as shared, so it can be attached to only a single channel, + * which means that {@link #encode(ChannelHandlerContext, NetconfMessage, ByteBuf)} + * cannot be invoked concurrently. Hence we can reuse the transmogrifier. + */ + private final Transmogrifier transmogrifier; - public NetconfMessageToEXIEncoder(final NetconfEXICodec codec) { - this.codec = Preconditions.checkNotNull(codec); + private NetconfMessageToEXIEncoder(final Transmogrifier transmogrifier) { + this.transmogrifier = Preconditions.checkNotNull(transmogrifier); + } + + public static NetconfMessageToEXIEncoder create(final NetconfEXICodec codec) throws EXIOptionsException, TransmogrifierException { + return new NetconfMessageToEXIEncoder(codec.getTransmogrifier()); } @Override @@ -37,10 +48,15 @@ public final class NetconfMessageToEXIEncoder extends MessageToByteEncoder