[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn commit: r981684 - in /subversion/branches/performance/subversion/libsvn_fs_fs: caching.c fs_fs.h

From: Blair Zajac <blair_at_orcaware.com>
Date: Tue, 03 Aug 2010 09:12:18 -0700

On 08/02/2010 01:51 PM, stefan2_at_apache.org wrote:
> Author: stefan2
> Date: Mon Aug 2 20:51:35 2010
> New Revision: 981684
>
> URL: http://svn.apache.org/viewvc?rev=981684&view=rev
> Log:
> Bring the membuffer cache to its first use for the full text cache.
> Also, provide functions to get / set the FSFS cache configuration
> although not all of it is supported, yet.
>

Stefan,

I appreciate you working on this, I'm looking forward to using these
improvements in production, which is why I'm closely looking at them.

> +/* Access to the cache settings as a process-wide singleton. */
> +static svn_fs_fs__cache_config_t *
> +internal_get_cache_config(void)
> +{
> + static svn_fs_fs__cache_config_t settings =
> + {
> + /* default configuration:
> + */
> + 0x8000000, /* 128 MB for caches */
> + 16, /* up to 16 files kept open */
> + FALSE, /* don't cache fulltexts */
> + FALSE, /* don't cache text deltas */
> + FALSE /* assume multi-threaded operation */
> + };
> +
> + return&settings;
> +}

Why not make "settings" static at file scope instead of inside this
function? What does this function provide for us?

> +/* Access the process-global (singleton) membuffer cache. The first call
> + * will automatically allocate the cache using the current cache config.
> + * NULL will be returned if the desired cache size is 0.
> + */
> +static svn_membuffer_t *
> +get_global_membuffer_cache(void)
> +{
> + static svn_membuffer_t *cache = NULL;
> +
> + apr_uint64_t cache_size = svn_fs_fs__get_cache_config()->cache_size;
> + if (!cache&& cache_size)

s/cache&&/cache &&/

> + {
> + /* auto-allocate cache*/
> + apr_allocator_t *allocator = NULL;
> + apr_pool_t *pool = NULL;
> +
> + if (apr_allocator_create(&allocator))
> + return NULL;
> +
> + /* ensure that a we free partially allocated data if we run OOM

s/a we/we/

> + * before the cache is complete.
> + */
> + apr_allocator_max_free_set(allocator, 1);
> + pool = svn_pool_create_ex(NULL, allocator);
> +
> + svn_cache__membuffer_cache_create
> + (&cache,
> + cache_size,
> + cache_size / 16,
> + ! svn_fs_fs__get_cache_config()->single_threaded,
> + pool);
> + }

So the allocator is associated with this pool forever then? So it
cannot be destroyed after

> - ffd->fulltext_cache = NULL;
> + {
> + ffd->fulltext_cache = NULL;
> + }
> +
> + if (ffd->fulltext_cache&& ! no_handler)

s/fulltext_cache&& ! no_handler/fulltext_cache && ! no_handler

> + SVN_ERR(svn_cache__set_error_handler(ffd->fulltext_cache,
> + warn_on_cache_errors, fs, pool));
>
> return SVN_NO_ERROR;
> }
>
> Modified: subversion/branches/performance/subversion/libsvn_fs_fs/fs_fs.h
> URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/libsvn_fs_fs/fs_fs.h?rev=981684&r1=981683&r2=981684&view=diff
> ==============================================================================
> --- subversion/branches/performance/subversion/libsvn_fs_fs/fs_fs.h (original)
> +++ subversion/branches/performance/subversion/libsvn_fs_fs/fs_fs.h Mon Aug 2 20:51:35 2010
> @@ -523,6 +523,39 @@ svn_fs_fs__get_node_origin(const svn_fs_
> svn_error_t *
> svn_fs_fs__initialize_caches(svn_fs_t *fs, apr_pool_t *pool);
>
> +/* FSFS cache settings. It controls what caches, in what size and
> + how they will be created. The settomgs apply for the whole process.

s/settomgs/settings/

> + */
> +typedef struct svn_fs_fs__cache_config_t
> +{
> + /* total cache size in bytes. May be 0, resulting in no cache being used */
> + apr_uint64_t cache_size;
> +
> + /* maximum number of files kept open */
> + apr_size_t file_handle_count;
> +
> + /* shall fulltexts be cached? */
> + svn_boolean_t cache_fulltexts;
> +
> + /* shall text deltas be cached? */
> + svn_boolean_t cache_txdeltas;
> +
> + /* is this a guaranteed single-threaded application? */
> + svn_boolean_t single_threaded;
> +} svn_fs_fs__cache_config_t;
> +
> +/* Get the current FSFS cache configuration. If it has not been set,
> + yet, this function will return the default settings.

s/yet,//

> + */
> +const svn_fs_fs__cache_config_t *
> +svn_fs_fs__get_cache_config(void);
> +
> +/* Set the FSFS cache configuration. Please note that it may not change
> + the actual configuration *in use*. Therefore, call it before reading
> + data from any FSFS repo and call it only once.

Should also document that this is not multi-threaded safe and does not
protect against races, just as you do at the functions implementation.

> + */
> +void
> +svn_fs_fs__set_cache_config(svn_fs_fs__cache_config_t *settings);

Instead of

   svn_fs_fs__cache_config_t *settings

make it const:

   const svn_fs_fs__cache_config_t *settings

Regards,
Blair
Received on 2010-08-03 18:13:01 CEST

This is an archived mail posted to the Subversion Dev mailing list.