Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.workerpool_unittest.py @ 91c17910

History | View | Annotate | Download (19.5 kB)

1 76094e37 Michael Hanselmann
#!/usr/bin/python
2 76094e37 Michael Hanselmann
#
3 76094e37 Michael Hanselmann
4 52c47e4e Michael Hanselmann
# Copyright (C) 2008, 2009, 2010 Google Inc.
5 76094e37 Michael Hanselmann
#
6 76094e37 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 76094e37 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 76094e37 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 76094e37 Michael Hanselmann
# (at your option) any later version.
10 76094e37 Michael Hanselmann
#
11 76094e37 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 76094e37 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 76094e37 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 76094e37 Michael Hanselmann
# General Public License for more details.
15 76094e37 Michael Hanselmann
#
16 76094e37 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 76094e37 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 76094e37 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 76094e37 Michael Hanselmann
# 02110-1301, USA.
20 76094e37 Michael Hanselmann
21 76094e37 Michael Hanselmann
22 76094e37 Michael Hanselmann
"""Script for unittesting the workerpool module"""
23 76094e37 Michael Hanselmann
24 76094e37 Michael Hanselmann
import unittest
25 76094e37 Michael Hanselmann
import threading
26 76094e37 Michael Hanselmann
import time
27 76094e37 Michael Hanselmann
import sys
28 76094e37 Michael Hanselmann
import zlib
29 52c47e4e Michael Hanselmann
import random
30 76094e37 Michael Hanselmann
31 76094e37 Michael Hanselmann
from ganeti import workerpool
32 52c47e4e Michael Hanselmann
from ganeti import errors
33 125b74b2 Michael Hanselmann
from ganeti import utils
34 bba69414 Michael Hanselmann
from ganeti import compat
35 76094e37 Michael Hanselmann
36 25231ec5 Michael Hanselmann
import testutils
37 25231ec5 Michael Hanselmann
38 7ed3248b Guido Trotter
39 52c47e4e Michael Hanselmann
class CountingContext(object):
40 7ed3248b Guido Trotter
  def __init__(self):
41 7ed3248b Guido Trotter
    self._lock = threading.Condition(threading.Lock())
42 7ed3248b Guido Trotter
    self.done = 0
43 7ed3248b Guido Trotter
44 7ed3248b Guido Trotter
  def DoneTask(self):
45 7ed3248b Guido Trotter
    self._lock.acquire()
46 7ed3248b Guido Trotter
    try:
47 7ed3248b Guido Trotter
      self.done += 1
48 7ed3248b Guido Trotter
    finally:
49 7ed3248b Guido Trotter
      self._lock.release()
50 7ed3248b Guido Trotter
51 7ed3248b Guido Trotter
  def GetDoneTasks(self):
52 7ed3248b Guido Trotter
    self._lock.acquire()
53 7ed3248b Guido Trotter
    try:
54 7ed3248b Guido Trotter
      return self.done
55 7ed3248b Guido Trotter
    finally:
56 7ed3248b Guido Trotter
      self._lock.release()
57 7ed3248b Guido Trotter
58 7ed3248b Guido Trotter
  @staticmethod
59 7ed3248b Guido Trotter
  def UpdateChecksum(current, value):
60 7ed3248b Guido Trotter
    return zlib.adler32(str(value), current)
61 76094e37 Michael Hanselmann
62 7ed3248b Guido Trotter
63 7ed3248b Guido Trotter
class CountingBaseWorker(workerpool.BaseWorker):
64 7ed3248b Guido Trotter
  def RunTask(self, ctx, text):
65 7ed3248b Guido Trotter
    ctx.DoneTask()
66 76094e37 Michael Hanselmann
67 76094e37 Michael Hanselmann
68 76094e37 Michael Hanselmann
class ChecksumContext:
69 76094e37 Michael Hanselmann
  CHECKSUM_START = zlib.adler32("")
70 76094e37 Michael Hanselmann
71 76094e37 Michael Hanselmann
  def __init__(self):
72 76094e37 Michael Hanselmann
    self.lock = threading.Condition(threading.Lock())
73 76094e37 Michael Hanselmann
    self.checksum = self.CHECKSUM_START
74 76094e37 Michael Hanselmann
75 76094e37 Michael Hanselmann
  @staticmethod
76 76094e37 Michael Hanselmann
  def UpdateChecksum(current, value):
77 76094e37 Michael Hanselmann
    return zlib.adler32(str(value), current)
78 76094e37 Michael Hanselmann
79 76094e37 Michael Hanselmann
80 76094e37 Michael Hanselmann
class ChecksumBaseWorker(workerpool.BaseWorker):
81 76094e37 Michael Hanselmann
  def RunTask(self, ctx, number):
82 daba67c7 Michael Hanselmann
    name = "number%s" % number
83 daba67c7 Michael Hanselmann
    self.SetTaskName(name)
84 daba67c7 Michael Hanselmann
85 daba67c7 Michael Hanselmann
    # This assertion needs to be checked before updating the checksum. A
86 daba67c7 Michael Hanselmann
    # failing assertion will then cause the result to be wrong.
87 daba67c7 Michael Hanselmann
    assert self.getName() == ("%s/%s" % (self._worker_id, name))
88 daba67c7 Michael Hanselmann
89 76094e37 Michael Hanselmann
    ctx.lock.acquire()
90 76094e37 Michael Hanselmann
    try:
91 76094e37 Michael Hanselmann
      ctx.checksum = ctx.UpdateChecksum(ctx.checksum, number)
92 76094e37 Michael Hanselmann
    finally:
93 76094e37 Michael Hanselmann
      ctx.lock.release()
94 76094e37 Michael Hanselmann
95 76094e37 Michael Hanselmann
96 52c47e4e Michael Hanselmann
class ListBuilderContext:
97 52c47e4e Michael Hanselmann
  def __init__(self):
98 52c47e4e Michael Hanselmann
    self.lock = threading.Lock()
99 52c47e4e Michael Hanselmann
    self.result = []
100 52c47e4e Michael Hanselmann
    self.prioresult = {}
101 52c47e4e Michael Hanselmann
102 52c47e4e Michael Hanselmann
103 52c47e4e Michael Hanselmann
class ListBuilderWorker(workerpool.BaseWorker):
104 52c47e4e Michael Hanselmann
  def RunTask(self, ctx, data):
105 52c47e4e Michael Hanselmann
    ctx.lock.acquire()
106 52c47e4e Michael Hanselmann
    try:
