Author: rhuijben
Date: Tue Mar 10 11:30:53 2015
New Revision: 1665480
URL: http://svn.apache.org/r1665480
Log:
In ra-serf and ra-svn: Make svn_ra_replay_range properly handle errors to
make the ra layers behave in the same way, and to allow re-using the ra
session after a failure without seeing spurious errors caused by previous
requests.
* subversion/libsvn_ra/ra_loader.c
(svn_ra_replay_range): Add assertions here that already apply to some
ra layers.
* subversion/libsvn_ra_serf/replay.c
(svn_ra_serf__replay_range): Use subpool to allow unregistering requests.
* subversion/libsvn_ra_svn/client.c
(ra_svn_replay_range): Properly handle errors reported during replay,
instead of just noting a protocol error.
Modified:
subversion/trunk/subversion/libsvn_ra/ra_loader.c
subversion/trunk/subversion/libsvn_ra_serf/replay.c
subversion/trunk/subversion/libsvn_ra_svn/client.c
Modified: subversion/trunk/subversion/libsvn_ra/ra_loader.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra/ra_loader.c?rev=1665480&r1=1665479&r2=1665480&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra/ra_loader.c (original)
+++ subversion/trunk/subversion/libsvn_ra/ra_loader.c Tue Mar 10 11:30:53 2015
@@ -1190,7 +1190,14 @@ svn_ra_replay_range(svn_ra_session_t *se
void *replay_baton,
apr_pool_t *pool)
{
- svn_error_t *err =
+ svn_error_t *err;
+
+ SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(start_revision)
+ && SVN_IS_VALID_REVNUM(end_revision)
+ && start_revision <= end_revision
+ && SVN_IS_VALID_REVNUM(low_water_mark));
+
+ err =
session->vtable->replay_range(session, start_revision, end_revision,
low_water_mark, text_deltas,
revstart_func, revfinish_func,
Modified: subversion/trunk/subversion/libsvn_ra_serf/replay.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/replay.c?rev=1665480&r1=1665479&r2=1665480&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/replay.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/replay.c Tue Mar 10 11:30:53 2015
@@ -647,9 +647,10 @@ svn_ra_serf__replay_range(svn_ra_session
int active_reports = 0;
const char *include_path;
svn_boolean_t done;
+ apr_pool_t *subpool = svn_pool_create(scratch_pool);
SVN_ERR(svn_ra_serf__report_resource(&report_target, session,
- scratch_pool));
+ subpool));
/* Prior to 1.8, mod_dav_svn expect to get replay REPORT requests
aimed at the session URL. But that's incorrect -- these reports
@@ -672,7 +673,7 @@ svn_ra_serf__replay_range(svn_ra_session
{
SVN_ERR(svn_ra_serf__get_relative_path(&include_path,
session->session_url.path,
- session, scratch_pool));
+ session, subpool));
}
else
{
@@ -690,7 +691,7 @@ svn_ra_serf__replay_range(svn_ra_session
{
struct revision_report_t *rev_ctx;
svn_ra_serf__handler_t *handler;
- apr_pool_t *rev_pool = svn_pool_create(scratch_pool);
+ apr_pool_t *rev_pool = svn_pool_create(subpool);
svn_ra_serf__xml_context_t *xmlctx;
const char *replay_target;
@@ -770,13 +771,23 @@ svn_ra_serf__replay_range(svn_ra_session
/* Run the serf loop. */
done = FALSE;
- SVN_ERR(svn_ra_serf__context_run_wait(&done, session, scratch_pool));
+ {
+ svn_error_t *err = svn_ra_serf__context_run_wait(&done, session,
+ subpool);
+
+ if (err)
+ {
+ svn_pool_destroy(subpool); /* Unregister all requests! */
+ return svn_error_trace(err);
+ }
+ }
/* The done handler of reports decrements active_reports when a report
is done. This same handler reports (fatal) report errors, so we can
just loop here. */
}
+ svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
#undef MAX_OUTSTANDING_REQUESTS
Modified: subversion/trunk/subversion/libsvn_ra_svn/client.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_svn/client.c?rev=1665480&r1=1665479&r2=1665480&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_svn/client.c (original)
+++ subversion/trunk/subversion/libsvn_ra_svn/client.c Tue Mar 10 11:30:53 2015
@@ -2720,10 +2720,16 @@ ra_svn_replay_range(svn_ra_session_t *se
SVN_ERR(svn_ra_svn__read_tuple(sess->conn, iterpool,
"wl", &word, &list));
+
if (strcmp(word, "revprops") != 0)
- return svn_error_createf(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
- _("Expected 'revprops', found '%s'"),
- word);
+ {
+ if (strcmp(word, "failure") == 0)
+ SVN_ERR(svn_ra_svn__handle_failure_status(list, iterpool));
+
+ return svn_error_createf(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
+ _("Expected 'revprops', found '%s'"),
+ word);
+ }
SVN_ERR(svn_ra_svn__parse_proplist(list, iterpool, &rev_props));