Author: stefan2 Date: Wed Aug 4 18:56:24 2010 New Revision: 982360 URL: http://svn.apache.org/viewvc?rev=982360&view=rev Log: Introduce a process-global open file handle cache and make it available to FSFS code. A reference in fs_fs_data_t is used instead of a global "svn_get_fh_cache" function to allow for more fine-grained configuration in future.
* subversion/libsvn_fs_fs/fs.h (fs_fs_data_t): add file_handle_cache member; fix indentation * subversion/libsvn_fs_fs/caching.c (get_global_file_handle_cache): new function managing the cache singleton (svn_fs_fs__set_cache_config): auto-init the file handle cache as well (svn_fs_fs__initialize_caches): assign the file handle cache to the FSFS context Modified: subversion/branches/performance/subversion/libsvn_fs_fs/caching.c subversion/branches/performance/subversion/libsvn_fs_fs/fs.h Modified: subversion/branches/performance/subversion/libsvn_fs_fs/caching.c URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/libsvn_fs_fs/caching.c?rev=982360&r1=982359&r2=982360&view=diff ============================================================================== --- subversion/branches/performance/subversion/libsvn_fs_fs/caching.c (original) +++ subversion/branches/performance/subversion/libsvn_fs_fs/caching.c Wed Aug 4 18:56:24 2010 @@ -249,11 +249,25 @@ get_global_membuffer_cache(void) return cache; } -/* Set the current FSFS cache configuration. Apply it immediately to ensure - * thread-safety: since this function should be called from the processes' - * initialization code, no race with background / worker threads should occur. +/* Access the process-global (singleton) open file handle cache. The first + * call will automatically allocate the cache using the current cache config. + * Even for file handle limit of 0, a cache object will be returned. */ -void +static svn_file_handle_cache_t * +get_global_file_handle_cache(void) +{ + static svn_file_handle_cache_t *cache = NULL; + + if (!cache) + svn_file_handle_cache__create_cache(&cache, + cache_settings.file_handle_count, + !cache_settings.single_threaded, + svn_pool_create(NULL)); + + return cache; +} + +void svn_fs_fs__set_cache_config(const svn_fs_fs__cache_config_t *settings) { cache_settings = *settings; @@ -261,6 +275,9 @@ svn_fs_fs__set_cache_config(const svn_fs /* Allocate global membuffer cache as a side-effect. * Only the first call will actually take affect. */ get_global_membuffer_cache(); + + /* Same for the file handle cache. */ + get_global_file_handle_cache(); } svn_error_t * @@ -363,6 +380,7 @@ svn_fs_fs__initialize_caches(svn_fs_t *f SVN_ERR(svn_cache__set_error_handler(ffd->packed_offset_cache, warn_on_cache_errors, fs, pool)); + /* initialize fulltext cache as configured */ if (memcache) { SVN_ERR(svn_cache__create_memcache(&(ffd->fulltext_cache), @@ -395,5 +413,8 @@ svn_fs_fs__initialize_caches(svn_fs_t *f SVN_ERR(svn_cache__set_error_handler(ffd->fulltext_cache, warn_on_cache_errors, fs, pool)); + /* initialize file handle cache as configured */ + ffd->file_handle_cache = get_global_file_handle_cache(); + return SVN_NO_ERROR; } Modified: subversion/branches/performance/subversion/libsvn_fs_fs/fs.h URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/libsvn_fs_fs/fs.h?rev=982360&r1=982359&r2=982360&view=diff ============================================================================== --- subversion/branches/performance/subversion/libsvn_fs_fs/fs.h (original) +++ subversion/branches/performance/subversion/libsvn_fs_fs/fs.h Wed Aug 4 18:56:24 2010 @@ -34,6 +34,7 @@ #include "private/svn_cache.h" #include "private/svn_fs_private.h" #include "private/svn_sqlite.h" +#include "private/svn_file_handle_cache.h" #ifdef __cplusplus extern "C" { @@ -240,6 +241,9 @@ typedef struct pack files. */ svn_cache__t *packed_offset_cache; + /* Reference to the process-global open file handle cache */ + svn_file_handle_cache_t *file_handle_cache; + /* Data shared between all svn_fs_t objects for a given filesystem. */ fs_fs_shared_data_t *shared; @@ -249,14 +253,14 @@ typedef struct /* Thread-safe boolean */ svn_atomic_t rep_cache_db_opened; - /* The sqlite database used for revprops. */ - svn_sqlite__db_t *revprop_db; + /* The sqlite database used for revprops. */ + svn_sqlite__db_t *revprop_db; /* The oldest revision not in a pack file. */ svn_revnum_t min_unpacked_rev; - /* The oldest revision property not in a pack db. */ - svn_revnum_t min_unpacked_revprop; + /* The oldest revision property not in a pack db. */ + svn_revnum_t min_unpacked_revprop; /* Whether rep-sharing is supported by the filesystem * and allowed by the configuration. */