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

Reply via email to