* GenericInterBranch.pull() takes a write lock on the bound branch, and
maintains the lock across a call to BasicTags.merge_to().
* BasicTags.merge_to takes its own lock on the bound branch. Under
different circumstances this lock would succeed, because
BzrBranch.get_master_branch() provides a cached result and the
in-memory branch will support counted locks. But in this code path
GenericInterBranch._pull() calls
GenericInterBranch._update_revisions(), and this blows away the
cached master on a call to BzrBranch.set_last_revision_info().
So the master gets reloaded from disk, and bzr is unaware that
the branch is already write-locked.
Some root cause analysis:
* GenericInterBra nch.pull( ) takes a write lock on the bound branch, and merge_to( ).
maintains the lock across a call to BasicTags.
* BasicTags.merge_to takes its own lock on the bound branch. Under .get_master_ branch( ) provides a cached result and the terBranch. _pull() calls terBranch. _update_ revisions( ), and this blows away the set_last_ revision_ info().
different circumstances this lock would succeed, because
BzrBranch
in-memory branch will support counted locks. But in this code path
GenericIn
GenericIn
cached master on a call to BzrBranch.
So the master gets reloaded from disk, and bzr is unaware that
the branch is already write-locked.