You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pr...@apache.org on 2013/06/28 14:56:27 UTC

svn commit: r1497757 - in /subversion/branches/verify-keep-going/subversion: include/svn_repos.h libsvn_repos/dump.c svnadmin/svnadmin.c

Author: prabhugs
Date: Fri Jun 28 12:56:26 2013
New Revision: 1497757

URL: http://svn.apache.org/r1497757
Log:
Show the summary of corrupt revisions if keep-going is enabled.
--quiet behaves the same irrespective of the value of keep-going.

* subversion/include/svn_repos.h
  (svn_repos_notify_action_t): Add svn_repos_notify_failure_summary and
  svn_repos_notify_summary to show the summary of corruptions.

* subversion/libsvn_repos/dump.c
  (notify_verification_summary): New function to notify the summary title.
  (notify_verification_error_summary): New function to notify the actual
  summary of the corrupt revisions.
  (error_list): New struct with the revnum and the err to show in summary.
  (err_cleanup): Function to cleanup the pool.
  (populate_summary): New function to populate an array of error_lists
  with the respective revnum and err to notify in the summary.
  (svn_repos_verify_fs3): Show the summary of corruptions.

* subversion/svnadmin/svnadmin.c
  (repos_notify_handler): Handle notification of corruption summary
  title and the actual summary of corrupt revisions.

Modified:
    subversion/branches/verify-keep-going/subversion/include/svn_repos.h
    subversion/branches/verify-keep-going/subversion/libsvn_repos/dump.c
    subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c

Modified: subversion/branches/verify-keep-going/subversion/include/svn_repos.h
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/include/svn_repos.h?rev=1497757&r1=1497756&r2=1497757&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/include/svn_repos.h (original)
+++ subversion/branches/verify-keep-going/subversion/include/svn_repos.h Fri Jun 28 12:56:26 2013
@@ -254,7 +254,13 @@ typedef enum svn_repos_notify_action_t
   svn_repos_notify_verify_rev_structure,
 
   /** A revision is found with corruption/errors. @since New in 1.9. */
-  svn_repos_notify_failure
+  svn_repos_notify_failure,
+
+  /** Summary of corrupt revisions. @since New in 1.9. */
+  svn_repos_notify_failure_summary,
+
+  /** Summary title string. @since New in 1.9. */
+  svn_repos_notify_summary
 
 } svn_repos_notify_action_t;
 

Modified: subversion/branches/verify-keep-going/subversion/libsvn_repos/dump.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_repos/dump.c?rev=1497757&r1=1497756&r2=1497757&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_repos/dump.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_repos/dump.c Fri Jun 28 12:56:26 2013
@@ -1350,6 +1350,42 @@ notify_verification_error(svn_revnum_t r
   notify_func(notify_baton, notify_failure, pool);
 }
 
+static void
+notify_verification_summary(svn_error_t *err,
+                            svn_repos_notify_func_t notify_func,
+                            void *notify_baton,
+                            apr_pool_t *pool)
+{
+  svn_repos_notify_t *notify_failure;
+
+  if (notify_func == NULL)
+    return;
+
+  notify_failure = svn_repos_notify_create(svn_repos_notify_summary, pool);
+  notify_failure->err = err;
+  notify_failure->revision = SVN_INVALID_REVNUM;
+  notify_func(notify_baton, notify_failure, pool);
+}
+
+static void
+notify_verification_error_summary(svn_revnum_t rev,
+                                  svn_error_t *err,
+                                  svn_repos_notify_func_t notify_func,
+                                  void *notify_baton,
+                                  apr_pool_t *pool)
+{
+  svn_repos_notify_t *notify_failure;
+
+  if (notify_func == NULL)
+    return;
+
+  notify_failure = svn_repos_notify_create(svn_repos_notify_failure_summary,
+                                           pool);
+  notify_failure->err = err;
+  notify_failure->revision = rev;
+  notify_func(notify_baton, notify_failure, pool);
+}
+
 /* Verify revision REV in file system FS. */
 static svn_error_t *
 verify_one_revision(svn_fs_t *fs,
@@ -1423,6 +1459,38 @@ verify_fs2_notify_func(svn_revnum_t revi
                             notify_baton->notify, pool);
 }
 
