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: DAV svn SVNPath /my/local/copy/of/repos SVNMasterURI http://master.example.com/repos/master 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