CLOUDSTACK-6001: Fixed hyperv vm console not working for 3 minutes after migration.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/13e0f293 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/13e0f293 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/13e0f293 Branch: refs/heads/rbac Commit: 13e0f293edc718a9ee03c56896b65240cdc86d34 Parents: 86cada3 Author: Anshul Gangwar <anshul.gang...@citrix.com> Authored: Fri Jan 31 13:04:36 2014 +0530 Committer: Devdeep Singh <devd...@gmail.com> Committed: Thu Feb 6 13:47:38 2014 +0530 ---------------------------------------------------------------------- .../consoleproxy/ConsoleProxyRdpClient.java | 147 ++++++++++--------- 1 file changed, 78 insertions(+), 69 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/13e0f293/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java ---------------------------------------------------------------------- diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java index d5a3fcd..7d49b19 100644 --- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java +++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyRdpClient.java @@ -19,7 +19,6 @@ package com.cloud.consoleproxy; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; -import java.io.IOException; import java.net.InetSocketAddress; import org.apache.log4j.Logger; @@ -55,7 +54,8 @@ public class ConsoleProxyRdpClient extends ConsoleProxyClientBase { private RdpBufferedImageCanvas _canvas = null; private Thread _worker; - private volatile boolean _workerDone = false; + private volatile boolean _workerDone = true; + private volatile long _threadStopTime; private AwtMouseEventSource _mouseEventSource = null; private AwtKeyEventSource _keyEventSource = null; @@ -231,77 +231,86 @@ public class ConsoleProxyRdpClient extends ConsoleProxyClientBase { @Override public void initClient(final ConsoleProxyClientParam param) { - _workerDone = false; - - int canvasWidth = 1024; - int canvasHeight = 768; - setClientParam(param); - - final String host = param.getHypervHost(); - final String password = param.getPassword(); - final String instanceId = param.getClientHostAddress(); - final int port = param.getClientHostPort(); - - _screen = new ScreenDescription(); - _canvas = new RdpBufferedImageCanvas(this, canvasWidth, canvasHeight); - onFramebufferSizeChange(canvasWidth, canvasHeight); - - _screen.addSizeChangeListener(new SizeChangeListener() { - @Override - public void sizeChanged(int width, int height) { - if (_canvas != null) { - _canvas.setCanvasSize(width, height); - } - } - }); + if ((System.currentTimeMillis() - _threadStopTime) < 1000) { + return; + } - final SSLState sslState = new SSLState(); + try { + int canvasWidth = 1024; + int canvasHeight = 768; + setClientParam(param); + + final String host = param.getHypervHost(); + final String password = param.getPassword(); + final String instanceId = param.getClientHostAddress(); + final int port = param.getClientHostPort(); + + final SSLState sslState = new SSLState(); + + final String username = param.getUsername(); + String name = null; + String domain = null; + if (username.contains("\\")) { + String[] tokens = username.split("\\\\"); + name = tokens[1]; + domain = tokens[0]; + } else { + name = username; + domain = "Workgroup"; + } - final String username = param.getUsername(); - String name = null; - String domain = null; - if (username.contains("\\")) { - String[] tokens = username.split("\\\\"); - name = tokens[1]; - domain = tokens[0]; - } else { - name = username; - domain = "Workgroup"; - } + _screen = new ScreenDescription(); + _canvas = new RdpBufferedImageCanvas(this, canvasWidth, canvasHeight); + onFramebufferSizeChange(canvasWidth, canvasHeight); - _client = new RdpClient("client", host, domain, name, password, instanceId, _screen, _canvas, - sslState); - - _mouseEventSource = _client.getMouseEventSource(); - _keyEventSource = _client.getKeyEventSource(); - - _worker = new Thread(new Runnable() { - @Override - public void run() { - _socket = new AprSocketWrapperImpl("socket", sslState); - Pipeline pipeline = new PipelineImpl("Client"); - pipeline.add(_socket, _client); - pipeline.link("socket", _client.getId(), "socket"); - pipeline.validate(); - - InetSocketAddress address = new InetSocketAddress(host, port); - ConsoleProxy.ensureRoute(host); - - try { - // Connect socket to remote server and run main loop(s) - _socket.connect(address); - } catch (IOException e) { - e.printStackTrace(); - } finally { - shutdown(); + _screen.addSizeChangeListener(new SizeChangeListener() { + @Override + public void sizeChanged(int width, int height) { + if (_canvas != null) { + _canvas.setCanvasSize(width, height); + } } - - s_logger.info("Receiver thread stopped."); - _workerDone = true; - } - }); - _worker.setDaemon(true); - _worker.start(); + }); + + s_logger.info("connecting to instance " + instanceId + " on host " + host); + _client = new RdpClient("client", host, domain, name, password, instanceId, _screen, _canvas, sslState); + + _mouseEventSource = _client.getMouseEventSource(); + _keyEventSource = _client.getKeyEventSource(); + + _worker = new Thread(new Runnable() { + @Override + public void run() { + _socket = new AprSocketWrapperImpl("socket", sslState); + Pipeline pipeline = new PipelineImpl("Client"); + pipeline.add(_socket, _client); + pipeline.link("socket", _client.getId(), "socket"); + pipeline.validate(); + + InetSocketAddress address = new InetSocketAddress(host, port); + ConsoleProxy.ensureRoute(host); + + try { + _workerDone = false; + s_logger.info("Connecting socket to remote server and run main loop(s)"); + _socket.connect(address); + } catch (Exception e) { + s_logger.info(" error occurred in connecting to socket " + e.getMessage()); + } finally { + shutdown(); + } + + _threadStopTime = System.currentTimeMillis(); + s_logger.info("Receiver thread stopped."); + _workerDone = true; + } + }); + _worker.setDaemon(true); + _worker.start(); + } catch (Exception e) { + _workerDone = true; + s_logger.info("error occurred in initializing rdp client " + e.getMessage()); + } } @Override