From 89eadf7f1465cfb4ec71f1c4dd17b3fec2afc5b3 Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Thu, 2 Feb 2012 14:31:17 +0200 Subject: [PATCH] Use private environment for database rebuilds too, document - One of the more common reasons for users to do --rebuilddb is a paniced environment. Throwing DB_RUNRECOVER errors at the user who is trying to recover by rebuilding the db isn't terribly productive (RhBug:590710). Use a private environment while rebuilding for both the original and new database, and dont bother with CDB which only slows things down when there are no other players present. - Verify wants the same flags but for different reasons... --- lib/backend/db3.c | 12 +++++++----- lib/rpmdb.c | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/backend/db3.c b/lib/backend/db3.c index 38f14de..30ed7ac 100644 --- a/lib/backend/db3.c +++ b/lib/backend/db3.c @@ -131,11 +131,13 @@ static int db_init(rpmdb rdb, const char * dbhome) return 0; } - /* By no means necessary but speeds things up a bit */ - if (rdb->db_flags & RPMDB_FLAG_REBUILD) - eflags &= ~DB_INIT_CDB; - /* XXX Something bizarre with verify... use private environment, no cdb */ - if (rdb->db_flags & RPMDB_FLAG_VERIFYONLY) { + /* + * Both verify and rebuild are rather special, if for different reasons: + * On rebuild we dont want to be affected by eg paniced environment, and + * CDB only slows things down there. Verify is a quirky beast unlike + * anything else in BDB, and does not like shared env or CDB. + */ + if (rdb->db_flags & (RPMDB_FLAG_VERIFYONLY|RPMDB_FLAG_REBUILD)) { eflags |= DB_PRIVATE; eflags &= ~DB_INIT_CDB; } diff --git a/lib/rpmdb.c b/lib/rpmdb.c index d3a5e23..79abde7 100644 --- a/lib/rpmdb.c +++ b/lib/rpmdb.c @@ -2838,7 +2838,8 @@ int rpmdbRebuild(const char * prefix, rpmts ts, } removedir = 1; - if (openDatabase(prefix, dbpath, &olddb, O_RDONLY, 0644, 0)) { + if (openDatabase(prefix, dbpath, &olddb, + O_RDONLY, 0644, RPMDB_FLAG_REBUILD)) { rc = 1; goto exit; } -- 2.7.4