Branch: http://svn.collab.net/repos/svn/branches/dav-mirror/

Purpose: This branch is meant to introduce a master/slave server
replication model for Subversion ra_dav transactions.

All clients interact with a slave server, but the slave transparently
passes all of the write-oriented activites to the master (rewriting the
content as necessary).  The slaves are essentially read-only, but they
do have a complete copy of the repository locally.  This serves to
alleviate read traffic from the master server which may be desirable
in certain circumstances.

This model has several advantages to using a straight HTTP DAV-aware
caching proxy, in that it can respond to all requests without seeing them
first.

Requirements: httpd 2.1 with mod_proxy enabled
              (several fixes to mod_proxy were committed for this patch that
               have not been backported to the 2.0 branch of httpd.  Just use
               HEAD of the httpd-2.0 repository.)

Issues/Thoughts:
- The master maybe should update the slaves using a DAV commit of its own.
  (essentially replay the commit once it is approved).  This requires
  a way to inject commits/user to the slave.  But, this would eliminate the
  reliance on post-commit hooks.
- Alternatively, slaves could pull updates rather than being pushed out by
  the master.  How would this work?  Separate process on client?
- This isn't multi-master replication.  The slave won't accept commits
  on its own.  If the master can't be contacted for a write operation, it
  will return a proxy error.  (Multi-master == distributed repositories.)
- Remove the location_filter for the header.  I believe mod_proxy does this
  for us already.  We may just be duplicating things.  We will still have
  to rewrite the bodies of the requests/responses though.
- Determine a better way to handle the MERGE call.  It's the only operation
  that doesn't occur on the activity URL.
- Cross fingers and see what people think of it.

Usage:

You must use the dav-mirror branch described above.

Each slave has:

<Location /repos/slave>
  DAV svn
  SVNPath /my/local/copy/of/repos
  SVNMasterURI http://master.example.com/repos/master
</Location>

The master must have a post-commit hook that updates the slaves.  An
example that does this using 'svnadmin dump'/'svnadmin load' and ssh is
provided here:

#!/bin/sh
REPOS="$1"
REV="$2"
SLAVE_HOST=slave.example.com
SLAVE_PATH=/my/local/copy/of/repos

# Ensure svnadmin is in your PATH on both this machine and the remote server!
svnadmin dump --incremental -r$2 $1 > /tmp/$2.dump
scp /tmp/$2.dump $SLAVE_HOST:$SLAVE_PATH
ssh $SLAVE_HOST "svnadmin load $SLAVE_PATH < $SLAVE_PATH/$2.dump"
ssh $SLAVE_HOST "rm $SLAVE_PATH/$2.dump"
rm /tmp/$2.dump
