From 1d26d99e0c78d53ff1330b938ee44bc0a04920cb Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Sat, 11 Dec 2010 06:16:32 -0800 Subject: [PATCH] Fix a deadlock with redo-oob. If a checksummed target A used to exist but is now missing, and we tried to redo-ifchange that exact file, we would unnecessarily run 'redo-oob A A'; that is, we have to build A in order to determine if A needs to be built. The sub-targets of redo-oob aren't run with REDO_UNLOCKED, so this would deadlock instantly. Add an assertion to redo-oob to ensure we never try to redo-ifchange the primary target (thus converting the deadlock into an exception). And skip doing redo-oob when the target is already the same as the thing we have to check. --- redo-ifchange.py | 3 ++- redo-oob.py | 3 +++ state.py | 1 + t/stamp/stamptest.do | 6 ++++++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/redo-ifchange.py b/redo-ifchange.py index d178c71..412052c 100755 --- a/redo-ifchange.py +++ b/redo-ifchange.py @@ -95,7 +95,8 @@ def should_build(t): f = state.File(name=t) if f.is_failed(): raise builder.ImmediateReturn(32) - return dirty_deps(f, depth = '', max_changed = vars.RUNID) + dirty = dirty_deps(f, depth = '', max_changed = vars.RUNID) + return dirty==[f] and DIRTY or dirty rv = 202 diff --git a/redo-oob.py b/redo-oob.py index 9b989a7..a60fc0a 100755 --- a/redo-oob.py +++ b/redo-oob.py @@ -10,6 +10,9 @@ if len(sys.argv[1:]) < 2: target = sys.argv[1] deps = sys.argv[2:] +for d in deps: + assert(d != target) + me = state.File(name=target) os.environ['REDO_NO_OOB'] = '1' diff --git a/state.py b/state.py index 103bfb6..3965236 100644 --- a/state.py +++ b/state.py @@ -262,6 +262,7 @@ class File(object): reldep = relpath(dep, vars.BASE) debug2('add-dep: %r < %s %r\n' % (self.name, mode, reldep)) assert(src.name == reldep) + assert(self.id != src.id) _write("insert or replace into Deps " " (target, mode, source) values (?,?,?)", [self.id, mode, src.id]) diff --git a/t/stamp/stamptest.do b/t/stamp/stamptest.do index 8b98df0..68576d8 100644 --- a/t/stamp/stamptest.do +++ b/t/stamp/stamptest.do @@ -56,3 +56,9 @@ redo-ifchange usestamp usestamp2 [ "$(wc -l