107 52c47e4e Michael Hanselmann
      ctx.result.append((self.GetCurrentPriority(), data))
108 52c47e4e Michael Hanselmann
      ctx.prioresult.setdefault(self.GetCurrentPriority(), []).append(data)
109 52c47e4e Michael Hanselmann
    finally:
110 52c47e4e Michael Hanselmann
      ctx.lock.release()
111 52c47e4e Michael Hanselmann
112 52c47e4e Michael Hanselmann
113 52c47e4e Michael Hanselmann
class DeferringTaskContext:
114 52c47e4e Michael Hanselmann
  def __init__(self):
115 52c47e4e Michael Hanselmann
    self.lock = threading.Lock()
116 52c47e4e Michael Hanselmann
    self.prioresult = {}
117 52c47e4e Michael Hanselmann
    self.samepriodefer = {}
118 bba69414 Michael Hanselmann
    self.num2ordertaskid = {}
119 52c47e4e Michael Hanselmann
120 52c47e4e Michael Hanselmann
121 52c47e4e Michael Hanselmann
class DeferringWorker(workerpool.BaseWorker):
122 52c47e4e Michael Hanselmann
  def RunTask(self, ctx, num, targetprio):
123 52c47e4e Michael Hanselmann
    ctx.lock.acquire()
124 52c47e4e Michael Hanselmann
    try:
125 bba69414 Michael Hanselmann
      otilst = ctx.num2ordertaskid.setdefault(num, [])
126 bba69414 Michael Hanselmann
      otilst.append(self._GetCurrentOrderAndTaskId())
127 bba69414 Michael Hanselmann
128 52c47e4e Michael Hanselmann
      if num in ctx.samepriodefer:
129 52c47e4e Michael Hanselmann
        del ctx.samepriodefer[num]
130 52c47e4e Michael Hanselmann
        raise workerpool.DeferTask()
131 52c47e4e Michael Hanselmann
132 52c47e4e Michael Hanselmann
      if self.GetCurrentPriority() > targetprio:
133 52c47e4e Michael Hanselmann
        raise workerpool.DeferTask(priority=self.GetCurrentPriority() - 1)
134 52c47e4e Michael Hanselmann
135 52c47e4e Michael Hanselmann
      ctx.prioresult.setdefault(self.GetCurrentPriority(), set()).add(num)
136 52c47e4e Michael Hanselmann
    finally:
137 52c47e4e Michael Hanselmann
      ctx.lock.release()
138 52c47e4e Michael Hanselmann
139 52c47e4e Michael Hanselmann
140 9a2564e7 Michael Hanselmann
class PriorityContext:
141 9a2564e7 Michael Hanselmann
  def __init__(self):
142 9a2564e7 Michael Hanselmann
    self.lock = threading.Lock()
143 9a2564e7 Michael Hanselmann
    self.result = []
144 9a2564e7 Michael Hanselmann
145 9a2564e7 Michael Hanselmann
146 9a2564e7 Michael Hanselmann
class PriorityWorker(workerpool.BaseWorker):
147 9a2564e7 Michael Hanselmann
  def RunTask(self, ctx, data):
148 9a2564e7 Michael Hanselmann
    ctx.lock.acquire()
149 9a2564e7 Michael Hanselmann
    try:
150 9a2564e7 Michael Hanselmann
      ctx.result.append((self.GetCurrentPriority(), data))
151 9a2564e7 Michael Hanselmann
    finally:
152 9a2564e7 Michael Hanselmann
      ctx.lock.release()
153 9a2564e7 Michael Hanselmann
154 9a2564e7 Michael Hanselmann
155 9a2564e7 Michael Hanselmann
class NotImplementedWorker(workerpool.BaseWorker):
156 9a2564e7 Michael Hanselmann
  def RunTask(self):
157 9a2564e7 Michael Hanselmann
    raise NotImplementedError
158 9a2564e7 Michael Hanselmann
159 9a2564e7 Michael Hanselmann
160 76094e37 Michael Hanselmann
class TestWorkerpool(unittest.TestCase):
161 76094e37 Michael Hanselmann
  """Workerpool tests"""
162 76094e37 Michael Hanselmann
163 7ed3248b Guido Trotter
  def testCounting(self):
164 7ed3248b Guido Trotter
    ctx = CountingContext()
165 7ed3248b Guido Trotter
    wp = workerpool.WorkerPool("Test", 3, CountingBaseWorker)
166 76094e37 Michael Hanselmann
    try:
167 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 3)
168 76094e37 Michael Hanselmann
169 f1501b3f Michael Hanselmann
      for i in range(10):
170 b2e8a4d9 Michael Hanselmann
        wp.AddTask((ctx, "Hello world %s" % i))
171 76094e37 Michael Hanselmann
172 76094e37 Michael Hanselmann
      wp.Quiesce()
173 76094e37 Michael Hanselmann
    finally:
174 76094e37 Michael Hanselmann
      wp.TerminateWorkers()
175 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
176 76094e37 Michael Hanselmann
177 7ed3248b Guido Trotter
    self.assertEquals(ctx.GetDoneTasks(), 10)
178 7ed3248b Guido Trotter
179 76094e37 Michael Hanselmann
  def testNoTasks(self):
180 7ed3248b Guido Trotter
    wp = workerpool.WorkerPool("Test", 3, CountingBaseWorker)
181 76094e37 Michael Hanselmann
    try:
182 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 3)
183 76094e37 Michael Hanselmann
      self._CheckNoTasks(wp)
184 76094e37 Michael Hanselmann
    finally:
185 76094e37 Michael Hanselmann
      wp.TerminateWorkers()
186 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
187 76094e37 Michael Hanselmann
188 76094e37 Michael Hanselmann
  def testNoTasksQuiesce(self):
189 7ed3248b Guido Trotter
    wp = workerpool.WorkerPool("Test", 3, CountingBaseWorker)
190 76094e37 Michael Hanselmann
    try:
191 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 3)
192 76094e37 Michael Hanselmann
      self._CheckNoTasks(wp)
193 76094e37 Michael Hanselmann
      wp.Quiesce()
194 76094e37 Michael Hanselmann
      self._CheckNoTasks(wp)
195 76094e37 Michael Hanselmann
    finally:
196 76094e37 Michael Hanselmann
      wp.TerminateWorkers()
197 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
198 76094e37 Michael Hanselmann
199 27caa993 Michael Hanselmann
  def testActive(self):
200 27caa993 Michael Hanselmann
    ctx = CountingContext()
