RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: [email protected] Module: rpm Date: 10-Oct-2009 15:56:27 Branch: HEAD Handle: 2009101013562601 Modified files: rpm/js rpmdbe-js.c rpm/lib fsm.c psm.c rpm/misc librpmmisc.vers rpm/rpmdb rpmdb.c rpmdb.h Log: - dbi: stub-in code to attempt durable orphan directories. Summary: Revision Changes Path 1.17 +27 -1 rpm/js/rpmdbe-js.c 2.187 +11 -9 rpm/lib/fsm.c 2.380 +27 -7 rpm/lib/psm.c 1.25 +1 -0 rpm/misc/librpmmisc.vers 1.326 +0 -4 rpm/rpmdb/rpmdb.c 1.110 +18 -0 rpm/rpmdb/rpmdb.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/js/rpmdbe-js.c ============================================================================ $ cvs diff -u -r1.16 -r1.17 rpmdbe-js.c --- rpm/js/rpmdbe-js.c 27 Sep 2009 08:06:32 -0000 1.16 +++ rpm/js/rpmdbe-js.c 10 Oct 2009 13:56:26 -0000 1.17 @@ -1473,7 +1473,33 @@ if (dbenv == NULL) goto exit; *rval = JSVAL_FALSE; - /* FIXME todo++ */ +#ifdef NOTYET + if (dbenv->app_private != NULL) { + DB_PREPLIST _preplist[32]; + long _count = (sizeof(_preplist) / sizeof(_preplist[0])); + long _got = 0; + uint32_t _flags = DB_FIRST; + int ret = 0; + int i; + + while (1) { + ret = dbenv->txn_recover(dbenv, _preplist, _count, &_count, _flags); + if (ret) { + dbenv->err(dbenv, ret, "DB_ENV->txn_recover"); + goto exit; + } + if (_got == 0) + break; + for (i = 0; i < _got; i++) { + DB_TXN * _txn = _preplist[i].txn; + uint32_t _tflags = 0; + (void) _txn->discard(_txn, _tflags); + } + _flags = DB_NEXT; + } + *rval = JSVAL_TRUE; + } +#endif ok = JS_TRUE; @@ . patch -p0 <<'@@ .' Index: rpm/lib/fsm.c ============================================================================ $ cvs diff -u -r2.186 -r2.187 fsm.c --- rpm/lib/fsm.c 11 Jul 2009 21:32:34 -0000 2.186 +++ rpm/lib/fsm.c 10 Oct 2009 13:56:26 -0000 2.187 @@ -7,9 +7,19 @@ #include <rpmio_internal.h> /* XXX urlPath, fdGetCpioPos */ #include <rpmcb.h> /* XXX fnpyKey */ +#include "rpmsq.h" #include <rpmsx.h> +#if defined(SUPPORT_AR_PAYLOADS) +#include "ar.h" +#endif +#include "cpio.h" +#include "tar.h" +#include "ugid.h" /* XXX unameToUid() and gnameToGid() */ + #include <rpmtag.h> #include <rpmtypes.h> +#define _RPMDB_INTERNAL +#include <rpmdb.h> #define _RPMFI_INTERNAL #include "rpmfi.h" @@ -18,20 +28,11 @@ #include <fsm.h> #define fsmUNSAFE fsmStage -#if defined(SUPPORT_AR_PAYLOADS) -#include "ar.h" -#endif -#include "cpio.h" -#include "tar.h" - #define _USE_RPMTE #if defined(_USE_RPMTE) #include "rpmte.h" #endif #include "rpmts.h" -#include "rpmsq.h" - -#include "ugid.h" /* XXX unameToUid() and gnameToGid() */ #include "debug.h" @@ -1486,6 +1487,7 @@ rpmfi fi = fsmGetFi(fsm); *te = '\0'; st->st_mode = S_IFDIR | (fi->dperms & 07777); +rc = rpmlioMkdir(rpmtsGetRdb(fsmGetTs(fsm)), fsm->path, st->st_mode); rc = fsmNext(fsm, IOSM_MKDIR); if (!rc) { /* XXX FIXME? only new dir will have context set. */ @@ . patch -p0 <<'@@ .' Index: rpm/lib/psm.c ============================================================================ $ cvs diff -u -r2.379 -r2.380 psm.c --- rpm/lib/psm.c 14 Sep 2009 21:32:21 -0000 2.379 +++ rpm/lib/psm.c 10 Oct 2009 13:56:26 -0000 2.380 @@ -26,6 +26,10 @@ #include <rpmtag.h> #include <rpmtypes.h> +#include <pkgio.h> +#define _RPMDB_INTERNAL +#include <rpmdb.h> /* XXX for db_chrootDone */ +#include "signature.h" /* signature constants */ #include <rpmlib.h> #define _RPMFI_INTERNAL @@ -46,10 +50,7 @@ #define _RPMTS_INTERNAL /* XXX ts->notify */ #include "rpmts.h" -#include <pkgio.h> #include "misc.h" /* XXX rpmMkdirPath, makeTempFile, doputenv */ -#include "rpmdb.h" /* XXX for db_chrootDone */ -#include "signature.h" /* signature constants */ #include <rpmcli.h> @@ -332,14 +333,14 @@ } #if defined(RPM_VENDOR_OPENPKG) /* switch-from-susr-to-musr-on-srpm-install */ - if(createDir(fi, ts, NULL, "%{_topdir}") || + if (createDir(fi, ts, NULL, "%{_topdir}") || createDir(fi, ts, NULL, "%{_builddir}") || createDir(fi, ts, NULL, "%{_rpmdir}") || createDir(fi, ts, NULL, "%{_srcrpmdir}") || createDir(fi, ts, &_sourcedir, "%{_sourcedir}") || createDir(fi, ts, &_specdir, "%{_specdir}")) #else - if(createDir(ts, NULL, "%{_topdir}") || + if (createDir(ts, NULL, "%{_topdir}") || createDir(ts, NULL, "%{_builddir}") || createDir(ts, NULL, "%{_rpmdir}") || createDir(ts, NULL, "%{_srcrpmdir}") || @@ -2592,6 +2593,8 @@ break; } + xx = rpmtxnBegin(rpmtsGetRdb(ts)); + rc = fsmSetup(fi->fsm, IOSM_PKGINSTALL, psm->payload_format, ts, fi, psm->cfd, NULL, &psm->failedFile); (void) rpmswAdd(rpmtsOp(ts, RPMTS_OP_UNCOMPRESS), @@ -2610,6 +2613,11 @@ if (!rc) rc = rpmpsmNext(psm, PSM_COMMIT); + if (rc) + xx = rpmtxnAbort(rpmtsGetRdb(ts)); + else + xx = rpmtxnCommit(rpmtsGetRdb(ts)); + /* XXX make sure progress is closed out */ psm->what = RPMCALLBACK_INST_PROGRESS; psm->amount = (fi->archiveSize ? fi->archiveSize : 100); @@ -3011,6 +3019,8 @@ if (fi->isSource) break; /* XXX never add SRPM's */ if (fi->h == NULL) break; /* XXX can't happen */ + xx = rpmtxnBegin(rpmtsGetRdb(ts)); + /* Add header to db, doing header check if requested */ /* XXX rollback headers propagate the previous transaction id. */ { rpmuint32_t tid = ((rpmtsType(ts) == RPMTRANS_TYPE_ROLLBACK) @@ -3023,7 +3033,11 @@ (void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DBADD), 0); } - if (rc != RPMRC_OK) break; + if (rc != RPMRC_OK) { + xx = rpmtxnAbort(rpmtsGetRdb(ts)); + break; + } else + xx = rpmtxnCommit(rpmtsGetRdb(ts)); assert(psm->te != NULL); /* Mark non-rollback elements as installed. */ @@ -3039,11 +3053,17 @@ if (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST) break; if (rpmtsFlags(ts) & RPMTRANS_FLAG_NORPMDB) break; + xx = rpmtxnBegin(rpmtsGetRdb(ts)); + (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DBREMOVE), 0); rc = rpmdbRemove(rpmtsGetRdb(ts), rpmtsGetTid(ts), fi->record, NULL); (void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DBREMOVE), 0); - if (rc != RPMRC_OK) break; + if (rc != RPMRC_OK) { + xx = rpmtxnAbort(rpmtsGetRdb(ts)); + break; + } else + xx = rpmtxnCommit(rpmtsGetRdb(ts)); /* Forget the offset of a successfully removed header. */ if (psm->te != NULL) /* XXX can't happen */ @@ . patch -p0 <<'@@ .' Index: rpm/misc/librpmmisc.vers ============================================================================ $ cvs diff -u -r1.24 -r1.25 librpmmisc.vers --- rpm/misc/librpmmisc.vers 25 Sep 2009 18:41:01 -0000 1.24 +++ rpm/misc/librpmmisc.vers 10 Oct 2009 13:56:27 -0000 1.25 @@ -7,6 +7,7 @@ db_env_set_func_fsync_rpmdb; db_sequence_create_rpmdb; db_strerror_rpmdb; + __db_add_recovery_rpmdb; ficlSystemCompileExtras; ficlSystemCreate; ficlSystemCreateVm; @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.c ============================================================================ $ cvs diff -u -r1.325 -r1.326 rpmdb.c --- rpm/rpmdb/rpmdb.c 7 Oct 2009 18:27:33 -0000 1.325 +++ rpm/rpmdb/rpmdb.c 10 Oct 2009 13:56:27 -0000 1.326 @@ -3080,7 +3080,6 @@ he->p.ptr = _free(he->p.ptr); (void) blockSignals(db, &signalMask); - xx = rpmtxnBegin(db); /*...@-nullpass -nullptrarith -nullderef @*/ /* FIX: rpmvals heartburn */ { dbiIndexItem rec = dbiIndexNewItem(hdrNum, 0); @@ -3346,7 +3345,6 @@ (void) headerFree(db->db_h); db->db_h = NULL; - xx = rpmtxnCommit(db); (void) unblockSignals(db, &signalMask); /* XXX return ret; */ @@ -3419,7 +3417,6 @@ dirIndexes = he->p.ui32p; (void) blockSignals(db, &signalMask); - xx = rpmtxnBegin(db); if (!db->db_rebuilding) { int64_t seqno = 0; @@ -3804,7 +3801,6 @@ /* Unreference header used by associated secondary index callbacks. */ (void) headerFree(db->db_h); - xx = (!ret ? rpmtxnCommit(db) : rpmtxnAbort(db)); (void) unblockSignals(db, &signalMask); dirIndexes = _free(dirIndexes); @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.h ============================================================================ $ cvs diff -u -r1.109 -r1.110 rpmdb.h --- rpm/rpmdb/rpmdb.h 7 Oct 2009 18:01:04 -0000 1.109 +++ rpm/rpmdb/rpmdb.h 10 Oct 2009 13:56:27 -0000 1.110 @@ -1147,6 +1147,24 @@ } /*...@unused@*/ static inline +int rpmlioMkdir(rpmdb rpmdb, const char * dn, mode_t mode) +{ + int rc = 0; +#ifdef NOTYET + extern int logio_Mkdir_log + __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, mode_t)); + DB_ENV * dbenv = rpmdb->db_dbenv; + DB_TXN * _txn = rpmdb->db_txnid; + DB_LSN _lsn = {0,0}; + DBT DNdbt = {0}; + DNdbt.data = (void *)dn; + DNdbt.size = strlen(dn) + 1; /* trailing NUL too */ + rc = logio_Mkdir_log(dbenv, _txn, &_lsn, DB_FLUSH, &DNdbt, mode) +#endif + return rc; +} + +/*...@unused@*/ static inline int rpmmpfSyncAll(rpmdb rpmdb) { DB_ENV * dbenv = rpmdb->db_dbenv; @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository [email protected]
