From dfe1f2e5721f7e6bc49adbec78f50a58a73b564f Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Thu, 9 Sep 2010 21:49:04 +0000 Subject: [PATCH] hack to try as hard as possible to recover a broken database (ITS#6482) --- doc/man/man8/slapcat.8 | 5 +++++ servers/slapd/slapcat.c | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/doc/man/man8/slapcat.8 b/doc/man/man8/slapcat.8 index 4673e49118..02e64c8988 100644 --- a/doc/man/man8/slapcat.8 +++ b/doc/man/man8/slapcat.8 @@ -82,6 +82,11 @@ option. .TP .B \-c Enable continue (ignore errors) mode. +Multiple occorrences of +.B \-c +make +.BR slapcat (8) +try harder. .TP .BI \-d \ debug-level Enable debugging messages as defined by the specified diff --git a/servers/slapd/slapcat.c b/servers/slapd/slapcat.c index af1cae4993..c4e7a7d658 100644 --- a/servers/slapd/slapcat.c +++ b/servers/slapd/slapcat.c @@ -109,8 +109,22 @@ slapcat( int argc, char **argv ) if ( e == NULL ) { printf("# no data for entry id=%08lx\n\n", (long) id ); rc = EXIT_FAILURE; - if( continuemode ) continue; - break; + if ( continuemode == 0 ) { + break; + + } else if ( continuemode == 1 ) { + continue; + } + + /* this is a last resort: linearly scan all ids + * trying to recover as much as possible (ITS#6482) */ + while ( ++id != NOID ) { + e = be->be_entry_get( be, id ); + if ( e != NULL ) break; + printf("# no data for entry id=%08lx\n\n", (long) id ); + } + + if ( e == NULL ) break; } if ( doBSF ) { -- 2.39.2