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));