Author: ivan
Date: Fri Jan 8 12:28:35 2016
New Revision: 1723715
URL: http://svn.apache.org/viewvc?rev=1723715&view=rev
Log:
Add runtime configuration option to enable FSFS node properties caching
without enabling full-texts caching.
* subversion/include/svn_fs.h
(SVN_FS_CONFIG_FSFS_CACHE_NODEPROPS): New.
* subversion/libsvn_fs_fs/caching.c
(read_config): Parse SVN_FS_CONFIG_FSFS_CACHE_NODEPROPS FS config flag.
(svn_fs_fs__initialize_caches): Enable node properties caching if needed.
* subversion/mod_dav_svn/dav_svn.h
(dav_svn__get_nodeprop_cache_flag): New.
* subversion/mod_dav_svn/mod_dav_svn.c
(dir_conf_t): Add NODEPROP_CACHE member.
(merge_dir_config): Merge NODEPROP_CACHE setting.
(SVNCacheNodeProps_cmd): New.
(dav_svn__get_nodeprop_cache_flag): New.
(cmds): Add SVNCacheNodeProps directive.
* subversion/mod_dav_svn/repos.c
(get_resource): Pass node properties caching setting to svn_repos_open3().
* subversion/svnadmin/svnadmin.c
(open_repos): Enable node properties caching to match Subversion 1.9.0
behavior.
* subversion/svnserve/svnserve.c
(SVNSERVE_OPT_CACHE_NODEPROPS): New.
(svnserve__options): Add '--cache-nodeprops' command line parameter.
(sub_main): Handle '--cache-nodeprops' command line parameter.
* subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c
(fuzzing_1_byte_1_rev): Enable node properties caching to match
Subversion 1.9.0 behavior.
Modified:
subversion/trunk/subversion/include/svn_fs.h
subversion/trunk/subversion/libsvn_fs_fs/caching.c
subversion/trunk/subversion/mod_dav_svn/dav_svn.h
subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c
subversion/trunk/subversion/mod_dav_svn/repos.c
subversion/trunk/subversion/svnadmin/svnadmin.c
subversion/trunk/subversion/svnserve/svnserve.c
subversion/trunk/subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c
Modified: subversion/trunk/subversion/include/svn_fs.h
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_fs.h?rev=1723715&r1=1723714&r2=1723715&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_fs.h (original)
+++ subversion/trunk/subversion/include/svn_fs.h Fri Jan 8 12:28:35 2016
@@ -134,6 +134,12 @@ typedef struct svn_fs_t svn_fs_t;
*/
#define SVN_FS_CONFIG_FSFS_CACHE_NS "fsfs-cache-namespace"
+/** Enable / disable caching of node properties for a FSFS repository.
+ *
+ * @since New in 1.10.
+ */
+#define SVN_FS_CONFIG_FSFS_CACHE_NODEPROPS "fsfs-cache-nodeprops"
+
/** Enable / disable the FSFS format 7 "block read" feature.
*
* @since New in 1.9.
Modified: subversion/trunk/subversion/libsvn_fs_fs/caching.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/caching.c?rev=1723715&r1=1723714&r2=1723715&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/caching.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/caching.c Fri Jan 8 12:28:35 2016
@@ -66,8 +66,9 @@ normalize_key_part(const char *original,
return normalized->data;
}
-/* *CACHE_TXDELTAS, *CACHE_FULLTEXTS flags will be set according to
- FS->CONFIG. *CACHE_NAMESPACE receives the cache prefix to use.
+/* *CACHE_TXDELTAS, *CACHE_FULLTEXTS, *CACHE_NODEPROPS 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. */
@@ -75,6 +76,7 @@ static svn_error_t *
read_config(const char **cache_namespace,
svn_boolean_t *cache_txdeltas,
svn_boolean_t *cache_fulltexts,
+ svn_boolean_t *cache_nodeprops,
svn_fs_t *fs,
apr_pool_t *pool)
{
@@ -117,6 +119,14 @@ read_config(const char **cache_namespace
SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS,
TRUE);
+ /* by default, cache nodeprops: this will match pre-1.10
+ * behavior where node properties caching was controlled
+ * by SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS configuration option.
+ */
+ *cache_nodeprops
+ = svn_hash__get_bool(fs->config,
+ SVN_FS_CONFIG_FSFS_CACHE_NODEPROPS,
+ TRUE);
return SVN_NO_ERROR;
}
@@ -353,6 +363,7 @@ svn_fs_fs__initialize_caches(svn_fs_t *f
svn_boolean_t no_handler = ffd->fail_stop;
svn_boolean_t cache_txdeltas;
svn_boolean_t cache_fulltexts;
+ svn_boolean_t cache_nodeprops;
const char *cache_namespace;
svn_boolean_t has_namespace;
@@ -360,6 +371,7 @@ svn_fs_fs__initialize_caches(svn_fs_t *f
SVN_ERR(read_config(&cache_namespace,
&cache_txdeltas,
&cache_fulltexts,
+ &cache_nodeprops,
fs,
pool));
@@ -538,21 +550,6 @@ svn_fs_fs__initialize_caches(svn_fs_t *f
no_handler,
fs->pool, pool));
- SVN_ERR(create_cache(&(ffd->properties_cache),
- NULL,
- membuffer,
- 0, 0, /* Do not use the inprocess cache */
- svn_fs_fs__serialize_properties,
- svn_fs_fs__deserialize_properties,
- sizeof(pair_cache_key_t),
- apr_pstrcat(pool, prefix, "PROP",
- SVN_VA_NULL),
- SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
- has_namespace,
- fs,
- no_handler,
- fs->pool, pool));
-
SVN_ERR(create_cache(&(ffd->mergeinfo_cache),
NULL,
membuffer,
@@ -586,11 +583,33 @@ svn_fs_fs__initialize_caches(svn_fs_t *f
else
{
ffd->fulltext_cache = NULL;
- ffd->properties_cache = NULL;
ffd->mergeinfo_cache = NULL;
ffd->mergeinfo_existence_cache = NULL;
}
+ /* if enabled, cache node properties */
+ if (cache_nodeprops)
+ {
+ SVN_ERR(create_cache(&(ffd->properties_cache),
+ NULL,
+ membuffer,
+ 0, 0, /* Do not use the inprocess cache */
+ svn_fs_fs__serialize_properties,
+ svn_fs_fs__deserialize_properties,
+ sizeof(pair_cache_key_t),
+ apr_pstrcat(pool, prefix, "PROP",
+ SVN_VA_NULL),
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
+ has_namespace,
+ fs,
+ no_handler,
+ fs->pool, pool));
+ }
+ else
+ {
+ ffd->properties_cache = NULL;
+ }
+
/* if enabled, cache text deltas and their combinations */
if (cache_txdeltas)
{
Modified: subversion/trunk/subversion/mod_dav_svn/dav_svn.h
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/dav_svn.h?rev=1723715&r1=1723714&r2=1723715&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/dav_svn.h (original)
+++ subversion/trunk/subversion/mod_dav_svn/dav_svn.h Fri Jan 8 12:28:35 2016
@@ -336,6 +336,10 @@ svn_boolean_t dav_svn__get_fulltext_cach
/* for the repository referred to by this request, is revprop caching active?
*/
svn_boolean_t dav_svn__get_revprop_cache_flag(request_rec *r);
+/* for the repository referred to by this request, is node prop caching
active? */
+svn_boolean_t
+dav_svn__get_nodeprop_cache_flag(request_rec *r);
+
/* has block read mode been enabled for the repository referred to by this
* request? */
svn_boolean_t dav_svn__get_block_read_flag(request_rec *r);
Modified: subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c?rev=1723715&r1=1723714&r2=1723715&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c Fri Jan 8 12:28:35
2016
@@ -105,6 +105,7 @@ typedef struct dir_conf_t {
enum conf_flag txdelta_cache; /* whether to enable txdelta caching */
enum conf_flag fulltext_cache; /* whether to enable fulltext caching */
enum conf_flag revprop_cache; /* whether to enable revprop caching */
+ enum conf_flag nodeprop_cache; /* whether to enable nodeprop caching */
enum conf_flag block_read; /* whether to enable block read mode */
const char *hooks_env; /* path to hook script env config file */
} dir_conf_t;
@@ -240,6 +241,7 @@ create_dir_config(apr_pool_t *p, char *d
conf->v2_protocol = CONF_FLAG_DEFAULT;
conf->hooks_env = NULL;
conf->txdelta_cache = CONF_FLAG_DEFAULT;
+ conf->nodeprop_cache = CONF_FLAG_DEFAULT;
return conf;
}
@@ -270,6 +272,7 @@ merge_dir_config(apr_pool_t *p, void *ba
newconf->txdelta_cache = INHERIT_VALUE(parent, child, txdelta_cache);
newconf->fulltext_cache = INHERIT_VALUE(parent, child, fulltext_cache);
newconf->revprop_cache = INHERIT_VALUE(parent, child, revprop_cache);
+ newconf->nodeprop_cache = INHERIT_VALUE(parent, child, nodeprop_cache);
newconf->block_read = INHERIT_VALUE(parent, child, block_read);
newconf->root_dir = INHERIT_VALUE(parent, child, root_dir);
newconf->hooks_env = INHERIT_VALUE(parent, child, hooks_env);
@@ -567,6 +570,19 @@ SVNCacheRevProps_cmd(cmd_parms *cmd, voi
}
static const char *
+SVNCacheNodeProps_cmd(cmd_parms *cmd, void *config, int arg)
+{
+ dir_conf_t *conf = config;
+
+ if (arg)
+ conf->nodeprop_cache = CONF_FLAG_ON;
+ else
+ conf->nodeprop_cache = CONF_FLAG_OFF;
+
+ return NULL;
+}
+
+static const char *
SVNBlockRead_cmd(cmd_parms *cmd, void *config, int arg)
{
dir_conf_t *conf = config;
@@ -991,6 +1007,15 @@ dav_svn__get_revprop_cache_flag(request_
return conf->revprop_cache == CONF_FLAG_ON;
}
+svn_boolean_t
+dav_svn__get_nodeprop_cache_flag(request_rec *r)
+{
+ dir_conf_t *conf;
+
+ conf = ap_get_module_config(r->per_dir_config, &dav_svn_module);
+ /* node properties caching is enabled by default. */
+ return get_conf_flag(conf->nodeprop_cache, FALSE);
+}
svn_boolean_t
dav_svn__get_block_read_flag(request_rec *r)
@@ -1343,6 +1368,13 @@ static const command_rec cmds[] =
"(default is Off)."),
/* per directory/location */
+ AP_INIT_FLAG("SVNCacheNodeProps", SVNCacheNodeProps_cmd, NULL,
+ ACCESS_CONF|RSRC_CONF,
+ "speeds up data access by caching node properties "
+ "if sufficient in-memory cache is available"
+ "(default is On)."),
+
+ /* per directory/location */
AP_INIT_FLAG("SVNBlockRead", SVNBlockRead_cmd, NULL,
ACCESS_CONF|RSRC_CONF,
"speeds up operations of FSFS 1.9+ repositories if large"
Modified: subversion/trunk/subversion/mod_dav_svn/repos.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/repos.c?rev=1723715&r1=1723714&r2=1723715&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/repos.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/repos.c Fri Jan 8 12:28:35 2016
@@ -2369,6 +2369,8 @@ get_resource(request_rec *r,
dav_svn__get_fulltext_cache_flag(r) ? "1" :"0");
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS,
dav_svn__get_revprop_cache_flag(r) ? "2" :"0");
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NODEPROPS,
+ dav_svn__get_nodeprop_cache_flag(r) ? "1" :"0");
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_BLOCK_READ,
dav_svn__get_block_read_flag(r) ? "1" :"0");
Modified: subversion/trunk/subversion/svnadmin/svnadmin.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/svnadmin/svnadmin.c?rev=1723715&r1=1723714&r2=1723715&view=diff
==============================================================================
--- subversion/trunk/subversion/svnadmin/svnadmin.c (original)
+++ subversion/trunk/subversion/svnadmin/svnadmin.c Fri Jan 8 12:28:35 2016
@@ -126,6 +126,7 @@ open_repos(svn_repos_t **repos,
apr_hash_t *fs_config = apr_hash_make(pool);
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_DELTAS, "1");
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS, "1");
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NODEPROPS, "1");
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS, "2");
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NS,
svn_uuid_generate(pool));
Modified: subversion/trunk/subversion/svnserve/svnserve.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/svnserve/svnserve.c?rev=1723715&r1=1723714&r2=1723715&view=diff
==============================================================================
--- subversion/trunk/subversion/svnserve/svnserve.c (original)
+++ subversion/trunk/subversion/svnserve/svnserve.c Fri Jan 8 12:28:35 2016
@@ -221,6 +221,7 @@ void winservice_notify_stop(void)
#define SVNSERVE_OPT_BLOCK_READ 273
#define SVNSERVE_OPT_MAX_REQUEST 274
#define SVNSERVE_OPT_MAX_RESPONSE 275
+#define SVNSERVE_OPT_CACHE_NODEPROPS 276
/* Text macro because we can't use #ifdef sections inside a N_("...")
macro expansion. */
@@ -318,6 +319,12 @@ static const apr_getopt_option_t svnserv
"Default is no.\n"
" "
"[used for FSFS and FSX repositories only]")},
+ {"cache-nodeprops", SVNSERVE_OPT_CACHE_NODEPROPS, 1,
+ N_("enable or disable caching of node properties\n"
+ " "
+ "Default is yes.\n"
+ " "
+ "[used for FSFS repositories only]")},
{"client-speed", SVNSERVE_OPT_CLIENT_SPEED, 1,
N_("Optimize network handling based on the assumption\n"
" "
@@ -714,6 +721,7 @@ sub_main(int *exit_code, int argc, const
svn_boolean_t is_multi_threaded;
enum connection_handling_mode handling_mode = CONNECTION_DEFAULT;
svn_boolean_t cache_fulltexts = TRUE;
+ svn_boolean_t cache_nodeprops = TRUE;
svn_boolean_t cache_txdeltas = TRUE;
svn_boolean_t cache_revprops = FALSE;
svn_boolean_t use_block_read = FALSE;
@@ -906,6 +914,10 @@ sub_main(int *exit_code, int argc, const
cache_revprops = svn_tristate__from_word(arg) == svn_tristate_true;
break;
+ case SVNSERVE_OPT_CACHE_NODEPROPS:
+ cache_nodeprops = svn_tristate__from_word(arg) == svn_tristate_true;
+ break;
+
case SVNSERVE_OPT_BLOCK_READ:
use_block_read = svn_tristate__from_word(arg) == svn_tristate_true;
break;
@@ -1024,6 +1036,8 @@ sub_main(int *exit_code, int argc, const
cache_txdeltas ? "1" :"0");
svn_hash_sets(params.fs_config, SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS,
cache_fulltexts ? "1" :"0");
+ svn_hash_sets(params.fs_config, SVN_FS_CONFIG_FSFS_CACHE_NODEPROPS,
+ cache_nodeprops ? "1" :"0");
svn_hash_sets(params.fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS,
cache_revprops ? "2" :"0");
svn_hash_sets(params.fs_config, SVN_FS_CONFIG_FSFS_BLOCK_READ,
Modified: subversion/trunk/subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c?rev=1723715&r1=1723714&r2=1723715&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c Fri Jan
8 12:28:35 2016
@@ -86,6 +86,7 @@ fuzzing_1_byte_1_rev(const char *repo_na
fs_config = apr_hash_make(pool);
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_DELTAS, "1");
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS, "1");
+ svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_NODEPROPS, "1");
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS, "2");
svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_BLOCK_READ, "0");