You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2014/04/22 21:15:43 UTC
svn commit: r1589254 - in /subversion/trunk/subversion:
libsvn_fs/fs-loader.c libsvn_fs/fs-loader.h libsvn_fs_base/fs.c
libsvn_fs_fs/fs.c libsvn_fs_x/fs.c
Author: stefan2
Date: Tue Apr 22 19:15:42 2014
New Revision: 1589254
URL: http://svn.apache.org/r1589254
Log:
Fix a race condition and pool lifetime issue between the FSFS / FSX'
svn_fs_hotcopy implementation and any other FS API call.
The problem is the access to the shared data struct hash. New entries
must be allocated in a process-global pool (COMMON_POOL) and any access
to it needs to be sync'ed properly (COMMON_POOL_LOCK).
* subversion/libsvn_fs/fs-loader.h
(fs_library_vtable_t): Add missing parameters to the hotcopy func.
It now is similar to all the other entries.
* subversion/libsvn_fs/fs-loader.c
(svn_fs_hotcopy2): Update the vtable caller.
* subversion/libsvn_fs_fs/fs.c
(fs_hotcopy): Update signature and use the extra params to open the source
repo using the properly synchronizing fs_open.
* subversion/libsvn_fs_x/fs.c
(x_hotcopy): Same.
* subversion/libsvn_fs_base/fs.c
(base_hotcopy): Update signature, but we don't need it extra params here.
Modified:
subversion/trunk/subversion/libsvn_fs/fs-loader.c
subversion/trunk/subversion/libsvn_fs/fs-loader.h
subversion/trunk/subversion/libsvn_fs_base/fs.c
subversion/trunk/subversion/libsvn_fs_fs/fs.c
subversion/trunk/subversion/libsvn_fs_x/fs.c
Modified: subversion/trunk/subversion/libsvn_fs/fs-loader.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs/fs-loader.c?rev=1589254&r1=1589253&r2=1589254&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.c Tue Apr 22 19:15:42 2014
@@ -663,7 +663,7 @@ svn_fs_hotcopy2(const char *src_path, co
SVN_ERR(vtable->hotcopy(src_fs, dst_fs, src_path, dst_path, clean,
incremental, cancel_func, cancel_baton,
- scratch_pool));
+ common_pool_lock, scratch_pool, common_pool));
return svn_error_trace(write_fs_type(dst_path, src_fs_type, scratch_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=1589254&r1=1589253&r2=1589254&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.h (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.h Tue Apr 22 19:15:42 2014
@@ -113,11 +113,17 @@ typedef struct fs_library_vtable_t
apr_pool_t *pool,
apr_pool_t *common_pool);
svn_error_t *(*delete_fs)(const char *path, apr_pool_t *pool);
- svn_error_t *(*hotcopy)(svn_fs_t *src_fs, svn_fs_t *dst_fs,
- const char *src_path, const char *dst_path,
- svn_boolean_t clean, svn_boolean_t incremental,
- svn_cancel_func_t cancel_func, void *cancel_baton,
- apr_pool_t *pool);
+ svn_error_t *(*hotcopy)(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ const char *src_path,
+ const char *dst_path,
+ svn_boolean_t clean,
+ svn_boolean_t incremental,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
+ apr_pool_t *common_pool);
const char *(*get_description)(void);
svn_error_t *(*recover)(svn_fs_t *fs,
svn_cancel_func_t cancel_func, void *cancel_baton,
Modified: subversion/trunk/subversion/libsvn_fs_base/fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/fs.c?rev=1589254&r1=1589253&r2=1589254&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/fs.c Tue Apr 22 19:15:42 2014
@@ -1293,7 +1293,9 @@ base_hotcopy(svn_fs_t *src_fs,
svn_boolean_t incremental,
svn_cancel_func_t cancel_func,
void *cancel_baton,
- apr_pool_t *pool)
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
+ apr_pool_t *common_pool)
{
svn_error_t *err;
u_int32_t pagesize;
Modified: subversion/trunk/subversion/libsvn_fs_fs/fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs.c?rev=1589254&r1=1589253&r2=1589254&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs.c Tue Apr 22 19:15:42 2014
@@ -394,13 +394,11 @@ fs_hotcopy(svn_fs_t *src_fs,
svn_boolean_t incremental,
svn_cancel_func_t cancel_func,
void *cancel_baton,
- apr_pool_t *pool)
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
+ apr_pool_t *common_pool)
{
- SVN_ERR(svn_fs__check_fs(src_fs, FALSE));
- SVN_ERR(initialize_fs_struct(src_fs));
- SVN_ERR(svn_fs_fs__open(src_fs, src_path, pool));
- SVN_ERR(svn_fs_fs__initialize_caches(src_fs, pool));
- SVN_ERR(fs_serialized_init(src_fs, pool, pool));
+ SVN_ERR(fs_open(src_fs, src_path, common_pool_lock, pool, common_pool));
SVN_ERR(svn_fs__check_fs(dst_fs, FALSE));
SVN_ERR(initialize_fs_struct(dst_fs));
Modified: subversion/trunk/subversion/libsvn_fs_x/fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/fs.c?rev=1589254&r1=1589253&r2=1589254&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_x/fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_x/fs.c Tue Apr 22 19:15:42 2014
@@ -381,13 +381,11 @@ x_hotcopy(svn_fs_t *src_fs,
svn_boolean_t incremental,
svn_cancel_func_t cancel_func,
void *cancel_baton,
- apr_pool_t *pool)
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
+ apr_pool_t *common_pool)
{
- SVN_ERR(svn_fs__check_fs(src_fs, FALSE));
- SVN_ERR(initialize_fs_struct(src_fs));
- SVN_ERR(svn_fs_x__open(src_fs, src_path, pool));
- SVN_ERR(svn_fs_x__initialize_caches(src_fs, pool));
- SVN_ERR(x_serialized_init(src_fs, pool, pool));
+ SVN_ERR(x_open(src_fs, src_path, common_pool_lock, pool, common_pool));
SVN_ERR(svn_fs__check_fs(dst_fs, FALSE));
SVN_ERR(initialize_fs_struct(dst_fs));