Author: svn-role
Date: Tue Apr 14 04:00:43 2015
New Revision: 1673349
URL: http://svn.apache.org/r1673349
Log:
Merge the r1670139 group from trunk:
* r1670139, r1670149, r1670152, r1670347
Lock-many pool handling and doc fixes as a result of API review.
Justification:
Better memory handling for callback, clearer documentation.
Votes:
+1: stefan2, rhuijben, philip
Modified:
subversion/branches/1.9.x/ (props changed)
subversion/branches/1.9.x/STATUS
subversion/branches/1.9.x/subversion/include/svn_fs.h
subversion/branches/1.9.x/subversion/include/svn_repos.h
subversion/branches/1.9.x/subversion/libsvn_fs/fs-loader.c
subversion/branches/1.9.x/subversion/libsvn_fs_base/lock.c
subversion/branches/1.9.x/subversion/libsvn_fs_fs/lock.c
subversion/branches/1.9.x/subversion/libsvn_fs_x/ (props changed)
subversion/branches/1.9.x/subversion/libsvn_fs_x/lock.c
Propchange: subversion/branches/1.9.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Apr 14 04:00:43 2015
@@ -89,4 +89,4 @@
/subversion/branches/verify-at-commit:1462039-1462408
/subversion/branches/verify-keep-going:1439280-1546110
/subversion/branches/wc-collate-path:1402685-1480384
-/subversion/trunk:1660545-1660547,1660549-1662901,1663003,1663183-1663184,1663338,1663347,1663355,1663374,1663450,1663697,1663706,1663738,1663749,1663791,1664078,1664080,1664084-1664085,1664187,1664191,1664193,1664200,1664344,1664476,1664480-1664481,1664483,1664489-1664490,1664507,1664520-1664521,1664523,1664526-1664527,1664531-1664532,1664588,1664653,1664684,1664927,1664938-1664940,1664978,1664984,1664997,1665164,1665195,1665318,1665437-1665438,1665611-1665612,1665845,1665850,1665852,1665886,1665894,1665896,1666096,1666270,1666272,1666379,1666449,1666690,1666851,1667101,1667106-1667107,1667941,1667976,1668598,1668600,1668602-1668603,1668618,1669749,1670329,1670353,1671388,1672511-1672512,1672728
+/subversion/trunk:1660545-1660547,1660549-1662901,1663003,1663183-1663184,1663338,1663347,1663355,1663374,1663450,1663697,1663706,1663738,1663749,1663791,1664078,1664080,1664084-1664085,1664187,1664191,1664193,1664200,1664344,1664476,1664480-1664481,1664483,1664489-1664490,1664507,1664520-1664521,1664523,1664526-1664527,1664531-1664532,1664588,1664653,1664684,1664927,1664938-1664940,1664978,1664984,1664997,1665164,1665195,1665318,1665437-1665438,1665611-1665612,1665845,1665850,1665852,1665886,1665894,1665896,1666096,1666270,1666272,1666379,1666449,1666690,1666851,1667101,1667106-1667107,1667941,1667976,1668598,1668600,1668602-1668603,1668618,1669749,1670139,1670149,1670152,1670329,1670347,1670353,1671388,1672511-1672512,1672728
Modified: subversion/branches/1.9.x/STATUS
URL:
http://svn.apache.org/viewvc/subversion/branches/1.9.x/STATUS?rev=1673349&r1=1673348&r2=1673349&view=diff
==============================================================================
--- subversion/branches/1.9.x/STATUS (original)
+++ subversion/branches/1.9.x/STATUS Tue Apr 14 04:00:43 2015
@@ -331,13 +331,6 @@ Veto-blocked changes:
Approved changes:
=================
- * r1670139, r1670149, r1670152, r1670347
- Lock-many pool handling and doc fixes as a result of API review.
- Justification:
- Better memory handling for callback, clearer documentation.
- Votes:
- +1: stefan2, rhuijben, philip
-
* r1667235
Reject invalid transaction property change requests in mod_dav_svn.
Justification:
Modified: subversion/branches/1.9.x/subversion/include/svn_fs.h
URL:
http://svn.apache.org/viewvc/subversion/branches/1.9.x/subversion/include/svn_fs.h?rev=1673349&r1=1673348&r2=1673349&view=diff
==============================================================================
--- subversion/branches/1.9.x/subversion/include/svn_fs.h (original)
+++ subversion/branches/1.9.x/subversion/include/svn_fs.h Tue Apr 14 04:00:43
2015
@@ -2640,8 +2640,8 @@ svn_fs_set_uuid(svn_fs_t *fs,
*/
typedef struct svn_fs_lock_target_t svn_fs_lock_target_t;
-/** Create an <tt>svn_fs_lock_target_t</tt> allocated in @a pool. @a
- * token can be NULL and @a current_rev can be SVN_INVALID_REVNUM.
+/** Create an <tt>svn_fs_lock_target_t</tt> allocated in @a result_pool.
+ * @a token can be NULL and @a current_rev can be SVN_INVALID_REVNUM.
*
* The @a token is not duplicated and so must have a lifetime at least as
* long as the returned target object.
@@ -2650,7 +2650,7 @@ typedef struct svn_fs_lock_target_t svn_
*/
svn_fs_lock_target_t *svn_fs_lock_target_create(const char *token,
svn_revnum_t current_rev,
- apr_pool_t *pool);
+ apr_pool_t *result_pool);
/** Update @a target changing the token to @a token, @a token can be NULL.
*
@@ -2670,7 +2670,12 @@ void svn_fs_lock_target_set_token(svn_fs
* returns, use svn_error_dup() to preserve the error.
*
* If the callback returns an error no further callbacks will be made
- * and svn_fs_lock_many/svn_fs_unlock_many will return an error.
+ * and svn_fs_lock_many/svn_fs_unlock_many will return an error. The
+ * caller cannot rely on any particular order for these callbacks and
+ * cannot rely on interrupting the underlying operation by returning
+ * an error. Returning an error stops the callbacks but any locks
+ * that would have been reported in further callbacks may, or may not,
+ * still be created/released.
*
* @since New in 1.9.
*/
@@ -2678,7 +2683,7 @@ typedef svn_error_t *(*svn_fs_lock_callb
const char *path,
const svn_lock_t *lock,
svn_error_t *fs_err,
- apr_pool_t *pool);
+ apr_pool_t *scratch_pool);
/** Lock the paths in @a lock_targets in @a fs.
*
@@ -2718,13 +2723,17 @@ typedef svn_error_t *(*svn_fs_lock_callb
*
* For each path in @a lock_targets @a lock_callback will be invoked
* passing @a lock_baton and the lock and error that apply to path.
- * @a lock_callback can be NULL in which case it is not called.
+ * @a lock_callback can be NULL in which case it is not called and any
+ * errors that would have been passed to the callback are not reported.
*
* The lock and path passed to @a lock_callback will be allocated in
* @a result_pool. Use @a scratch_pool for temporary allocations.
*
* @note At this time, only files can be locked.
*
+ * @note This function is not atomic. If it returns an error, some targets
+ * may remain unlocked while others may have been locked.
+ *
* @note You probably don't want to use this directly. Take a look at
* svn_repos_fs_lock_many() instead.
*
@@ -2792,11 +2801,15 @@ svn_fs_generate_lock_token(const char **
* For each path in @a unlock_targets @a lock_callback will be invoked
* passing @a lock_baton and error that apply to path. The @a lock
* passed to the callback will be NULL. @a lock_callback can be NULL
- * in which case it is not called.
+ * in which case it is not called and any errors that would have been
+ * passed to the callback are not reported.
*
* The path passed to lock_callback will be allocated in @a result_pool.
* Use @a scratch_pool for temporary allocations.
*
+ * @note This function is not atomic. If it returns an error, some targets
+ * may remain locked while others may have been unlocked.
+ *
* @note You probably don't want to use this directly. Take a look at
* svn_repos_fs_unlock_many() instead.
*
Modified: subversion/branches/1.9.x/subversion/include/svn_repos.h
URL:
http://svn.apache.org/viewvc/subversion/branches/1.9.x/subversion/include/svn_repos.h?rev=1673349&r1=1673348&r2=1673349&view=diff
==============================================================================
--- subversion/branches/1.9.x/subversion/include/svn_repos.h (original)
+++ subversion/branches/1.9.x/subversion/include/svn_repos.h Tue Apr 14
04:00:43 2015
@@ -2265,10 +2265,12 @@ svn_repos_fs_begin_txn_for_update(svn_fs
* The pre-lock is run for every path in @a targets. Those targets for
* which the pre-lock is successful are passed to svn_fs_lock_many and
* the post-lock is run for those that are successfully locked.
+ * Pre-lock hook errors are passed to @a lock_callback.
*
* For each path in @a targets @a lock_callback will be invoked
* passing @a lock_baton and the lock and error that apply to path.
- * @a lock_callback can be NULL in which case it is not called.
+ * @a lock_callback can be NULL in which case it is not called and any
+ * errors that would have been passed to the callback are not reported.
*
* If an error occurs when running the post-lock hook the error is
* returned wrapped with #SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED. If the
@@ -2281,6 +2283,9 @@ svn_repos_fs_begin_txn_for_update(svn_fs
* The lock and path passed to @a lock_callback will be allocated in
* @a result_pool. Use @a scratch_pool for temporary allocations.
*
+ * @note This function is not atomic. If it returns an error, some targets
+ * may remain unlocked while others may have been locked.
+ *
* @see svn_fs_lock_many
*
* @since New in 1.9.
@@ -2320,12 +2325,14 @@ svn_repos_fs_lock(svn_lock_t **lock,
* The pre-unlock hook is run for every path in @a targets. Those
* targets for which the pre-unlock is successful are passed to
* svn_fs_unlock_many and the post-unlock is run for those that are
- * successfully unlocked.
+ * successfully unlocked. Pre-unlock hook errors are passed to @a
+ * lock_callback.
*
* For each path in @a targets @a lock_callback will be invoked
* passing @a lock_baton and error that apply to path. The lock
* passed to the callback will be NULL. @a lock_callback can be NULL
- * in which case it is not called.
+ * in which case it is not called and any errors that would have been
+ * passed to the callback are not reported.
*
* If an error occurs when running the post-unlock hook, return the
* original error wrapped with #SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED.
@@ -2335,6 +2342,9 @@ svn_repos_fs_lock(svn_lock_t **lock,
* The path passed to @a lock_callback will be allocated in @a result_pool.
* Use @a scratch_pool for temporary allocations.
*
+ * @note This function is not atomic. If it returns an error, some targets
+ * may remain locked while others may have been unlocked.
+ *
* @see svn_fs_unlock_many
*
* @since New in 1.9.
Modified: subversion/branches/1.9.x/subversion/libsvn_fs/fs-loader.c
URL:
http://svn.apache.org/viewvc/subversion/branches/1.9.x/subversion/libsvn_fs/fs-loader.c?rev=1673349&r1=1673348&r2=1673349&view=diff
==============================================================================
--- subversion/branches/1.9.x/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/branches/1.9.x/subversion/libsvn_fs/fs-loader.c Tue Apr 14
04:00:43 2015
@@ -1758,9 +1758,10 @@ svn_fs_generate_lock_token(const char **
svn_fs_lock_target_t *
svn_fs_lock_target_create(const char *token,
svn_revnum_t current_rev,
- apr_pool_t *pool)
+ apr_pool_t *result_pool)
{
- svn_fs_lock_target_t *target = apr_palloc(pool,
sizeof(svn_fs_lock_target_t));
+ svn_fs_lock_target_t *target = apr_palloc(result_pool,
+ sizeof(svn_fs_lock_target_t));
target->token = token;
target->current_rev = current_rev;
Modified: subversion/branches/1.9.x/subversion/libsvn_fs_base/lock.c
URL:
http://svn.apache.org/viewvc/subversion/branches/1.9.x/subversion/libsvn_fs_base/lock.c?rev=1673349&r1=1673348&r2=1673349&view=diff
==============================================================================
--- subversion/branches/1.9.x/subversion/libsvn_fs_base/lock.c (original)
+++ subversion/branches/1.9.x/subversion/libsvn_fs_base/lock.c Tue Apr 14
04:00:43 2015
@@ -243,6 +243,7 @@ svn_fs_base__lock(svn_fs_t *fs,
apr_hash_index_t *hi;
svn_error_t *cb_err = SVN_NO_ERROR;
svn_revnum_t youngest_rev = SVN_INVALID_REVNUM;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
SVN_ERR(svn_fs__check_fs(fs, TRUE));
SVN_ERR(svn_fs_base__youngest_rev(&youngest_rev, fs, scratch_pool));
@@ -255,6 +256,7 @@ svn_fs_base__lock(svn_fs_t *fs,
svn_lock_t *lock;
svn_error_t *err = NULL;
+ svn_pool_clear(iterpool);
args.lock_p = &lock;
args.path = svn_fs__canonicalize_abspath(path, result_pool);
args.token = target->token;
@@ -275,11 +277,12 @@ svn_fs_base__lock(svn_fs_t *fs,
if (!err)
err = svn_fs_base__retry_txn(fs, txn_body_lock, &args, TRUE,
- scratch_pool);
+ iterpool);
if (!cb_err && lock_callback)
- cb_err = lock_callback(lock_baton, args.path, lock, err, scratch_pool);
+ cb_err = lock_callback(lock_baton, args.path, lock, err, iterpool);
svn_error_clear(err);
}
+ svn_pool_destroy(iterpool);
return svn_error_trace(cb_err);
}
@@ -368,6 +371,7 @@ svn_fs_base__unlock(svn_fs_t *fs,
{
apr_hash_index_t *hi;
svn_error_t *cb_err = SVN_NO_ERROR;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
SVN_ERR(svn_fs__check_fs(fs, TRUE));
@@ -378,16 +382,18 @@ svn_fs_base__unlock(svn_fs_t *fs,
const char *token = apr_hash_this_val(hi);
svn_error_t *err;
+ svn_pool_clear(iterpool);
args.path = svn_fs__canonicalize_abspath(path, result_pool);
args.token = token;
args.break_lock = break_lock;
err = svn_fs_base__retry_txn(fs, txn_body_unlock, &args, TRUE,
- scratch_pool);
+ iterpool);
if (!cb_err && lock_callback)
- cb_err = lock_callback(lock_baton, path, NULL, err, scratch_pool);
+ cb_err = lock_callback(lock_baton, path, NULL, err, iterpool);
svn_error_clear(err);
}
+ svn_pool_destroy(iterpool);
return svn_error_trace(cb_err);
}
Modified: subversion/branches/1.9.x/subversion/libsvn_fs_fs/lock.c
URL:
http://svn.apache.org/viewvc/subversion/branches/1.9.x/subversion/libsvn_fs_fs/lock.c?rev=1673349&r1=1673348&r2=1673349&view=diff
==============================================================================
--- subversion/branches/1.9.x/subversion/libsvn_fs_fs/lock.c (original)
+++ subversion/branches/1.9.x/subversion/libsvn_fs_fs/lock.c Tue Apr 14
04:00:43 2015
@@ -1109,6 +1109,7 @@ svn_fs_fs__lock(svn_fs_t *fs,
apr_array_header_t *sorted_targets;
apr_hash_t *canonical_targets = apr_hash_make(scratch_pool);
apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
svn_error_t *err, *cb_err = SVN_NO_ERROR;
int i;
@@ -1149,11 +1150,13 @@ svn_fs_fs__lock(svn_fs_t *fs,
lb.steal_lock = steal_lock;
lb.result_pool = result_pool;
- err = svn_fs_fs__with_write_lock(fs, lock_body, &lb, scratch_pool);
+ iterpool = svn_pool_create(scratch_pool);
+ err = svn_fs_fs__with_write_lock(fs, lock_body, &lb, iterpool);
for (i = 0; i < lb.infos->nelts; ++i)
{
struct lock_info_t *info = &APR_ARRAY_IDX(lb.infos, i,
struct lock_info_t);
+ svn_pool_clear(iterpool);
if (!cb_err && lock_callback)
{
if (!info->lock && !info->fs_err)
@@ -1162,10 +1165,11 @@ svn_fs_fs__lock(svn_fs_t *fs,
info->path);
cb_err = lock_callback(lock_baton, info->path, info->lock,
- info->fs_err, scratch_pool);
+ info->fs_err, iterpool);
}
svn_error_clear(info->fs_err);
}
+ svn_pool_destroy(iterpool);
if (err && cb_err)
svn_error_compose(err, cb_err);
@@ -1205,6 +1209,7 @@ svn_fs_fs__unlock(svn_fs_t *fs,
apr_array_header_t *sorted_targets;
apr_hash_t *canonical_targets = apr_hash_make(scratch_pool);
apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
svn_error_t *err, *cb_err = SVN_NO_ERROR;
int i;
@@ -1239,11 +1244,13 @@ svn_fs_fs__unlock(svn_fs_t *fs,
ub.break_lock = break_lock;
ub.result_pool = result_pool;
- err = svn_fs_fs__with_write_lock(fs, unlock_body, &ub, scratch_pool);
+ iterpool = svn_pool_create(scratch_pool);
+ err = svn_fs_fs__with_write_lock(fs, unlock_body, &ub, iterpool);
for (i = 0; i < ub.infos->nelts; ++i)
{
struct unlock_info_t *info = &APR_ARRAY_IDX(ub.infos, i,
struct unlock_info_t);
+ svn_pool_clear(iterpool);
if (!cb_err && lock_callback)
{
if (!info->done && !info->fs_err)
@@ -1251,10 +1258,11 @@ svn_fs_fs__unlock(svn_fs_t *fs,
0, _("Failed to unlock '%s'"),
info->path);
cb_err = lock_callback(lock_baton, info->path, NULL, info->fs_err,
- scratch_pool);
+ iterpool);
}
svn_error_clear(info->fs_err);
}
+ svn_pool_destroy(iterpool);
if (err && cb_err)
svn_error_compose(err, cb_err);
Propchange: subversion/branches/1.9.x/subversion/libsvn_fs_x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Apr 14 04:00:43 2015
@@ -90,4 +90,4 @@
/subversion/branches/verify-keep-going/subversion/libsvn_fs_x:1439280-1492639,1546002-1546110
/subversion/branches/wc-collate-path/subversion/libsvn_fs_x:1402685-1480384
/subversion/trunk/subversion/libsvn_fs_fs:1415133-1596500,1596567,1597414,1597989,1598273,1599140,1600872,1601633,1603485-1603487,1603499,1603605,1604128,1604188,1604413-1604414,1604416-1604417,1604421,1604442,1604700,1604717,1604720,1604726,1604755,1604794,1604802,1604824,1604836,1604844,1604902-1604903,1604911,1604925,1604933,1604947,1605059-1605060,1605064-1605065,1605068,1605071-1605073,1605075,1605123,1605188-1605189,1605191,1605197,1605444,1605633,1606132,1606142,1606144,1606514,1606526,1606528,1606551,1606554,1606564,1606598-1606599,1606656,1606658,1606662,1606744,1606840,1607085,1607572,1612407,1612810,1613339,1613872,1614611,1615348,1615351-1615352,1615356,1616338-1616339,1616613,1617586,1617688,1618138,1618151,1618153,1618226,1618641,1618653,1618662,1619068,1619358,1619413,1619769,1619774,1620602,1620909,1620912,1620928,1620930,1621275,1621635,1622931,1622937,1622942,1622946,1622959-1622960,1622963,1622987,1623007,1623368,1623373,1623377,1623379,1623381,1623398,1623402,162
4011,1624265,1624512,1626246,1626871,1626873,1626886,1627497-1627498,1627502,1627947-1627949,1627966,1628083,1628093,1628158-1628159,1628161,1628392-1628393,1628415,1628427,1628676,1628738,1628762,1628764,1629854-1629855,1629857,1629865,1629873,1629875,1629879,1630067,1630070,1631049-1631051,1631075,1631115,1631171,1631180,1631185-1631186,1631196-1631197,1631239-1631240,1631548,1631550,1631563,1631567,1631588,1631598,1632646,1632776,1632849,1632851-1632853,1632856-1632857,1632868,1632908,1632926,1633232,1633617-1633618,1634872,1634875,1634879-1634880,1634920,1636478,1636483,1636629,1636644,1637184,1637186,1637330,1637358,1637363,1637393,1639319,1639322,1639335,1639348,1639352,1639355,1639358,1639414,1639419,1639426,1639430,1639436,1639440,1639549,1640061-1640062,1640197,1640915,1640966,1641013,1643139,1643233,1645567,1646021,1646712,1646716,1647537,1647540-1647541,1647820,1647905,1648230,1648238,1648241-1648243,1648253,1648272,1648532,1648537-1648539,1648542,1648591,1648612,1653608,
1658482
-/subversion/trunk/subversion/libsvn_fs_x:1414756-1509914,1665318,1665894,1667101,1669749
+/subversion/trunk/subversion/libsvn_fs_x:1414756-1509914,1665318,1665894,1667101,1669749,1670139,1670149,1670152,1670347
Modified: subversion/branches/1.9.x/subversion/libsvn_fs_x/lock.c
URL:
http://svn.apache.org/viewvc/subversion/branches/1.9.x/subversion/libsvn_fs_x/lock.c?rev=1673349&r1=1673348&r2=1673349&view=diff
==============================================================================
--- subversion/branches/1.9.x/subversion/libsvn_fs_x/lock.c (original)
+++ subversion/branches/1.9.x/subversion/libsvn_fs_x/lock.c Tue Apr 14 04:00:43
2015
@@ -1239,6 +1239,7 @@ svn_fs_x__lock(svn_fs_t *fs,
apr_array_header_t *sorted_targets;
apr_hash_t *canonical_targets = apr_hash_make(scratch_pool);
apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
svn_error_t *err, *cb_err = SVN_NO_ERROR;
int i;
@@ -1277,11 +1278,13 @@ svn_fs_x__lock(svn_fs_t *fs,
lb.steal_lock = steal_lock;
lb.result_pool = result_pool;
- err = svn_fs_x__with_write_lock(fs, lock_body, &lb, scratch_pool);
+ iterpool = svn_pool_create(scratch_pool);
+ err = svn_fs_x__with_write_lock(fs, lock_body, &lb, iterpool);
for (i = 0; i < lb.infos->nelts; ++i)
{
struct lock_info_t *info = &APR_ARRAY_IDX(lb.infos, i,
struct lock_info_t);
+ svn_pool_clear(iterpool);
if (!cb_err && lock_callback)
{
if (!info->lock && !info->fs_err)
@@ -1290,10 +1293,11 @@ svn_fs_x__lock(svn_fs_t *fs,
info->path);
cb_err = lock_callback(lock_baton, info->path, info->lock,
- info->fs_err, scratch_pool);
+ info->fs_err, iterpool);
}
svn_error_clear(info->fs_err);
}
+ svn_pool_destroy(iterpool);
if (err && cb_err)
svn_error_compose(err, cb_err);
@@ -1333,6 +1337,7 @@ svn_fs_x__unlock(svn_fs_t *fs,
apr_array_header_t *sorted_targets;
apr_hash_t *canonical_targets = apr_hash_make(scratch_pool);
apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
svn_error_t *err, *cb_err = SVN_NO_ERROR;
int i;
@@ -1365,10 +1370,12 @@ svn_fs_x__unlock(svn_fs_t *fs,
ub.break_lock = break_lock;
ub.result_pool = result_pool;
- err = svn_fs_x__with_write_lock(fs, unlock_body, &ub, scratch_pool);
+ iterpool = svn_pool_create(scratch_pool);
+ err = svn_fs_x__with_write_lock(fs, unlock_body, &ub, iterpool);
for (i = 0; i < ub.infos->nelts; ++i)
{
unlock_info_t *info = &APR_ARRAY_IDX(ub.infos, i, unlock_info_t);
+ svn_pool_clear(iterpool);
if (!cb_err && lock_callback)
{
if (!info->done && !info->fs_err)
@@ -1376,10 +1383,11 @@ svn_fs_x__unlock(svn_fs_t *fs,
0, _("Failed to unlock '%s'"),
info->path);
cb_err = lock_callback(lock_baton, info->path, NULL, info->fs_err,
- scratch_pool);
+ iterpool);
}
svn_error_clear(info->fs_err);
}
+ svn_pool_destroy(iterpool);
if (err && cb_err)
svn_error_compose(err, cb_err);