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

Re: svn commit: r1241718 - in /subversion/trunk/subversion/libsvn_fs_fs: caching.c fs.h fs_fs.c

From: Daniel Shahaf <danielsh_at_elego.de>
Date: Thu, 9 Feb 2012 17:05:14 +0200

stefan2_at_apache.org wrote on Wed, Feb 08, 2012 at 00:44:26 -0000:
> Author: stefan2
> Date: Wed Feb 8 00:44:26 2012
> New Revision: 1241718
>
> URL: http://svn.apache.org/viewvc?rev=1241718&view=rev
> Log:
> Major improvement in delta window handling: Cache intermediate
> combined delta windows such that changes "close by" won't need
> to discover and read the whole chain again.
>
> For algorithms that traverse history linearly, this optimization
> gives delta combination an amortized constant runtime.
>
> For now, we only cache representations < 100kB. Support for larger
> reps can be added later.
>
> * subversion/libsvn_fs_fs/fs.h
> (fs_fs_data_t): add cache for combined windows
> * subversion/libsvn_fs_fs/caching.c
> (svn_fs_fs__initialize_caches): initialize that cache
>
> * subversion/libsvn_fs_fs/fs_fs.c
> (rep_state): add reference to new cache
> (create_rep_state_body): init that reference
> (rep_read_baton): add reference to cached base window
> (get_cached_combined_window, set_cached_combined_window):
> new utility functions
> (build_rep_list): terminate delta chain early if cached
> base window is available
> (rep_read_get_baton): adapt caller
> (get_combined_window): re-implement
> (get_contents): handle new special case; adapt to
> get_combined_window() signature changes
>
> 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
>

I haven't reviewed this, but a question:

> +/* Read the WINDOW_P for the rep state RS from the current FSFS session's
> + * cache. This will be a no-op and IS_CACHED will be set to FALSE if no
> + * cache has been given. If a cache is available IS_CACHED will inform
> + * the caller about the success of the lookup. Allocations (of the window
> + * in particualar) will be made from POOL.
> + */
> +static svn_error_t *
> +get_cached_combined_window(svn_stringbuf_t **window_p,
> + struct rep_state *rs,
> + svn_boolean_t *is_cached,
> + apr_pool_t *pool)
> +{
> + if (! rs->combined_cache)
> + {
> + /* txdelta window has not been enabled */
> + *is_cached = FALSE;
> + }
> + else
> + {
> + /* ask the cache for the desired txdelta window */
> + return svn_cache__get((void **)window_p,
> + is_cached,
> + rs->combined_cache,
> + get_window_key(rs, rs->start, pool),

How does the cache key identify the particular combined window being
cached?

get_window_key() may return "". If it returns "" when called as an
argument to svn_cache__set() and then also here, won't the cache return
a wrong result?

> + pool);
> + }
> +
> + return SVN_NO_ERROR;
> +}
> +
> +/* Store the WINDOW read at OFFSET for the rep state RS in the current
> + * FSFS session's cache. This will be a no-op if no cache has been given.
> + * Temporary allocations will be made from SCRATCH_POOL. */
> +static svn_error_t *
> +set_cached_combined_window(svn_stringbuf_t *window,
> + struct rep_state *rs,
> + apr_off_t offset,
> + apr_pool_t *scratch_pool)
> +{
> + if (rs->combined_cache)
> + {
> + /* but key it with the start offset because that is the known state
> + * when we will look it up */
> + return svn_cache__set(rs->combined_cache,
> + get_window_key(rs, offset, scratch_pool),
> + window,
> + scratch_pool);
> + }
> +
> + return SVN_NO_ERROR;
> +}
Received on 2012-02-09 16:07:46 CET

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