Skip to content

Commit

Permalink
Fix ResourceWarnings seen during testing, and a testrunner orphaned t…
Browse files Browse the repository at this point in the history
…hread warning.

Fixes #266
  • Loading branch information
jamadden committed May 9, 2019
1 parent cf15ac8 commit e454ce4
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 45 deletions.
1 change: 1 addition & 0 deletions doc/reference/storages.rst
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ Demo storages are configured using the ``demostorage`` section::
'base.fs'
>>> storage.changes.getName()
'Changes'
>>> storage.close()
``demostorage`` sections can contain up to 2 storage subsections,
named ``base`` and ``changes``, specifying the demo storage's base and
Expand Down
93 changes: 50 additions & 43 deletions src/ZODB/scripts/repozo.py
Original file line number Diff line number Diff line change
Expand Up @@ -667,9 +667,11 @@ def do_recover(options):
repofiles = find_files(options)
if not repofiles:
if options.date:
raise NoFiles('No files in repository before %s', options.date)
raise NoFiles('No files in repository before %s' % (options.date,))
else:
raise NoFiles('No files in repository')

files_to_close = ()
if options.output is None:
log('Recovering file to stdout')
outfp = sys.stdout
Expand All @@ -682,51 +684,56 @@ def do_recover(options):
log('Recovering file to %s', options.output)
temporary_output_file = options.output + '.part'
outfp = open(temporary_output_file, 'wb')
if options.withverify:
datfile = os.path.splitext(repofiles[0])[0] + '.dat'
with open(datfile) as fp:
truth_dict = {}
for line in fp:
fn, startpos, endpos, sum = line.split()
startpos = int(startpos)
endpos = int(endpos)
filename = os.path.join(options.repository,
os.path.basename(fn))
truth_dict[filename] = {
'size': endpos - startpos,
'sum': sum,
}
totalsz = 0
for repofile in repofiles:
reposz, reposum = concat([repofile], outfp)
expected_truth = truth_dict[repofile]
if reposz != expected_truth['size']:
raise VerificationFail(
"%s is %d bytes, should be %d bytes" % (
repofile, reposz, expected_truth['size']))
if reposum != expected_truth['sum']:
raise VerificationFail(
"%s has checksum %s instead of %s" % (
repofile, reposum, expected_truth['sum']))
totalsz += reposz
log("Recovered chunk %s : %s bytes, md5: %s", repofile, reposz, reposum)
log("Recovered a total of %s bytes", totalsz)
else:
reposz, reposum = concat(repofiles, outfp)
log('Recovered %s bytes, md5: %s', reposz, reposum)
files_to_close += (outfp,)

if options.output is not None:
last_base = os.path.splitext(repofiles[-1])[0]
source_index = '%s.index' % last_base
target_index = '%s.index' % options.output
if os.path.exists(source_index):
log('Restoring index file %s to %s', source_index, target_index)
shutil.copyfile(source_index, target_index)
try:
if options.withverify:
datfile = os.path.splitext(repofiles[0])[0] + '.dat'
with open(datfile) as fp:
truth_dict = {}
for line in fp:
fn, startpos, endpos, sum = line.split()
startpos = int(startpos)
endpos = int(endpos)
filename = os.path.join(options.repository,
os.path.basename(fn))
truth_dict[filename] = {
'size': endpos - startpos,
'sum': sum,
}
totalsz = 0
for repofile in repofiles:
reposz, reposum = concat([repofile], outfp)
expected_truth = truth_dict[repofile]
if reposz != expected_truth['size']:
raise VerificationFail(
"%s is %d bytes, should be %d bytes" % (
repofile, reposz, expected_truth['size']))
if reposum != expected_truth['sum']:
raise VerificationFail(
"%s has checksum %s instead of %s" % (
repofile, reposum, expected_truth['sum']))
totalsz += reposz
log("Recovered chunk %s : %s bytes, md5: %s", repofile, reposz, reposum)
log("Recovered a total of %s bytes", totalsz)
else:
log('No index file to restore: %s', source_index)
reposz, reposum = concat(repofiles, outfp)
log('Recovered %s bytes, md5: %s', reposz, reposum)

if outfp != sys.stdout:
outfp.close()
if options.output is not None:
last_base = os.path.splitext(repofiles[-1])[0]
source_index = '%s.index' % last_base
target_index = '%s.index' % options.output
if os.path.exists(source_index):
log('Restoring index file %s to %s', source_index, target_index)
shutil.copyfile(source_index, target_index)
else:
log('No index file to restore: %s', source_index)
finally:
for f in files_to_close:
f.close()

if options.output is not None:
try:
os.rename(temporary_output_file, options.output)
except OSError:
Expand Down
7 changes: 5 additions & 2 deletions src/ZODB/tests/testThreadedShutdown.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ def setUp(self):
'ZODBTests.fs', create=1)
self._db = ZODB.DB(self._storage)

def tearDown(self):
ZODB.tests.util.TestCase.tearDown(self)

def check_shutdown(self):
client_thread = ZODBClientThread(self._db, self)
client_thread.start()
Expand All @@ -47,8 +50,8 @@ def check_shutdown(self):
# have different contents.
self._db.close()

def tearDown(self):
ZODB.tests.util.TestCase.tearDown(self)
# Be sure not to 'leak' the running thread.
client_thread.join()


def test_suite():
Expand Down

0 comments on commit e454ce4

Please sign in to comment.