On Mar 26, 2005, at 10:00 PM, Philip Martin wrote:
>
> I can't see any obvious pool bugs. I think ra_dav simply doesn't send
> the child locks when deleting a directory, it only sends a delete for
> the directory itself.
>
Ah, thanks Philip, you're exactly right.
Both ra_local and ra_svn push *all* of the working copy's lock-tokens
into the filesystem right at the beginning of the commit. But because
http is stateless, ra_dav has to attach selected tokens to each
CHECKOUT, PUT, PROPPATCH, and DELETE request, in 'If:' headers (... and
then re-send all of the tokens in the final MERGE request.)
Sure enough, if you look at
libsvn_ra_dav/commit.c:commit_delete_entry(), it's trying to lookup the
path directly in the lock-tokens hash. That works fine when deleting a
file, but not deleting a directory.
There are a couple of problems here:
1. How do we find all paths in the lock-token hash which are children
of the directory? There's no magical partial-key lookup here, like we
have in BDB.
2. We're back to the old scalability problem. If a directory has 27000
lock-tokens inside it, they won't all fit in the request header(s).
Apache will reject headers that are too many or too long. This same
problem existed in the final MERGE request, and we solved it by putting
the list of all tokens in the request body. I suspect that we'll have
to do the same for DELETE requests now... :-/
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sun Mar 27 15:44:53 2005