problems with bzr 0.10 and paramiko sftp transfer

Robey Pointer robey at lag.net
Wed Aug 30 03:31:45 BST 2006


On 29 Aug 2006, at 12:17, John Arbash Meinel wrote:

> Lukáš Lalinský wrote:
>
> ...
>
>> F:\tmp>bzr branch http://www.lag.net/paramiko/bzr/paramiko/
>> bzr: ERROR: Knit header error: '\n' unexpected
>>
>> But yes, with trunk it works fine.
>
> I just looked at Robey's branches, and I'm getting the same error.
>
> If I browse to his repository using Firefox, I think I see why we are
> getting the error, but I don't know if it is because of a problem with
> Apache, or if there is actually a problem with the branch.
>
> If you go to:
> http://www.lag.net/paramiko/bzr/paramiko/.bzr/repository/ 
> inventory.kndx
> or
> http://www.lag.net/paramiko/bzr/paramiko/.bzr/repository/ 
> revisions.kndx
>
> Now there are a few things:
>
> 1) There is no 'Knit index format 8\n' header at the top of the file.
> There should be something similar to this:
> http://www.lag.net/paramiko/bzr/paramiko/.bzr/repository/ 
> signatures.kndx
>
> Now, this header actually has an extra blank line between the header,
> and the start of data.
>
> So my feeling is that Apache is misconfigured, and it is sending this
> line out as part of the Headers for the file, rather than as part  
> of the
> Body of the file. (since HTTP headers are separated by 2 CRLF pairs).
>
> 2) We probably have a bug in Knit.join() code.
>             if version in self._cache:
>                 # -- inlined lookup() --
>                 result_list.append(str(self._cache[version][5]))
>                 # -- end lookup () --
>             else:
>                 result_list.append('.' + encode_utf8(version))
>
> Which seems to say that we only add a '.<revision_id>' if the version
> does not exist in 'self._cache'. But if you look, you can see that we
> have the parent in the file already. My guess is that the parent was
> added during a join() operation, and the index._cache isn't being kept
> up to date.
>
> Actually, I think I can prove that. If you look at
> _KnitIndex.add_versions()
> It iterates over the versions to add, and uses
> self._version_list_to_index() on each one.
> But it doesn't call self._cache_version() until after it has iterated
> over the list. With the statement:
>     # cache after writing, so that a failed write leads to missing  
> cache
>     # entries not extra ones.
>
> I do realize that there can be some race conditions for dictionary
> compressing new entries. Because if someone else appends to the file
> while you are appending to it, suddenly all of your dictionary lookups
> are incorrect. Even though both appends are successful.

For what it's worth, I had a weird '\n' error pop up when I tried to  
update my pushed "no_has_key" branch earlier today, too.  I ended up  
erasing the tree and doing a clean push to work around it.

I'm not using any special apache config, nor have I updated it in the  
past few weeks (probably even few months), so I think we can rule out  
apache... or at least, any *new* apache behavior.

robey





More information about the bazaar mailing list