RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: rpm Date: 08-Dec-2009 22:20:35 Branch: HEAD Handle: 2009120821203401 Modified files: rpm CHANGES rpm/rpmdb DB_CONFIG.in rpmdb.c Log: - rpmdb: do in-place rebuilddb, opt-in for now. Summary: Revision Changes Path 1.3187 +1 -0 rpm/CHANGES 1.8 +3 -3 rpm/rpmdb/DB_CONFIG.in 1.351 +92 -1 rpm/rpmdb/rpmdb.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.3186 -r1.3187 CHANGES --- rpm/CHANGES 8 Dec 2009 17:46:40 -0000 1.3186 +++ rpm/CHANGES 8 Dec 2009 21:20:34 -0000 1.3187 @@ -1,5 +1,6 @@ 5.2b1 -> 5.3a1 + - jbj: rpmdb: do in-place rebuilddb, opt-in for now. - jbj: rpmdb: lazily create non-existent secondary indices. - jbj: rpmdb: consolidate primary key swabbing to network order. - jbj: rpmdb: re-open dbenv w DB_RUNRECOVER rather than remove/verify. @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/DB_CONFIG.in ============================================================================ $ cvs diff -u -r1.7 -r1.8 DB_CONFIG.in --- rpm/rpmdb/DB_CONFIG.in 3 Dec 2009 21:44:26 -0000 1.7 +++ rpm/rpmdb/DB_CONFIG.in 8 Dec 2009 21:20:35 -0000 1.8 @@ -31,8 +31,8 @@ set_mp_mmapsize 16777216 # ================ Locking -set_lk_max_locks 4000 -set_lk_max_lockers 4000 -set_lk_max_objects 4000 +set_lk_max_locks 8000 +set_lk_max_lockers 8000 +set_lk_max_objects 8000 # ================ Replication @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.c ============================================================================ $ cvs diff -u -r1.350 -r1.351 rpmdb.c --- rpm/rpmdb/rpmdb.c 8 Dec 2009 18:30:02 -0000 1.350 +++ rpm/rpmdb/rpmdb.c 8 Dec 2009 21:20:35 -0000 1.351 @@ -69,6 +69,8 @@ /*...@unchecked@*/ static int _rebuildinprogress = 0; +static int _rebuild_inplace = 1; + #define _DBI_FLAGS 0 #define _DBI_PERMS 0644 #define _DBI_MAJOR -1 @@ -794,6 +796,10 @@ case RPMDBI_ADDED: case RPMDBI_REMOVED: case RPMDBI_DEPENDS: + case RPMDBI_BTREE: + case RPMDBI_HASH: + case RPMDBI_QUEUE: + case RPMDBI_RECNO: continue; /*...@notreached@*/ /*...@switchbreak@*/ break; default: @@ -3182,12 +3188,26 @@ for (i = 0; i < dbiNTags; i++) { const char * dbiBN = (dbiTags[i].str != NULL ? dbiTags[i].str : tagName(dbiTags[i].tag)); +if (_rebuild_inplace) +switch (dbiTags[i].tag) { +case RPMDBI_PACKAGES: +case RPMDBI_SEQNO: +case RPMDBI_BTREE: +case RPMDBI_HASH: +case RPMDBI_QUEUE: +case RPMDBI_RECNO: + continue; + /*...@notreached@*/ break; +default: + break; +} fn = rpmGetPath(prefix, dbpath, "/", dbiBN, NULL); if (rpmioFileExists(fn)) xx = Unlink(fn); fn = _free(fn); } +if (!_rebuild_inplace) { fn = rpmGetPath(prefix, dbpath, "/", "__db.000", NULL); suffix = (char *)(fn + strlen(fn) - (sizeof("000") - 1)); for (i = 0; i < 16; i++) { @@ -3196,6 +3216,7 @@ xx = Unlink(fn); } fn = _free(fn); +} } break; case 2: @@ -3204,9 +3225,11 @@ break; } +if (!_rebuild_inplace) { fn = rpmGetPath(prefix, dbpath, NULL); xx = Rmdir(fn); fn = _free(fn); +} return 0; } @@ -3328,7 +3351,7 @@ return rc; } -int rpmdbRebuild(const char * prefix, rpmts ts) +static int _rpmdbRebuild(const char * prefix, rpmts ts) /*...@globals _rebuildinprogress @*/ /*...@modifies _rebuildinprogress @*/ { @@ -3563,3 +3586,71 @@ return rc; } + +int rpmdbRebuild(const char * prefix, rpmts ts) + /*...@globals _rebuildinprogress @*/ + /*...@modifies _rebuildinprogress @*/ +{ + const char * myprefix = NULL; + rpmdb olddb; + const char * dbpath = NULL; + const char * rootdbpath = NULL; + int _dbapi = rpmExpandNumeric("%{_dbapi}"); + tagStore_t dbiTags = NULL; + size_t dbiNTags = 0; + const char * tfn; + int rc = 1; /* assume failure */ + int xx; + + if (!_rebuild_inplace) + return _rpmdbRebuild(prefix, ts); + +fprintf(stderr, "--> %s(%s, %p)\n", __FUNCTION__, prefix, ts); + + dbiTagsInit(&dbiTags, &dbiNTags); + + /*...@-nullpass@*/ + tfn = rpmGetPath("%{?_dbpath}", NULL); + /*...@=nullpass@*/ + if (!(tfn && tfn[0] != '\0')) { + rpmlog(RPMLOG_DEBUG, D_("no dbpath has been set")); + tfn = _free(tfn); + goto exit; + } + + /* Add --root prefix iff --dbpath is not a URL. */ + switch (urlPath(tfn, NULL)) { + default: + myprefix = xstrdup(""); + break; + case URL_IS_UNKNOWN: + myprefix = rpmGetPath((prefix ? prefix : "/"), NULL); + break; + } + + dbpath = rootdbpath = rpmGetPath(myprefix, tfn, NULL); + if (!(myprefix[0] == '/' && myprefix[1] == '\0')) + dbpath += strlen(myprefix); + tfn = _free(tfn); + + xx = rpmdbRemoveDatabase(myprefix, dbpath, _dbapi, dbiTags, dbiNTags); + + /* XXX Seqno update needs O_RDWR. */ + if (rpmdbOpenDatabase(myprefix, dbpath, _dbapi, &olddb, O_RDWR, 0644, 0)) { + rc = 1; + goto exit; + } + _dbapi = olddb->db_api; + + xx = rpmdbOpenAll(olddb); + + xx = rpmdbClose(olddb); + + rc = 0; + +exit: + rootdbpath = _free(rootdbpath); + dbiTags = tagStoreFree(dbiTags, dbiNTags); + myprefix = _free(myprefix); + return rc; +} @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org