From 63bf2c78aab8a4a48201877a5b5de255ff3cdf75 Mon Sep 17 00:00:00 2001 From: Tomas Cere Date: Thu, 7 May 2015 13:39:51 +0200 Subject: [PATCH] Fix racecondition in AsyncSshHandlerWriter Fixed racecondition between releasing of netty ByteBuff and removing the msg from pendingWrites. Change-Id: I40eff55d9c7858534d105a242d3ec6feb9d950d0 Signed-off-by: Tomas Cere --- .../ssh/client/AsyncSshHandlerWriter.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/client/AsyncSshHandlerWriter.java b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/client/AsyncSshHandlerWriter.java index 757dc1a2ba..10941021bc 100644 --- a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/client/AsyncSshHandlerWriter.java +++ b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/client/AsyncSshHandlerWriter.java @@ -68,7 +68,7 @@ public final class AsyncSshHandlerWriter implements AutoCloseable { //sending message with pending //if resending message not succesfull, then attribute wasPending is true - private void writeWithPendingDetection(final ChannelHandlerContext ctx, final ChannelPromise promise, final ByteBuf byteBufMsg, boolean wasPending) { + private void writeWithPendingDetection(final ChannelHandlerContext ctx, final ChannelPromise promise, final ByteBuf byteBufMsg, final boolean wasPending) { try { if (LOG.isTraceEnabled()) { @@ -80,7 +80,7 @@ public final class AsyncSshHandlerWriter implements AutoCloseable { public void operationComplete(final IoWriteFuture future) { if (LOG.isTraceEnabled()) { LOG.trace("Ssh write request finished on channel: {} with result: {}: and ex:{}, message: {}", - ctx.channel(), future.isWritten(), future.getException(), byteBufToString(byteBufMsg)); + ctx.channel(), future.isWritten(), future.getException(), byteBufToString(byteBufMsg)); } // Notify success or failure @@ -94,6 +94,14 @@ public final class AsyncSshHandlerWriter implements AutoCloseable { // Not needed anymore, release byteBufMsg.release(); + synchronized (AsyncSshHandlerWriter.this) { + //rescheduling message from queue after successfully sent + if (wasPending) { + byteBufMsg.resetReaderIndex(); + pending.remove(); + } + } + // Check pending queue and schedule next // At this time we are guaranteed that we are not in pending state anymore so the next request should succeed writePendingIfAny(); @@ -101,12 +109,6 @@ public final class AsyncSshHandlerWriter implements AutoCloseable { } }); - //rescheduling message from queue after successfully sent - if(wasPending){ - byteBufMsg.resetReaderIndex(); - pending.remove(); - } - } catch (final WritePendingException e) { if(wasPending == false){ -- 2.36.6