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 20:19:52 UTC

svn commit: r1589235 - in /subversion/trunk/subversion/libsvn_fs_fs: caching.c fs.h fs_fs.c hotcopy.c

Author: stefan2
Date: Tue Apr 22 18:19:52 2014
New Revision: 1589235

URL: http://svn.apache.org/r1589235
Log:
Parse and evaluate the FSFS config file once and store the individual
values in the private data struct.  We then no longer need to keep the
redundant svn_config_t instance around.

The only user of the config file is / was the cache configuration.
We move that bit to read_config() and extend fs_fs_data_t accordingly.

* subversion/libsvn_fs_fs/fs.h
  (fs_fs_data_t): Replace the CONFIG with the bits that we used to
                  read later from it but will now read immediately
                  with the rest of the settings.

* subversion/libsvn_fs_fs/fs_fs.c
  (read_config): Switch to two-pool paradigm to make FS->POOL available.
                 CONFIG is now a temporary and we need to fill more bits
                 in the FFD struct - code taken from caching.c:read_config.
  (svn_fs_fs__open,
   svn_fs_fs__create): Pass both, the FS->POOL as well as the temp POOL
                       to read_config.

* subversion/libsvn_fs_fs/caching.c
  (read_config): Remove the config struct access here.  Only process
                 settings passed to the FS struct here (no FSFS internals).
  (svn_fs_fs__initialize_caches): Get the info from the FFD struct now.

* subversion/libsvn_fs_fs/hotcopy.c
  (hotcopy_create_empty_dest): No CONFIG member to copy anymore.  The new
                               FFD members are not relevant for hotcopy.

Modified:
    subversion/trunk/subversion/libsvn_fs_fs/caching.c
    subversion/trunk/subversion/libsvn_fs_fs/fs.h
    subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
    subversion/trunk/subversion/libsvn_fs_fs/hotcopy.c

Modified: subversion/trunk/subversion/libsvn_fs_fs/caching.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/caching.c?rev=1589235&r1=1589234&r2=1589235&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/caching.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/caching.c Tue Apr 22 18:19:52 2014
@@ -66,32 +66,20 @@ normalize_key_part(const char *original,
   return normalized->data;
 }
 
-/* Return a memcache in *MEMCACHE_P for FS if it's configured to use
-   memcached, or NULL otherwise.  Also, sets *FAIL_STOP to a boolean
-   indicating whether cache errors should be returned to the caller or
-   just passed to the FS warning handler.
-
-   *CACHE_TXDELTAS, *CACHE_FULLTEXTS and *CACHE_REVPROPS flags will be set
+/* *CACHE_TXDELTAS, *CACHE_FULLTEXTS and *CACHE_REVPROPS flags will be set
    according to FS->CONFIG.  *CACHE_NAMESPACE receives the cache prefix
    to use.
 
    Use FS->pool for allocating the memcache and CACHE_NAMESPACE, and POOL
    for temporary allocations. */
 static svn_error_t *