201 27caa993 Michael Hanselmann
    wp = workerpool.WorkerPool("TestActive", 5, CountingBaseWorker)
202 27caa993 Michael Hanselmann
    try:
203 27caa993 Michael Hanselmann
      self._CheckWorkerCount(wp, 5)
204 27caa993 Michael Hanselmann
      self.assertTrue(wp._active)
205 27caa993 Michael Hanselmann
206 27caa993 Michael Hanselmann
      # Process some tasks
207 27caa993 Michael Hanselmann
      for _ in range(10):
208 27caa993 Michael Hanselmann
        wp.AddTask((ctx, None))
209 27caa993 Michael Hanselmann
210 27caa993 Michael Hanselmann
      wp.Quiesce()
211 27caa993 Michael Hanselmann
      self._CheckNoTasks(wp)
212 27caa993 Michael Hanselmann
      self.assertEquals(ctx.GetDoneTasks(), 10)
213 27caa993 Michael Hanselmann
214 27caa993 Michael Hanselmann
      # Repeat a few times
215 27caa993 Michael Hanselmann
      for count in range(10):
216 27caa993 Michael Hanselmann
        # Deactivate pool
217 27caa993 Michael Hanselmann
        wp.SetActive(False)
218 27caa993 Michael Hanselmann
        self._CheckNoTasks(wp)
219 27caa993 Michael Hanselmann
220 27caa993 Michael Hanselmann
        # Queue some more tasks
221 27caa993 Michael Hanselmann
        for _ in range(10):
222 27caa993 Michael Hanselmann
          wp.AddTask((ctx, None))
223 27caa993 Michael Hanselmann
224 27caa993 Michael Hanselmann
        for _ in range(5):
225 27caa993 Michael Hanselmann
          # Short delays to give other threads a chance to cause breakage
226 27caa993 Michael Hanselmann
          time.sleep(.01)
227 27caa993 Michael Hanselmann
          wp.AddTask((ctx, "Hello world %s" % 999))
228 27caa993 Michael Hanselmann
          self.assertFalse(wp._active)
229 27caa993 Michael Hanselmann
230 27caa993 Michael Hanselmann
        self.assertEquals(ctx.GetDoneTasks(), 10 + (count * 15))
231 27caa993 Michael Hanselmann
232 27caa993 Michael Hanselmann
        # Start processing again
233 27caa993 Michael Hanselmann
        wp.SetActive(True)
234 27caa993 Michael Hanselmann
        self.assertTrue(wp._active)
235 27caa993 Michael Hanselmann
236 27caa993 Michael Hanselmann
        # Wait for tasks to finish
237 27caa993 Michael Hanselmann
        wp.Quiesce()
238 27caa993 Michael Hanselmann
        self._CheckNoTasks(wp)
239 27caa993 Michael Hanselmann
        self.assertEquals(ctx.GetDoneTasks(), 10 + (count * 15) + 15)
240 27caa993 Michael Hanselmann
241 27caa993 Michael Hanselmann
        self._CheckWorkerCount(wp, 5)
242 27caa993 Michael Hanselmann
    finally:
243 27caa993 Michael Hanselmann
      wp.TerminateWorkers()
244 27caa993 Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
245 27caa993 Michael Hanselmann
246 76094e37 Michael Hanselmann
  def testChecksum(self):
247 76094e37 Michael Hanselmann
    # Tests whether all tasks are run and, since we're only using a single
248 76094e37 Michael Hanselmann
    # thread, whether everything is started in order.
249 89e2b4d2 Michael Hanselmann
    wp = workerpool.WorkerPool("Test", 1, ChecksumBaseWorker)
250 76094e37 Michael Hanselmann
    try:
251 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
252 76094e37 Michael Hanselmann
253 76094e37 Michael Hanselmann
      ctx = ChecksumContext()
254 76094e37 Michael Hanselmann
      checksum = ChecksumContext.CHECKSUM_START
255 f1501b3f Michael Hanselmann
      for i in range(1, 100):
256 76094e37 Michael Hanselmann
        checksum = ChecksumContext.UpdateChecksum(checksum, i)
257 b2e8a4d9 Michael Hanselmann
        wp.AddTask((ctx, i))
258 76094e37 Michael Hanselmann
259 76094e37 Michael Hanselmann
      wp.Quiesce()
260 76094e37 Michael Hanselmann
261 76094e37 Michael Hanselmann
      self._CheckNoTasks(wp)
262 76094e37 Michael Hanselmann
263 76094e37 Michael Hanselmann
      # Check sum
264 76094e37 Michael Hanselmann
      ctx.lock.acquire()
265 76094e37 Michael Hanselmann
      try:
266 76094e37 Michael Hanselmann
        self.assertEqual(checksum, ctx.checksum)
267 76094e37 Michael Hanselmann
      finally:
268 76094e37 Michael Hanselmann
        ctx.lock.release()
269 76094e37 Michael Hanselmann
    finally:
270 76094e37 Michael Hanselmann
      wp.TerminateWorkers()
271 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
272 76094e37 Michael Hanselmann
273 c2a8e8ba Guido Trotter
  def testAddManyTasks(self):
274 7ed3248b Guido Trotter
    ctx = CountingContext()
275 7ed3248b Guido Trotter
    wp = workerpool.WorkerPool("Test", 3, CountingBaseWorker)
276 c2a8e8ba Guido Trotter
    try:
277 c2a8e8ba Guido Trotter
      self._CheckWorkerCount(wp, 3)
278 c2a8e8ba Guido Trotter
279 7ed3248b Guido Trotter
      wp.AddManyTasks([(ctx, "Hello world %s" % i, ) for i in range(10)])
280 b2e8a4d9 Michael Hanselmann
      wp.AddTask((ctx, "A separate hello"))
281 b2e8a4d9 Michael Hanselmann
      wp.AddTask((ctx, "Once more, hi!"))
282 7ed3248b Guido Trotter
      wp.AddManyTasks([(ctx, "Hello world %s" % i, ) for i in range(10)])
283 c2a8e8ba Guido Trotter
284 c2a8e8ba Guido Trotter
      wp.Quiesce()
285 c2a8e8ba Guido Trotter
286 c2a8e8ba Guido Trotter
      self._CheckNoTasks(wp)
287 c2a8e8ba Guido Trotter
    finally:
288 c2a8e8ba Guido Trotter
      wp.TerminateWorkers()
289 c2a8e8ba Guido Trotter
      self._CheckWorkerCount(wp, 0)
