You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by iv...@apache.org on 2013/07/19 20:07:18 UTC

svn commit: r1504951 - in /subversion/trunk/subversion: include/ libsvn_fs/ libsvn_fs_base/ libsvn_fs_fs/ libsvn_repos/

Author: ivan
Date: Fri Jul 19 18:07:17 2013
New Revision: 1504951

URL: http://svn.apache.org/r1504951
Log:
Make svnadmin load really atomic by adding option to 
svn_fs_commit_txn2 to disable updating 'svn:date' revision property after 
committing transaction.

* subversion/include/svn_fs.h
  (svn_fs_commit_txn2): New. Revv svn_fs_commit_txn() and add new 
   SET_TIMESTAMP argument to disable setting 'svn:date' in FS layer.

* subversion/libsvn_fs/fs-loader.h
* subversion/libsvn_fs/fs-loader.c
  (svn_fs_commit_txn2): Revv svn_fs_commit_txn() and pass set_timestamp 
   argument to commit vtable method.
  (svn_fs_commit_txn): Call svn_fs_commit_txn2() with SET_TIMESTAMP=TRUE.

* subversion/libsvn_fs_base/dag.h
* subversion/libsvn_fs_base/dag.c
  (svn_fs_base__dag_commit_txn): Add SET_TIMESTAMP argument and update 
   'svn:date' revision property only if SET_TIMESTAMP is non-zero.

* subversion/libsvn_fs_base/tree.c
* subversion/libsvn_fs_base/tree.h
  (commit_args): Add SET_TIMESTAMP member.
  (txn_body_commit): Pass SET_TIMESTAMP to svn_fs_base__dag_commit_txn().
  (svn_fs_base__commit_txn): Add SET_TIMESTAMP argument and store it in
   commit baton.

* subversion/libsvn_fs_fs/fs_fs.h
* subversion/libsvn_fs_fs/fs_fs.c
  (commit_baton): Add SET_TIMESTAMP member.
  (commit_body): Update 'svn:date' revision property only if SET_TIMESTAMP 
   is non-zero.
  (svn_fs_fs__commit): Add SET_TIMESTAMP argument and store it in commit 
   baton.

* subversion/libsvn_fs_fs/tree.c
* subversion/libsvn_fs_fs/tree.h
  (svn_fs_fs__commit_txn): Add SET_TIMESTAMP argument and pass it to
   svn_fs_fs__commit().

* subversion/libsvn_repos/load-fs-vtable.c
  (close_revision): Use svn_fs_commit_txn2() and do not fix-up 'svn:date' 
   property after commit.

Modified:
    subversion/trunk/subversion/include/svn_fs.h
    subversion/trunk/subversion/libsvn_fs/fs-loader.c
    subversion/trunk/subversion/libsvn_fs/fs-loader.h
    subversion/trunk/subversion/libsvn_fs_base/dag.c
    subversion/trunk/subversion/libsvn_fs_base/dag.h
    subversion/trunk/subversion/libsvn_fs_base/tree.c
    subversion/trunk/subversion/libsvn_fs_base/tree.h
    subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
    subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h
    subversion/trunk/subversion/libsvn_fs_fs/tree.c
    subversion/trunk/subversion/libsvn_fs_fs/tree.h
    subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c

