1- """
2- TestCases for multi-threaded access to a DB.
1+ """TestCases for multi-threaded access to a DB.
32"""
43
5- import sys , os , string
6- import tempfile
4+ import os
5+ import sys
76import time
7+ import errno
8+ import shutil
9+ import tempfile
810from pprint import pprint
911from whrandom import random
1012
13+ try :
14+ True , False
15+ except NameError :
16+ True = 1
17+ False = 0
18+
19+ DASH = '-'
20+
1121try :
1222 from threading import Thread , currentThread
13- have_threads = 1
23+ have_threads = True
1424except ImportError :
15- have_threads = 0
16-
25+ have_threads = False
1726
1827import unittest
1928from test_all import verbose
20-
2129from bsddb import db , dbutils
2230
2331#----------------------------------------------------------------------
@@ -28,15 +36,16 @@ class BaseThreadedTestCase(unittest.TestCase):
2836 dbsetflags = 0
2937 envflags = 0
3038
31-
3239 def setUp (self ):
3340 if verbose :
3441 dbutils ._deadlock_VerboseFile = sys .stdout
3542
3643 homeDir = os .path .join (os .path .dirname (sys .argv [0 ]), 'db_home' )
3744 self .homeDir = homeDir
38- try : os .mkdir (homeDir )
39- except os .error : pass
45+ try :
46+ os .mkdir (homeDir )
47+ except OSError , e :
48+ if e .errno <> errno .EEXIST : raise
4049 self .env = db .DBEnv ()
4150 self .setEnvOpts ()
4251 self .env .open (homeDir , self .envflags | db .DB_CREATE )
@@ -47,22 +56,16 @@ def setUp(self):
4756 self .d .set_flags (self .dbsetflags )
4857 self .d .open (self .filename , self .dbtype , self .dbopenflags | db .DB_CREATE )
4958
50-
5159 def tearDown (self ):
5260 self .d .close ()
5361 self .env .close ()
54- import glob
55- files = glob .glob (os .path .join (self .homeDir , '*' ))
56- for file in files :
57- os .remove (file )
58-
62+ shutil .rmtree (self .homeDir )
5963
6064 def setEnvOpts (self ):
6165 pass
6266
63-
6467 def makeData (self , key ):
65- return string .join ([key ] * 5 , '-' )
68+ return DASH .join ([key ] * 5 )
6669
6770
6871#----------------------------------------------------------------------
@@ -75,7 +78,6 @@ class ConcurrentDataStoreBase(BaseThreadedTestCase):
7578 writers = 0
7679 records = 1000
7780
78-
7981 def test01_1WriterMultiReaders (self ):
8082 if verbose :
8183 print '\n ' , '-=' * 30
@@ -102,11 +104,11 @@ def test01_1WriterMultiReaders(self):
102104 for t in threads :
103105 t .join ()
104106
105-
106107 def writerThread (self , d , howMany , writerNum ):
107108 #time.sleep(0.01 * writerNum + 0.01)
108109 name = currentThread ().getName ()
109- start , stop = howMany * writerNum , howMany * (writerNum + 1 ) - 1
110+ start = howMany * writerNum
111+ stop = howMany * (writerNum + 1 ) - 1
110112 if verbose :
111113 print "%s: creating records %d - %d" % (name , start , stop )
112114
@@ -117,7 +119,8 @@ def writerThread(self, d, howMany, writerNum):
117119 if verbose and x % 100 == 0 :
118120 print "%s: records %d - %d finished" % (name , start , x )
119121
120- if verbose : print "%s: finished creating records" % name
122+ if verbose :
123+ print "%s: finished creating records" % name
121124
122125## # Each write-cursor will be exclusive, the only one that can update the DB...
123126## if verbose: print "%s: deleting a few records" % name
@@ -130,8 +133,8 @@ def writerThread(self, d, howMany, writerNum):
130133## c.delete()
131134
132135## c.close()
133- if verbose : print "%s: thread finished" % name
134-
136+ if verbose :
137+ print "%s: thread finished" % name
135138
136139 def readerThread (self , d , readerNum ):
137140 time .sleep (0.01 * readerNum )
@@ -142,16 +145,17 @@ def readerThread(self, d, readerNum):
142145 count = 0
143146 rec = c .first ()
144147 while rec :
145- count = count + 1
148+ count += 1
146149 key , data = rec
147- assert self .makeData (key ) == data
150+ self .assertEqual ( self . makeData (key ), data )
148151 rec = c .next ()
149- if verbose : print "%s: found %d records" % (name , count )
152+ if verbose :
153+ print "%s: found %d records" % (name , count )
150154 c .close ()
151155 time .sleep (0.05 )
152156
153- if verbose : print "%s: thread finished" % name
154-
157+ if verbose :
158+ print "%s: thread finished" % name
155159
156160
157161class BTreeConcurrentDataStore (ConcurrentDataStoreBase ):
@@ -167,6 +171,7 @@ class HashConcurrentDataStore(ConcurrentDataStoreBase):
167171 readers = 10
168172 records = 1000
169173
174+
170175#----------------------------------------------------------------------
171176
172177class SimpleThreadedBase (BaseThreadedTestCase ):
@@ -176,11 +181,9 @@ class SimpleThreadedBase(BaseThreadedTestCase):
176181 writers = 3
177182 records = 1000
178183
179-
180184 def setEnvOpts (self ):
181185 self .env .set_lk_detect (db .DB_LOCK_DEFAULT )
182186
183-
184187 def test02_SimpleLocks (self ):
185188 if verbose :
186189 print '\n ' , '-=' * 30
@@ -205,11 +208,10 @@ def test02_SimpleLocks(self):
205208 for t in threads :
206209 t .join ()
207210
208-
209-
210211 def writerThread (self , d , howMany , writerNum ):
211212 name = currentThread ().getName ()
212- start , stop = howMany * writerNum , howMany * (writerNum + 1 ) - 1
213+ start = howMany * writerNum
214+ stop = howMany * (writerNum + 1 ) - 1
213215 if verbose :
214216 print "%s: creating records %d - %d" % (name , start , stop )
215217
@@ -227,7 +229,7 @@ def writerThread(self, d, howMany, writerNum):
227229 for y in xrange (start , x ):
228230 key = '%04d' % x
229231 data = dbutils .DeadlockWrap (d .get , key , max_retries = 12 )
230- assert data == self .makeData (key )
232+ self . assertEqual ( data , self .makeData (key ) )
231233
232234 # flush them
233235 try :
@@ -242,14 +244,14 @@ def writerThread(self, d, howMany, writerNum):
242244 data = dbutils .DeadlockWrap (d .get , key , max_retries = 12 )
243245 if verbose and x % 100 == 0 :
244246 print "%s: fetched record (%s, %s)" % (name , key , data )
245- assert data == self .makeData ( key ), ( key , data , self .makeData (key ))
247+ self .assertEqual ( data , self .makeData (key ))
246248 if random () <= 0.10 :
247249 dbutils .DeadlockWrap (d .delete , key , max_retries = 12 )
248250 if verbose :
249251 print "%s: deleted record %s" % (name , key )
250252
251- if verbose : print "%s: thread finished" % name
252-
253+ if verbose :
254+ print "%s: thread finished" % name
253255
254256 def readerThread (self , d , readerNum ):
255257 time .sleep (0.01 * readerNum )
@@ -260,17 +262,17 @@ def readerThread(self, d, readerNum):
260262 count = 0
261263 rec = c .first ()
262264 while rec :
263- count = count + 1
265+ count += 1
264266 key , data = rec
265- assert self .makeData (key ) == data
267+ self .assertEqual ( self . makeData (key ), data )
266268 rec = c .next ()
267- if verbose : print "%s: found %d records" % (name , count )
269+ if verbose :
270+ print "%s: found %d records" % (name , count )
268271 c .close ()
269272 time .sleep (0.05 )
270273
271- if verbose : print "%s: thread finished" % name
272-
273-
274+ if verbose :
275+ print "%s: thread finished" % name
274276
275277
276278class BTreeSimpleThreaded (SimpleThreadedBase ):
@@ -284,7 +286,6 @@ class HashSimpleThreaded(SimpleThreadedBase):
284286#----------------------------------------------------------------------
285287
286288
287-
288289class ThreadedTransactionsBase (BaseThreadedTestCase ):
289290 dbopenflags = db .DB_THREAD | db .DB_AUTO_COMMIT
290291 envflags = (db .DB_THREAD |
@@ -296,15 +297,12 @@ class ThreadedTransactionsBase(BaseThreadedTestCase):
296297 readers = 0
297298 writers = 0
298299 records = 2000
299-
300300 txnFlag = 0
301301
302-
303302 def setEnvOpts (self ):
304303 #self.env.set_lk_detect(db.DB_LOCK_DEFAULT)
305304 pass
306305
307-
308306 def test03_ThreadedTransactions (self ):
309307 if verbose :
310308 print '\n ' , '-=' * 30
@@ -334,12 +332,11 @@ def test03_ThreadedTransactions(self):
334332 for t in threads :
335333 t .join ()
336334
337- self .doLockDetect = 0
335+ self .doLockDetect = False
338336 dt .join ()
339337
340-
341338 def doWrite (self , d , name , start , stop ):
342- finished = 0
339+ finished = False
343340 while not finished :
344341 try :
345342 txn = self .env .txn_begin (None , self .txnFlag )
@@ -349,29 +346,30 @@ def doWrite(self, d, name, start, stop):
349346 if verbose and x % 100 == 0 :
350347 print "%s: records %d - %d finished" % (name , start , x )
351348 txn .commit ()
352- finished = 1
349+ finished = True
353350 except (db .DBLockDeadlockError , db .DBLockNotGrantedError ), val :
354351 if verbose :
355352 print "%s: Aborting transaction (%s)" % (name , val [1 ])
356353 txn .abort ()
357354 time .sleep (0.05 )
358355
359-
360-
361356 def writerThread (self , d , howMany , writerNum ):
362357 name = currentThread ().getName ()
363- start , stop = howMany * writerNum , howMany * (writerNum + 1 ) - 1
358+ start = howMany * writerNum
359+ stop = howMany * (writerNum + 1 ) - 1
364360 if verbose :
365361 print "%s: creating records %d - %d" % (name , start , stop )
366362
367363 step = 100
368364 for x in range (start , stop , step ):
369365 self .doWrite (d , name , x , min (stop , x + step ))
370366
371- if verbose : print "%s: finished creating records" % name
372- if verbose : print "%s: deleting a few records" % name
367+ if verbose :
368+ print "%s: finished creating records" % name
369+ if verbose :
370+ print "%s: deleting a few records" % name
373371
374- finished = 0
372+ finished = False
375373 while not finished :
376374 try :
377375 recs = []
@@ -384,38 +382,39 @@ def writerThread(self, d, howMany, writerNum):
384382 d .delete (key , txn )
385383 recs .append (key )
386384 txn .commit ()
387- finished = 1
388- if verbose : print "%s: deleted records %s" % (name , recs )
385+ finished = True
386+ if verbose :
387+ print "%s: deleted records %s" % (name , recs )
389388 except (db .DBLockDeadlockError , db .DBLockNotGrantedError ), val :
390389 if verbose :
391390 print "%s: Aborting transaction (%s)" % (name , val [1 ])
392391 txn .abort ()
393392 time .sleep (0.05 )
394393
395- if verbose : print "%s: thread finished" % name
396-
394+ if verbose :
395+ print "%s: thread finished" % name
397396
398397 def readerThread (self , d , readerNum ):
399398 time .sleep (0.01 * readerNum + 0.05 )
400399 name = currentThread ().getName ()
401400
402401 for loop in range (5 ):
403- finished = 0
402+ finished = False
404403 while not finished :
405404 try :
406405 txn = self .env .txn_begin (None , self .txnFlag )
407406 c = d .cursor (txn )
408407 count = 0
409408 rec = c .first ()
410409 while rec :
411- count = count + 1
410+ count += 1
412411 key , data = rec
413- assert self .makeData (key ) == data
412+ self .assertEqual ( self . makeData (key ), data )
414413 rec = c .next ()
415414 if verbose : print "%s: found %d records" % (name , count )
416415 c .close ()
417416 txn .commit ()
418- finished = 1
417+ finished = True
419418 except (db .DBLockDeadlockError , db .DBLockNotGrantedError ), val :
420419 if verbose :
421420 print "%s: Aborting transaction (%s)" % (name , val [1 ])
@@ -425,11 +424,11 @@ def readerThread(self, d, readerNum):
425424
426425 time .sleep (0.05 )
427426
428- if verbose : print "%s: thread finished" % name
429-
427+ if verbose :
428+ print "%s: thread finished" % name
430429
431430 def deadlockThread (self ):
432- self .doLockDetect = 1
431+ self .doLockDetect = True
433432 while self .doLockDetect :
434433 time .sleep (0.5 )
435434 try :
@@ -442,7 +441,6 @@ def deadlockThread(self):
442441 pass
443442
444443
445-
446444class BTreeThreadedTransactions (ThreadedTransactionsBase ):
447445 dbtype = db .DB_BTREE
448446 writers = 3
0 commit comments