+/* Structure for populating the errors. */
+struct error_list
+{
+  svn_revnum_t rev;
+  svn_error_t *err;
+};
+
+/* Pool cleanup function to clear an svn_error_t *. */
+static apr_status_t err_cleanup(void *data)
+{
+  svn_error_clear(data);
+
+  return APR_SUCCESS;
+}
+
+/* Populate the error summary. */
+static void
+populate_summary(apr_array_header_t **error_summary,
+                 svn_revnum_t rev,
+                 svn_error_t *err,
+                 apr_pool_t *scratch_pool)
+{
+  struct error_list *el = apr_palloc(scratch_pool, sizeof(*el));
+
+  el->rev = rev;
+  el->err = svn_error_dup(err);
+
+  apr_pool_cleanup_register(scratch_pool, el->err, err_cleanup,
+                            apr_pool_cleanup_null);
+  APR_ARRAY_PUSH(*error_summary, struct error_list *) = el;
+}
+
 svn_error_t *
 svn_repos_verify_fs3(svn_repos_t *repos,
                      svn_revnum_t start_rev,
@@ -1442,6 +1510,8 @@ svn_repos_verify_fs3(svn_repos_t *repos,
   svn_fs_progress_notify_func_t verify_notify = NULL;
   struct verify_fs2_notify_func_baton_t *verify_notify_baton = NULL;
   svn_error_t *err;
+  apr_array_header_t *error_summary;
+  int i;
   svn_boolean_t found_corruption = FALSE;
 
   /* Determine the current youngest revision of the filesystem. */
@@ -1504,6 +1574,8 @@ svn_repos_verify_fs3(svn_repos_t *repos,
       svn_error_clear(err);
     }
 
+  error_summary = apr_array_make(pool, 0, sizeof(struct error_list *));
+          
   for (rev = start_rev; rev <= end_rev; rev++)
     {
       svn_pool_clear(iterpool);
@@ -1517,12 +1589,18 @@ svn_repos_verify_fs3(svn_repos_t *repos,
           found_corruption = TRUE;
           notify_verification_error(rev, err, notify_func, notify_baton,
                                     iterpool);
-          svn_error_clear(err);
 
           if (keep_going)
-            continue;
+            {
+              populate_summary(&error_summary, rev, err, pool);
+              svn_error_clear(err);
+              continue;
+            }
           else
-            break;
+            {
+              svn_error_clear(err);
+              break;
+            }
         }
 
       if (notify_func)
@@ -1532,6 +1610,18 @@ svn_repos_verify_fs3(svn_repos_t *repos,
         }
     }
 
+  /* Show the summary. */
+  if (notify_func && keep_going)
+    {
+      notify_verification_summary(err, notify_func, notify_baton, iterpool);
+      for(i=0; i < error_summary->nelts; i++)
+        {
+          struct error_list *err_list = APR_ARRAY_IDX(error_summary, i, struct error_list *);
+          notify_verification_error_summary(err_list->rev, err_list->err, notify_func, notify_baton,
+                                            iterpool);
+        }
+    }
+
   /* We're done. */
   if (notify_func)
     {

Modified: subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c?rev=1497757&r1=1497756&r2=1497757&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c (original)
+++ subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c Fri Jun 28 12:56:26 2013
@@ -847,6 +847,18 @@ repos_notify_handler(void *baton,
                           "svnadmin: ");
       return;
 
+    case svn_repos_notify_failure_summary:
+      if (notify->revision != SVN_INVALID_REVNUM)
+        cmdline_stream_printf(feedback_stream, scratch_pool,
+                              _("r%ld: %s\n"),
+                              notify->revision, notify->err->message);
+      return;
+
+    case svn_repos_notify_summary:
+      cmdline_stream_printf(feedback_stream, scratch_pool,
+                            _("\n-----Summary of corrupt revisions-----\n"));
+      return;
+
     case svn_repos_notify_dump_rev_end:
       cmdline_stream_printf(feedback_stream, scratch_pool,
                             _("* Dumped revision %ld.\n"),



Re: svn commit: r1497757 - in /subversion/branches/verify-keep-going/subversion: include/svn_repos.h libsvn_repos/dump.c svnadmin/svnadmin.c

Posted by Stefan Sperling <st...@elego.de>.
On Fri, Jun 28, 2013 at 02:40:25PM +0000, Daniel Shahaf wrote:
> Should it print the top-most error or the bottom-most one?
> 
> Here are some traces:
> 
>     svnadmin: SVN_ERR_FS_CORRUPT: Corrupt node-revision '2-1.0.r1/114'
>     svnadmin: SVN_ERR_FS_CORRUPT: Found malformed header 'count  0' in revision file
> 
>     svnadmin: SVN_ERR_FS_CORRUPT: Corrupt representation '2 0 14 1 (null) adc83b19e793491b1c6ea0fd8b46cd9f32e592fc (null)'
>     svnadmin: SVN_ERR_FS_CORRUPT: Malformed svndiff data in representation
> 
>     svnadmin: SVN_ERR_FS_CORRUPT: Filesystem is corrupt
>     svnadmin: SVN_ERR_CHECKSUM_MISMATCH: Checksum mismatch while reading representation:
>        expected:  2d2977d1c96f487abe4a1e202dd03b4f
>          actual:  2d2977d1c96f487abe4a1e202dd03b4e
> 
>     svnadmin: SVN_ERR_ATOMIC_INIT_FAILURE: Couldn't open rep-cache database
>     svnadmin: SVN_ERR_ATOMIC_INIT_FAILURE: Couldn't perform atomic initialization
>     svnadmin: SVN_ERR_SQLITE_ERROR: sqlite: file is encrypted or is not a database (S26), executing statement 'PRAGMA synchronous=OFF;PRAGMA recursive_triggers=ON;'

Hmmm. Perhaps it should print the entire error chain every time.

Re: svn commit: r1497757 - in /subversion/branches/verify-keep-going/subversion: include/svn_repos.h libsvn_repos/dump.c svnadmin/svnadmin.c

Posted by Daniel Shahaf <da...@apache.org>.
On Fri, Jun 28, 2013 at 03:46:11PM +0200, Stefan Sperling wrote:
> On Fri, Jun 28, 2013 at 01:11:18PM +0000, Daniel Shahaf wrote:
> > On Fri, Jun 28, 2013 at 12:56:27PM -0000, prabhugs@apache.org wrote:
> > > @@ -1532,6 +1610,18 @@ svn_repos_verify_fs3(svn_repos_t *repos,
> > > +        {
> > > +          struct error_list *err_list = APR_ARRAY_IDX(error_summary, i, struct error_list *);
> > > +          notify_verification_error_summary(err_list->rev, err_list->err, notify_func, notify_baton,
> > 
> > Wrap to 80 columns.
> > 
> > > Modified: subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c
> > > URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c?rev=1497757&r1=1497756&r2=1497757&view=diff
> > > ==============================================================================
> > > --- subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c (original)
> > > +++ subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c Fri Jun 28 12:56:26 2013
> > > @@ -847,6 +847,18 @@ repos_notify_handler(void *baton,
> > >                            "svnadmin: ");
> > >        return;
> > >  
> > > +    case svn_repos_notify_failure_summary:
> > > +      if (notify->revision != SVN_INVALID_REVNUM)
> > > +        cmdline_stream_printf(feedback_stream, scratch_pool,
> > > +                              _("r%ld: %s\n"),
> > > +                              notify->revision, notify->err->message);
> > 
> > err->message may be NULL, perhaps svn_err_best_message()?
> 
> Should be using svn_error_root_cause() as well, otherwise output
> in maintainer-mode builds looks like this:
> 

Should it print the top-most error or the bottom-most one?

Here are some traces:

    svnadmin: SVN_ERR_FS_CORRUPT: Corrupt node-revision '2-1.0.r1/114'
    svnadmin: SVN_ERR_FS_CORRUPT: Found malformed header 'count  0' in revision file

    svnadmin: SVN_ERR_FS_CORRUPT: Corrupt representation '2 0 14 1 (null) adc83b19e793491b1c6ea0fd8b46cd9f32e592fc (null)'
    svnadmin: SVN_ERR_FS_CORRUPT: Malformed svndiff data in representation

    svnadmin: SVN_ERR_FS_CORRUPT: Filesystem is corrupt
    svnadmin: SVN_ERR_CHECKSUM_MISMATCH: Checksum mismatch while reading representation:
       expected:  2d2977d1c96f487abe4a1e202dd03b4f
         actual:  2d2977d1c96f487abe4a1e202dd03b4e

    svnadmin: SVN_ERR_ATOMIC_INIT_FAILURE: Couldn't open rep-cache database
    svnadmin: SVN_ERR_ATOMIC_INIT_FAILURE: Couldn't perform atomic initialization
    svnadmin: SVN_ERR_SQLITE_ERROR: sqlite: file is encrypted or is not a database (S26), executing statement 'PRAGMA synchronous=OFF;PRAGMA recursive_triggers=ON;'

> -----Summary of corrupt revisions-----
> r5: traced call
> r6: traced call
> r7: traced call
> r8: traced call

Re: svn commit: r1497757 - in /subversion/branches/verify-keep-going/subversion: include/svn_repos.h libsvn_repos/dump.c svnadmin/svnadmin.c

Posted by Stefan Sperling <st...@elego.de>.
On Fri, Jun 28, 2013 at 01:11:18PM +0000, Daniel Shahaf wrote:
> On Fri, Jun 28, 2013 at 12:56:27PM -0000, prabhugs@apache.org wrote:
> > @@ -1532,6 +1610,18 @@ svn_repos_verify_fs3(svn_repos_t *repos,
> > +        {
> > +          struct error_list *err_list = APR_ARRAY_IDX(error_summary, i, struct error_list *);
> > +          notify_verification_error_summary(err_list->rev, err_list->err, notify_func, notify_baton,
> 
> Wrap to 80 columns.
> 
> > Modified: subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c
> > URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c?rev=1497757&r1=1497756&r2=1497757&view=diff
> > ==============================================================================
> > --- subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c (original)
> > +++ subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c Fri Jun 28 12:56:26 2013
> > @@ -847,6 +847,18 @@ repos_notify_handler(void *baton,
> >                            "svnadmin: ");
> >        return;
> >  
> > +    case svn_repos_notify_failure_summary:
> > +      if (notify->revision != SVN_INVALID_REVNUM)
> > +        cmdline_stream_printf(feedback_stream, scratch_pool,
> > +                              _("r%ld: %s\n"),
> > +                              notify->revision, notify->err->message);
> 
> err->message may be NULL, perhaps svn_err_best_message()?

Should be using svn_error_root_cause() as well, otherwise output
in maintainer-mode builds looks like this:

-----Summary of corrupt revisions-----
r5: traced call
r6: traced call
r7: traced call
r8: traced call

Re: svn commit: r1497757 - in /subversion/branches/verify-keep-going/subversion: include/svn_repos.h libsvn_repos/dump.c svnadmin/svnadmin.c

Posted by Daniel Shahaf <da...@apache.org>.
On Fri, Jun 28, 2013 at 12:56:27PM -0000, prabhugs@apache.org wrote:
> @@ -1532,6 +1610,18 @@ svn_repos_verify_fs3(svn_repos_t *repos,
> +        {
> +          struct error_list *err_list = APR_ARRAY_IDX(error_summary, i, struct error_list *);
> +          notify_verification_error_summary(err_list->rev, err_list->err, notify_func, notify_baton,

Wrap to 80 columns.

> Modified: subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c
> URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c?rev=1497757&r1=1497756&r2=1497757&view=diff
> ==============================================================================
> --- subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c (original)
> +++ subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c Fri Jun 28 12:56:26 2013
> @@ -847,6 +847,18 @@ repos_notify_handler(void *baton,
>                            "svnadmin: ");
>        return;
>  
> +    case svn_repos_notify_failure_summary:
> +      if (notify->revision != SVN_INVALID_REVNUM)
> +        cmdline_stream_printf(feedback_stream, scratch_pool,
> +                              _("r%ld: %s\n"),
> +                              notify->revision, notify->err->message);

err->message may be NULL, perhaps svn_err_best_message()?

> +      return;
> +
> +    case svn_repos_notify_summary:
> +      cmdline_stream_printf(feedback_stream, scratch_pool,
> +                            _("\n-----Summary of corrupt revisions-----\n"));
> +      return;

I think you shouldn't print that header when there are no corrupt revisions.

Re: svn commit: r1497757 - in /subversion/branches/verify-keep-going/subversion: include/svn_repos.h libsvn_repos/dump.c svnadmin/svnadmin.c

Posted by Daniel Shahaf <da...@apache.org>.
On Fri, Jun 28, 2013 at 12:56:27PM -0000, prabhugs@apache.org wrote:
> @@ -1532,6 +1610,18 @@ svn_repos_verify_fs3(svn_repos_t *repos,
> +        {
> +          struct error_list *err_list = APR_ARRAY_IDX(error_summary, i, struct error_list *);
> +          notify_verification_error_summary(err_list->rev, err_list->err, notify_func, notify_baton,

Wrap to 80 columns.

> Modified: subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c
> URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c?rev=1497757&r1=1497756&r2=1497757&view=diff
> ==============================================================================
> --- subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c (original)
> +++ subversion/branches/verify-keep-going/subversion/svnadmin/svnadmin.c Fri Jun 28 12:56:26 2013
> @@ -847,6 +847,18 @@ repos_notify_handler(void *baton,
>                            "svnadmin: ");
>        return;
>  
> +    case svn_repos_notify_failure_summary:
> +      if (notify->revision != SVN_INVALID_REVNUM)
> +        cmdline_stream_printf(feedback_stream, scratch_pool,
> +                              _("r%ld: %s\n"),
> +                              notify->revision, notify->err->message);

err->message may be NULL, perhaps svn_err_best_message()?

> +      return;
> +
> +    case svn_repos_notify_summary:
> +      cmdline_stream_printf(feedback_stream, scratch_pool,
> +                            _("\n-----Summary of corrupt revisions-----\n"));
> +      return;

I think you shouldn't print that header when there are no corrupt revisions.