Revision d2aff862

b/lib/locking.py
560 560
      shared: is the pre-acquisition shared?
561 561

  
562 562
    """
563

  
564
    assert not self.__lock._is_owned(shared=1), (
565
           "Cannot add new elements while sharing the set-lock")
563
    # Check we don't already own locks at this level
564
    assert not self._is_owned() or self.__lock._is_owned(shared=0), \
565
      "Cannot add locks if the set is only partially owned, or shared"
566 566

  
567 567
    # Support passing in a single resource to add rather than many
568 568
    if isinstance(names, basestring):
b/test/ganeti.locking_unittest.py
354 354
    self.assert_('five' not in self.ls._names())
355 355
    self.assert_('six' not in self.ls._names())
356 356
    self.assertEquals(self.ls._list_owned(), set(['seven']))
357
    self.ls.add('eight', acquired=1, shared=1)
358
    self.assert_('eight' in self.ls._names())
359
    self.assertEquals(self.ls._list_owned(), set(['seven', 'eight']))
357
    self.assertRaises(AssertionError, self.ls.add, 'eight', acquired=1)
360 358
    self.ls.remove('seven')
361 359
    self.assert_('seven' not in self.ls._names())
362
    self.assertEquals(self.ls._list_owned(), set(['eight']))
360
    self.assertEquals(self.ls._list_owned(), set([]))
361
    self.ls.acquire(None, shared=1)
362
    self.assertRaises(AssertionError, self.ls.add, 'eight')
363
    self.ls.release()
364
    self.ls.acquire(None)
365
    self.ls.add('eight', acquired=1)
366
    self.assert_('eight' in self.ls._names())
367
    self.assert_('eight' in self.ls._list_owned())
368
    self.ls.add('nine')
369
    self.assert_('nine' in self.ls._names())
370
    self.assert_('nine' not in self.ls._list_owned())
363 371
    self.ls.release()
364 372
    self.ls.remove(['two'])
365 373
    self.assert_('two' not in self.ls._names())
......
550 558
    self.assertEqual(self.done.get(True, 1), 'DONE')
551 559
    self.assertEqual(self.done.get(True, 1), 'DONE')
552 560

  
561
  def testConcurrentSetLockAdd(self):
562
    self.ls.acquire('one')
563
    # Another thread wants the whole SetLock
564
    Thread(target=self._doLockSet, args=(None, 0)).start()
565
    Thread(target=self._doLockSet, args=(None, 1)).start()
566
    self.assertRaises(Queue.Empty, self.done.get, True, 0.2)
567
    self.assertRaises(AssertionError, self.ls.add, 'four')
568
    self.ls.release()
569
    self.assertEqual(self.done.get(True, 1), 'DONE')
570
    self.assertEqual(self.done.get(True, 1), 'DONE')
571
    self.ls.acquire(None)
572
    Thread(target=self._doLockSet, args=(None, 0)).start()
573
    Thread(target=self._doLockSet, args=(None, 1)).start()
574
    self.assertRaises(Queue.Empty, self.done.get, True, 0.2)
575
    self.ls.add('four')
576
    self.ls.add('five', acquired=1)
577
    self.ls.add('six', acquired=1, shared=1)
578
    self.assertEquals(self.ls._list_owned(),
579
      set(['one', 'two', 'three', 'five', 'six']))
580
    self.assertEquals(self.ls._is_owned(), True)
581
    self.assertEquals(self.ls._names(),
582
      set(['one', 'two', 'three', 'four', 'five', 'six']))
583
    self.ls.release()
584
    self.assertEqual(self.done.get(True, 1), 'DONE')
585
    self.assertEqual(self.done.get(True, 1), 'DONE')
586

  
553 587
  def testEmptyLockSet(self):
554 588
    # get the set-lock
555 589
    self.assertEqual(self.ls.acquire(None), set(['one', 'two', 'three']))

Also available in: Unified diff