Revision 04e1bfaf

b/lib/locking.py
670 670
#   If you need more than one node, or more than one instance, acquire them at
671 671
#   the same time.
672 672
LEVEL_CLUSTER = 0
673
LEVEL_NODE = 1
674
LEVEL_INSTANCE = 2
673
LEVEL_INSTANCE = 1
674
LEVEL_NODE = 2
675 675

  
676 676
LEVELS = [LEVEL_CLUSTER,
677
          LEVEL_NODE,
678
          LEVEL_INSTANCE]
677
          LEVEL_INSTANCE,
678
          LEVEL_NODE]
679 679

  
680 680
# Lock levels which are modifiable
681 681
LEVELS_MOD = [LEVEL_NODE, LEVEL_INSTANCE]
b/lib/mcpu.py
176 176
      lu = lu_class(self, op, self.context, sstore)
177 177
      lu.ExpandNames()
178 178
      assert lu.needed_locks is not None, "needed_locks not set by LU"
179
      result = self._LockAndExecLU(lu, locking.LEVEL_NODE)
179
      result = self._LockAndExecLU(lu, locking.LEVEL_INSTANCE)
180 180
    finally:
181 181
      self.context.glm.release(locking.LEVEL_CLUSTER)
182 182
      self.exclusive_BGL = False
b/test/ganeti.locking_unittest.py
621 621
  def testAcquireRelease(self):
622 622
    self.GL.acquire(locking.LEVEL_CLUSTER, ['BGL'], shared=1)
623 623
    self.assertEquals(self.GL._list_owned(locking.LEVEL_CLUSTER), set(['BGL']))
624
    self.GL.acquire(locking.LEVEL_INSTANCE, ['i1'])
624 625
    self.GL.acquire(locking.LEVEL_NODE, ['n1', 'n2'], shared=1)
625
    self.GL.release(locking.LEVEL_NODE)
626
    self.GL.acquire(locking.LEVEL_NODE, ['n1'])
626
    self.GL.release(locking.LEVEL_NODE, ['n2'])
627 627
    self.assertEquals(self.GL._list_owned(locking.LEVEL_NODE), set(['n1']))
628
    self.GL.acquire(locking.LEVEL_INSTANCE, ['i1', 'i2'])
629
    self.GL.release(locking.LEVEL_INSTANCE, ['i2'])
630 628
    self.assertEquals(self.GL._list_owned(locking.LEVEL_INSTANCE), set(['i1']))
631 629
    self.GL.release(locking.LEVEL_NODE)
630
    self.assertEquals(self.GL._list_owned(locking.LEVEL_NODE), set())
631
    self.assertEquals(self.GL._list_owned(locking.LEVEL_INSTANCE), set(['i1']))
632 632
    self.GL.release(locking.LEVEL_INSTANCE)
633 633
    self.assertRaises(errors.LockError, self.GL.acquire,
634 634
                      locking.LEVEL_INSTANCE, ['i5'])
......
656 656

  
657 657
  def testWrongOrder(self):
658 658
    self.GL.acquire(locking.LEVEL_CLUSTER, ['BGL'], shared=1)
659
    self.GL.acquire(locking.LEVEL_INSTANCE, ['i3'])
659
    self.GL.acquire(locking.LEVEL_NODE, ['n2'])
660 660
    self.assertRaises(AssertionError, self.GL.acquire,
661 661
                      locking.LEVEL_NODE, ['n1'])
662 662
    self.assertRaises(AssertionError, self.GL.acquire,
......
678 678
    self.GL.acquire(locking.LEVEL_CLUSTER, ['BGL'], shared=1)
679 679
    Thread(target=self._doLock, args=(locking.LEVEL_INSTANCE, 'i1', 1)).start()
680 680
    self.assertEqual(self.done.get(True, 1), 'DONE')
681
    self.GL.acquire(locking.LEVEL_NODE, ['n1'])
682 681
    self.GL.acquire(locking.LEVEL_INSTANCE, ['i3'])
683 682
    Thread(target=self._doLock, args=(locking.LEVEL_INSTANCE, 'i1', 1)).start()
684 683
    self.assertEqual(self.done.get(True, 1), 'DONE')

Also available in: Unified diff