@@ -13,7 +13,8 @@ except ImportError:
_screendump_thread = None
_screendump_thread_termination_event = None
-
+_session_cleaning_thread = None
+_session_cleaning_thread_termination_event = None
def preprocess_image(test, params):
"""
@@ -267,6 +268,14 @@ def preprocess(test, params, env):
args=(test, params, env))
_screendump_thread.start()
+ # Start the session cleaning thread
+ logging.debug("Starting remote session cleaning thread")
+ global _session_cleaning_thread, _session_cleaning_thread_termination_event
+ _session_cleaning_thread_termination_event = threading.Event()
+ _session_cleaning_thread = threading.Thread(target=_clean_remote_sessions,
+ args=(test, params, env))
+ _session_cleaning_thread.start()
+
def postprocess(test, params, env):
"""
@@ -442,3 +451,25 @@ def _take_screendumps(test, params, env):
if _screendump_thread_termination_event.isSet():
break
_screendump_thread_termination_event.wait(delay)
+
+
+def _clean_remote_sessions(test, params, env):
+ """
+ Some remote shell servers such as SSH can be very slow on giving up of a
+ connection, which is fair. However, if the VM is known to be dead, we
+ can speed up this process reaping the remote sessions stablished to it.
+
+ @param test: KVM test object.
+ @param params: Dictionary with test parameters.
+ @param env: KVM test environment.
+ """
+ global _session_cleaning_termination_event
+ delay = float(params.get("session_cleaning_delay", 30))
+ while True:
+ for vm in kvm_utils.env_get_all_vms(env):
+ if vm.is_dead():
+ for session in vm.get_remote_session_list():
+ session.close()
+ if _session_cleaning_thread_termination_event.isSet():
+ break
+ _session_cleaning_thread_termination_event.wait(delay)
@@ -115,6 +115,7 @@ class VM:
self.root_dir = root_dir
self.address_cache = address_cache
self.pci_assignable = None
+ self.remote_session_list = []
# Find available monitor filename
while True:
@@ -749,6 +750,10 @@ class VM:
return self.process.get_pid()
+ def get_remote_session_list(self):
+ return self.remote_session_list
+
+
def get_shared_meminfo(self):
"""
Returns the VM's shared memory information.
@@ -802,6 +807,8 @@ class VM:
if session:
session.set_status_test_command(self.params.get("status_test_"
"command", ""))
+ self.remote_session_list.append(session)
+
return session