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 2015/10/30 00:58:55 UTC
svn commit: r1711388 - in /subversion/trunk/subversion/libsvn_fs_x: fs.c
fs_x.c fs_x.h hotcopy.c recovery.c
Author: stefan2
Date: Thu Oct 29 23:58:55 2015
New Revision: 1711388
URL: http://svn.apache.org/viewvc?rev=1711388&view=rev
Log:
Reduce the cost of creating a new repository in FSX.
Similar to svn_fs_x__write_format, don't fsync when writing the initial
uuid file.
* subversion/libsvn_fs_x/fs_x.h
(svn_fs_x__set_uuid): Add OVERWRITE parameter.
* subversion/libsvn_fs_x/fs_x.c
(svn_fs_x__create_file_tree): Update caller - request a fresh uuid file.
(svn_fs_x__set_uuid): Perform the expensive atomic replacement dance
only if the file already exists and may be read
by others.
* subversion/libsvn_fs_x/fs.c
(x_set_uuid): Update caller - modifying the existing file.
* subversion/libsvn_fs_x/hotcopy.c
(svn_fs_x__hotcopy): Same.
* subversion/libsvn_fs_x/recovery.c
(recover_body): Same.
Modified:
subversion/trunk/subversion/libsvn_fs_x/fs.c
subversion/trunk/subversion/libsvn_fs_x/fs_x.c
subversion/trunk/subversion/libsvn_fs_x/fs_x.h
subversion/trunk/subversion/libsvn_fs_x/hotcopy.c
subversion/trunk/subversion/libsvn_fs_x/recovery.c
Modified: subversion/trunk/subversion/libsvn_fs_x/fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/fs.c?rev=1711388&r1=1711387&r2=1711388&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_x/fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_x/fs.c Thu Oct 29 23:58:55 2015
@@ -265,7 +265,8 @@ x_set_uuid(svn_fs_t *fs,
{
/* Whenever we set a new UUID, imply that FS will also be a different
* instance (on formats that support this). */
- return svn_error_trace(svn_fs_x__set_uuid(fs, uuid, NULL, scratch_pool));
+ return svn_error_trace(svn_fs_x__set_uuid(fs, uuid, NULL, TRUE,
+ scratch_pool));
}
/* Wrapper around svn_fs_x__begin_txn() providing the scratch pool. */
Modified: subversion/trunk/subversion/libsvn_fs_x/fs_x.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/fs_x.c?rev=1711388&r1=1711387&r2=1711388&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_x/fs_x.c (original)
+++ subversion/trunk/subversion/libsvn_fs_x/fs_x.c Thu Oct 29 23:58:55 2015
@@ -974,7 +974,7 @@ svn_fs_x__create_file_tree(svn_fs_t *fs,
/* Create the 'uuid' file. */
SVN_ERR(svn_io_file_create_empty(svn_fs_x__path_lock(fs, scratch_pool),
scratch_pool));
- SVN_ERR(svn_fs_x__set_uuid(fs, NULL, NULL, scratch_pool));
+ SVN_ERR(svn_fs_x__set_uuid(fs, NULL, NULL, FALSE, scratch_pool));
/* Create the fsfs.conf file. */
SVN_ERR(write_config(fs, scratch_pool));
@@ -1056,6 +1056,7 @@ svn_error_t *
svn_fs_x__set_uuid(svn_fs_t *fs,
const char *uuid,
const char *instance_id,
+ svn_boolean_t overwrite,
apr_pool_t *scratch_pool)
{
svn_fs_x__data_t *ffd = fs->fsap_data;
@@ -1074,11 +1075,23 @@ svn_fs_x__set_uuid(svn_fs_t *fs,
svn_stringbuf_appendcstr(contents, "\n");
/* We use the permissions of the 'current' file, because the 'uuid'
- file does not exist during repository creation. */
- SVN_ERR(svn_io_write_atomic2(uuid_path, contents->data, contents->len,
- /* perms */
- svn_fs_x__path_current(fs, scratch_pool),
- TRUE, scratch_pool));
+ file does not exist during repository creation.
+
+ svn_io_write_atomic2() does a load of magic to allow it to
+ replace version files that already exist. We only need to do
+ that when we're allowed to overwrite an existing file. */
+ if (! overwrite)
+ {
+ /* Create the file */
+ SVN_ERR(svn_io_file_create(uuid_path, contents->data, scratch_pool));
+ }
+ else
+ {
+ SVN_ERR(svn_io_write_atomic2(uuid_path, contents->data, contents->len,
+ /* perms */
+ svn_fs_x__path_current(fs, scratch_pool),
+ TRUE, scratch_pool));
+ }
fs->uuid = apr_pstrdup(fs->pool, uuid);
ffd->instance_id = apr_pstrdup(fs->pool, instance_id);
Modified: subversion/trunk/subversion/libsvn_fs_x/fs_x.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/fs_x.h?rev=1711388&r1=1711387&r2=1711388&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_x/fs_x.h (original)
+++ subversion/trunk/subversion/libsvn_fs_x/fs_x.h Thu Oct 29 23:58:55 2015
@@ -148,11 +148,16 @@ svn_fs_x__create(svn_fs_t *fs,
/* Set the uuid of repository FS to UUID and the instance ID to INSTANCE_ID.
If any of them is NULL, use a newly generated UUID / ID instead.
+
+ If OVERWRITE is not set, the uuid file must not exist yet implying this
+ is a fresh repository.
+
Perform temporary allocations in SCRATCH_POOL. */
svn_error_t *
svn_fs_x__set_uuid(svn_fs_t *fs,
const char *uuid,
const char *instance_id,
+ svn_boolean_t overwrite,
apr_pool_t *scratch_pool);
/* Read the format number and maximum number of files per directory
Modified: subversion/trunk/subversion/libsvn_fs_x/hotcopy.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/hotcopy.c?rev=1711388&r1=1711387&r2=1711388&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_x/hotcopy.c (original)
+++ subversion/trunk/subversion/libsvn_fs_x/hotcopy.c Thu Oct 29 23:58:55 2015
@@ -750,7 +750,8 @@ svn_fs_x__hotcopy(svn_fs_t *src_fs,
/* Copy the UUID. Hotcopy destination receives a new instance ID, but
* has the same filesystem UUID as the source. */
- SVN_ERR(svn_fs_x__set_uuid(dst_fs, src_fs->uuid, NULL, scratch_pool));
+ SVN_ERR(svn_fs_x__set_uuid(dst_fs, src_fs->uuid, NULL, TRUE,
+ scratch_pool));
/* Remove revision 0 contents. Otherwise, it may not get overwritten
* due to having a newer timestamp. */
Modified: subversion/trunk/subversion/libsvn_fs_x/recovery.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/recovery.c?rev=1711388&r1=1711387&r2=1711388&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_x/recovery.c (original)
+++ subversion/trunk/subversion/libsvn_fs_x/recovery.c Thu Oct 29 23:58:55 2015
@@ -134,7 +134,7 @@ recover_body(void *baton,
/* The admin may have created a plain copy of this repo before attempting
to recover it (hotcopy may or may not work with corrupted repos).
Bump the instance ID. */
- SVN_ERR(svn_fs_x__set_uuid(fs, fs->uuid, NULL, scratch_pool));
+ SVN_ERR(svn_fs_x__set_uuid(fs, fs->uuid, NULL, TRUE, scratch_pool));
/* We need to know the largest revision in the filesystem. */
SVN_ERR(recover_get_largest_revision(fs, &max_rev, scratch_pool));