Modified: subversion/trunk/subversion/include/svn_fs.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_fs.h?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_fs.h (original)
+++ subversion/trunk/subversion/include/svn_fs.h Fri Jul 19 18:07:17 2013
@@ -45,7 +45,8 @@
 extern "C" {
 #endif /* __cplusplus */
 
-
+
+
 /**
  * Get libsvn_fs version information.
  *
@@ -175,7 +176,8 @@ typedef struct svn_fs_t svn_fs_t;
  */
 svn_error_t *
 svn_fs_initialize(apr_pool_t *pool);
-
+
+
 
 /** The type of a warning callback function.  @a baton is the value specified
  * in the call to svn_fs_set_warning_func(); the filesystem passes it through
@@ -201,7 +203,8 @@ svn_fs_set_warning_func(svn_fs_t *fs,
                         svn_fs_warning_callback_t warning,
                         void *warning_baton);
 
-
+
+
 
 /**
  * Create a new, empty Subversion filesystem, stored in the directory
@@ -635,7 +638,8 @@ svn_fs_berkeley_recover(const char *path
 
 /** @} */
 
-
+
+
 /** Filesystem Access Contexts.
  *
  * @since New in 1.2.
@@ -722,7 +726,8 @@ svn_fs_access_add_lock_token(svn_fs_acce
 
 /** @} */
 
-
+
+
 /** Filesystem Nodes and Node-Revisions.
  *
  * In a Subversion filesystem, a `node' corresponds roughly to an
@@ -813,7 +818,8 @@ svn_fs_unparse_id(const svn_fs_id_t *id,
 
 /** @} */
 
-
+
+
 /** Filesystem Transactions.
  *
  * To make a change to a Subversion filesystem:
@@ -989,6 +995,9 @@ svn_fs_begin_txn(svn_fs_txn_t **txn_p,
  * the conflict in @a txn, allocated within @a pool;
  * otherwise, set @a *conflict_p to NULL.
  *
+ * If @ set_timestamp is non-zero 'svn:date' revision property will be updated
+ * to current time to ensure that svn:date revprops remain ordered.
+ *
  * If the commit succeeds, @a txn is invalid.
  *
  * If the commit fails for any reason, @a *new_rev is an invalid
@@ -1020,6 +1029,19 @@ svn_fs_begin_txn(svn_fs_txn_t **txn_p,
  * ###     conflict string
  * ###   *new_rev will always be initialized to SVN_INVALID_REVNUM, or
  * ###     to a valid, committed revision number
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_commit_txn2(const char **conflict_p,
+                   svn_revnum_t *new_rev,
+                   svn_fs_txn_t *txn,
+                   svn_boolean_t set_timestamp,
+                   apr_pool_t *pool);
+
+/*
+ * Same as svn_fs_commit_txn2(), but with @a set_timestamp
+ * always set to @c TRUE.
  */
 svn_error_t *
 svn_fs_commit_txn(const char **conflict_p,
@@ -1146,7 +1168,8 @@ svn_fs_change_txn_props(svn_fs_txn_t *tx
 
 /** @} */
 
-
+
+
 /** Roots.
  *
  * An #svn_fs_root_t object represents the root directory of some
@@ -1230,7 +1253,8 @@ svn_fs_revision_root_revision(svn_fs_roo
 
 /** @} */
 
-
+
+
 /** Directory entry names and directory paths.
  *
  * Here are the rules for directory entry names, and directory paths:
@@ -1258,7 +1282,8 @@ svn_fs_revision_root_revision(svn_fs_roo
  */
 
 
-
+
+
 /** The kind of change that occurred on the path. */
 typedef enum svn_fs_path_change_kind_t
 {
@@ -1387,7 +1412,8 @@ svn_fs_paths_changed(apr_hash_t **change
 
 /** @} */
 
-
+
+
 /* Operations appropriate to all kinds of nodes.  */
 
 /** Set @a *kind_p to the type of node present at @a path under @a
@@ -1764,7 +1790,8 @@ svn_fs_merge(const char **conflict_p,
              apr_pool_t *pool);
 
 
-
+
+
 /* Directories.  */
 
 
@@ -1869,7 +1896,8 @@ svn_fs_revision_link(svn_fs_root_t *from
                      svn_fs_root_t *to_root,
                      const char *path,
                      apr_pool_t *pool);
-
+
+
 /* Files.  */
 
 /** Set @a *length_p to the length of the file @a path in @a root, in bytes.
@@ -2103,7 +2131,8 @@ svn_fs_contents_changed(svn_boolean_t *c
                         apr_pool_t *pool);
 
 
-
+
+
 /* Filesystem revisions.  */
 
 
@@ -2236,7 +2265,8 @@ svn_fs_change_rev_prop(svn_fs_t *fs,
                        apr_pool_t *pool);
 
 
-
+
+
 /* Computing deltas.  */
 
 
@@ -2258,7 +2288,8 @@ svn_fs_get_file_delta_stream(svn_txdelta
                              apr_pool_t *pool);
 
 
-
+
+
 /* UUID manipulation. */
 
 /** Populate @a *uuid with the UUID associated with @a fs.  Allocate
@@ -2278,13 +2309,15 @@ svn_fs_set_uuid(svn_fs_t *fs,
                 const char *uuid,
                 apr_pool_t *pool);
 
-
+
+
 /* Non-historical properties.  */
 
 /* [[Yes, do tell.]] */
 
 
-
+
+
 /** @defgroup svn_fs_locks Filesystem locks
  * @{
  * @since New in 1.2. */

Modified: subversion/trunk/subversion/libsvn_fs/fs-loader.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs/fs-loader.c?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.c Fri Jul 19 18:07:17 2013
@@ -787,8 +787,9 @@ svn_fs_begin_txn(svn_fs_txn_t **txn_p, s
 
 
 svn_error_t *
-svn_fs_commit_txn(const char **conflict_p, svn_revnum_t *new_rev,
-                  svn_fs_txn_t *txn, apr_pool_t *pool)
+svn_fs_commit_txn2(const char **conflict_p, svn_revnum_t *new_rev,
+                   svn_fs_txn_t *txn, svn_boolean_t set_timestamp,
+                   apr_pool_t *pool)
 {
   svn_error_t *err;
 
@@ -796,7 +797,7 @@ svn_fs_commit_txn(const char **conflict_
   if (conflict_p)
     *conflict_p = NULL;
 
-  err = txn->vtable->commit(conflict_p, new_rev, txn, pool);
+  err = txn->vtable->commit(conflict_p, new_rev, txn, set_timestamp, pool);
 
 #ifdef SVN_DEBUG
   /* Check postconditions. */
@@ -829,6 +830,12 @@ svn_fs_commit_txn(const char **conflict_
   return SVN_NO_ERROR;
 }
 
+svn_error_t *
+svn_fs_commit_txn(const char **conflict_p, svn_revnum_t *new_rev,
+                  svn_fs_txn_t *txn, apr_pool_t *pool)
+{
+  return svn_fs_commit_txn2(conflict_p, new_rev, txn, TRUE, pool);
+}
 
 svn_error_t *
 svn_fs_abort_txn(svn_fs_txn_t *txn, apr_pool_t *pool)

Modified: subversion/trunk/subversion/libsvn_fs/fs-loader.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs/fs-loader.h?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.h (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.h Fri Jul 19 18:07:17 2013
@@ -248,7 +248,8 @@ typedef struct fs_vtable_t
 typedef struct txn_vtable_t
 {
   svn_error_t *(*commit)(const char **conflict_p, svn_revnum_t *new_rev,
-                         svn_fs_txn_t *txn, apr_pool_t *pool);
+                         svn_fs_txn_t *txn, svn_boolean_t set_timestamp,
+                         apr_pool_t *pool);
   svn_error_t *(*abort)(svn_fs_txn_t *txn, apr_pool_t *pool);
   svn_error_t *(*get_prop)(svn_string_t **value_p, svn_fs_txn_t *txn,
                            const char *propname, apr_pool_t *pool);

Modified: subversion/trunk/subversion/libsvn_fs_base/dag.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/dag.c?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/dag.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/dag.c Fri Jul 19 18:07:17 2013
@@ -59,7 +59,8 @@
 
 #include "svn_private_config.h"
 
-
+
+
 /* Initializing a filesystem.  */
 
 struct dag_node_t
@@ -90,7 +91,8 @@ struct dag_node_t
 };
 
 
-
+
+
 /* Trivial helper/accessor functions. */
 svn_node_kind_t svn_fs_base__dag_node_kind(dag_node_t *node)
 {
@@ -265,7 +267,8 @@ svn_fs_base__dag_init_fs(svn_fs_t *fs)
 }
 
 
-
+
+
 /*** Directory node functions ***/
 
 /* Some of these are helpers for functions outside this section. */
@@ -538,7 +541,8 @@ svn_fs_base__dag_set_entry(dag_node_t *n
 }
 
 
-
+
+
 /*** Proplists. ***/
 
 svn_error_t *
@@ -669,7 +673,8 @@ svn_fs_base__dag_set_proplist(dag_node_t
 }
 
 
-
+
+
 /*** Roots. ***/
 
 svn_error_t *
@@ -1450,7 +1455,8 @@ svn_fs_base__dag_copy(dag_node_t *to_nod
 }
 
 
-
+
+
 /*** Deltification ***/
 
 /* Maybe change the representation identified by TARGET_REP_KEY to be
@@ -1569,17 +1575,18 @@ svn_fs_base__dag_index_checksums(dag_nod
 }
 
 
-
+
+
 /*** Committing ***/
 
 svn_error_t *
 svn_fs_base__dag_commit_txn(svn_revnum_t *new_rev,
                             svn_fs_txn_t *txn,
                             trail_t *trail,
+                            svn_boolean_t set_timestamp,
                             apr_pool_t *pool)
 {
   revision_t revision;
-  svn_string_t date;
   apr_hash_t *txnprops;
   svn_fs_t *fs = txn->fs;
   const char *txn_id = txn->id;
@@ -1605,15 +1612,22 @@ svn_fs_base__dag_commit_txn(svn_revnum_t
   SVN_ERR(svn_fs_base__txn_make_committed(fs, txn_id, *new_rev,
                                           trail, pool));
 
-  /* Set a date on the commit.  We wait until now to fetch the date,
-     so it's definitely newer than any previous revision's date. */
-  date.data = svn_time_to_cstring(apr_time_now(), pool);
-  date.len = strlen(date.data);
-  return svn_fs_base__set_rev_prop(fs, *new_rev, SVN_PROP_REVISION_DATE,
-                                   NULL, &date, trail, pool);
+  if (set_timestamp)
+    {
+      /* Set a date on the commit if requested.  We wait until now to fetch the
+         date, so it's definitely newer than any previous revision's date. */
+      svn_string_t date;
+      date.data = svn_time_to_cstring(apr_time_now(), pool);
+      date.len = strlen(date.data);
+      SVN_ERR(svn_fs_base__set_rev_prop(fs, *new_rev, SVN_PROP_REVISION_DATE,
+                                        NULL, &date, trail, pool));
+    }
+
+  return SVN_NO_ERROR;
 }
 
-
+
+
 /*** Comparison. ***/
 
 svn_error_t *
@@ -1657,7 +1671,8 @@ svn_fs_base__things_different(svn_boolea
 }
 
 
-
+
+
 /*** Mergeinfo tracking stuff ***/
 
 svn_error_t *

Modified: subversion/trunk/subversion/libsvn_fs_base/dag.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/dag.h?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/dag.h (original)
+++ subversion/trunk/subversion/libsvn_fs_base/dag.h Fri Jul 19 18:07:17 2013
@@ -273,12 +273,16 @@ svn_error_t *svn_fs_base__dag_clone_root
    latest revision in TXN->FS.  If the caller doesn't take care of this,
    you may lose people's work!
 
+   Update commit time to ensure that svn:date revprops remain ordered if
+   SET_TIMESTAMP is non-zero.
+
    Do any necessary temporary allocation in a subpool of POOL.
    Consume temporary space at most proportional to the maximum depth
    of SVN_TXN's tree of mutable nodes.  */
 svn_error_t *svn_fs_base__dag_commit_txn(svn_revnum_t *new_rev,
                                          svn_fs_txn_t *txn,
                                          trail_t *trail,
+                                         svn_boolean_t set_timestamp,
                                          apr_pool_t *pool);
 
 

Modified: subversion/trunk/subversion/libsvn_fs_base/tree.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/tree.c?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/tree.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/tree.c Fri Jul 19 18:07:17 2013
@@ -2560,6 +2560,7 @@ struct commit_args
 {
   svn_fs_txn_t *txn;
   svn_revnum_t new_rev;
+  svn_boolean_t set_timestamp;
 };
 
 
@@ -2619,7 +2620,7 @@ txn_body_commit(void *baton, trail_t *tr
 
   /* Else, commit the txn. */
   return svn_fs_base__dag_commit_txn(&(args->new_rev), txn, trail,
-                                     trail->pool);
+                                     args->set_timestamp, trail->pool);
 }
 
 
@@ -2629,6 +2630,7 @@ svn_error_t *
 svn_fs_base__commit_txn(const char **conflict_p,
                         svn_revnum_t *new_rev,
                         svn_fs_txn_t *txn,
+                        svn_boolean_t set_timestamp,
                         apr_pool_t *pool)
 {
   /* How do commits work in Subversion?
@@ -2732,6 +2734,7 @@ svn_fs_base__commit_txn(const char **con
 
       /* Try to commit. */
       commit_args.txn = txn;
+      commit_args.set_timestamp = set_timestamp;
       err = svn_fs_base__retry_txn(fs, txn_body_commit, &commit_args,
                                    FALSE, subpool);
       if (err && (err->apr_err == SVN_ERR_FS_TXN_OUT_OF_DATE))

Modified: subversion/trunk/subversion/libsvn_fs_base/tree.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/tree.h?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/tree.h (original)
+++ subversion/trunk/subversion/libsvn_fs_base/tree.h Fri Jul 19 18:07:17 2013
@@ -42,6 +42,7 @@ svn_error_t *svn_fs_base__deltify(svn_fs
 
 svn_error_t *svn_fs_base__commit_txn(const char **conflict_p,
                                      svn_revnum_t *new_rev, svn_fs_txn_t *txn,
+                                     svn_boolean_t set_timestamp,
                                      apr_pool_t *pool);
 
 svn_error_t *svn_fs_base__txn_root(svn_fs_root_t **root_p, svn_fs_txn_t *txn,

Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Fri Jul 19 18:07:17 2013
@@ -8492,6 +8492,7 @@ struct commit_baton {
   svn_revnum_t *new_rev_p;
   svn_fs_t *fs;
   svn_fs_txn_t *txn;
+  svn_boolean_t set_timestamp;
   apr_array_header_t *reps_to_cache;
   apr_hash_t *reps_hash;
   apr_pool_t *reps_pool;
@@ -8517,7 +8518,6 @@ commit_body(void *baton, apr_pool_t *poo
   apr_hash_t *txnprops;
   apr_array_header_t *txnprop_list;
   svn_prop_t prop;
-  svn_string_t date;
 
   /* Get the current youngest revision. */
   SVN_ERR(svn_fs_fs__youngest_rev(&old_rev, cb->fs, pool));
@@ -8638,12 +8638,18 @@ commit_body(void *baton, apr_pool_t *poo
      remove the transaction directory later. */
   SVN_ERR(unlock_proto_rev(cb->fs, cb->txn->id, proto_file_lockcookie, pool));
 
-  /* Update commit time to ensure that svn:date revprops remain ordered. */
-  date.data = svn_time_to_cstring(apr_time_now(), pool);
-  date.len = strlen(date.data);
+  /* Update commit time to ensure that svn:date revprops remain ordered if
+     requested. */
+  if (cb->set_timestamp)
+    {
+      svn_string_t date;
+
+      date.data = svn_time_to_cstring(apr_time_now(), pool);
+      date.len = strlen(date.data);
 
-  SVN_ERR(svn_fs_fs__change_txn_prop(cb->txn, SVN_PROP_REVISION_DATE,
-                                     &date, pool));
+      SVN_ERR(svn_fs_fs__change_txn_prop(cb->txn, SVN_PROP_REVISION_DATE,
+                                         &date, pool));
+    }
 
   /* Move the revprops file into place. */
   SVN_ERR_ASSERT(! is_packed_revprop(cb->fs, new_rev));
@@ -8697,6 +8703,7 @@ svn_error_t *
 svn_fs_fs__commit(svn_revnum_t *new_rev_p,
                   svn_fs_t *fs,
                   svn_fs_txn_t *txn,
+                  svn_boolean_t set_timestamp,
                   apr_pool_t *pool)
 {
   struct commit_baton cb;
@@ -8705,6 +8712,7 @@ svn_fs_fs__commit(svn_revnum_t *new_rev_
   cb.new_rev_p = new_rev_p;
   cb.fs = fs;
   cb.txn = txn;
+  cb.set_timestamp = set_timestamp;
 
   if (ffd->rep_sharing_allowed)
     {

Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h Fri Jul 19 18:07:17 2013
@@ -360,11 +360,13 @@ svn_error_t *svn_fs_fs__set_proplist(svn
 
 /* Commit the transaction TXN in filesystem FS and return its new
    revision number in *REV.  If the transaction is out of date, return
-   the error SVN_ERR_FS_TXN_OUT_OF_DATE.  Use POOL for temporary
-   allocations. */
+   the error SVN_ERR_FS_TXN_OUT_OF_DATE. Update commit time to ensure that
+   svn:date revprops remain ordered if SET_TIMESTAMP is non-zero. Use POOL for
+   temporary allocations. */
 svn_error_t *svn_fs_fs__commit(svn_revnum_t *new_rev_p,
                                svn_fs_t *fs,
                                svn_fs_txn_t *txn,
+                               svn_boolean_t set_timestamp,
                                apr_pool_t *pool);
 
 /* Return the next available copy_id in *COPY_ID for the transaction

Modified: subversion/trunk/subversion/libsvn_fs_fs/tree.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/tree.c?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/tree.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/tree.c Fri Jul 19 18:07:17 2013
@@ -2001,6 +2001,7 @@ svn_error_t *
 svn_fs_fs__commit_txn(const char **conflict_p,
                       svn_revnum_t *new_rev,
                       svn_fs_txn_t *txn,
+                      svn_boolean_t set_timestamp,
                       apr_pool_t *pool)
 {
   /* How do commits work in Subversion?
@@ -2097,7 +2098,7 @@ svn_fs_fs__commit_txn(const char **confl
       txn->base_rev = youngish_rev;
 
       /* Try to commit. */
-      err = svn_fs_fs__commit(new_rev, fs, txn, iterpool);
+      err = svn_fs_fs__commit(new_rev, fs, txn, set_timestamp, iterpool);
       if (err && (err->apr_err == SVN_ERR_FS_TXN_OUT_OF_DATE))
         {
           /* Did someone else finish committing a new revision while we

Modified: subversion/trunk/subversion/libsvn_fs_fs/tree.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/tree.h?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/tree.h (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/tree.h Fri Jul 19 18:07:17 2013
@@ -48,10 +48,12 @@ svn_error_t *svn_fs_fs__deltify(svn_fs_t
 /* Commit the transaction TXN as a new revision.  Return the new
    revision in *NEW_REV.  If the transaction conflicts with other
    changes return SVN_ERR_FS_CONFLICT and set *CONFLICT_P to a string
-   that details the cause of the conflict.  Perform temporary
-   allocations in POOL. */
+   that details the cause of the conflict.
+   Update commit time to ensure that svn:date revprops remain ordered if
+   SET_TIMESTAMP is non-zero. Perform temporary allocations in POOL. */
 svn_error_t *svn_fs_fs__commit_txn(const char **conflict_p,
                                    svn_revnum_t *new_rev, svn_fs_txn_t *txn,
+                                   svn_boolean_t set_timestamp,
                                    apr_pool_t *pool);
 
 /* Set ROOT_P to the root directory of transaction TXN.  Allocate the

Modified: subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c (original)
+++ subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c Fri Jul 19 18:07:17 2013
@@ -926,6 +926,15 @@ close_revision(void *baton)
   if (rb->skipped || (rb->rev <= 0))
     return SVN_NO_ERROR;
 
+  if (!rb->datestamp)
+    {
+      /* Remove 'svn:date' revision property that was set by FS layer when TXN
+         created if source dump doesn't have 'svn:date' property. */
+      svn_prop_t *prop = &APR_ARRAY_PUSH(rb->revprops, svn_prop_t);
+      prop->name = SVN_PROP_REVISION_DATE;
+      prop->value = NULL;
+    }
+
   /* Apply revision property changes. */
   if (rb->pb->validate_props)
     SVN_ERR(svn_repos_fs_change_txn_props(rb->txn, rb->revprops, rb->pool));
@@ -959,7 +968,8 @@ close_revision(void *baton)
     }
 
   /* Commit. */
-  err = svn_fs_commit_txn(&conflict_msg, &committed_rev, rb->txn, rb->pool);
+  err = svn_fs_commit_txn2(&conflict_msg, &committed_rev, rb->txn, FALSE,
+                           rb->pool);
   if (SVN_IS_VALID_REVNUM(committed_rev))
     {
       if (err)
@@ -1017,15 +1027,6 @@ close_revision(void *baton)
   /* Deltify the predecessors of paths changed in this revision. */
   SVN_ERR(svn_fs_deltify_revision(pb->fs, committed_rev, rb->pool));
 
-  /* Grrr, svn_fs_commit_txn rewrites the datestamp property to the
-     current clock-time.  We don't want that, we want to preserve
-     history exactly.  Good thing revision props aren't versioned!
-     Note that if rb->datestamp is NULL, that's fine -- if the dump
-     data doesn't carry a datestamp, we want to preserve that fact in
-     the load. */
-  SVN_ERR(change_rev_prop(pb->repos, committed_rev, SVN_PROP_REVISION_DATE,
-                          rb->datestamp, pb->validate_props, rb->pool));
-
   if (pb->notify_func)
     {
       pb->notify->action = svn_repos_notify_load_txn_committed;