Revision a95fd5d7 test/ganeti.locking_unittest.py

b/test/ganeti.locking_unittest.py
28 28
import Queue
29 29

  
30 30
from ganeti import locking
31
from ganeti import errors
31 32
from threading import Thread
32 33

  
33 34

  
......
86 87
  # helper functions: called in a separate thread they acquire the lock, send
87 88
  # their identifier on the done queue, then release it.
88 89
  def _doItSharer(self):
89
    self.sl.acquire(shared=1)
90
    self.done.put('SHR')
91
    self.sl.release()
90
    try:
91
      self.sl.acquire(shared=1)
92
      self.done.put('SHR')
93
      self.sl.release()
94
    except errors.LockError:
95
      self.done.put('ERR')
92 96

  
93 97
  def _doItExclusive(self):
94
    self.sl.acquire()
95
    self.done.put('EXC')
96
    self.sl.release()
98
    try:
99
      self.sl.acquire()
100
      self.done.put('EXC')
101
      self.sl.release()
102
    except errors.LockError:
103
      self.done.put('ERR')
104

  
105
  def _doItDelete(self):
106
    try:
107
      self.sl.acquire()
108
      self.done.put('DEL')
109
      self.sl.release()
110
    except errors.LockError:
111
      self.done.put('ERR')
97 112

  
98 113
  def testSharersCanCoexist(self):
99 114
    self.sl.acquire(shared=1)
......
109 124
    self.sl.release()
110 125
    self.assert_(self.done.get(True, 1))
111 126

  
127
  def testExclusiveBlocksDelete(self):
128
    self.sl.acquire()
129
    Thread(target=self._doItDelete).start()
130
    # give it a bit of time to check that it's not actually doing anything
131
    self.assertRaises(Queue.Empty, self.done.get, True, 0.2)
132
    self.sl.release()
133
    self.assert_(self.done.get(True, 1))
134

  
112 135
  def testExclusiveBlocksSharer(self):
113 136
    self.sl.acquire()
114 137
    Thread(target=self._doItSharer).start()
......
125 148
    self.sl.release()
126 149
    self.assert_(self.done.get(True, 1))
127 150

  
151
  def testSharerBlocksDelete(self):
152
    self.sl.acquire(shared=1)
153
    Thread(target=self._doItDelete).start()
154
    time.sleep(0.05)
155
    self.assertRaises(Queue.Empty, self.done.get, True, 0.2)
156
    self.sl.release()
157
    self.assert_(self.done.get(True, 1))
158

  
128 159
  def testWaitingExclusiveBlocksSharer(self):
129 160
    self.sl.acquire(shared=1)
130 161
    # the lock is acquired in shared mode...
......
153 184
    self.assertEqual(self.done.get(True, 1), 'SHR')
154 185
    self.assertEqual(self.done.get(True, 1), 'EXC')
155 186

  
187
  def testNoNonBlocking(self):
188
    self.assertRaises(NotImplementedError, self.sl.acquire, blocking=0)
189
    self.assertRaises(NotImplementedError, self.sl.delete, blocking=0)
190
    self.sl.acquire()
191
    self.sl.delete(blocking=0) # Fine, because the lock is already acquired
192

  
193
  def testDelete(self):
194
    self.sl.delete()
195
    self.assertRaises(errors.LockError, self.sl.acquire)
196
    self.assertRaises(errors.LockError, self.sl.delete)
197

  
198
  def testDeletePendingSharersExclusiveDelete(self):
199
    self.sl.acquire()
200
    Thread(target=self._doItSharer).start()
201
    Thread(target=self._doItSharer).start()
202
    time.sleep(0.05)
203
    Thread(target=self._doItExclusive).start()
204
    Thread(target=self._doItDelete).start()
205
    time.sleep(0.05)
206
    self.sl.delete()
207
    # The two threads who were pending return both ERR
208
    self.assertEqual(self.done.get(True, 1), 'ERR')
209
    self.assertEqual(self.done.get(True, 1), 'ERR')
210
    self.assertEqual(self.done.get(True, 1), 'ERR')
211
    self.assertEqual(self.done.get(True, 1), 'ERR')
212

  
213
  def testDeletePendingDeleteExclusiveSharers(self):
214
    self.sl.acquire()
215
    Thread(target=self._doItDelete).start()
216
    Thread(target=self._doItExclusive).start()
217
    time.sleep(0.05)
218
    Thread(target=self._doItSharer).start()
219
    Thread(target=self._doItSharer).start()
220
    time.sleep(0.05)
221
    self.sl.delete()
222
    # The two threads who were pending return both ERR
223
    self.assertEqual(self.done.get(True, 1), 'ERR')
224
    self.assertEqual(self.done.get(True, 1), 'ERR')
225
    self.assertEqual(self.done.get(True, 1), 'ERR')
226
    self.assertEqual(self.done.get(True, 1), 'ERR')
227

  
156 228

  
157 229
if __name__ == '__main__':
158 230
  unittest.main()

Also available in: Unified diff