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