Stefan Fuhrmann wrote on Sun, May 15, 2011 at 18:17:22 +0200: > On 14.05.2011 03:54, Daniel Shahaf wrote: >> stef...@apache.org wrote on Sun, Apr 17, 2011 at 14:48:34 -0000: >>> Author: stefan2 >>> Date: Sun Apr 17 14:48:33 2011 >>> New Revision: 1094150 >>> >>> URL: http://svn.apache.org/viewvc?rev=1094150&view=rev >>> Log: >>> Support concurrent transactions on FSFS: reset txn-local caches upon >>> closing the txn (i.e. don't wait until pool cleanup) and support concurrency >>> by simply disabling these caches permanently for the respective session >>> once a concurrency has been detected. >>> >>> + struct txn_cleanup_baton_t *baton; >>> + >>> + baton = apr_palloc(pool, sizeof(*baton)); >>> + baton->txn_cache = *cache; >>> + baton->to_reset = cache; >>> + >>> + apr_pool_cleanup_register(pool, >>> + baton, >>> + remove_txn_cache, >>> + apr_pool_cleanup_null); >>> + } >>> + >>> + return SVN_NO_ERROR; >>> +} >>> + >>> svn_error_t * >>> svn_fs_fs__initialize_txn_caches(svn_fs_t *fs, >>> const char *txn_id, >>> @@ -361,9 +395,15 @@ svn_fs_fs__initialize_txn_caches(svn_fs_ >>> ":", svn_uuid_generate(pool), ":", >>> (char *)NULL); >>> >>> - /* There must be no concurrent transactions in progress for the same >>> - FSFS access / session object. Maybe, you forgot to clean POOL. */ >>> - SVN_ERR_ASSERT(ffd->txn_dir_cache == NULL); >>> + /* We don't support caching for concurrent transactions in the SAME >>> + * FSFS session. Maybe, you forgot to clean POOL. */ >>> + if (ffd->txn_dir_cache != NULL || ffd->concurrent_transactions) >>> + { >>> + ffd->txn_dir_cache = NULL; >>> + ffd->concurrent_transactions = TRUE; >>> + >>> + return SVN_NO_ERROR; >>> + } >>> >> Why is this safe? >> >> Is it because svn_fs_fs__initialize_txn_caches() is called from all the >> relevant codepaths? (presumably the relevant codepaths are those that >> create txns) > Correct. The assumption that is being made here is that either > > * transactions won't use txn-local caches without previously > calling svn_fs_fs__initialize_txn_caches, or > * no two transactions are being run concurrently within the > same FSFS session. >
Okay. There is only one code path that initializes txn's, so I'm not too worried about documenting this centrally... But: the call in make_txn_root() to svn_fs_fs__initialize_txn_caches() is missing an SVN_ERR() wrapper. Could you look into these please? (I've fixed *all* instances in the code a while back using vim+gcc --- I'd be happy not to see more instances added :-)) > Otherwise, one txn might read from a different txn's caches. > I say caches here for generality. Currently, there is at most > one such cache. >>> /* create a txn-local directory cache */ >>> if (svn_fs__get_global_membuffer_cache()) >>> @@ -386,10 +426,17 @@ svn_fs_fs__initialize_txn_caches(svn_fs_ >>> pool)); >>> >>> /* reset the transaction-specific cache if the pool gets cleaned up. */ >>> - apr_pool_cleanup_register(pool, >>> -&(ffd->txn_dir_cache), >>> - remove_txn_cache, >>> - apr_pool_cleanup_null); >>> + init_txn_callbacks(&(ffd->txn_dir_cache), pool); >>> >>> return SVN_NO_ERROR; >>> } >>> + >>> +void >>> +svn_fs_fs__reset_txn_caches(svn_fs_t *fs) >>> +{ >>> + /* we can always just reset the caches. This may degrade performance but >>> + * can never cause in incorrect behavior. */ >>> + >>> + fs_fs_data_t *ffd = fs->fsap_data; >>> + ffd->txn_dir_cache = NULL; >>> +} >>> \ No newline at end of file > Thanks for all the review! > Thanks for the fixes :) > -- Stefan^2. >