Hi all,

I'd like to propose a patch that optimises svnsync when synchronizing to
local filesystem repositories (file:// URLs). Currently, svnsync performs
a two-step process for each revision:

  1. Commit the revision content (author/date are set to the current
     user and current time)
  2. Update svn:author and svn:date revision properties to match the
     source repository

This works but is inefficient for file:// URLs where we have direct
repository access and can set these properties correctly during the
initial commit.


THE PROBLEM
-----------

When svnsync replays a revision from a source repository, the commit
is created with the local user as the author and the current time as
the date. After the commit completes, svnsync then makes separate
svn_ra_change_rev_prop2() calls to update svn:author and svn:date to
match the source repository.

For remote servers (svn://, http://), this two-step process is necessary
because the server enforces its own author/date policies. However, for
file:// URLs via ra_local, we have direct access to the repository and
can bypass this limitation.

We have an SVN server acting as the slave via the Apache module proxy,
the slave server is kept in sync with the master using svnsync. This
two-step approach has caused issues with various tools that monitor the
slave SVN server for new revisions, they will occasionally get the data
for a synced revision that hasn't yet had the revision properties
copied. Having the sync be a single atomic operation means this can
never happen.


THE SOLUTION
------------

This patch introduces a new RA capability "commit-allow-rev-props" that
ra_local advertises. When svnsync detects this capability on the
destination repository, it:

  1. Includes svn:author and svn:date in the initial commit's revprop
     table (instead of filtering them out)

  2. ra_local now conditionally preserves these properties:
     - svn:author is only set to the session user if not already provided
     - If svn:date is provided, the SVN_FS_TXN_CLIENT_DATE flag is passed
       to svn_fs_begin_txn2() so the filesystem uses that date

  3. Skips the post-commit revprop update step since author/date are
     already correct


CHANGES OVERVIEW
----------------

subversion/include/svn_ra.h:
  - Added SVN_RA_CAPABILITY_COMMIT_ALLOW_REV_PROPS capability definition

subversion/include/svn_repos.h:
  - Added svn_repos_fs_begin_txn_for_commit3() with flags parameter
  - Added svn_repos_get_commit_editor6() with txn_flags parameter

subversion/libsvn_repos/fs-wrap.c:
  - Implemented svn_repos_fs_begin_txn_for_commit3() which passes flags
    (including SVN_FS_TXN_CLIENT_DATE) to svn_fs_begin_txn2()

subversion/libsvn_repos/commit.c:
  - Added txn_flags to edit_baton structure
  - Implemented svn_repos_get_commit_editor6() to support txn_flags
  - Updated open_root() to use the new begin_txn function

subversion/libsvn_ra_local/ra_plugin.c:
  - Advertises SVN_RA_CAPABILITY_COMMIT_ALLOW_REV_PROPS
  - Modified get_commit_editor to preserve caller-provided author/date
  - Sets SVN_FS_TXN_CLIENT_DATE when date is provided in revprops

subversion/svnsync/svnsync.c:
  - Detects the new capability on the destination
  - When capability is present, includes author/date in commit revprops
  - Skips post-commit revprop sync when capability is present
  - Updated user-facing messages to reflect the optimization


USER-VISIBLE CHANGES
--------------------

When synchronizing to a file:// URL, svnsync now displays:

  Destination supports commit-time author and date; no post-commit
  revprop sync needed.
  Committed revision 1.
  Committed revision 2.
  ...

Instead of the previous:

  Committed revision 1.
  Copied properties for revision 1.
  Committed revision 2.
  Copied properties for revision 2.
  ...


BENEFITS
--------

1. Atomicity: Author and date are set in the same transaction as the
   commit, rather than being updated afterward.

2. No behavioral change for remote servers: The optimization only
   applies when the destination advertises the capability, so svn://
   and http:// synchronization continues to work as before.

3. Reduced I/O: Eliminates separate revprop change operations for each
   revision synced to a file:// destination.

COMPATIBILITY
-------------

- The new capability is only advertised by ra_local, so this is a
  client-side optimization with no server protocol changes.

- Existing svnsync mirrors continue to work unchanged.

- The new API functions (svn_repos_fs_begin_txn_for_commit3 and
  svn_repos_get_commit_editor6) maintain backward compatibility
  through wrapper functions.


TESTING
-------

I have tested this with svnsync to file:// URLs and verified that:
- Revision properties (author, date, log) match the source repository
- The new optimization message appears at sync start
- No "Copied properties" messages appear
- Subsequent incremental syncs work correctly


Please review and let me know if you have any questions or suggestions.

Thanks,
Jordan Peck

Attachment: svnsyncatomicauthor.patch
Description: Binary data

Reply via email to