From 81387f0ae5898b196a54493f9bf4305993f39d1c Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sat, 15 Feb 2014 18:24:21 +0100 Subject: [PATCH] Improve NETCONF encoding performance This changes the protocol encoder such that it is piped directly into the output buffer rather than constructing intermediate buffers and strings. Change-Id: I4938b2fd72b2321d21617c4e9c8a4d491778b657 Signed-off-by: Robert Varga --- .../NetconfHelloMessageToXMLEncoder.java | 22 +++++------ .../handler/NetconfMessageToXMLEncoder.java | 37 +++++++++++-------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfHelloMessageToXMLEncoder.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfHelloMessageToXMLEncoder.java index a87d175d78..65d5b27025 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfHelloMessageToXMLEncoder.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfHelloMessageToXMLEncoder.java @@ -7,12 +7,18 @@ */ package org.opendaylight.controller.netconf.util.handler; -import java.nio.ByteBuffer; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; + +import java.io.IOException; + +import javax.xml.transform.TransformerException; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessage; import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessageAdditionalHeader; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Charsets; import com.google.common.base.Optional; import com.google.common.base.Preconditions; @@ -39,9 +45,9 @@ import com.google.common.base.Preconditions; * */ public final class NetconfHelloMessageToXMLEncoder extends NetconfMessageToXMLEncoder { - @Override - protected ByteBuffer encodeMessage(NetconfMessage msg) { + @VisibleForTesting + public void encode(ChannelHandlerContext ctx, NetconfMessage msg, ByteBuf out) throws IOException, TransformerException { Preconditions.checkState(msg instanceof NetconfHelloMessage, "Netconf message of type %s expected, was %s", NetconfHelloMessage.class, msg.getClass()); Optional headerOptional = ((NetconfHelloMessage) msg) @@ -50,15 +56,9 @@ public final class NetconfHelloMessageToXMLEncoder extends NetconfMessageToXMLEn // If additional header present, serialize it along with netconf hello // message if (headerOptional.isPresent()) { - byte[] bytesFromHeader = headerOptional.get().toFormattedString().getBytes(Charsets.UTF_8); - byte[] bytesFromMessage = xmlToString(msg.getDocument()).getBytes(Charsets.UTF_8); - - ByteBuffer byteBuffer = ByteBuffer.allocate(bytesFromHeader.length + bytesFromMessage.length) - .put(bytesFromHeader).put(bytesFromMessage); - byteBuffer.flip(); - return byteBuffer; + out.writeBytes(headerOptional.get().toFormattedString().getBytes(Charsets.UTF_8)); } - return super.encodeMessage(msg); + super.encode(ctx, msg, out); } } diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfMessageToXMLEncoder.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfMessageToXMLEncoder.java index df0f7ef46a..f9792a6c5b 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfMessageToXMLEncoder.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfMessageToXMLEncoder.java @@ -8,24 +8,32 @@ package org.opendaylight.controller.netconf.util.handler; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufOutputStream; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; -import java.nio.ByteBuffer; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; + +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import org.opendaylight.controller.netconf.api.NetconfMessage; -import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Comment; -import org.w3c.dom.Document; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Charsets; import com.google.common.base.Optional; public class NetconfMessageToXMLEncoder extends MessageToByteEncoder { private static final Logger LOG = LoggerFactory.getLogger(NetconfMessageToXMLEncoder.class); + private static final TransformerFactory FACTORY = TransformerFactory.newInstance(); private final Optional clientId; @@ -39,7 +47,7 @@ public class NetconfMessageToXMLEncoder extends MessageToByteEncoder