290 c2a8e8ba Guido Trotter
291 7ed3248b Guido Trotter
    self.assertEquals(ctx.GetDoneTasks(), 22)
292 7ed3248b Guido Trotter
293 25e557a5 Guido Trotter
  def testManyTasksSequence(self):
294 25e557a5 Guido Trotter
    ctx = CountingContext()
295 25e557a5 Guido Trotter
    wp = workerpool.WorkerPool("Test", 3, CountingBaseWorker)
296 25e557a5 Guido Trotter
    try:
297 25e557a5 Guido Trotter
      self._CheckWorkerCount(wp, 3)
298 25e557a5 Guido Trotter
      self.assertRaises(AssertionError, wp.AddManyTasks,
299 25e557a5 Guido Trotter
                        ["Hello world %s" % i for i in range(10)])
300 25e557a5 Guido Trotter
      self.assertRaises(AssertionError, wp.AddManyTasks,
301 25e557a5 Guido Trotter
                        [i for i in range(10)])
302 9a2564e7 Michael Hanselmann
      self.assertRaises(AssertionError, wp.AddManyTasks, [], task_id=0)
303 25e557a5 Guido Trotter
304 25e557a5 Guido Trotter
      wp.AddManyTasks([(ctx, "Hello world %s" % i, ) for i in range(10)])
305 b2e8a4d9 Michael Hanselmann
      wp.AddTask((ctx, "A separate hello"))
306 25e557a5 Guido Trotter
307 25e557a5 Guido Trotter
      wp.Quiesce()
308 25e557a5 Guido Trotter
309 25e557a5 Guido Trotter
      self._CheckNoTasks(wp)
310 25e557a5 Guido Trotter
    finally:
311 25e557a5 Guido Trotter
      wp.TerminateWorkers()
312 25e557a5 Guido Trotter
      self._CheckWorkerCount(wp, 0)
313 25e557a5 Guido Trotter
314 25e557a5 Guido Trotter
    self.assertEquals(ctx.GetDoneTasks(), 11)
315 25e557a5 Guido Trotter
316 76094e37 Michael Hanselmann
  def _CheckNoTasks(self, wp):
317 76094e37 Michael Hanselmann
    wp._lock.acquire()
318 76094e37 Michael Hanselmann
    try:
319 76094e37 Michael Hanselmann
      # The task queue must be empty now
320 125b74b2 Michael Hanselmann
      self.assertFalse(wp._tasks)
321 125b74b2 Michael Hanselmann
      self.assertFalse(wp._taskdata)
322 76094e37 Michael Hanselmann
    finally:
323 76094e37 Michael Hanselmann
      wp._lock.release()
324 76094e37 Michael Hanselmann
325 76094e37 Michael Hanselmann
  def _CheckWorkerCount(self, wp, num_workers):
326 76094e37 Michael Hanselmann
    wp._lock.acquire()
327 76094e37 Michael Hanselmann
    try:
328 76094e37 Michael Hanselmann
      self.assertEqual(len(wp._workers), num_workers)
329 76094e37 Michael Hanselmann
    finally:
330 76094e37 Michael Hanselmann
      wp._lock.release()
331 76094e37 Michael Hanselmann
332 52c47e4e Michael Hanselmann
  def testPriorityChecksum(self):
333 52c47e4e Michael Hanselmann
    # Tests whether all tasks are run and, since we're only using a single
334 52c47e4e Michael Hanselmann
    # thread, whether everything is started in order and respects the priority
335 52c47e4e Michael Hanselmann
    wp = workerpool.WorkerPool("Test", 1, ChecksumBaseWorker)
336 52c47e4e Michael Hanselmann
    try:
337 52c47e4e Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
338 52c47e4e Michael Hanselmann
339 52c47e4e Michael Hanselmann
      ctx = ChecksumContext()
340 52c47e4e Michael Hanselmann
341 52c47e4e Michael Hanselmann
      data = {}
342 52c47e4e Michael Hanselmann
      tasks = []
343 52c47e4e Michael Hanselmann
      priorities = []
344 52c47e4e Michael Hanselmann
      for i in range(1, 333):
345 52c47e4e Michael Hanselmann
        prio = i % 7
346 52c47e4e Michael Hanselmann
        tasks.append((ctx, i))
347 52c47e4e Michael Hanselmann
        priorities.append(prio)
348 52c47e4e Michael Hanselmann
        data.setdefault(prio, []).append(i)
349 52c47e4e Michael Hanselmann
350 52c47e4e Michael Hanselmann
      wp.AddManyTasks(tasks, priority=priorities)
351 52c47e4e Michael Hanselmann
352 52c47e4e Michael Hanselmann
      wp.Quiesce()
353 52c47e4e Michael Hanselmann
354 52c47e4e Michael Hanselmann
      self._CheckNoTasks(wp)
355 52c47e4e Michael Hanselmann
356 52c47e4e Michael Hanselmann
      # Check sum
357 52c47e4e Michael Hanselmann
      ctx.lock.acquire()
358 52c47e4e Michael Hanselmann
      try:
359 52c47e4e Michael Hanselmann
        checksum = ChecksumContext.CHECKSUM_START
360 52c47e4e Michael Hanselmann
        for priority in sorted(data.keys()):
361 52c47e4e Michael Hanselmann
          for i in data[priority]:
362 52c47e4e Michael Hanselmann
            checksum = ChecksumContext.UpdateChecksum(checksum, i)
363 52c47e4e Michael Hanselmann
364 52c47e4e Michael Hanselmann
        self.assertEqual(checksum, ctx.checksum)
365 52c47e4e Michael Hanselmann
      finally:
366 52c47e4e Michael Hanselmann
        ctx.lock.release()
367 52c47e4e Michael Hanselmann
368 52c47e4e Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
369 52c47e4e Michael Hanselmann
    finally:
370 52c47e4e Michael Hanselmann
      wp.TerminateWorkers()
371 52c47e4e Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
372 52c47e4e Michael Hanselmann
373 52c47e4e Michael Hanselmann
  def testPriorityListManyTasks(self):
374 52c47e4e Michael Hanselmann
    # Tests whether all tasks are run and, since we're only using a single
375 52c47e4e Michael Hanselmann
    # thread, whether everything is started in order and respects the priority
376 52c47e4e Michael Hanselmann
    wp = workerpool.WorkerPool("Test", 1, ListBuilderWorker)
377 52c47e4e Michael Hanselmann
    try:
378 52c47e4e Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
379 52c47e4e Michael Hanselmann
380 52c47e4e Michael Hanselmann
      ctx = ListBuilderContext()
