Revision 3b7ed473 test/ganeti.locking_unittest.py
b/test/ganeti.locking_unittest.py | ||
---|---|---|
331 | 331 |
# Cannot remove 'three' as we are sharing it |
332 | 332 |
self.assertRaises(AssertionError, self.ls.remove, 'three') |
333 | 333 |
|
334 |
def testAcquireSetLock(self): |
|
335 |
# acquire the set-lock exclusively |
|
336 |
self.assertEquals(self.ls.acquire(None), set(['one', 'two', 'three'])) |
|
337 |
# I can still add/remove elements... |
|
338 |
self.assertEquals(self.ls.remove(['two', 'three']), ['two', 'three']) |
|
339 |
self.assert_(self.ls.add('six')) |
|
340 |
self.ls.release() |
|
341 |
# share the set-lock |
|
342 |
self.assertEquals(self.ls.acquire(None, shared=1), set(['one', 'six'])) |
|
343 |
# adding new elements is not possible |
|
344 |
self.assertRaises(AssertionError, self.ls.add, 'five') |
|
345 |
self.ls.release() |
|
346 |
|
|
334 | 347 |
def _doLockSet(self, set, shared): |
335 | 348 |
try: |
336 | 349 |
self.ls.acquire(set, shared=shared) |
... | ... | |
339 | 352 |
except errors.LockError: |
340 | 353 |
self.done.put('ERR') |
341 | 354 |
|
355 |
def _doAddSet(self, set): |
|
356 |
try: |
|
357 |
self.ls.add(set, acquired=1) |
|
358 |
self.done.put('DONE') |
|
359 |
self.ls.release() |
|
360 |
except errors.LockError: |
|
361 |
self.done.put('ERR') |
|
362 |
|
|
342 | 363 |
def _doRemoveSet(self, set): |
343 | 364 |
self.done.put(self.ls.remove(set)) |
344 | 365 |
|
... | ... | |
412 | 433 |
self.assertEqual(self.done.get(True, 1), ['two']) |
413 | 434 |
self.ls.release() |
414 | 435 |
|
436 |
def testConcurrentSharedSetLock(self): |
|
437 |
# share the set-lock... |
|
438 |
self.ls.acquire(None, shared=1) |
|
439 |
# ...another thread can share it too |
|
440 |
Thread(target=self._doLockSet, args=(None, 1)).start() |
|
441 |
self.assertEqual(self.done.get(True, 1), 'DONE') |
|
442 |
# ...or just share some elements |
|
443 |
Thread(target=self._doLockSet, args=(['one', 'three'], 1)).start() |
|
444 |
self.assertEqual(self.done.get(True, 1), 'DONE') |
|
445 |
# ...but not add new ones or remove any |
|
446 |
Thread(target=self._doAddSet, args=(['nine'])).start() |
|
447 |
Thread(target=self._doRemoveSet, args=(['two'], )).start() |
|
448 |
self.assertRaises(Queue.Empty, self.done.get, True, 0.2) |
|
449 |
# this just releases the set-lock |
|
450 |
self.ls.release([]) |
|
451 |
self.assertEqual(self.done.get(True, 1), 'DONE') |
|
452 |
# release the lock on the actual elements so remove() can proceed too |
|
453 |
self.ls.release() |
|
454 |
self.assertEqual(self.done.get(True, 1), ['two']) |
|
455 |
|
|
456 |
def testConcurrentExclusiveSetLock(self): |
|
457 |
# acquire the set-lock... |
|
458 |
self.ls.acquire(None, shared=0) |
|
459 |
# ...no one can do anything else |
|
460 |
Thread(target=self._doLockSet, args=(None, 1)).start() |
|
461 |
Thread(target=self._doLockSet, args=(None, 0)).start() |
|
462 |
Thread(target=self._doLockSet, args=(['three'], 0)).start() |
|
463 |
Thread(target=self._doLockSet, args=(['two'], 1)).start() |
|
464 |
Thread(target=self._doAddSet, args=(['nine'])).start() |
|
465 |
self.ls.release() |
|
466 |
self.assertEqual(self.done.get(True, 1), 'DONE') |
|
467 |
self.assertEqual(self.done.get(True, 1), 'DONE') |
|
468 |
self.assertEqual(self.done.get(True, 1), 'DONE') |
|
469 |
self.assertEqual(self.done.get(True, 1), 'DONE') |
|
470 |
self.assertEqual(self.done.get(True, 1), 'DONE') |
|
471 |
|
|
415 | 472 |
|
416 | 473 |
class TestGanetiLockManager(unittest.TestCase): |
417 | 474 |
|
Also available in: Unified diff