-read_config(svn_memcache_t **memcache_p,
-            svn_boolean_t *fail_stop,
-            const char **cache_namespace,
+read_config(const char **cache_namespace,
             svn_boolean_t *cache_txdeltas,
             svn_boolean_t *cache_fulltexts,
             svn_boolean_t *cache_revprops,
             svn_fs_t *fs,
             apr_pool_t *pool)
 {
-  fs_fs_data_t *ffd = fs->fsap_data;
-
-  SVN_ERR(svn_cache__make_memcache_from_config(memcache_p, ffd->config,
-                                               fs->pool));
-
   /* No cache namespace by default.  I.e. all FS instances share the
    * cached data.  If you specify different namespaces, the data will
    * share / compete for the same cache memory but keys will not match
@@ -149,9 +137,7 @@ read_config(svn_memcache_t **memcache_p,
   else
     *cache_revprops = svn_named_atomic__is_efficient();
 
-  return svn_config_get_bool(ffd->config, fail_stop,
-                             CONFIG_SECTION_CACHES, CONFIG_OPTION_FAIL_STOP,
-                             FALSE);
+  return SVN_NO_ERROR;
 }
 
 
@@ -377,18 +363,15 @@ svn_fs_fs__initialize_caches(svn_fs_t *f
                                    "/", normalize_key_part(fs->path, pool),
                                    ":",
                                    SVN_VA_NULL);
-  svn_memcache_t *memcache;
   svn_membuffer_t *membuffer;
-  svn_boolean_t no_handler;
+  svn_boolean_t no_handler = ffd->fail_stop;
   svn_boolean_t cache_txdeltas;
   svn_boolean_t cache_fulltexts;
   svn_boolean_t cache_revprops;
   const char *cache_namespace;
 
   /* Evaluating the cache configuration. */
-  SVN_ERR(read_config(&memcache,
-                      &no_handler,
-                      &cache_namespace,
+  SVN_ERR(read_config(&cache_namespace,
                       &cache_txdeltas,
                       &cache_fulltexts,
                       &cache_revprops,
@@ -535,7 +518,7 @@ svn_fs_fs__initialize_caches(svn_fs_t *f
   if (cache_fulltexts)
     {
       SVN_ERR(create_cache(&(ffd->fulltext_cache),
-                           memcache,
+                           ffd->memcache,
                            membuffer,
                            0, 0, /* Do not use inprocess cache */
                            /* Values are svn_stringbuf_t */

Modified: subversion/trunk/subversion/libsvn_fs_fs/fs.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs.h?rev=1589235&r1=1589234&r2=1589235&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs.h (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs.h Tue Apr 22 18:19:52 2014
@@ -28,6 +28,7 @@
 #include <apr_network_io.h>
 #include <apr_md5.h>
 #include <apr_sha1.h>
+#include <apr_poll.h>
 
 #include "svn_fs.h"
 #include "svn_config.h"
@@ -315,13 +316,16 @@ typedef struct fs_fs_data_t
   /* The revision that was youngest, last time we checked. */
   svn_revnum_t youngest_rev_cache;
 
-  /* The fsfs.conf file, parsed.  Allocated in FS->pool. */
-  svn_config_t *config;
-
-  /* Caches of immutable data.  (Note that if these are created with
-     svn_cache__create_memcache, the data can be shared between
+  /* Caches of immutable data.  (Note that these may be shared between
      multiple svn_fs_t's for the same filesystem.) */
 
+  /* Access to the configured memcached instances.  May be NULL. */
+  svn_memcache_t *memcache;
+
+  /* If TRUE, don't ignore any cache-related errors.  If FALSE, errors from
+     e.g. memcached may be ignored as caching is an optional feature. */
+  svn_boolean_t fail_stop;
+
   /* A cache of revision root IDs, mapping from (svn_revnum_t *) to
      (svn_fs_id_t *).  (Not threadsafe.) */
   svn_cache__t *rev_root_id_cache;

Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c?rev=1589235&r1=1589234&r2=1589235&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Tue Apr 22 18:19:52 2014
@@ -628,20 +628,23 @@ svn_fs_fs__fs_supports_mergeinfo(svn_fs_
 }
 
 /* Read the configuration information of the file system at FS_PATH
- * and set the respective values in FFD.  Use POOL for allocations.
+ * and set the respective values in FFD.  Use pools as usual.
  */
 static svn_error_t *
 read_config(fs_fs_data_t *ffd,
             const char *fs_path,
-            apr_pool_t *pool)
+            apr_pool_t *result_pool,
+            apr_pool_t *scratch_pool)
 {
-  SVN_ERR(svn_config_read3(&ffd->config,
-                           svn_dirent_join(fs_path, PATH_CONFIG, pool),
-                           FALSE, FALSE, FALSE, pool));
+  svn_config_t *config;
+
+  SVN_ERR(svn_config_read3(&config,
+                           svn_dirent_join(fs_path, PATH_CONFIG, scratch_pool),
+                           FALSE, FALSE, FALSE, scratch_pool));
 
   /* Initialize ffd->rep_sharing_allowed. */
   if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT)
-    SVN_ERR(svn_config_get_bool(ffd->config, &ffd->rep_sharing_allowed,
+    SVN_ERR(svn_config_get_bool(config, &ffd->rep_sharing_allowed,
                                 CONFIG_SECTION_REP_SHARING,
                                 CONFIG_OPTION_ENABLE_REP_SHARING, TRUE));
   else
@@ -652,24 +655,24 @@ read_config(fs_fs_data_t *ffd,
     {
       apr_int64_t compression_level;
 
-      SVN_ERR(svn_config_get_bool(ffd->config, &ffd->deltify_directories,
+      SVN_ERR(svn_config_get_bool(config, &ffd->deltify_directories,
                                   CONFIG_SECTION_DELTIFICATION,
                                   CONFIG_OPTION_ENABLE_DIR_DELTIFICATION,
                                   TRUE));
-      SVN_ERR(svn_config_get_bool(ffd->config, &ffd->deltify_properties,
+      SVN_ERR(svn_config_get_bool(config, &ffd->deltify_properties,
                                   CONFIG_SECTION_DELTIFICATION,
                                   CONFIG_OPTION_ENABLE_PROPS_DELTIFICATION,
                                   TRUE));
-      SVN_ERR(svn_config_get_int64(ffd->config, &ffd->max_deltification_walk,
+      SVN_ERR(svn_config_get_int64(config, &ffd->max_deltification_walk,
                                    CONFIG_SECTION_DELTIFICATION,
                                    CONFIG_OPTION_MAX_DELTIFICATION_WALK,
                                    SVN_FS_FS_MAX_DELTIFICATION_WALK));
-      SVN_ERR(svn_config_get_int64(ffd->config, &ffd->max_linear_deltification,
+      SVN_ERR(svn_config_get_int64(config, &ffd->max_linear_deltification,
                                    CONFIG_SECTION_DELTIFICATION,
                                    CONFIG_OPTION_MAX_LINEAR_DELTIFICATION,
                                    SVN_FS_FS_MAX_LINEAR_DELTIFICATION));
 
-      SVN_ERR(svn_config_get_int64(ffd->config, &compression_level,
+      SVN_ERR(svn_config_get_int64(config, &compression_level,
                                    CONFIG_SECTION_DELTIFICATION,
                                    CONFIG_OPTION_COMPRESSION_LEVEL,
                                    SVN_DELTA_COMPRESSION_LEVEL_DEFAULT));
@@ -689,11 +692,11 @@ read_config(fs_fs_data_t *ffd,
   /* Initialize revprop packing settings in ffd. */
   if (ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
     {
-      SVN_ERR(svn_config_get_bool(ffd->config, &ffd->compress_packed_revprops,
+      SVN_ERR(svn_config_get_bool(config, &ffd->compress_packed_revprops,
                                   CONFIG_SECTION_PACKED_REVPROPS,
                                   CONFIG_OPTION_COMPRESS_PACKED_REVPROPS,
                                   TRUE));
-      SVN_ERR(svn_config_get_int64(ffd->config, &ffd->revprop_pack_size,
+      SVN_ERR(svn_config_get_int64(config, &ffd->revprop_pack_size,
                                    CONFIG_SECTION_PACKED_REVPROPS,
                                    CONFIG_OPTION_REVPROP_PACK_SIZE,
                                    ffd->compress_packed_revprops
@@ -710,15 +713,15 @@ read_config(fs_fs_data_t *ffd,
 
   if (ffd->format >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT)
     {
-      SVN_ERR(svn_config_get_int64(ffd->config, &ffd->block_size,
+      SVN_ERR(svn_config_get_int64(config, &ffd->block_size,
                                    CONFIG_SECTION_IO,
                                    CONFIG_OPTION_BLOCK_SIZE,
                                    64));
-      SVN_ERR(svn_config_get_int64(ffd->config, &ffd->l2p_page_size,
+      SVN_ERR(svn_config_get_int64(config, &ffd->l2p_page_size,
                                    CONFIG_SECTION_IO,
                                    CONFIG_OPTION_L2P_PAGE_SIZE,
                                    0x2000));
-      SVN_ERR(svn_config_get_int64(ffd->config, &ffd->p2l_page_size,
+      SVN_ERR(svn_config_get_int64(config, &ffd->p2l_page_size,
                                    CONFIG_SECTION_IO,
                                    CONFIG_OPTION_P2L_PAGE_SIZE,
                                    0x400));
@@ -736,7 +739,7 @@ read_config(fs_fs_data_t *ffd,
 
   if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
     {
-      SVN_ERR(svn_config_get_bool(ffd->config, &ffd->pack_after_commit,
+      SVN_ERR(svn_config_get_bool(config, &ffd->pack_after_commit,
                                   CONFIG_SECTION_DEBUG,
                                   CONFIG_OPTION_PACK_AFTER_COMMIT,
                                   FALSE));
@@ -746,6 +749,14 @@ read_config(fs_fs_data_t *ffd,
       ffd->pack_after_commit = FALSE;
     }
 
+  /* memcached configuration */
+  SVN_ERR(svn_cache__make_memcache_from_config(&ffd->memcache, config,
+                                               result_pool));
+
+  SVN_ERR(svn_config_get_bool(config, &ffd->fail_stop,
+                              CONFIG_SECTION_CACHES, CONFIG_OPTION_FAIL_STOP,
+                              FALSE));
+
   return SVN_NO_ERROR;
 }
 
@@ -991,7 +1002,7 @@ svn_fs_fs__open(svn_fs_t *fs, const char
     SVN_ERR(svn_fs_fs__update_min_unpacked_rev(fs, pool));
 
   /* Read the configuration file. */
-  SVN_ERR(read_config(ffd, fs->path, fs->pool));
+  SVN_ERR(read_config(ffd, fs->path, fs->pool, pool));
 
   return get_youngest(&(ffd->youngest_rev_cache), path, pool);
 }
@@ -1574,7 +1585,7 @@ svn_fs_fs__create(svn_fs_t *fs,
   if (ffd->format >= SVN_FS_FS__MIN_CONFIG_FILE)
     SVN_ERR(write_config(fs, pool));
 
-  SVN_ERR(read_config(ffd, fs->path, pool));
+  SVN_ERR(read_config(ffd, fs->path, fs->pool, pool));
 
   /* Create the min unpacked rev file. */
   if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)

Modified: subversion/trunk/subversion/libsvn_fs_fs/hotcopy.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/hotcopy.c?rev=1589235&r1=1589234&r2=1589235&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/hotcopy.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/hotcopy.c Tue Apr 22 18:19:52 2014
@@ -978,7 +978,6 @@ hotcopy_create_empty_dest(svn_fs_t *src_
 
   dst_ffd->max_files_per_dir = src_ffd->max_files_per_dir;
   dst_ffd->min_log_addressing_rev = src_ffd->min_log_addressing_rev;
-  dst_ffd->config = src_ffd->config;
   dst_ffd->format = src_ffd->format;
 
   /* Create the revision data directories. */