381 52c47e4e Michael Hanselmann
382 52c47e4e Michael Hanselmann
      # Use static seed for this test
383 52c47e4e Michael Hanselmann
      rnd = random.Random(0)
384 52c47e4e Michael Hanselmann
385 52c47e4e Michael Hanselmann
      data = {}
386 52c47e4e Michael Hanselmann
      tasks = []
387 52c47e4e Michael Hanselmann
      priorities = []
388 52c47e4e Michael Hanselmann
      for i in range(1, 333):
389 52c47e4e Michael Hanselmann
        prio = int(rnd.random() * 10)
390 52c47e4e Michael Hanselmann
        tasks.append((ctx, i))
391 52c47e4e Michael Hanselmann
        priorities.append(prio)
392 52c47e4e Michael Hanselmann
        data.setdefault(prio, []).append((prio, i))
393 52c47e4e Michael Hanselmann
394 52c47e4e Michael Hanselmann
      wp.AddManyTasks(tasks, priority=priorities)
395 52c47e4e Michael Hanselmann
396 52c47e4e Michael Hanselmann
      self.assertRaises(errors.ProgrammerError, wp.AddManyTasks,
397 52c47e4e Michael Hanselmann
                        [("x", ), ("y", )], priority=[1] * 5)
398 125b74b2 Michael Hanselmann
      self.assertRaises(errors.ProgrammerError, wp.AddManyTasks,
399 125b74b2 Michael Hanselmann
                        [("x", ), ("y", )], task_id=[1] * 5)
400 52c47e4e Michael Hanselmann
401 52c47e4e Michael Hanselmann
      wp.Quiesce()
402 52c47e4e Michael Hanselmann
403 52c47e4e Michael Hanselmann
      self._CheckNoTasks(wp)
404 52c47e4e Michael Hanselmann
405 52c47e4e Michael Hanselmann
      # Check result
406 52c47e4e Michael Hanselmann
      ctx.lock.acquire()
407 52c47e4e Michael Hanselmann
      try:
408 52c47e4e Michael Hanselmann
        expresult = []
409 52c47e4e Michael Hanselmann
        for priority in sorted(data.keys()):
410 52c47e4e Michael Hanselmann
          expresult.extend(data[priority])
411 52c47e4e Michael Hanselmann
412 52c47e4e Michael Hanselmann
        self.assertEqual(expresult, ctx.result)
413 52c47e4e Michael Hanselmann
      finally:
414 52c47e4e Michael Hanselmann
        ctx.lock.release()
415 52c47e4e Michael Hanselmann
416 52c47e4e Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
417 52c47e4e Michael Hanselmann
    finally:
418 52c47e4e Michael Hanselmann
      wp.TerminateWorkers()
419 52c47e4e Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
420 52c47e4e Michael Hanselmann
421 52c47e4e Michael Hanselmann
  def testPriorityListSingleTasks(self):
422 52c47e4e Michael Hanselmann
    # Tests whether all tasks are run and, since we're only using a single
423 52c47e4e Michael Hanselmann
    # thread, whether everything is started in order and respects the priority
424 52c47e4e Michael Hanselmann
    wp = workerpool.WorkerPool("Test", 1, ListBuilderWorker)
425 52c47e4e Michael Hanselmann
    try:
426 52c47e4e Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
427 52c47e4e Michael Hanselmann
428 52c47e4e Michael Hanselmann
      ctx = ListBuilderContext()
429 52c47e4e Michael Hanselmann
430 52c47e4e Michael Hanselmann
      # Use static seed for this test
431 52c47e4e Michael Hanselmann
      rnd = random.Random(26279)
432 52c47e4e Michael Hanselmann
433 52c47e4e Michael Hanselmann
      data = {}
434 52c47e4e Michael Hanselmann
      for i in range(1, 333):
435 52c47e4e Michael Hanselmann
        prio = int(rnd.random() * 30)
436 52c47e4e Michael Hanselmann
        wp.AddTask((ctx, i), priority=prio)
437 52c47e4e Michael Hanselmann
        data.setdefault(prio, []).append(i)
438 52c47e4e Michael Hanselmann
439 52c47e4e Michael Hanselmann
        # Cause some distortion
440 52c47e4e Michael Hanselmann
        if i % 11 == 0:
441 52c47e4e Michael Hanselmann
          time.sleep(.001)
442 52c47e4e Michael Hanselmann
        if i % 41 == 0:
443 52c47e4e Michael Hanselmann
          wp.Quiesce()
444 52c47e4e Michael Hanselmann
445 52c47e4e Michael Hanselmann
      wp.Quiesce()
446 52c47e4e Michael Hanselmann
447 52c47e4e Michael Hanselmann
      self._CheckNoTasks(wp)
448 52c47e4e Michael Hanselmann
449 52c47e4e Michael Hanselmann
      # Check result
450 52c47e4e Michael Hanselmann
      ctx.lock.acquire()
451 52c47e4e Michael Hanselmann
      try:
452 52c47e4e Michael Hanselmann
        self.assertEqual(data, ctx.prioresult)
453 52c47e4e Michael Hanselmann
      finally:
454 52c47e4e Michael Hanselmann
        ctx.lock.release()
455 52c47e4e Michael Hanselmann
456 52c47e4e Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
457 52c47e4e Michael Hanselmann
    finally:
458 52c47e4e Michael Hanselmann
      wp.TerminateWorkers()
459 52c47e4e Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
460 52c47e4e Michael Hanselmann
461 52c47e4e Michael Hanselmann
  def testDeferTask(self):
462 52c47e4e Michael Hanselmann
    # Tests whether all tasks are run and, since we're only using a single
463 52c47e4e Michael Hanselmann
    # thread, whether everything is started in order and respects the priority
464 52c47e4e Michael Hanselmann
    wp = workerpool.WorkerPool("Test", 1, DeferringWorker)
465 52c47e4e Michael Hanselmann
    try:
466 52c47e4e Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
467 52c47e4e Michael Hanselmann
468 52c47e4e Michael Hanselmann
      ctx = DeferringTaskContext()
469 52c47e4e Michael Hanselmann
470 52c47e4e Michael Hanselmann
      # Use static seed for this test
471 52c47e4e Michael Hanselmann
      rnd = random.Random(14921)
472 52c47e4e Michael Hanselmann
473 52c47e4e Michael Hanselmann
      data = {}
474 bba69414 Michael Hanselmann
      num2taskid = {}
475 52c47e4e Michael Hanselmann
      for i in range(1, 333):
