ErrorFromSmartServer - AbsentContentFactory (unfixable by users) error when pulling a branch from the mirrored area
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Bazaar |
Fix Released
|
Critical
|
Andrew Bennetts | ||
1.13 |
Fix Released
|
High
|
Bob Tanner | ||
Launchpad itself |
Fix Released
|
Undecided
|
Unassigned | ||
bzr (Ubuntu) |
Fix Released
|
Undecided
|
Unassigned | ||
Bug Description
Workarounds
----------------
If you can write to the branch:
- Use the fixer script attached to this bug to repair the affected branch (by fetching the missing parts from the stacked-on repository). Run it as 'fix-branch.py bzr+ssh:
- Alternatively just delete the affected branch and repush it with a fixed client (1.14rc2 or newer)
If you cannot write to the branch:
- Use non-smart URLs to access an affected branch, e.g. sftp:// or nosmart+bzr+ssh://. This works because the client can access the stacked-on repository, and the missing data is present there, but will be slower as it disables streaming fetch.
Details
-------
When bzr introduced stacking the data pushed to a stacking branch was too minimal. This lack was discovered when streaming fetch from stacked branches was enabled. The server needs to be able to generate a delta of the data in its graph to decide what to send the client, and the ACF record sent to the client is an indicator that it was failing to do this correctly.
Resolution
----------
Use bzr.dev newer than r4307 (or bzr 1.15 or newer) on the server and bzr 1.13 or newer as clients with bzr+ssh or bzr+http urls. If the server cannot run 1.15, use bzr 1.13.2 or 1.14rc2 or newer on the client. Do not use older bzr versions.
bzr.dev and 1.14rc2 have been fixed on the client side to always include enough data, and bzr.dev (and thus bzr 1.15) include a fix for the server to make bzr 1.13 clients that use the Repository.
Symptom
-------
When pulling affected branches, you get a traceback like this:
bzr: ERROR: bzrlib.
Traceback (most recent call last):
...
File "/Library/
result = unbound(self, *args, **kwargs)
File "/Library/
pb=pb, find_ghosts=
File "/Library/
self.__fetch()
File "/Library/
self.
File "/Library/
stream, from_format, [])
File "/Library/
return self._locked_
File "/Library/
for substream_type, substream in stream:
File "/Library/
for kind, substream in stream:
File "/Library/
for bytes in byte_stream:
File "/Library/
_translate_
File "/Library/
raise errors.
ErrorFromSmartS
Related branches
description: | updated |
description: | updated |
Changed in bzr: | |
milestone: | 1.14rc1 → 1.14rc2 |
status: | Confirmed → Fix Committed |
description: | updated |
description: | updated |
description: | updated |
tags: | added: lp-cherrypick-candidate |
tags: |
added: lp-cp removed: lp-cherrypick-candidate |
description: | updated |
tags: |
added: lp-needs removed: lp-cp |
description: | updated |
Changed in launchpad-code: | |
status: | New → Fix Committed |
Changed in launchpad-code: | |
status: | Fix Committed → Fix Released |
Changed in bzr (Ubuntu): | |
status: | Confirmed → Fix Released |
This is probably due to a get_stream RPC with an "ancestry-of" argument failing on a stacked branch?
What ought to happen is fetching all the ancestry that the stacked branch has, then asking the fallback location for the ancestry of all the revisions that were referenced (but not present) in the first repo.