You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2010/06/17 19:20:26 UTC
svn commit: r955679 - in /subversion/branches/1.6.x: ./ CHANGES STATUS
subversion/libsvn_fs_fs/fs.h subversion/libsvn_fs_fs/fs_fs.c
subversion/libsvn_fs_fs/rep-cache.c subversion/libsvn_fs_fs/rep-cache.h
subversion/tests/cmdline/merge_tests.py
Author: hwright
Date: Thu Jun 17 17:20:25 2010
New Revision: 955679
URL: http://svn.apache.org/viewvc?rev=955679&view=rev
Log:
Reintegrate the 1.6.x-issue3506 branch:
* r879966, r879971
Reduce the lifetime of the rep-sharing database handles in FSFS to avoid
having writers blocking readers, and update that database outside the
general FSFS write lock. This addresses issue #3506.
Justification:
The performance problems and outright failures of the current code
are hurting the ASF repository, and presumably other high-concurrency
repositories, too, when large commits occur.
Justification:
Pre-requisite for the r934599 group.
Branch:
^/subversion/branches/1.6.x-issue3506
Votes:
+1: danielsh, cmpilato, hwright
Modified:
subversion/branches/1.6.x/ (props changed)
subversion/branches/1.6.x/CHANGES (props changed)
subversion/branches/1.6.x/STATUS
subversion/branches/1.6.x/subversion/libsvn_fs_fs/fs.h
subversion/branches/1.6.x/subversion/libsvn_fs_fs/fs_fs.c
subversion/branches/1.6.x/subversion/libsvn_fs_fs/rep-cache.c
subversion/branches/1.6.x/subversion/libsvn_fs_fs/rep-cache.h
subversion/branches/1.6.x/subversion/tests/cmdline/merge_tests.py (props changed)
Propchange: subversion/branches/1.6.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jun 17 17:20:25 2010
@@ -10,6 +10,7 @@
/subversion/branches/1.6.x-issue3432:878598-924025
/subversion/branches/1.6.x-issue3443:878597-879480
/subversion/branches/1.6.x-issue3469:945700-953293
+/subversion/branches/1.6.x-issue3506:934622-955678
/subversion/branches/1.6.x-issue3519:880376-889934
/subversion/branches/1.6.x-issue3573:906488-923765
/subversion/branches/1.6.x-issue3605:923668-923887
@@ -78,4 +79,4 @@
/subversion/branches/tc_url_rev:874351-874483
/subversion/branches/tree-conflicts:868291-873154
/subversion/branches/tree-conflicts-notify:873926-874008
-/subversion/trunk:875965,875968,876004,876012,876017,876019,876022,876024,876032,876041-876042,876048,876051,876055-876056,876059,876083,876091,876097,876101,876104,876109,876123-876125,876129,876132,876138,876160,876167,876175,876180,876185,876205,876223-876225,876230,876233,876245,876252,876256,876283,876287,876312,876326-876327,876330,876366,876372,876374,876376,876383,876386,876442,876456-876457,876462-876464,876467,876469,876480,876486,876495-876497,876516-876518,876524,876526,876583,876601,876614,876628,876633,876641,876659,876687,876689,876705,876715,876726,876760,876763,876794,876804,876815-876816,876821,876825,876837,876840-876841,876843,876849,876857-876858,876862,876873,876890,876897,876905,876908,876925,876931,876934,876948-876949,876953,876987,876993,877011,877014,877016,877028-877029,877038,877119,877127,877146,877157,877191,877195,877203,877211,877230,877234,877237,877243,877249,877259,877261,877304,877319,877407,877437,877441-877442,877453,877459,877472,87754
4,877553,877565,877568,877573,877593,877595,877597,877601,877612,877665,877667,877681,877692,877696,877701,877720,877730,877784,877793,877797,877809,877815,877819,877821,877842,877848,877853,877867,877869,877873,877901,877909,877916,877931,877942,877953,877964,877968,877970,877981-877982,878005,878013,878015,878020,878046,878053,878062,878074,878080,878089,878091,878093,878095,878127,878129,878131,878142,878173-878176,878216,878240,878242,878255,878269,878272,878279,878296-878297,878303,878321,878335,878338,878341,878343,878353,878364,878367-878368,878385,878399,878423,878426,878447,878462,878484,878491,878498,878532,878595,878646,878659,878673,878682-878683,878690-878691,878693,878723,878760-878761,878873,878875,878877,878879,878905,878910-878911,878915-878916,878924-878925,878946,878949,878955,878960,878970,878981,879001,879033,879056,879074,879076,879081-879082,879093,879105,879126,879148,879170,879198-879199,879201,879271,879293,879357,879375-879376,879403,879631,879635-
879636,879688,879709-879711,879747,879902,879916,879954,879961,880082,880095,880105,880162,880226,880274-880275,880370,880450,880461,880474,880525-880526,880552,881905,884842,886164,886197,888715,888979,889081,889840,891672,892050,892085,895514,895653,896522,896915,898048,898963,899826,899828,900797,901304,901752,902093,904301,904394,904594,905303,905326,906256,906305,906587,908980-908981,917640,918211,922516,923389,923391,926151,926167,927323,927328,931209,931211,931392,931568,932942,933299,935631,935992,935996,937610,944635,950931,950933,951753,952992,953317
+/subversion/trunk:875965,875968,876004,876012,876017,876019,876022,876024,876032,876041-876042,876048,876051,876055-876056,876059,876083,876091,876097,876101,876104,876109,876123-876125,876129,876132,876138,876160,876167,876175,876180,876185,876205,876223-876225,876230,876233,876245,876252,876256,876283,876287,876312,876326-876327,876330,876366,876372,876374,876376,876383,876386,876442,876456-876457,876462-876464,876467,876469,876480,876486,876495-876497,876516-876518,876524,876526,876583,876601,876614,876628,876633,876641,876659,876687,876689,876705,876715,876726,876760,876763,876794,876804,876815-876816,876821,876825,876837,876840-876841,876843,876849,876857-876858,876862,876873,876890,876897,876905,876908,876925,876931,876934,876948-876949,876953,876987,876993,877011,877014,877016,877028-877029,877038,877119,877127,877146,877157,877191,877195,877203,877211,877230,877234,877237,877243,877249,877259,877261,877304,877319,877407,877437,877441-877442,877453,877459,877472,87754
4,877553,877565,877568,877573,877593,877595,877597,877601,877612,877665,877667,877681,877692,877696,877701,877720,877730,877784,877793,877797,877809,877815,877819,877821,877842,877848,877853,877867,877869,877873,877901,877909,877916,877931,877942,877953,877964,877968,877970,877981-877982,878005,878013,878015,878020,878046,878053,878062,878074,878080,878089,878091,878093,878095,878127,878129,878131,878142,878173-878176,878216,878240,878242,878255,878269,878272,878279,878296-878297,878303,878321,878335,878338,878341,878343,878353,878364,878367-878368,878385,878399,878423,878426,878447,878462,878484,878491,878498,878532,878595,878646,878659,878673,878682-878683,878690-878691,878693,878723,878760-878761,878873,878875,878877,878879,878905,878910-878911,878915-878916,878924-878925,878946,878949,878955,878960,878970,878981,879001,879033,879056,879074,879076,879081-879082,879093,879105,879126,879148,879170,879198-879199,879201,879271,879293,879357,879375-879376,879403,879631,879635-
879636,879688,879709-879711,879747,879902,879916,879954,879961,879966,879971,880082,880095,880105,880162,880226,880274-880275,880370,880450,880461,880474,880525-880526,880552,881905,884842,886164,886197,888715,888979,889081,889840,891672,892050,892085,895514,895653,896522,896915,898048,898963,899826,899828,900797,901304,901752,902093,904301,904394,904594,905303,905326,906256,906305,906587,908980-908981,917640,918211,922516,923389,923391,926151,926167,927323,927328,931209,931211,931392,931568,932942,933299,935631,935992,935996,937610,944635,950931,950933,951753,952992,953317
Propchange: subversion/branches/1.6.x/CHANGES
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jun 17 17:20:25 2010
@@ -10,6 +10,7 @@
/subversion/branches/1.6.x-issue3432/CHANGES:878598-924025
/subversion/branches/1.6.x-issue3443/CHANGES:878597-879480
/subversion/branches/1.6.x-issue3469/CHANGES:945700-953293
+/subversion/branches/1.6.x-issue3506/CHANGES:934622-955678
/subversion/branches/1.6.x-issue3519/CHANGES:880376-889934
/subversion/branches/1.6.x-issue3573/CHANGES:906488-923765
/subversion/branches/1.6.x-issue3605/CHANGES:923668-923887
Modified: subversion/branches/1.6.x/STATUS
URL: http://svn.apache.org/viewvc/subversion/branches/1.6.x/STATUS?rev=955679&r1=955678&r2=955679&view=diff
==============================================================================
--- subversion/branches/1.6.x/STATUS (original)
+++ subversion/branches/1.6.x/STATUS Thu Jun 17 17:20:25 2010
@@ -217,18 +217,3 @@ Veto-blocked changes:
Approved changes:
=================
-
- * r879966, r879971
- Reduce the lifetime of the rep-sharing database handles in FSFS to avoid
- having writers blocking readers, and update that database outside the
- general FSFS write lock. This addresses issue #3506.
- Justification:
- The performance problems and outright failures of the current code
- are hurting the ASF repository, and presumably other high-concurrency
- repositories, too, when large commits occur.
- Justification:
- Pre-requisite for the r934599 group.
- Branch:
- ^/subversion/branches/1.6.x-issue3506
- Votes:
- +1: danielsh, cmpilato, hwright
Modified: subversion/branches/1.6.x/subversion/libsvn_fs_fs/fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/1.6.x/subversion/libsvn_fs_fs/fs.h?rev=955679&r1=955678&r2=955679&view=diff
==============================================================================
--- subversion/branches/1.6.x/subversion/libsvn_fs_fs/fs.h (original)
+++ subversion/branches/1.6.x/subversion/libsvn_fs_fs/fs.h Thu Jun 17 17:20:25 2010
@@ -235,6 +235,10 @@ typedef struct
/* The oldest revision not in a pack file. */
svn_revnum_t min_unpacked_rev;
+
+ /* Whether rep-sharing is supported by the filesystem
+ * and allowed by the configuration. */
+ svn_boolean_t rep_sharing_allowed;
} fs_fs_data_t;
Modified: subversion/branches/1.6.x/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/1.6.x/subversion/libsvn_fs_fs/fs_fs.c?rev=955679&r1=955678&r2=955679&view=diff
==============================================================================
--- subversion/branches/1.6.x/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/branches/1.6.x/subversion/libsvn_fs_fs/fs_fs.c Thu Jun 17 17:20:25 2010
@@ -1058,6 +1058,27 @@ svn_fs_fs__fs_supports_mergeinfo(svn_fs_
}
static svn_error_t *
+read_config(svn_fs_t *fs,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
+ SVN_ERR(svn_config_read(&ffd->config,
+ svn_path_join(fs->path, PATH_CONFIG, pool),
+ FALSE, fs->pool));
+
+ /* Initialize ffd->rep_sharing_allowed. */
+ if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT)
+ SVN_ERR(svn_config_get_bool(ffd->config, &ffd->rep_sharing_allowed,
+ CONFIG_SECTION_REP_SHARING,
+ CONFIG_OPTION_ENABLE_REP_SHARING, TRUE));
+ else
+ ffd->rep_sharing_allowed = FALSE;
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
write_config(svn_fs_t *fs,
apr_pool_t *pool)
{
@@ -1147,7 +1168,6 @@ svn_fs_fs__open(svn_fs_t *fs, const char
int format, max_files_per_dir;
char buf[APR_UUID_FORMATTED_LENGTH + 2];
apr_size_t limit;
- svn_boolean_t rep_sharing_allowed;
fs->path = apr_pstrdup(fs->pool, path);
@@ -1175,17 +1195,7 @@ svn_fs_fs__open(svn_fs_t *fs, const char
SVN_ERR(update_min_unpacked_rev(fs, pool));
/* Read the configuration file. */
- SVN_ERR(svn_config_read(&ffd->config,
- svn_path_join(fs->path, PATH_CONFIG, pool),
- FALSE, fs->pool));
- SVN_ERR(svn_config_get_bool(ffd->config, &rep_sharing_allowed,
- CONFIG_SECTION_REP_SHARING,
- CONFIG_OPTION_ENABLE_REP_SHARING, TRUE));
-
- /* Open the rep cache. */
- if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT
- && rep_sharing_allowed)
- SVN_ERR(svn_fs_fs__open_rep_cache(fs, fs->pool));
+ SVN_ERR(read_config(fs, pool));
return get_youngest(&(ffd->youngest_rev_cache), path, pool);
}
@@ -5028,7 +5038,8 @@ rep_write_contents_close(void *baton)
/* Check and see if we already have a representation somewhere that's
identical to the one we just wrote out. */
- if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT)
+ if (ffd->rep_sharing_allowed)
+ /* ### TODO: ignore errors opening the DB (issue #3506) * */
SVN_ERR(svn_fs_fs__get_rep_reference(&old_rep, b->fs, rep->sha1_checksum,
b->parent_pool));
else
@@ -5275,6 +5286,8 @@ write_final_rev(const svn_fs_id_t **new_
const svn_fs_id_t *id,
const char *start_node_id,
const char *start_copy_id,
+ apr_array_header_t *reps_to_cache,
+ apr_pool_t *reps_pool,
apr_pool_t *pool)
{
node_revision_t *noderev;
@@ -5313,6 +5326,7 @@ write_final_rev(const svn_fs_id_t **new_
dirent = val;
SVN_ERR(write_final_rev(&new_id, file, rev, fs, dirent->id,
start_node_id, start_copy_id,
+ reps_to_cache, reps_pool,
subpool));
if (new_id && (svn_fs_fs__id_rev(new_id) == rev))
dirent->id = svn_fs_fs__id_copy(new_id, pool);
@@ -5408,10 +5422,14 @@ write_final_rev(const svn_fs_id_t **new_
pool));
/* Save the data representation's hash in the rep cache. */
- if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT
+ if (ffd->rep_sharing_allowed
&& noderev->data_rep && noderev->kind == svn_node_file
&& noderev->data_rep->revision == rev)
- SVN_ERR(svn_fs_fs__set_rep_reference(fs, noderev->data_rep, FALSE, pool));
+ {
+ SVN_ERR_ASSERT(reps_to_cache && reps_pool);
+ APR_ARRAY_PUSH(reps_to_cache, representation_t *)
+ = svn_fs_fs__rep_copy(noderev->data_rep, reps_pool);
+ }
/* Return our ID that references the revision file. */
*new_id_p = noderev->id;
@@ -5652,6 +5670,8 @@ struct commit_baton {
svn_revnum_t *new_rev_p;
svn_fs_t *fs;
svn_fs_txn_t *txn;
+ apr_array_header_t *reps_to_cache;
+ apr_pool_t *reps_pool;
};
/* The work-horse for svn_fs_fs__commit, called with the FS write lock.
@@ -5705,6 +5725,7 @@ commit_body(void *baton, apr_pool_t *poo
root_id = svn_fs_fs__id_txn_create("0", "0", cb->txn->id, pool);
SVN_ERR(write_final_rev(&new_root_id, proto_file, new_rev, cb->fs, root_id,
start_node_id, start_copy_id,
+ cb->reps_to_cache, cb->reps_pool,
pool));
/* Write the changed-path information. */
@@ -5826,28 +5847,42 @@ struct commit_sqlite_txn_baton
apr_pool_t *pool;
};
-/* Implements svn_sqlite__transaction_callback_t. */
+/* Add the representations in REPS_TO_CACHE (an array of representation_t *)
+ * to the rep-cache database of FS. */
static svn_error_t *
-commit_sqlite_txn_callback(void *baton, svn_sqlite__db_t *db)
+write_reps_to_cache(svn_fs_t *fs,
+ apr_array_header_t *reps_to_cache,
+ apr_pool_t *scratch_pool)
{
- struct commit_sqlite_txn_baton *cstb = baton;
- return commit_body(cstb->cb, cstb->pool);
+ int i;
+
+ for (i = 0; i < reps_to_cache->nelts; i++)
+ {
+ representation_t *rep = APR_ARRAY_IDX(reps_to_cache, i, representation_t *);
+
+ /* FALSE because we don't care if another parallel commit happened to
+ * collide with us. (Non-parallel collisions will not be detected.) */
+ SVN_ERR(svn_fs_fs__set_rep_reference(fs, rep, FALSE, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
}
-/* Wrapper around commit_body() which implements SQLite transactions. Arguments
- the same as commit_body(). */
+/* Implements svn_sqlite__transaction_callback_t. */
static svn_error_t *
-commit_body_rep_cache(void *baton, apr_pool_t *pool)
+commit_sqlite_txn_callback(void *baton, svn_sqlite__db_t *db)
{
- struct commit_sqlite_txn_baton cstb;
- struct commit_baton *cb = baton;
- fs_fs_data_t *ffd = cb->fs->fsap_data;
+ struct commit_sqlite_txn_baton *cstb = baton;
+ struct commit_baton *cb = cstb->cb;
- cstb.cb = cb;
- cstb.pool = pool;
+ /* Write new entries to the rep-sharing database.
+ *
+ * We use an sqlite transcation to speed things up;
+ * see <http://www.sqlite.org/faq.html#q19>.
+ */
+ SVN_ERR(write_reps_to_cache(cb->fs, cb->reps_to_cache, cstb->pool));
- return svn_sqlite__with_transaction(ffd->rep_cache_db,
- commit_sqlite_txn_callback, &cstb);
+ return SVN_NO_ERROR;
}
svn_error_t *
@@ -5862,10 +5897,34 @@ svn_fs_fs__commit(svn_revnum_t *new_rev_
cb.new_rev_p = new_rev_p;
cb.fs = fs;
cb.txn = txn;
- return svn_fs_fs__with_write_lock(fs,
- ffd->rep_cache_db ? commit_body_rep_cache :
- commit_body,
- &cb, pool);
+
+ if (ffd->rep_sharing_allowed)
+ {
+ cb.reps_to_cache = apr_array_make(pool, 5, sizeof(representation_t *));
+ cb.reps_pool = pool;
+ }
+ else
+ {
+ cb.reps_to_cache = NULL;
+ cb.reps_pool = NULL;
+ }
+
+ SVN_ERR(svn_fs_fs__with_write_lock(fs, commit_body, &cb, pool));
+
+ if (ffd->rep_sharing_allowed)
+ {
+ struct commit_sqlite_txn_baton cstb;
+ cstb.cb = &cb;
+ cstb.pool = pool;
+
+ /* ### TODO: ignore errors opening the DB (issue #3506) * */
+ SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
+ SVN_ERR(svn_sqlite__with_transaction(ffd->rep_cache_db,
+ commit_sqlite_txn_callback,
+ &cstb));
+ }
+
+ return SVN_NO_ERROR;
}
svn_error_t *
@@ -5926,7 +5985,6 @@ svn_fs_fs__create(svn_fs_t *fs,
{
int format = SVN_FS_FS__FORMAT_NUMBER;
fs_fs_data_t *ffd = fs->fsap_data;
- svn_boolean_t rep_sharing_allowed;
fs->path = apr_pstrdup(pool, path);
/* See if we had an explicitly requested pre-1.4- or pre-1.5-compatible. */
@@ -5986,17 +6044,7 @@ svn_fs_fs__create(svn_fs_t *fs,
SVN_ERR(write_config(fs, pool));
/* Read the configuration file. */
- SVN_ERR(svn_config_read(&ffd->config,
- svn_path_join(fs->path, PATH_CONFIG, pool),
- FALSE, fs->pool));
- SVN_ERR(svn_config_get_bool(ffd->config, &rep_sharing_allowed,
- CONFIG_SECTION_REP_SHARING,
- CONFIG_OPTION_ENABLE_REP_SHARING, TRUE));
-
- /* Create the rep cache. */
- if (ffd->format >= SVN_FS_FS__MIN_REP_SHARING_FORMAT
- && rep_sharing_allowed)
- SVN_ERR(svn_fs_fs__open_rep_cache(fs, fs->pool));
+ SVN_ERR(read_config(fs, pool));
/* Create the min unpacked rev file. */
if (ffd->format >= SVN_FS_FS__MIN_PACKED_FORMAT)
Modified: subversion/branches/1.6.x/subversion/libsvn_fs_fs/rep-cache.c
URL: http://svn.apache.org/viewvc/subversion/branches/1.6.x/subversion/libsvn_fs_fs/rep-cache.c?rev=955679&r1=955678&r2=955679&view=diff
==============================================================================
--- subversion/branches/1.6.x/subversion/libsvn_fs_fs/rep-cache.c (original)
+++ subversion/branches/1.6.x/subversion/libsvn_fs_fs/rep-cache.c Thu Jun 17 17:20:25 2010
@@ -61,6 +61,10 @@ svn_fs_fs__open_rep_cache(svn_fs_t *fs,
fs_fs_data_t *ffd = fs->fsap_data;
const char *db_path;
+ /* Be idempotent. */
+ if (ffd->rep_cache_db)
+ return SVN_NO_ERROR;
+
/* Open (or create) the sqlite database. It will be automatically
closed when fs->pool is destoyed. */
db_path = svn_path_join(fs->path, REP_CACHE_DB_NAME, pool);
@@ -82,11 +86,9 @@ svn_fs_fs__get_rep_reference(representat
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
- if (ffd->rep_cache_db == NULL)
- {
- *rep = NULL;
- return SVN_NO_ERROR;
- }
+ SVN_ERR_ASSERT(ffd->rep_sharing_allowed);
+ if (! ffd->rep_cache_db)
+ SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
/* We only allow SHA1 checksums in this table. */
if (checksum->kind != svn_checksum_sha1)
@@ -124,8 +126,9 @@ svn_fs_fs__set_rep_reference(svn_fs_t *f
representation_t *old_rep;
svn_sqlite__stmt_t *stmt;
- if (ffd->rep_cache_db == NULL)
- return SVN_NO_ERROR;
+ SVN_ERR_ASSERT(ffd->rep_sharing_allowed);
+ if (! ffd->rep_cache_db)
+ SVN_ERR(svn_fs_fs__open_rep_cache(fs, pool));
/* We only allow SHA1 checksums in this table. */
if (rep->sha1_checksum == NULL)
Modified: subversion/branches/1.6.x/subversion/libsvn_fs_fs/rep-cache.h
URL: http://svn.apache.org/viewvc/subversion/branches/1.6.x/subversion/libsvn_fs_fs/rep-cache.h?rev=955679&r1=955678&r2=955679&view=diff
==============================================================================
--- subversion/branches/1.6.x/subversion/libsvn_fs_fs/rep-cache.h (original)
+++ subversion/branches/1.6.x/subversion/libsvn_fs_fs/rep-cache.h Thu Jun 17 17:20:25 2010
@@ -29,7 +29,7 @@ extern "C" {
#define REP_CACHE_DB_NAME "rep-cache.db"
-/* Open (and create, if needed) the rep cache database associated with FS.
+/* Open and create, if needed, the rep cache database associated with FS.
Use POOL for temporary allocations. */
svn_error_t *
svn_fs_fs__open_rep_cache(svn_fs_t *fs,
Propchange: subversion/branches/1.6.x/subversion/tests/cmdline/merge_tests.py
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jun 17 17:20:25 2010
@@ -9,6 +9,7 @@
/subversion/branches/1.6.x-issue3432/subversion/tests/cmdline/merge_tests.py:878598-924025
/subversion/branches/1.6.x-issue3443/subversion/tests/cmdline/merge_tests.py:878597-879480
/subversion/branches/1.6.x-issue3469/subversion/tests/cmdline/merge_tests.py:945700-953293
+/subversion/branches/1.6.x-issue3506/subversion/tests/cmdline/merge_tests.py:934622-955678
/subversion/branches/1.6.x-issue3519/subversion/tests/cmdline/merge_tests.py:880376-889934
/subversion/branches/1.6.x-issue3573/subversion/tests/cmdline/merge_tests.py:906488-923765
/subversion/branches/1.6.x-issue3605/subversion/tests/cmdline/merge_tests.py:923668-923887