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.