Don't check as often whether the .redo directory exists.

Just check it once after running a subprocess: that's the only way it ought
to be able to disappear (ie. in a 'make clean' setup).
This commit is contained in:
Avery Pennarun 2010-12-09 03:01:26 -08:00
commit 3ef2bd7300
5 changed files with 21 additions and 31 deletions

View file

@ -130,6 +130,7 @@ class BuildJob:
def _after(self, t, rv): def _after(self, t, rv):
try: try:
state.check_sane()
rv = self._after1(t, rv) rv = self._after1(t, rv)
finally: finally:
self._after2(rv) self._after2(rv)
@ -211,7 +212,8 @@ def main(targets, shouldbuildfunc):
jwack.get_token(t) jwack.get_token(t)
if retcode[0] and not vars.KEEP_GOING: if retcode[0] and not vars.KEEP_GOING:
break break
if not state.is_sane(): if not state.check_sane():
err('.redo directory disappeared; cannot continue.\n')
retcode[0] = 205 retcode[0] = 205
break break
lock = state.Lock(t) lock = state.Lock(t)
@ -234,7 +236,8 @@ def main(targets, shouldbuildfunc):
if retcode[0] and not vars.KEEP_GOING: if retcode[0] and not vars.KEEP_GOING:
break break
if locked: if locked:
if not state.is_sane(): if not state.check_sane():
err('.redo directory disappeared; cannot continue.\n')
retcode[0] = 205 retcode[0] = 205
break break
t = locked.pop(0) t = locked.pop(0)

View file

@ -15,24 +15,6 @@ def unlink(f):
pass # it doesn't exist, that's what you asked for pass # it doesn't exist, that's what you asked for
def mkdirp(d, mode=None):
"""Recursively create directories on path 'd'.
Unlike os.makedirs(), it doesn't raise an exception if the last element of
the path already exists.
"""
try:
if mode:
os.makedirs(d, mode)
else:
os.makedirs(d)
except OSError, e:
if e.errno == errno.EEXIST:
pass
else:
raise
def log_(s): def log_(s):
sys.stdout.flush() sys.stdout.flush()
if vars.DEBUG_PIDS: if vars.DEBUG_PIDS:

View file

@ -1,7 +1,7 @@
#!/usr/bin/python #!/usr/bin/python
import sys, os, errno, stat import sys, os, errno, stat
import vars, state, builder, jwack import vars, state, builder, jwack
from helpers import debug, debug2, err, mkdirp, unlink from helpers import debug, debug2, err, unlink
def dirty_deps(f, depth, max_changed): def dirty_deps(f, depth, max_changed):

View file

@ -1,7 +1,7 @@
#!/usr/bin/python #!/usr/bin/python
import sys, os import sys, os
import vars, state import vars, state
from helpers import err, mkdirp from helpers import err
try: try:

View file

@ -1,6 +1,6 @@
import sys, os, errno, glob, stat, sqlite3 import sys, os, errno, glob, stat, sqlite3
import vars import vars
from helpers import unlink, err, debug2, debug3, mkdirp, close_on_exec from helpers import unlink, err, debug2, debug3, close_on_exec
import helpers import helpers
SCHEMA_VER=1 SCHEMA_VER=1
@ -13,7 +13,13 @@ def db():
return _db return _db
dbdir = '%s/.redo' % vars.BASE dbdir = '%s/.redo' % vars.BASE
dbfile = '%s/db.sqlite3' % dbdir dbfile = '%s/db.sqlite3' % dbdir
mkdirp(dbdir) try:
os.mkdir(dbdir)
except OSError, e:
if e.errno == errno.EEXIST:
pass # if it exists, that's okay
else:
raise
must_create = not os.path.exists(dbfile) must_create = not os.path.exists(dbfile)
if not must_create: if not must_create:
_db = sqlite3.connect(dbfile, timeout=TIMEOUT) _db = sqlite3.connect(dbfile, timeout=TIMEOUT)
@ -72,6 +78,8 @@ def init():
_wrote = 0 _wrote = 0
def _write(q, l): def _write(q, l):
if _insane:
return
global _wrote global _wrote
_wrote += 1 _wrote += 1
#helpers.log_('W: %r %r\n' % (q,l)) #helpers.log_('W: %r %r\n' % (q,l))
@ -79,6 +87,8 @@ def _write(q, l):
def commit(): def commit():
if _insane:
return
global _wrote global _wrote
if _wrote: if _wrote:
#helpers.log_("COMMIT (%d)\n" % _wrote) #helpers.log_("COMMIT (%d)\n" % _wrote)
@ -87,12 +97,10 @@ def commit():
_insane = None _insane = None
def is_sane(): def check_sane():
global _insane global _insane, _writable
if not _insane: if not _insane:
_insane = not os.path.exists('%s/.redo' % vars.BASE) _insane = not os.path.exists('%s/.redo' % vars.BASE)
if _insane:
err('.redo directory disappeared; cannot continue.\n')
return not _insane return not _insane
@ -161,9 +169,6 @@ class File(object):
self._init_from_cols(row) self._init_from_cols(row)
def save(self): def save(self):
if not os.path.exists('%s/.redo' % vars.BASE):
# this might happen if 'make clean' removes the .redo dir
return
_write('update Files set ' _write('update Files set '
' is_generated=?, checked_runid=?, changed_runid=?, ' ' is_generated=?, checked_runid=?, changed_runid=?, '
' stamp=?, csum=? ' ' stamp=?, csum=? '