476 52c47e4e Michael Hanselmann
        ctx.lock.acquire()
477 52c47e4e Michael Hanselmann
        try:
478 52c47e4e Michael Hanselmann
          if i % 5 == 0:
479 52c47e4e Michael Hanselmann
            ctx.samepriodefer[i] = True
480 52c47e4e Michael Hanselmann
        finally:
481 52c47e4e Michael Hanselmann
          ctx.lock.release()
482 52c47e4e Michael Hanselmann
483 52c47e4e Michael Hanselmann
        prio = int(rnd.random() * 30)
484 bba69414 Michael Hanselmann
        num2taskid[i] = 1000 * i
485 bba69414 Michael Hanselmann
        wp.AddTask((ctx, i, prio), priority=50,
486 bba69414 Michael Hanselmann
                   task_id=num2taskid[i])
487 52c47e4e Michael Hanselmann
        data.setdefault(prio, set()).add(i)
488 52c47e4e Michael Hanselmann
489 52c47e4e Michael Hanselmann
        # Cause some distortion
490 52c47e4e Michael Hanselmann
        if i % 24 == 0:
491 52c47e4e Michael Hanselmann
          time.sleep(.001)
492 52c47e4e Michael Hanselmann
        if i % 31 == 0:
493 52c47e4e Michael Hanselmann
          wp.Quiesce()
494 52c47e4e Michael Hanselmann
495 52c47e4e Michael Hanselmann
      wp.Quiesce()
496 52c47e4e Michael Hanselmann
497 52c47e4e Michael Hanselmann
      self._CheckNoTasks(wp)
498 52c47e4e Michael Hanselmann
499 52c47e4e Michael Hanselmann
      # Check result
500 52c47e4e Michael Hanselmann
      ctx.lock.acquire()
501 52c47e4e Michael Hanselmann
      try:
502 52c47e4e Michael Hanselmann
        self.assertEqual(data, ctx.prioresult)
503 bba69414 Michael Hanselmann
504 bba69414 Michael Hanselmann
        all_order_ids = []
505 bba69414 Michael Hanselmann
506 bba69414 Michael Hanselmann
        for (num, numordertaskid) in ctx.num2ordertaskid.items():
507 bba69414 Michael Hanselmann
          order_ids = map(compat.fst, numordertaskid)
508 bba69414 Michael Hanselmann
          self.assertFalse(utils.FindDuplicates(order_ids),
509 bba69414 Michael Hanselmann
                           msg="Order ID has been reused")
510 bba69414 Michael Hanselmann
          all_order_ids.extend(order_ids)
511 bba69414 Michael Hanselmann
512 bba69414 Michael Hanselmann
          for task_id in map(compat.snd, numordertaskid):
513 bba69414 Michael Hanselmann
            self.assertEqual(task_id, num2taskid[num],
514 bba69414 Michael Hanselmann
                             msg=("Task %s used different task IDs" % num))
515 bba69414 Michael Hanselmann
516 bba69414 Michael Hanselmann
        self.assertFalse(utils.FindDuplicates(all_order_ids),
517 bba69414 Michael Hanselmann
                         msg="Order ID has been reused")
518 52c47e4e Michael Hanselmann
      finally:
519 52c47e4e Michael Hanselmann
        ctx.lock.release()
520 52c47e4e Michael Hanselmann
521 52c47e4e Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
522 52c47e4e Michael Hanselmann
    finally:
523 52c47e4e Michael Hanselmann
      wp.TerminateWorkers()
524 52c47e4e Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
525 52c47e4e Michael Hanselmann
526 9a2564e7 Michael Hanselmann
  def testChangeTaskPriority(self):
527 9a2564e7 Michael Hanselmann
    wp = workerpool.WorkerPool("Test", 1, PriorityWorker)
528 9a2564e7 Michael Hanselmann
    try:
529 9a2564e7 Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
530 9a2564e7 Michael Hanselmann
531 9a2564e7 Michael Hanselmann
      ctx = PriorityContext()
532 9a2564e7 Michael Hanselmann
533 9a2564e7 Michael Hanselmann
      # Use static seed for this test
534 9a2564e7 Michael Hanselmann
      rnd = random.Random(4727)
535 9a2564e7 Michael Hanselmann
536 9a2564e7 Michael Hanselmann
      # Disable processing of tasks
537 9a2564e7 Michael Hanselmann
      wp.SetActive(False)
538 9a2564e7 Michael Hanselmann
539 9a2564e7 Michael Hanselmann
      # No task ID
540 9a2564e7 Michael Hanselmann
      self.assertRaises(workerpool.NoSuchTask, wp.ChangeTaskPriority,
541 9a2564e7 Michael Hanselmann
                        None, 0)
542 9a2564e7 Michael Hanselmann
543 9a2564e7 Michael Hanselmann
      # Pre-generate task IDs and priorities
544 9a2564e7 Michael Hanselmann
      count = 100
545 9a2564e7 Michael Hanselmann
      task_ids = range(0, count)
546 9a2564e7 Michael Hanselmann
      priorities = range(200, 200 + count) * 2
547 9a2564e7 Michael Hanselmann
548 9a2564e7 Michael Hanselmann
      rnd.shuffle(task_ids)
549 9a2564e7 Michael Hanselmann
      rnd.shuffle(priorities)
550 9a2564e7 Michael Hanselmann
551 9a2564e7 Michael Hanselmann
      # Make sure there are some duplicate priorities, but not all
552 9a2564e7 Michael Hanselmann
      priorities[count * 2 - 10:count * 2 - 1] = \
553 9a2564e7 Michael Hanselmann
        priorities[count - 10: count - 1]
554 9a2564e7 Michael Hanselmann
555 9a2564e7 Michael Hanselmann
      assert len(priorities) == 2 * count
556 9a2564e7 Michael Hanselmann
      assert priorities[0:(count - 1)] != priorities[count:(2 * count - 1)]
557 9a2564e7 Michael Hanselmann
558 9a2564e7 Michael Hanselmann
      # Add some tasks; this loop consumes the first half of all previously
559 9a2564e7 Michael Hanselmann
      # generated priorities
560 9a2564e7 Michael Hanselmann
      for (idx, task_id) in enumerate(task_ids):
561 9a2564e7 Michael Hanselmann
        wp.AddTask((ctx, idx),
562 9a2564e7 Michael Hanselmann
                   priority=priorities.pop(),
563 9a2564e7 Michael Hanselmann
                   task_id=task_id)
