Comment 2 for bug 1018528

Revision history for this message
Paul Pelzl (pelzlpj) wrote :

Some root cause analysis:

    * 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.