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