On 16.02.2011 11:52, Philip Martin wrote:
> Stefan Sperling <s...@elego.de> writes:
>
>> [[[
>> Improve performance of svn proplist in a similar way as was done in r1039808.
>> But, this time, avoid problems with callbacks invoked during sqlite
>> transactions by storing results in a temporary table and invoking
>> callbacks during a query on the temporary table.
>> +read_props_recursive(svn_wc__db_t *db,
>> +                     const char *local_abspath,
>> +                     svn_boolean_t files_only,
>> +                     svn_boolean_t immediates_only,
>> +                     svn_wc__proplist_receiver_t receiver_func,
>> +                     void *receiver_baton,
>> +                     svn_cancel_func_t cancel_func,
>> +                     void *cancel_baton,
>> +                     apr_pool_t *scratch_pool)
>>  {
>>    svn_wc__db_wcroot_t *wcroot;
>> -  const char *local_relpath;
>> -  const char *prev_child_relpath;
>>    svn_sqlite__stmt_t *stmt;
>> +  cache_props_baton_t baton;
>>    svn_boolean_t have_row;
>> -  apr_hash_t *props_per_child;
>> -  apr_hash_t *files;
>> -  apr_hash_t *not_present;
>> -  apr_hash_index_t *hi;
>> +  int row_number;
>>    apr_pool_t *iterpool;
>>  
>>    SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
>>    SVN_ERR_ASSERT(receiver_func);
>>  
>> -  SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
>> -                                             local_abspath,
>> -                                             svn_sqlite__mode_readwrite,
>> -                                             scratch_pool, scratch_pool));
>> +  SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, 
>> &baton.local_relpath,
>> +                                                db, local_abspath,
>> +                                                svn_sqlite__mode_readwrite,
>> +                                                scratch_pool, 
>> scratch_pool));
>>    VERIFY_USABLE_WCROOT(wcroot);
>>  
>> -  props_per_child = apr_hash_make(scratch_pool);
>> -  not_present = apr_hash_make(scratch_pool);
>> -  if (files_only)
>> -    files = apr_hash_make(scratch_pool);
>> +  SVN_ERR(svn_sqlite__exec_statements(wcroot->sdb,
>> +                                      STMT_CLEAR_NODE_PROPS_CACHE));
>> +
> As far as I can see there is only one cache, and so there has to be some
> sort of serialisation to prevent multiple callers interfering with each
> other.  For a write operation that is simple, the working copy locks
> will only allow one operation at a time.  proplist doesn't take a lock,
> do we need to serialise it somehow?  Should we be using views with
> per-transaction names?  If we did how would we clear old views for
> clients that exited unexpectedly?
>
> I'm thinking of using something like this for recursive revert. It's
> easy to delete WORKING/ACTUAL rows in a single query, but hard to
> notify, particularly as the rows don't exist after the revert.  Since
> revert is a write operation the working copy lock should serialise
> things

The single cache is a temporary table, which has distinct per-connection
instances. If some other thread is using the same connection at the same
time, all bets are off anyway, because transactions are per-connection,
too. The cache is filled within a single sqlite transaction, so I assume
that the cached state is consistent. In fact, it's better than before,
when a recursive proplist would work its way throuth any number of
transactions, making the consistency of the result doubtful at best.

-- Brane

Reply via email to