Fix racecondition in AsyncSshHandlerWriter 94/19794/2
authorTomas Cere <tcere@cisco.com>
Thu, 7 May 2015 11:39:51 +0000 (13:39 +0200)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 12 May 2015 07:43:40 +0000 (07:43 +0000)
Fixed racecondition between releasing of netty ByteBuff and removing the msg from pendingWrites.

Change-Id: I40eff55d9c7858534d105a242d3ec6feb9d950d0
Signed-off-by: Tomas Cere <tcere@cisco.com>
opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/ssh/client/AsyncSshHandlerWriter.java

index 757dc1a2ba334d4169718e751a553d309e6240f6..10941021bceaa1e12433ff5291e7d55741ad822a 100644 (file)
@@ -68,7 +68,7 @@ public final class AsyncSshHandlerWriter implements AutoCloseable {
 
     //sending message with pending
     //if resending message not succesfull, then attribute wasPending is true
 
     //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()) {
         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: {}",
                 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
                     }
 
                     // Notify success or failure
@@ -94,6 +94,14 @@ public final class AsyncSshHandlerWriter implements AutoCloseable {
                     // Not needed anymore, release
                     byteBufMsg.release();
 
                     // 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();
                     // 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){
         } catch (final WritePendingException e) {
 
             if(wasPending == false){