This patch combines all patches from the performance branch that implement the svnadmin command line UI part of the membuffer cache configuration. Revisions merged partially from /branches/performance (excluding all changes not related to the membuffer cache): 982057, 987886 * subversion/svnserve/server.h (serve_params_t): add cache size parameter * subversion/svnserve/main.c (svnserve__options): add "-M" parameter (main): initialize, parse and apply the new parameter git-svn-id: https://svn.apache.org/repos/asf/subversion/branches/integrate-cache-membuffer@998852 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/subversion/svnserve/main.c b/subversion/svnserve/main.c index 3273988..f52b6d7 100644 --- a/subversion/svnserve/main.c +++ b/subversion/svnserve/main.c
@@ -189,6 +189,16 @@ "at the same time is not supported in daemon mode.\n" " " "Use inetd mode or tunnel mode if you need this.]")}, + {"memory-cache-size", 'M', 1, + N_("size of the extra in-memory cache in MB used to\n" + " " + "minimize redundant operations.\n" + " " + "Default is 128 for threaded and 16 for non-\n" + " " + "threaded mode.\n" + " " + "[used for FSFS repositories only]")}, #ifdef CONNECTION_HAVE_THREAD_OPTION /* ### Making the assumption here that WIN32 never has fork and so * ### this option never exists when --service exists. */ @@ -431,6 +441,7 @@ params.pwdb = NULL; params.authzdb = NULL; params.log_file = NULL; + params.memory_cache_size = (apr_uint64_t)-1; while (1) { @@ -540,6 +551,10 @@ handling_mode = connection_mode_thread; break; + case 'M': + params.memory_cache_size = 0x100000 * apr_strtoi64(arg, NULL, 0); + break; + #ifdef WIN32 case SVNSERVE_OPT_SERVICE: if (run_mode != run_mode_service) @@ -786,6 +801,25 @@ winservice_running(); #endif + /* Configure FS caches for maximum efficiency with svnserve. + * For pre-forked (i.e. multi-processed) mode of operation, + * keep the per-process caches smaller than the default. + * Also, apply the respective command line parameters, if given. */ + { + svn_fs_cache_config_t settings = *svn_fs_get_cache_config(); + + if (params.memory_cache_size != -1) + settings.cache_size = params.memory_cache_size; + else if (handling_mode != connection_mode_thread) + settings.cache_size = 0x1000000; + + settings.cache_fulltexts = TRUE; + settings.cache_txdeltas = FALSE; + settings.single_threaded = handling_mode != connection_mode_thread; + + svn_fs_set_cache_config(&settings); + } + while (1) { #ifdef WIN32
diff --git a/subversion/svnserve/server.h b/subversion/svnserve/server.h index f567db8..8a4b396 100644 --- a/subversion/svnserve/server.h +++ b/subversion/svnserve/server.h
@@ -101,6 +101,9 @@ /* A filehandle open for writing logs to; possibly NULL. */ apr_file_t *log_file; + + /* Size of the in-memory cache (used by FSFS only). */ + apr_uint64_t memory_cache_size; } serve_params_t; /* Serve the connection CONN according to the parameters PARAMS. */