You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by da...@apache.org on 2013/03/28 13:05:27 UTC

svn commit: r1462062 - in /subversion/branches/verify-at-commit/subversion: libsvn_fs/fs-loader.c libsvn_fs/fs-loader.h libsvn_fs_base/fs.c libsvn_fs_fs/fs.c libsvn_fs_fs/fs.h libsvn_fs_fs/fs_fs.c

Author: danielsh
Date: Thu Mar 28 12:05:27 2013
New Revision: 1462062

URL: http://svn.apache.org/r1462062
Log:
On the verify-at-commit branch, add a backend-dependent implementation (FSFS):

This required devising a way for an FSAP backend to call svn_fs_open().

* subversion/libsvn_fs/fs-loader.h
  (fs_library_vtable_t.set_svn_fs_open): New API.

* subversion/libsvn_fs/fs-loader.c
  (svn_fs_create, svn_fs_open, svn_fs_create_berkeley, svn_fs_open_berkeley):
    Invoke it from all public APIs that create/populate an svn_fs_t.

* subversion/libsvn_fs_base/fs.c
  (base_set_svn_fs_open, library_vtable): Add no-op implementation.

* subversion/libsvn_fs_fs/fs.c
  (fs_set_svn_fs_open, library_vtable): Add non-no-op implementation, using..

* subversion/libsvn_fs_fs/fs.h
  (fs_fs_data_t.svn_fs_open_): .. this new struct member.
  
* subversion/libsvn_fs_fs/fs_fs.c
  (verify_as_revision_before_current_plus_plus): New.
  (commit_body): Call it.

Modified:
    subversion/branches/verify-at-commit/subversion/libsvn_fs/fs-loader.c
    subversion/branches/verify-at-commit/subversion/libsvn_fs/fs-loader.h
    subversion/branches/verify-at-commit/subversion/libsvn_fs_base/fs.c
    subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs.c
    subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs.h
    subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs_fs.c

Modified: subversion/branches/verify-at-commit/subversion/libsvn_fs/fs-loader.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-at-commit/subversion/libsvn_fs/fs-loader.c?rev=1462062&r1=1462061&r2=1462062&view=diff
==============================================================================
--- subversion/branches/verify-at-commit/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/branches/verify-at-commit/subversion/libsvn_fs/fs-loader.c Thu Mar 28 12:05:27 2013
@@ -479,6 +479,8 @@ svn_fs_create(svn_fs_t **fs_p, const cha
 
   SVN_MUTEX__WITH_LOCK(common_pool_lock,
                        vtable->create(*fs_p, path, pool, common_pool));
+  SVN_ERR(vtable->set_svn_fs_open(*fs_p, svn_fs_open));
+
   return SVN_NO_ERROR;
 }
 
@@ -503,6 +505,8 @@ svn_fs_open(svn_fs_t **fs_p, const char 
 
   SVN_MUTEX__WITH_LOCK(common_pool_lock,
                        vtable->open_fs(*fs_p, path, pool, common_pool));
+  SVN_ERR(vtable->set_svn_fs_open(*fs_p, svn_fs_open));
+
   return SVN_NO_ERROR;
 }
 
@@ -705,6 +709,8 @@ svn_fs_create_berkeley(svn_fs_t *fs, con
   /* Perform the actual creation. */
   SVN_MUTEX__WITH_LOCK(common_pool_lock,
                        vtable->create(fs, path, fs->pool, common_pool));
+  SVN_ERR(vtable->set_svn_fs_open(fs, svn_fs_open));
+
   return SVN_NO_ERROR;
 }
 
@@ -716,6 +722,8 @@ svn_fs_open_berkeley(svn_fs_t *fs, const
   SVN_ERR(fs_library_vtable(&vtable, path, fs->pool));
   SVN_MUTEX__WITH_LOCK(common_pool_lock,
                        vtable->open_fs(fs, path, fs->pool, common_pool));
+  SVN_ERR(vtable->set_svn_fs_open(fs, svn_fs_open));
+
   return SVN_NO_ERROR;
 }
 

Modified: subversion/branches/verify-at-commit/subversion/libsvn_fs/fs-loader.h
URL: http://svn.apache.org/viewvc/subversion/branches/verify-at-commit/subversion/libsvn_fs/fs-loader.h?rev=1462062&r1=1462061&r2=1462062&view=diff
==============================================================================
--- subversion/branches/verify-at-commit/subversion/libsvn_fs/fs-loader.h (original)
+++ subversion/branches/verify-at-commit/subversion/libsvn_fs/fs-loader.h Thu Mar 28 12:05:27 2013
@@ -124,6 +124,14 @@ typedef struct fs_library_vtable_t
      into the FS vtable. */
   svn_fs_id_t *(*parse_id)(const char *data, apr_size_t len,
                            apr_pool_t *pool);
+  /* Allow an FSAP to call svn_fs_open(), which is in a higher-level library
+     (libsvn_fs-1.so) and cannot easily be moved to libsvn_fs_util. */
+  svn_error_t *(*set_svn_fs_open)(svn_fs_t *fs,
+                                  svn_error_t *(*svn_fs_open_)(svn_fs_t **,
+                                                               const char *,
+                                                               apr_hash_t *,
+                                                               apr_pool_t *));
+
 } fs_library_vtable_t;
 
 /* This is the type of symbol an FS module defines to fetch the

Modified: subversion/branches/verify-at-commit/subversion/libsvn_fs_base/fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-at-commit/subversion/libsvn_fs_base/fs.c?rev=1462062&r1=1462061&r2=1462062&view=diff
==============================================================================
--- subversion/branches/verify-at-commit/subversion/libsvn_fs_base/fs.c (original)
+++ subversion/branches/verify-at-commit/subversion/libsvn_fs_base/fs.c Thu Mar 28 12:05:27 2013
@@ -1381,6 +1381,15 @@ base_get_description(void)
   return _("Module for working with a Berkeley DB repository.");
 }
 
+static svn_error_t *
+base_set_svn_fs_open(svn_fs_t *fs,
+                     svn_error_t *(*svn_fs_open_)(svn_fs_t **,
+                                                  const char *,
+                                                  apr_hash_t *,
+                                                  apr_pool_t *))
+{
+  return SVN_NO_ERROR;
+}
 
 
 /* Base FS library vtable, used by the FS loader library. */
