Since the fsfs logics of rev-packing and revprop-packing are entirely
separate (e.g., min-unpacked-rev and min-unpacked-revprop are separate),
one could reasonably want to enable one without enabling the other. The
attached patch implements this.
I took it for a spin: it seems to work as intended on a test repository,
and the fs/repos C tests still pass.
Daniel
(Patch generated by 'svn diff -x-w' to make the next-to-last hunk
reviewable.)
[[[
Index: subversion/libsvn_fs_fs/fs.h
===================================================================
--- subversion/libsvn_fs_fs/fs.h (revision 908057)
+++ subversion/libsvn_fs_fs/fs.h (working copy)
@@ -85,6 +85,9 @@ extern "C" {
#define CONFIG_OPTION_FAIL_STOP "fail-stop"
#define CONFIG_SECTION_REP_SHARING "rep-sharing"
#define CONFIG_OPTION_ENABLE_REP_SHARING "enable-rep-sharing"
+#define CONFIG_SECTION_PACKING "packing"
+#define CONFIG_OPTION_PACK_REVS "pack-revision-shards"
+#define CONFIG_OPTION_PACK_REVPROPS "pack-revprop-shards"
/* The format number of this filesystem.
This is independent of the repository format number, and
@@ -257,6 +260,14 @@ typedef struct
/* Whether rep-sharing is supported by the filesystem
* and allowed by the configuration. */
svn_boolean_t rep_sharing_allowed;
+
+ /* Whether packing of revision shards is allowed by the configuration
+ * (regardless of the filesystem's format). */
+ svn_boolean_t may_pack_revs;
+
+ /* Whether packing of revprop shards is allowed by the configuration
+ * (regardless of the filesystem's format). */
+ svn_boolean_t may_pack_revprops;
} fs_fs_data_t;
Index: subversion/libsvn_fs_fs/fs_fs.c
===================================================================
--- subversion/libsvn_fs_fs/fs_fs.c (revision 908057)
+++ subversion/libsvn_fs_fs/fs_fs.c (working copy)
@@ -1096,6 +1096,14 @@ read_config(svn_fs_t *fs,
else
ffd->rep_sharing_allowed = FALSE;
+ /* Initialize packing configuration bits. */
+ SVN_ERR(svn_config_get_bool(ffd->config, &ffd->may_pack_revs,
+ CONFIG_SECTION_PACKING,
+ CONFIG_OPTION_PACK_REVS, TRUE));
+ SVN_ERR(svn_config_get_bool(ffd->config, &ffd->may_pack_revprops,
+ CONFIG_SECTION_PACKING,
+ CONFIG_OPTION_PACK_REVPROPS, TRUE));
+
return SVN_NO_ERROR;
}
@@ -1142,6 +1150,15 @@ write_config(svn_fs_t *fs,
"### be switched on and off at will, but for best space-saving results" NL
"### should be enabled consistently over the life of the repository." NL
"# " CONFIG_OPTION_ENABLE_REP_SHARING " = true" NL
+"" NL
+"[" CONFIG_SECTION_PACKING "]" NL
+"### The following parameters cause future runs of 'svnadmin pack' to skip" NL
+"### packing the revision shards or the revprop shards, respectively. They" NL
+"### have no effect on already-packed shards. They can be changed at any" NL
+"### time, but the change will only affect future runs; it will not affect" NL
+"### shards that had been packed previously." NL
+"# " CONFIG_OPTION_PACK_REVS " = true" NL
+"# " CONFIG_OPTION_PACK_REVPROPS " = true" NL
;
#undef NL
@@ -7496,6 +7513,7 @@ pack_body(void *baton,
const char *data_path, *revprops_path;
svn_revnum_t min_unpacked_rev;
svn_revnum_t min_unpacked_revprop;
+ fs_fs_data_t *ffd = pb->fs->fsap_data;
SVN_ERR(read_format(&format, &max_files_per_dir,
svn_dirent_join(pb->fs->path, PATH_FORMAT, pool),
@@ -7537,10 +7555,17 @@ pack_body(void *baton,
min_unpacked_revprop == (completed_shards * max_files_per_dir))
return SVN_NO_ERROR;
+ /* Are we allowed to do anything? */
+ if (ffd->may_pack_revs == FALSE && ffd->may_pack_revprops == FALSE)
+ return SVN_NO_ERROR;
+
data_path = svn_dirent_join(pb->fs->path, PATH_REVS_DIR, pool);
revprops_path = svn_dirent_join(pb->fs->path, PATH_REVPROPS_DIR, pool);
iterpool = svn_pool_create(pool);
+
+ SVN_ERR_ASSERT(format >= SVN_FS_FS__MIN_PACKED_FORMAT);
+ if (ffd->may_pack_revs)
for (i = min_unpacked_rev / max_files_per_dir; i < completed_shards; i++)
{
svn_pool_clear(iterpool);
@@ -7553,7 +7578,7 @@ pack_body(void *baton,
pb->cancel_func, pb->cancel_baton, iterpool));
}
- if (format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
+ if (format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT && ffd->may_pack_revprops)
for (i = min_unpacked_revprop / max_files_per_dir; i < completed_shards; i++)
{
svn_pool_clear(iterpool);
]]]
Received on 2010-02-09 16:32:48 CET