Repository: cloudstack Updated Branches: refs/heads/master 63ea596ba -> a400eecf6
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. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/4c9507d2 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/4c9507d2 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/4c9507d2 Branch: refs/heads/master Commit: 4c9507d21e82e9c55ac64e75165329565ec6a14f Parents: 63ea596 Author: Anshul Gangwar <[email protected]> Authored: Wed Sep 3 14:28:28 2014 +0530 Committer: Devdeep Singh <[email protected]> Committed: Wed Sep 10 11:32:51 2014 +0530 ---------------------------------------------------------------------- .../rdpconsole/src/main/java/streamer/SyncLink.java | 2 +- .../src/main/java/streamer/apr/AprSocketSource.java | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4c9507d2/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/SyncLink.java ---------------------------------------------------------------------- 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 94281d2..493964a 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); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4c9507d2/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/apr/AprSocketSource.java ---------------------------------------------------------------------- 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 0298349..5d3d65b 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();
