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