Author: stefan2
Date: Sat Jan 19 22:45:02 2013
New Revision: 1435746
URL: http://svn.apache.org/viewvc?rev=1435746&view=rev
Log:
Fix issues #3995 (redesign svn_fs_verify() for 1.8) and #4211 (verify
is slow and needs to handle node verification better).
This patch does two things. First, it adds a notification callback
to svn_fs_verify() and forwards its output to our console stream.
The second change is that revision-specific checks are begin moved
from svn_fs_fs__verify() to a new svn_fs_verify_rev() function.
Because the latter is being called as part of the per-revision checks,
progress is visible and access / cache locality is very much improved.
* subversion/include/svn_fs.h
(svn_fs_progress_notify_func_t): declare new callback type
(svn_fs_verify): add optional notification callbacks
(svn_fs_verify_rev): declare new notification API
* subversion/include/svn_repos.h
(svn_repos_notify_action_t): add svn_repos_notify_verify_struc_rev
notification action
* subversion/libsvn_fs_base/fs.c
(base_bdb_verify_rev): empty implementation of new API for BDB
(fs_vtable,
base_verify): update
* subversion/libsvn_fs_fs/fs.c
(fs_vtable,
fs_verify): update
* subversion/libsvn_fs_fs/fs_fs.h
(svn_fs_fs__verify): update declaration
(svn_fs_fs__verify_rev): declare implementation for new FS API
* subversion/libsvn_fs_fs/fs_fs.c
(svn_fs_fs__verify): update and split off ...
(svn_fs_fs__verify_rev): ... this part
* subversion/libsvn_fs/fs-loader.c
(svn_fs_verify): update
(svn_fs_verify_rev): new pass-through function
* subversion/libsvn_fs/fs-loader.h
(fs_library_vtable_t,
fs_vtable_t): update / extend vtables
* subversion/libsvn_fs_fs/rep-cache.h
(svn_fs_fs__walk_rep_reference): add notification callbacks to API
* subversion/libsvn_fs_fs/rep-cache.c
(svn_fs_fs__walk_rep_reference): send notifications
* subversion/libsvn_repos/dump.c
(verify_fs2_notify_func_baton_t): new baton type for ...
(verify_fs2_notify_func): ... this new forwarding notification handler
(svn_repos_verify_fs2): initialize forwarding notification handle and
use it to patch svn_fs_verify through to the parent; call the new
per-revision verification API as well
* subversion/svnadmin/svnadmin.c
(repos_notify_handler): handle svn_repos_notify_verify_struc_rev
Modified:
subversion/trunk/subversion/include/svn_fs.h
subversion/trunk/subversion/include/svn_repos.h
subversion/trunk/subversion/libsvn_fs/fs-loader.c
subversion/trunk/subversion/libsvn_fs/fs-loader.h
subversion/trunk/subversion/libsvn_fs_base/fs.c
subversion/trunk/subversion/libsvn_fs_fs/fs.c
subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h
subversion/trunk/subversion/libsvn_fs_fs/rep-cache.c
subversion/trunk/subversion/libsvn_fs_fs/rep-cache.h
subversion/trunk/subversion/libsvn_repos/dump.c
subversion/trunk/subversion/svnadmin/svnadmin.c
Modified: subversion/trunk/subversion/include/svn_fs.h
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_fs.h?rev=1435746&r1=1435745&r2=1435746&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_fs.h (original)
+++ subversion/trunk/subversion/include/svn_fs.h Sat Jan 19 22:45:02 2013
@@ -263,14 +263,32 @@ svn_fs_upgrade(const char *path,
apr_pool_t *pool);
/**
+ * Callback function type for progress notification.
+ *
+ * @a revision is the number of the revision currently begin processed,
+ * #SVN_INVALID_REVNUM if the current stage is not linked to any specific
+ * revision. @a baton is the callback baton.
+ *
+ * @since New in 1.8.
+ */
+typedef void (*svn_fs_progress_notify_func_t)(svn_revnum_t revision,
+ void *baton,
+ apr_pool_t *pool);
+
+/**
* Perform backend-specific data consistency and correctness validations
* to the Subversion filesystem located in the directory @a path.
- * Use @a pool for necessary allocations.
+ * Use @a scratch_pool for temporary allocations.
*
* @a start and @a end may be #SVN_INVALID_REVNUM, in which case
* svn_repos_verify_fs2()'s semantics apply. When @c r0 is being
* verified, global invariants may be verified as well.
*
+ * The optional @a notify_func callback is only a general feedback that
+ * the operation is still in process but may be called in random revisions
+ * order and more than once for the same revision, i.e. r2, r1, r2 would
+ * be a valid sequence.
+ *
* @note You probably don't want to use this directly. Take a look at
* svn_repos_verify_fs2() instead, which does non-backend-specific
* verifications as well.
@@ -281,11 +299,29 @@ svn_error_t *
svn_fs_verify(const char *path,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
svn_revnum_t start,
svn_revnum_t end,
apr_pool_t *scratch_pool);
/**
+ * Perform backend-specific data consistency and correctness validations
+ * to revision @a revision of the Subversion filesystem @a fs.
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * @note You probably don't want to use this directly. Take a look at
+ * svn_repos_verify_fs2() instead, which does non-backend-specific
+ * verifications as well.
+ *
+ * @since New in 1.8.
+ */
+svn_error_t *
+svn_fs_verify_rev(svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool);
+
+/**
* Return, in @a *fs_type, a string identifying the back-end type of
* the Subversion filesystem located in @a path. Allocate @a *fs_type
* in @a pool.
Modified: subversion/trunk/subversion/include/svn_repos.h
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_repos.h?rev=1435746&r1=1435745&r2=1435746&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_repos.h (original)
+++ subversion/trunk/subversion/include/svn_repos.h Sat Jan 19 22:45:02 2013
@@ -245,7 +245,10 @@ typedef enum svn_repos_notify_action_t
svn_repos_notify_upgrade_start,
/** A revision was skipped during loading. @since New in 1.8. */
- svn_repos_notify_load_skipped_rev
+ svn_repos_notify_load_skipped_rev,
+
+ /** The structure of a revision is begin verified. @since New in 1.8. */
+ svn_repos_notify_verify_struc_rev
} svn_repos_notify_action_t;
Modified: subversion/trunk/subversion/libsvn_fs/fs-loader.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs/fs-loader.c?rev=1435746&r1=1435745&r2=1435746&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.c Sat Jan 19 22:45:02 2013
@@ -485,6 +485,8 @@ svn_error_t *
svn_fs_verify(const char *path,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
svn_revnum_t start,
svn_revnum_t end,
apr_pool_t *pool)
@@ -497,7 +499,8 @@ svn_fs_verify(const char *path,
SVN_MUTEX__WITH_LOCK(common_pool_lock,
vtable->verify_fs(fs, path, cancel_func, cancel_baton,
- start, end, pool, common_pool));
+ notify_func, notify_baton, start,
+ end, pool, common_pool));
return SVN_NO_ERROR;
}
@@ -625,6 +628,16 @@ svn_fs_recover(const char *path,
}
svn_error_t *
+svn_fs_verify_rev(svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(fs->vtable->verify_rev(fs, revision, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
svn_fs_freeze(svn_fs_t *fs,
svn_error_t *(*freeze_body)(void *baton, apr_pool_t *pool),
void *baton,
Modified: subversion/trunk/subversion/libsvn_fs/fs-loader.h
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs/fs-loader.h?rev=1435746&r1=1435745&r2=1435746&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.h (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.h Sat Jan 19 22:45:02 2013
@@ -88,8 +88,9 @@ typedef struct fs_library_vtable_t
svn_error_t *(*upgrade_fs)(svn_fs_t *fs, const char *path, apr_pool_t *pool,
apr_pool_t *common_pool);
svn_error_t *(*verify_fs)(svn_fs_t *fs, const char *path,
- /* ### notification? */
svn_cancel_func_t cancel_func, void *cancel_baton,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
svn_revnum_t start,
svn_revnum_t end,
apr_pool_t *pool,
@@ -202,6 +203,9 @@ typedef struct fs_vtable_t
svn_fs_get_locks_callback_t get_locks_func,
void *get_locks_baton,
apr_pool_t *pool);
+ svn_error_t *(*verify_rev)(svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *pool);
svn_error_t *(*freeze)(svn_fs_t *fs,
svn_error_t *(*freeze_body)(void *, apr_pool_t *),
void *baton, apr_pool_t *pool);
Modified: subversion/trunk/subversion/libsvn_fs_base/fs.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/fs.c?rev=1435746&r1=1435745&r2=1435746&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/fs.c Sat Jan 19 22:45:02 2013
@@ -472,6 +472,15 @@ bdb_write_config(svn_fs_t *fs)
}
static svn_error_t *
+base_bdb_verify_rev(svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *scratch_pool)
+{
+ /* Verifying is currently a no op for BDB. */
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
base_bdb_freeze(svn_fs_t *fs,
svn_error_t *(*freeze_body)(void *, apr_pool_t *),
void *baton,
@@ -500,6 +509,7 @@ static fs_vtable_t fs_vtable = {
svn_fs_base__unlock,
svn_fs_base__get_lock,
svn_fs_base__get_locks,
+ base_bdb_verify_rev,
base_bdb_freeze,
base_bdb_set_errcall,
};
@@ -894,6 +904,8 @@ static svn_error_t *
base_verify(svn_fs_t *fs, const char *path,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
svn_revnum_t start,
svn_revnum_t end,
apr_pool_t *pool,
Modified: subversion/trunk/subversion/libsvn_fs_fs/fs.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs.c?rev=1435746&r1=1435745&r2=1435746&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs.c Sat Jan 19 22:45:02 2013
@@ -184,6 +184,7 @@ static fs_vtable_t fs_vtable = {
svn_fs_fs__unlock,
svn_fs_fs__get_lock,
svn_fs_fs__get_locks,
+ svn_fs_fs__verify_rev,
fs_freeze,
fs_set_errcall
};
@@ -285,6 +286,8 @@ static svn_error_t *
fs_verify(svn_fs_t *fs, const char *path,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
svn_revnum_t start,
svn_revnum_t end,
apr_pool_t *pool,
@@ -295,7 +298,8 @@ fs_verify(svn_fs_t *fs, const char *path
SVN_ERR(svn_fs_fs__open(fs, path, pool));
SVN_ERR(svn_fs_fs__initialize_caches(fs, pool));
SVN_ERR(fs_serialized_init(fs, common_pool, pool));
- return svn_fs_fs__verify(fs, cancel_func, cancel_baton, start, end, pool);
+ return svn_fs_fs__verify(fs, cancel_func, cancel_baton, notify_func,
+ notify_baton, start, end, pool);
}
static svn_error_t *
Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c?rev=1435746&r1=1435745&r2=1435746&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Sat Jan 19 22:45:02 2013
@@ -10315,6 +10315,8 @@ svn_error_t *
svn_fs_fs__verify(svn_fs_t *fs,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
svn_revnum_t start,
svn_revnum_t end,
apr_pool_t *pool)
@@ -10322,7 +10324,6 @@ svn_fs_fs__verify(svn_fs_t *fs,
fs_fs_data_t *ffd = fs->fsap_data;
svn_boolean_t exists;
svn_revnum_t youngest = ffd->youngest_rev_cache; /* cache is current */
- apr_pool_t *iterpool = svn_pool_create(pool);
if (ffd->format < SVN_FS_FS__MIN_REP_SHARING_FORMAT)
return SVN_NO_ERROR;
@@ -10332,8 +10333,8 @@ svn_fs_fs__verify(svn_fs_t *fs,
start = 0;
if (! SVN_IS_VALID_REVNUM(end))
end = youngest;
- SVN_ERR(ensure_revision_exists(fs, start, iterpool));
- SVN_ERR(ensure_revision_exists(fs, end, iterpool));
+ SVN_ERR(ensure_revision_exists(fs, start, pool));
+ SVN_ERR(ensure_revision_exists(fs, end, pool));
/* rep-cache verification. */
SVN_ERR(svn_fs_fs__exists_rep_cache(&exists, fs, pool));
@@ -10343,31 +10344,32 @@ svn_fs_fs__verify(svn_fs_t *fs,
Don't take any lock. */
SVN_ERR(svn_fs_fs__walk_rep_reference(fs, verify_walker, NULL,
cancel_func, cancel_baton,
+ notify_func, notify_baton,
start, end,
pool));
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__verify_rev(svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *pool)
+{
+ svn_fs_root_t *root;
+
/* Issue #4129: bogus pred-counts and minfo-cnt's on the root node-rev
(and elsewhere). This code makes more thorough checks than the
commit-time checks in validate_root_noderev(). */
- {
- svn_revnum_t i;
- for (i = start; i <= end; i++)
- {
- svn_fs_root_t *root;
-
- svn_pool_clear(iterpool);
-
- /* ### TODO: Make sure caches are disabled.
-
- When this code is called in the library, we want to ensure we
- use the on-disk data --- rather than some data that was read
- in the possibly-distance past and cached since. */
- SVN_ERR(svn_fs_fs__revision_root(&root, fs, i, iterpool));
- SVN_ERR(svn_fs_fs__verify_root(root, iterpool));
- }
- }
- svn_pool_destroy(iterpool);
+ /* ### TODO: Make sure caches are disabled.
+
+ When this code is called in the library, we want to ensure we
+ use the on-disk data --- rather than some data that was read
+ in the possibly-distance past and cached since. */
+ SVN_ERR(svn_fs_fs__revision_root(&root, fs, revision, pool));
+ SVN_ERR(svn_fs_fs__verify_root(root, pool));
+
return SVN_NO_ERROR;
}
Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h?rev=1435746&r1=1435745&r2=1435746&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h Sat Jan 19 22:45:02 2013
@@ -42,10 +42,18 @@ svn_error_t *svn_fs_fs__upgrade(svn_fs_t
svn_error_t *svn_fs_fs__verify(svn_fs_t *fs,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
svn_revnum_t start,
svn_revnum_t end,
apr_pool_t *pool);
+/* Verify REVISION in filesystem FS. Use POOL for temporary allocations. */
+svn_error_t *
+svn_fs_fs__verify_rev(svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_pool_t *pool);
+
/* Copy the fsfs filesystem SRC_FS at SRC_PATH into a new copy DST_FS at
* DST_PATH. If INCREMENTAL is TRUE, do not re-copy data which already
* exists in DST_FS. Use POOL for temporary allocations. */
Modified: subversion/trunk/subversion/libsvn_fs_fs/rep-cache.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/rep-cache.c?rev=1435746&r1=1435745&r2=1435746&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/rep-cache.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/rep-cache.c Sat Jan 19 22:45:02
2013
@@ -135,6 +135,8 @@ svn_fs_fs__walk_rep_reference(svn_fs_t *
void *walker_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
svn_revnum_t start,
svn_revnum_t end,
apr_pool_t *pool)
@@ -143,6 +145,7 @@ svn_fs_fs__walk_rep_reference(svn_fs_t *
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
int iterations = 0;
+ svn_revnum_t last_notified_revision = SVN_INVALID_REVNUM;
apr_pool_t *iterpool = svn_pool_create(pool);
@@ -164,6 +167,9 @@ svn_fs_fs__walk_rep_reference(svn_fs_t *
SVN_ERR(svn_sqlite__reset(stmt));
if (SVN_IS_VALID_REVNUM(max)) /* The rep-cache could be empty. */
SVN_ERR(svn_fs_fs__revision_exists(max, fs, iterpool));
+
+ if (notify_func)
+ notify_func(SVN_INVALID_REVNUM, notify_baton, iterpool);
}
SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->rep_cache_db,
@@ -210,6 +216,16 @@ svn_fs_fs__walk_rep_reference(svn_fs_t *
return svn_error_compose_create(err, svn_sqlite__reset(stmt));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
+
+ /* Notify (occasionally, because walking is fast and we can't
+ guarantee a properly ordered notification sequence anyway) */
+ if ( notify_func
+ && (iterations % 1024 == 0)
+ && (rep->revision != last_notified_revision))
+ {
+ notify_func(rep->revision, notify_baton, iterpool);
+ last_notified_revision = rep->revision;
+ }
}
SVN_ERR(svn_sqlite__reset(stmt));
Modified: subversion/trunk/subversion/libsvn_fs_fs/rep-cache.h
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/rep-cache.h?rev=1435746&r1=1435745&r2=1435746&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/rep-cache.h (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/rep-cache.h Sat Jan 19 22:45:02
2013
@@ -55,6 +55,8 @@ svn_fs_fs__walk_rep_reference(svn_fs_t *
void *walker_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
+ svn_fs_progress_notify_func_t notify_func,
+ void *notify_baton,
svn_revnum_t start,
svn_revnum_t end,
apr_pool_t *pool);
Modified: subversion/trunk/subversion/libsvn_repos/dump.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/dump.c?rev=1435746&r1=1435745&r2=1435746&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/dump.c (original)
+++ subversion/trunk/subversion/libsvn_repos/dump.c Sat Jan 19 22:45:02 2013
@@ -1359,6 +1359,32 @@ verify_close_directory(void *dir_baton,
return close_directory(dir_baton, pool);
}
+/* Baton type used for forwarding notifications from FS API to REPOS API. */
+struct verify_fs2_notify_func_baton_t
+{
+ /* notification function to call (must not be NULL) */
+ svn_repos_notify_func_t notify_func;
+
+ /* baton to use for it */
+ void *notify_baton;
+
+ /* type of notification to send (we will simply plug in the revision) */
+ svn_repos_notify_t *notify;
+};
+
+/* Forward the notification to BATON. */
+static void
+verify_fs2_notify_func(svn_revnum_t revision,
+ void *baton,
+ apr_pool_t *pool)
+{
+ struct verify_fs2_notify_func_baton_t *notify_baton = baton;
+
+ notify_baton->notify->revision = revision;
+ notify_baton->notify_func(notify_baton->notify_baton,
+ notify_baton->notify, pool);
+}
+
svn_error_t *
svn_repos_verify_fs2(svn_repos_t *repos,
svn_revnum_t start_rev,
@@ -1374,6 +1400,8 @@ svn_repos_verify_fs2(svn_repos_t *repos,
svn_revnum_t rev;
apr_pool_t *iterpool = svn_pool_create(pool);
svn_repos_notify_t *notify;
+ svn_fs_progress_notify_func_t verify_notify = NULL;
+ struct verify_fs2_notify_func_baton_t *verify_notify_baton = NULL;
/* Determine the current youngest revision of the filesystem. */
SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool));
@@ -1396,15 +1424,26 @@ svn_repos_verify_fs2(svn_repos_t *repos,
"(youngest revision is %ld)"),
end_rev, youngest);
+ /* Create a notify object that we can reuse within the loop and a
+ forwarding structure for notifications from inside svn_fs_verify(). */
+ if (notify_func)
+ {
+ notify = svn_repos_notify_create(svn_repos_notify_verify_rev_end,
+ pool);
+
+ verify_notify = verify_fs2_notify_func;
+ verify_notify_baton = apr_palloc(pool, sizeof(*verify_notify_baton));
+ verify_notify_baton->notify_func = notify_func;
+ verify_notify_baton->notify_baton = notify_baton;
+ verify_notify_baton->notify
+ = svn_repos_notify_create(svn_repos_notify_verify_struc_rev, pool);
+ }
+
/* Verify global/auxiliary data and backend-specific data first. */
SVN_ERR(svn_fs_verify(svn_fs_path(fs, pool), cancel_func, cancel_baton,
+ verify_notify, verify_notify_baton,
start_rev, end_rev, pool));
- /* Create a notify object that we can reuse within the loop. */
- if (notify_func)
- notify = svn_repos_notify_create(svn_repos_notify_verify_rev_end,
- pool);
-
for (rev = start_rev; rev <= end_rev; rev++)
{
const svn_delta_editor_t *dump_editor;
@@ -1432,6 +1471,8 @@ svn_repos_verify_fs2(svn_repos_t *repos,
&cancel_edit_baton,
iterpool));
+ SVN_ERR(svn_fs_verify_rev(fs, rev, iterpool));
+
SVN_ERR(svn_fs_revision_root(&to_root, fs, rev, iterpool));
SVN_ERR(svn_repos_replay2(to_root, "", SVN_INVALID_REVNUM, FALSE,
cancel_editor, cancel_edit_baton,
Modified: subversion/trunk/subversion/svnadmin/svnadmin.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/svnadmin/svnadmin.c?rev=1435746&r1=1435745&r2=1435746&view=diff
==============================================================================
--- subversion/trunk/subversion/svnadmin/svnadmin.c (original)
+++ subversion/trunk/subversion/svnadmin/svnadmin.c Sat Jan 19 22:45:02 2013
@@ -756,6 +756,16 @@ repos_notify_handler(void *baton,
notify->revision));
return;
+ case svn_repos_notify_verify_struc_rev:
+ if (notify->revision == SVN_INVALID_REVNUM)
+ svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
+ _("* Verifying global structure ...\n")));
+ else
+ svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
+ _("* Verifying structure at revision %ld ...\n"),
+ notify->revision));
+ return;
+
case svn_repos_notify_pack_shard_start:
{
const char *shardstr = apr_psprintf(scratch_pool,