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,


Reply via email to