From 4c9507d21e82e9c55ac64e75165329565ec6a14f Mon Sep 17 00:00:00 2001 From: Anshul Gangwar Date: Wed, 3 Sep 2014 14:28:28 +0530 Subject: [PATCH] CLOUDSTACK-6898: [Hyper-V] fixed rdp console freezing during reboot. Console was freezing because we read data from socket in blocking mode. During reboot it was blocking infintely. To fix issue, now we are reading data in non-blocking mode. In non-blocking mode I set the timeout to 5 seconds. --- .../rdpconsole/src/main/java/streamer/SyncLink.java | 2 +- .../src/main/java/streamer/apr/AprSocketSource.java | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/SyncLink.java b/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/SyncLink.java index 94281d21c9d..493964a26c1 100755 --- a/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/SyncLink.java +++ b/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/SyncLink.java @@ -371,7 +371,7 @@ public class SyncLink implements Link { // Pull source in loop while (!shutdown) { // Pull data from source element and send it to sink element - ByteBuffer data = pull(true); + ByteBuffer data = pull(false); if (data != null) sink.handleData(data, this); diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/apr/AprSocketSource.java b/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/apr/AprSocketSource.java index 02983492e8d..5d3d65bdc0c 100755 --- a/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/apr/AprSocketSource.java +++ b/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/apr/AprSocketSource.java @@ -101,20 +101,23 @@ public class AprSocketSource extends BaseElement { if (verbose) System.out.println("[" + this + "] INFO: Reading data from stream."); + // to unblock during reboot + long startTime = System.currentTimeMillis(); // FIXME: If pull is destroyed or socket is closed, segfault will happen here int actualLength = (block) ? // Blocking read Socket.recv(socket, buf.data, buf.offset, buf.data.length - buf.offset) : // Non-blocking read - Socket.recvt(socket, buf.data, buf.offset, buf.data.length - buf.offset, 1); + Socket.recvt(socket, buf.data, buf.offset, buf.data.length - buf.offset, 5000000); if (socketWrapper.shutdown) { socketWrapper.destroyPull(); return; } - if (actualLength < 0) { + long elapsedTime = System.currentTimeMillis() - startTime; + if (actualLength < 0 || elapsedTime > 5000) { if (verbose) - System.out.println("[" + this + "] INFO: End of stream."); + System.out.println("[" + this + "] INFO: End of stream or timeout"); buf.unref(); closeStream();