564 9a2564e7 Michael Hanselmann
565 9a2564e7 Michael Hanselmann
      self.assertEqual(len(wp._tasks), len(task_ids))
566 9a2564e7 Michael Hanselmann
      self.assertEqual(len(wp._taskdata), len(task_ids))
567 9a2564e7 Michael Hanselmann
568 9a2564e7 Michael Hanselmann
      # Tasks have been added, so half of the priorities should have been
569 9a2564e7 Michael Hanselmann
      # consumed
570 9a2564e7 Michael Hanselmann
      assert len(priorities) == len(task_ids)
571 9a2564e7 Michael Hanselmann
572 9a2564e7 Michael Hanselmann
      # Change task priority
573 9a2564e7 Michael Hanselmann
      expected = []
574 9a2564e7 Michael Hanselmann
      for ((idx, task_id), prio) in zip(enumerate(task_ids), priorities):
575 9a2564e7 Michael Hanselmann
        wp.ChangeTaskPriority(task_id, prio)
576 9a2564e7 Michael Hanselmann
        expected.append((prio, idx))
577 9a2564e7 Michael Hanselmann
578 9a2564e7 Michael Hanselmann
      self.assertEqual(len(wp._taskdata), len(task_ids))
579 9a2564e7 Michael Hanselmann
580 9a2564e7 Michael Hanselmann
      # Half the entries are now abandoned tasks
581 9a2564e7 Michael Hanselmann
      self.assertEqual(len(wp._tasks), len(task_ids) * 2)
582 9a2564e7 Michael Hanselmann
583 9a2564e7 Michael Hanselmann
      assert len(priorities) == count
584 9a2564e7 Michael Hanselmann
      assert len(task_ids) == count
585 9a2564e7 Michael Hanselmann
586 9a2564e7 Michael Hanselmann
      # Start processing
587 9a2564e7 Michael Hanselmann
      wp.SetActive(True)
588 9a2564e7 Michael Hanselmann
589 9a2564e7 Michael Hanselmann
      # Wait for tasks to finish
590 9a2564e7 Michael Hanselmann
      wp.Quiesce()
591 9a2564e7 Michael Hanselmann
592 9a2564e7 Michael Hanselmann
      self._CheckNoTasks(wp)
593 9a2564e7 Michael Hanselmann
594 9a2564e7 Michael Hanselmann
      for task_id in task_ids:
595 9a2564e7 Michael Hanselmann
        # All tasks are done
596 9a2564e7 Michael Hanselmann
        self.assertRaises(workerpool.NoSuchTask, wp.ChangeTaskPriority,
597 9a2564e7 Michael Hanselmann
                          task_id, 0)
598 9a2564e7 Michael Hanselmann
599 9a2564e7 Michael Hanselmann
      # Check result
600 9a2564e7 Michael Hanselmann
      ctx.lock.acquire()
601 9a2564e7 Michael Hanselmann
      try:
602 9a2564e7 Michael Hanselmann
        self.assertEqual(ctx.result, sorted(expected))
603 9a2564e7 Michael Hanselmann
      finally:
604 9a2564e7 Michael Hanselmann
        ctx.lock.release()
605 9a2564e7 Michael Hanselmann
606 9a2564e7 Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
607 9a2564e7 Michael Hanselmann
    finally:
608 9a2564e7 Michael Hanselmann
      wp.TerminateWorkers()
609 9a2564e7 Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
610 9a2564e7 Michael Hanselmann
611 9a2564e7 Michael Hanselmann
  def testChangeTaskPriorityInteralStructures(self):
612 9a2564e7 Michael Hanselmann
    wp = workerpool.WorkerPool("Test", 1, NotImplementedWorker)
613 9a2564e7 Michael Hanselmann
    try:
614 9a2564e7 Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
615 9a2564e7 Michael Hanselmann
616 9a2564e7 Michael Hanselmann
      # Use static seed for this test
617 9a2564e7 Michael Hanselmann
      rnd = random.Random(643)
618 9a2564e7 Michael Hanselmann
619 9a2564e7 Michael Hanselmann
      (num1, num2) = rnd.sample(range(1000), 2)
620 9a2564e7 Michael Hanselmann
621 9a2564e7 Michael Hanselmann
      # Disable processing of tasks
622 9a2564e7 Michael Hanselmann
      wp.SetActive(False)
623 9a2564e7 Michael Hanselmann
624 9a2564e7 Michael Hanselmann
      self.assertFalse(wp._tasks)
625 9a2564e7 Michael Hanselmann
      self.assertFalse(wp._taskdata)
626 9a2564e7 Michael Hanselmann
627 9a2564e7 Michael Hanselmann
      # No priority or task ID
628 9a2564e7 Michael Hanselmann
      wp.AddTask(())
629 9a2564e7 Michael Hanselmann
      self.assertEqual(wp._tasks, [
630 9a2564e7 Michael Hanselmann
        [workerpool._DEFAULT_PRIORITY, 0, None, ()],
631 9a2564e7 Michael Hanselmann
        ])
632 9a2564e7 Michael Hanselmann
      self.assertFalse(wp._taskdata)
633 9a2564e7 Michael Hanselmann
634 9a2564e7 Michael Hanselmann
      # No task ID
635 9a2564e7 Michael Hanselmann
      wp.AddTask((), priority=7413)
636 9a2564e7 Michael Hanselmann
      self.assertEqual(wp._tasks, [
637 9a2564e7 Michael Hanselmann
        [workerpool._DEFAULT_PRIORITY, 0, None, ()],
638 9a2564e7 Michael Hanselmann
        [7413, 1, None, ()],
639 9a2564e7 Michael Hanselmann
        ])
640 9a2564e7 Michael Hanselmann
      self.assertFalse(wp._taskdata)
641 9a2564e7 Michael Hanselmann
642 9a2564e7 Michael Hanselmann
      # Start adding real tasks
643 9a2564e7 Michael Hanselmann
      wp.AddTask((), priority=10267659, task_id=num1)
644 9a2564e7 Michael Hanselmann
      self.assertEqual(wp._tasks, [
645 9a2564e7 Michael Hanselmann
        [workerpool._DEFAULT_PRIORITY, 0, None, ()],
646 9a2564e7 Michael Hanselmann
        [7413, 1, None, ()],
647 9a2564e7 Michael Hanselmann
        [10267659, 2, num1, ()],
648 9a2564e7 Michael Hanselmann
        ])
649 9a2564e7 Michael Hanselmann
      self.assertEqual(wp._taskdata, {
650 9a2564e7 Michael Hanselmann
        num1: [10267659, 2, num1, ()],
651 9a2564e7 Michael Hanselmann
        })