@@ -1397,7 +1406,8 @@ static fs_library_vtable_t library_vtabl
   base_bdb_recover,
   base_bdb_pack,
   base_bdb_logfiles,
-  svn_fs_base__id_parse
+  svn_fs_base__id_parse,
+  base_set_svn_fs_open
 };
 
 svn_error_t *

Modified: subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs.c?rev=1462062&r1=1462061&r2=1462062&view=diff
==============================================================================
--- subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs.c (original)
+++ subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs.c Thu Mar 28 12:05:27 2013
@@ -400,6 +400,17 @@ fs_get_description(void)
   return _("Module for working with a plain file (FSFS) repository.");
 }
 
+static svn_error_t *
+fs_set_svn_fs_open(svn_fs_t *fs,
+                   svn_error_t *(*svn_fs_open_)(svn_fs_t **,
+                                                const char *,
+                                                apr_hash_t *,
+                                                apr_pool_t *))
+{
+  fs_fs_data_t *ffd = fs->fsap_data;
+  ffd->svn_fs_open_ = svn_fs_open_;
+  return SVN_NO_ERROR;
+}
 
 
 /* Base FS library vtable, used by the FS loader library. */
@@ -417,7 +428,8 @@ static fs_library_vtable_t library_vtabl
   svn_fs_fs__recover,
   fs_pack,
   fs_logfiles,
-  NULL /* parse_id */
+  NULL /* parse_id */,
+  fs_set_svn_fs_open
 };
 
 svn_error_t *

Modified: subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs.h?rev=1462062&r1=1462061&r2=1462062&view=diff
==============================================================================
--- subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs.h (original)
+++ subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs.h Thu Mar 28 12:05:27 2013
@@ -362,6 +362,10 @@ typedef struct fs_fs_data_t
   /* Maximum number of length of the linear part at the top of the
    * deltification history after which skip deltas will be used. */
   apr_int64_t max_linear_deltification;
+
+  /* Pointer to svn_fs_open. */
+  svn_error_t *(*svn_fs_open_)(svn_fs_t **, const char *, apr_hash_t *,
+                               apr_pool_t *);
 } fs_fs_data_t;
 
 

Modified: subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs_fs.c?rev=1462062&r1=1462061&r2=1462062&view=diff
==============================================================================
--- subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/branches/verify-at-commit/subversion/libsvn_fs_fs/fs_fs.c Thu Mar 28 12:05:27 2013
@@ -8262,6 +8262,44 @@ write_current(svn_fs_t *fs, svn_revnum_t
   return move_into_place(tmp_name, name, name, pool);
 }
 
+/* Open a new svn_fs_t handle to FS, set that handle's concept of "current
+   youngest revision" to NEW_REV, and call svn_fs_fs__verify_root() on
+   NEW_REV's revision root.
+
+   Intended to be called as the very last step in a commit before 'current'
+   is bumped.  This implies that we are holding the write lock. */
+static svn_error_t *
+verify_as_revision_before_current_plus_plus(svn_fs_t *fs,
+                                            svn_revnum_t new_rev,
+                                            apr_pool_t *pool)
+{
+  fs_fs_data_t *ffd = fs->fsap_data;
+  svn_fs_t *ft; /* fs++ == ft */
+  svn_fs_root_t *root;
+  fs_fs_data_t *ft_ffd;
+
+  /* ### TODO: skip the call at svn_fs_commit_txn() */
+  if (! fs->verify_at_commit)
+    return SVN_NO_ERROR;
+
+  SVN_ERR_ASSERT(ffd->svn_fs_open_);
+
+  SVN_ERR(ffd->svn_fs_open_(&ft, fs->path,
+                            NULL /* ### TODO fs_config */,
+                            pool));
+  ft_ffd = ft->fsap_data;
+
+  /* Time travel! */
+  ft_ffd->youngest_rev_cache = new_rev;
+
+  SVN_ERR(svn_fs_fs__revision_root(&root, ft, new_rev, pool));
+  SVN_ERR_ASSERT(root->is_txn_root == FALSE && root->rev == new_rev);
+  SVN_ERR_ASSERT(ft_ffd->youngest_rev_cache == new_rev);
+  SVN_ERR(svn_fs_fs__verify_root(root, pool));
+
+  return SVN_NO_ERROR;
+}
+
 /* Update the 'current' file to hold the correct next node and copy_ids
    from transaction TXN_ID in filesystem FS.  The current revision is
    set to REV.  Perform temporary allocations in POOL. */
@@ -8532,6 +8570,7 @@ commit_body(void *baton, apr_pool_t *poo
                           old_rev_filename, pool));
 
   /* Update the 'current' file. */
+  SVN_ERR(verify_as_revision_before_current_plus_plus(cb->fs, new_rev, pool));
   SVN_ERR(write_final_current(cb->fs, cb->txn->id, new_rev, start_node_id,
                               start_copy_id, pool));