diff mbox

[RFC] KVM test: Create a remote session cleaning thread

Message ID 1271456629-13314-1-git-send-email-lmr@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Lucas Meneghel Rodrigues April 16, 2010, 10:23 p.m. UTC
None
diff mbox

Patch

diff --git a/client/tests/kvm/kvm_preprocessing.py b/client/tests/kvm/kvm_preprocessing.py
index 50db65c..707565d 100644
--- a/client/tests/kvm/kvm_preprocessing.py
+++ b/client/tests/kvm/kvm_preprocessing.py
@@ -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)
diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py
index 047505a..82ef3cf 100755
--- a/client/tests/kvm/kvm_vm.py
+++ b/client/tests/kvm/kvm_vm.py
@@ -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