On 26 April 2016 at 23:11, <kotkov_at_apache.org> wrote:
> Author: kotkov
> Date: Tue Apr 26 20:11:30 2016
> New Revision: 1741096
>
> URL: http://svn.apache.org/viewvc?rev=1741096&view=rev
> Log:
> Rollback an sqlite transaction in case we fail to COMMIT it.
>
> Otherwise, the db connection might be left in an unusable state and can
> be causing different issues, especially in case the connection is a
> long-living one.
>
> See r1741071 and the commit_with_locked_rep_cache() test.
>
[...]
[...]
> Modified: subversion/trunk/subversion/libsvn_fs_fs/transaction.c
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/transaction.c?rev=1741096&r1=1741095&r2=1741096&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_fs_fs/transaction.c (original)
> +++ subversion/trunk/subversion/libsvn_fs_fs/transaction.c Tue Apr 26 20:11:30 2016
> @@ -3824,6 +3824,8 @@ svn_fs_fs__commit(svn_revnum_t *new_rev_
>
> if (ffd->rep_sharing_allowed)
> {
> + svn_error_t *err;
> +
> SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
>
> /* Write new entries to the rep-sharing database.
> @@ -3834,9 +3836,21 @@ svn_fs_fs__commit(svn_revnum_t *new_rev_
> /* ### A commit that touches thousands of files will starve other
> (reader/writer) commits for the duration of the below call.
> Maybe write in batches? */
> - SVN_SQLITE__WITH_TXN(
> - write_reps_to_cache(fs, cb.reps_to_cache, pool),
> - ffd->rep_cache_db);
> + SVN_ERR(svn_sqlite__begin_transaction(ffd->rep_cache_db));
> + err = write_reps_to_cache(fs, cb.reps_to_cache, pool);
> + err = svn_sqlite__finish_transaction(ffd->rep_cache_db, err);
> +
> + if (err && svn_error_find_cause(err, SVN_ERR_SQLITE_ROLLBACK_FAILED))
There is no need check for 'err' since svn_error_find_cause() already
checks for SVN_NO_ERROR.
> + {
> + /* Failed rollback means that our db connection is unusable, and
> + the only thing we can do is close it. The connection will be
> + reopened during the next operation with rep-cache.db. */
> + return svn_error_trace(
> + svn_error_compose_create(err,
> + svn_fs_fs__close_rep_cache(fs)));
> + }
> + else if (err)
> + return svn_error_trace(err);
> }
>
> return SVN_NO_ERROR;
>
--
Ivan Zhakov
Received on 2016-04-26 23:28:41 CEST