652 9a2564e7 Michael Hanselmann
653 9a2564e7 Michael Hanselmann
      wp.AddTask((), priority=123, task_id=num2)
654 9a2564e7 Michael Hanselmann
      self.assertEqual(sorted(wp._tasks), [
655 9a2564e7 Michael Hanselmann
        [workerpool._DEFAULT_PRIORITY, 0, None, ()],
656 9a2564e7 Michael Hanselmann
        [123, 3, num2, ()],
657 9a2564e7 Michael Hanselmann
        [7413, 1, None, ()],
658 9a2564e7 Michael Hanselmann
        [10267659, 2, num1, ()],
659 9a2564e7 Michael Hanselmann
        ])
660 9a2564e7 Michael Hanselmann
      self.assertEqual(wp._taskdata, {
661 9a2564e7 Michael Hanselmann
        num1: [10267659, 2, num1, ()],
662 9a2564e7 Michael Hanselmann
        num2: [123, 3, num2, ()],
663 9a2564e7 Michael Hanselmann
        })
664 9a2564e7 Michael Hanselmann
665 9a2564e7 Michael Hanselmann
      wp.ChangeTaskPriority(num1, 100)
666 9a2564e7 Michael Hanselmann
      self.assertEqual(sorted(wp._tasks), [
667 9a2564e7 Michael Hanselmann
        [workerpool._DEFAULT_PRIORITY, 0, None, ()],
668 9a2564e7 Michael Hanselmann
        [100, 2, num1, ()],
669 9a2564e7 Michael Hanselmann
        [123, 3, num2, ()],
670 9a2564e7 Michael Hanselmann
        [7413, 1, None, ()],
671 9a2564e7 Michael Hanselmann
        [10267659, 2, num1, None],
672 9a2564e7 Michael Hanselmann
        ])
673 9a2564e7 Michael Hanselmann
      self.assertEqual(wp._taskdata, {
674 9a2564e7 Michael Hanselmann
        num1: [100, 2, num1, ()],
675 9a2564e7 Michael Hanselmann
        num2: [123, 3, num2, ()],
676 9a2564e7 Michael Hanselmann
        })
677 9a2564e7 Michael Hanselmann
678 9a2564e7 Michael Hanselmann
      wp.ChangeTaskPriority(num2, 91337)
679 9a2564e7 Michael Hanselmann
      self.assertEqual(sorted(wp._tasks), [
680 9a2564e7 Michael Hanselmann
        [workerpool._DEFAULT_PRIORITY, 0, None, ()],
681 9a2564e7 Michael Hanselmann
        [100, 2, num1, ()],
682 9a2564e7 Michael Hanselmann
        [123, 3, num2, None],
683 9a2564e7 Michael Hanselmann
        [7413, 1, None, ()],
684 9a2564e7 Michael Hanselmann
        [91337, 3, num2, ()],
685 9a2564e7 Michael Hanselmann
        [10267659, 2, num1, None],
686 9a2564e7 Michael Hanselmann
        ])
687 9a2564e7 Michael Hanselmann
      self.assertEqual(wp._taskdata, {
688 9a2564e7 Michael Hanselmann
        num1: [100, 2, num1, ()],
689 9a2564e7 Michael Hanselmann
        num2: [91337, 3, num2, ()],
690 9a2564e7 Michael Hanselmann
        })
691 9a2564e7 Michael Hanselmann
692 9a2564e7 Michael Hanselmann
      wp.ChangeTaskPriority(num1, 10139)
693 9a2564e7 Michael Hanselmann
      self.assertEqual(sorted(wp._tasks), [
694 9a2564e7 Michael Hanselmann
        [workerpool._DEFAULT_PRIORITY, 0, None, ()],
695 9a2564e7 Michael Hanselmann
        [100, 2, num1, None],
696 9a2564e7 Michael Hanselmann
        [123, 3, num2, None],
697 9a2564e7 Michael Hanselmann
        [7413, 1, None, ()],
698 9a2564e7 Michael Hanselmann
        [10139, 2, num1, ()],
699 9a2564e7 Michael Hanselmann
        [91337, 3, num2, ()],
700 9a2564e7 Michael Hanselmann
        [10267659, 2, num1, None],
701 9a2564e7 Michael Hanselmann
        ])
702 9a2564e7 Michael Hanselmann
      self.assertEqual(wp._taskdata, {
703 9a2564e7 Michael Hanselmann
        num1: [10139, 2, num1, ()],
704 9a2564e7 Michael Hanselmann
        num2: [91337, 3, num2, ()],
705 9a2564e7 Michael Hanselmann
        })
706 9a2564e7 Michael Hanselmann
707 9a2564e7 Michael Hanselmann
      # Change to the same priority once again
708 9a2564e7 Michael Hanselmann
      wp.ChangeTaskPriority(num1, 10139)
709 9a2564e7 Michael Hanselmann
      self.assertEqual(sorted(wp._tasks), [
710 9a2564e7 Michael Hanselmann
        [workerpool._DEFAULT_PRIORITY, 0, None, ()],
711 9a2564e7 Michael Hanselmann
        [100, 2, num1, None],
712 9a2564e7 Michael Hanselmann
        [123, 3, num2, None],
713 9a2564e7 Michael Hanselmann
        [7413, 1, None, ()],
714 9a2564e7 Michael Hanselmann
        [10139, 2, num1, None],
715 9a2564e7 Michael Hanselmann
        [10139, 2, num1, ()],
716 9a2564e7 Michael Hanselmann
        [91337, 3, num2, ()],
717 9a2564e7 Michael Hanselmann
        [10267659, 2, num1, None],
718 9a2564e7 Michael Hanselmann
        ])
719 9a2564e7 Michael Hanselmann
      self.assertEqual(wp._taskdata, {
720 9a2564e7 Michael Hanselmann
        num1: [10139, 2, num1, ()],
721 9a2564e7 Michael Hanselmann
        num2: [91337, 3, num2, ()],
722 9a2564e7 Michael Hanselmann
        })
723 9a2564e7 Michael Hanselmann
724 9a2564e7 Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
725 9a2564e7 Michael Hanselmann
    finally:
726 9a2564e7 Michael Hanselmann
      wp.TerminateWorkers()
727 9a2564e7 Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
728 9a2564e7 Michael Hanselmann
729 76094e37 Michael Hanselmann
730 2f96c43c Michael Hanselmann
if __name__ == "__main__":
731 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()