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();

Reply via email to