[RFC] Add run_cleanup, do_with_cleanup
Martin Pool
mbp at canonical.com
Fri Sep 25 02:42:06 BST 2009
2009/9/25 Andrew Bennetts <andrew.bennetts at canonical.com>:
> Martin Pool wrote:
> [...]
>> OK, so +1 from me, but the proof will be in how it would handle the
>> bugs reported as TooMany*. It might be worth grepping for them and
>> looking at their call stacks.
>
> So, I've spent some time looking at the TooMany* bug reports. Here's a summary
> of causes:
>
> * WorkingTree.pull has error -> then runs unlock in finally
> * Branch.push has error -> then run unlock in finally
> * Repo.fetch has error during stream -> then run unlock in finally
> (e.g. due to buggy stream from old server sending cross-format to 2a)
> * commit has an error -> then runs a bunch of unlocks in a finally
>
> So those are all a case of unlock doomed to failure by prior error, then
> obscures that prior error.
OK
> There is one other case, though:
>
> * WorkingTree.commit invokes -> BzrBranch5.get_master_branch -> Branch.open ->
> BzrDir.open -> do_catching_redirections... eventually 'BzrDir.open' RPC fails
> with TooMany* error.
>
> This one doesn't appear to be a cleanup error, but some sort of failure about
> charging onwards after an error, when probably we shouldn't? I'm not sure
> exactly what's going on there, but I suspect a bug in the way we find formats in
> BzrDir.open. Anyway, this one is not a bug during cleanup AFAICT.
>
> So, it appears we would get excellent mileage out of changing unlock on the core
> objects (Branch, WorkingTree, etc) to suppress at least most errors, although
> probably we still want to allow LockNotHeld and maybe LockBroken to raise, not
> just warn?
That sounds good. We could even consider not treating LockNotHeld etc
differently to start with, people are unlikely to try to catch them.
--
Martin <http://launchpad.net/~mbp/>
More information about the bazaar
mailing list