Peter Samuelson wrote on Wed, Jul 06, 2011 at 15:10:15 -0500:
> 
> [Hyrum K Wright]
> > Revprops wouldn't be packed until explicitly asked to do so by
> > 'svnadmin pack' which means the frequent post-commit revprop editing
> > wouldn't pose a performance problem.
> 
> I still think it'd be possible, even practical, to create packfiles on
> the fly, instead of just explicitly via svnadmin pack.  This requires

What do you gain by that?

> preallocating the 'manifest' region at the top of the file, to
> accommodate a full shard.  And that in turn is easiest if manifest
> entries are fixed-width, say, 16 bytes, space-padded.  (This limits us
> to 48-bit offsets.  At 1000 revs per shard, you can average 256 GB of
> revprops per revision.  Which is some distance into the realm of the
> ridiculous.)
> 
> There is the question of atomicity of updates.  But with the HEAD
> revision, note that nobody should be trying to read it until the commit
> is official!  Therefore, assuming you hold a write lock, it should be
> perfectly safe to append the revprops to the pack file, then update the
> manifest entry, then release the write lock.
> 
> Then we have the possibly common case of editing the HEAD revprops
> immediately after commit ... say, from post-commit hook.  This can
> actually be special-cased, _because_ it is the HEAD rev:
> 
>     0) Definitions: R0 = existing revprops blob, RN = new revprops blob
>     1) Rewrite R0 at offset R0 + max(len(R0), len(RN))
>     2) Rewrite R0 manifest entry

How do you rewrite the manifest entry atomically?

>     3) Write RN at offset R0
>     4) Rewrite RN manifest entry
>     5) Truncate file after RN
> 
> This may seem to be a bit of work, but I bet it's not really
> noticeable.  Plus, post-commit hook performance isn't nearly so
> important as performance of the rest of the system.
> 
> Peter

Reply via email to