From 19ad29d23a80af39162af1a6996a81d7ccc00c64 Mon Sep 17 00:00:00 2001
From: Guido Trotter <ultrotter@google.com>
Date: Wed, 19 May 2010 22:52:03 +0100
Subject: [PATCH] Fix race condition in mainloop unittest

Currently, in testDeferredCancel if the self._CancelEvent are entered
more than 0.3 seconds after the _SendSig have been entered, the test
could fail. This is unlikely but may happen. To avoid it we use
enterabs, to use absolute times.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>
---
 test/ganeti.daemon_unittest.py | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/test/ganeti.daemon_unittest.py b/test/ganeti.daemon_unittest.py
index 7b0cfe50a..7bf9d813b 100755
--- a/test/ganeti.daemon_unittest.py
+++ b/test/ganeti.daemon_unittest.py
@@ -25,6 +25,7 @@ import unittest
 import signal
 import os
 import socket
+import time
 
 from ganeti import daemon
 
@@ -82,13 +83,17 @@ class TestMainloop(testutils.GanetiTestCase):
 
   def testDeferredCancel(self):
     self.mainloop.RegisterSignal(self)
-    self.mainloop.scheduler.enter(0.1, 1, self._SendSig, [signal.SIGCHLD])
-    handle1 = self.mainloop.scheduler.enter(0.3, 2, self._SendSig,
-                                           [signal.SIGCHLD])
-    handle2 = self.mainloop.scheduler.enter(0.4, 2, self._SendSig,
-                                           [signal.SIGCHLD])
-    self.mainloop.scheduler.enter(0, 1, self._CancelEvent, [handle1])
-    self.mainloop.scheduler.enter(0, 1, self._CancelEvent, [handle2])
+    now = time.time()
+    self.mainloop.scheduler.enterabs(now + 0.1, 1, self._SendSig,
+                                     [signal.SIGCHLD])
+    handle1 = self.mainloop.scheduler.enterabs(now + 0.3, 2, self._SendSig,
+                                               [signal.SIGCHLD])
+    handle2 = self.mainloop.scheduler.enterabs(now + 0.4, 2, self._SendSig,
+                                               [signal.SIGCHLD])
+    self.mainloop.scheduler.enterabs(now + 0.2, 1, self._CancelEvent,
+                                     [handle1])
+    self.mainloop.scheduler.enterabs(now + 0.2, 1, self._CancelEvent,
+                                     [handle2])
     self.mainloop.scheduler.enter(0.5, 1, self._SendSig, [signal.SIGTERM])
     self.mainloop.Run()
     self.assertEquals(self.sendsig_events, [signal.SIGCHLD, signal.SIGTERM])
-- 
GitLab