diff options
author | Michael Schroeder <mls@suse.de> | 2015-07-16 17:42:10 +0200 |
---|---|---|
committer | Michael Schroeder <mls@suse.de> | 2015-07-16 17:42:10 +0200 |
commit | e8a38dba598c4d089d723c0650bd662fc2fdbafc (patch) | |
tree | bb8959f9d0cb10542a449247cb0ee607a06e9abf /lib | |
parent | 278216e6b326ba0e2612b937cf3dc8e6d8d99685 (diff) | |
download | rpm-e8a38dba598c4d089d723c0650bd662fc2fdbafc.tar.gz |
Add INDEXSYNC db control op
We do this for two purposes: to fsync the index database and to
update the generation count so that we can detect when the database
is out of sync.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/backend/dbi.h | 9 | ||||
-rw-r--r-- | lib/backend/ndb/glue.c | 23 | ||||
-rw-r--r-- | lib/rpmdb.c | 7 | ||||
-rw-r--r-- | lib/rpmdb.h | 3 |
4 files changed, 37 insertions, 5 deletions
diff --git a/lib/backend/dbi.h b/lib/backend/dbi.h index 831c166d1..a575d3cba 100644 --- a/lib/backend/dbi.h +++ b/lib/backend/dbi.h @@ -13,10 +13,11 @@ enum rpmdbFlags { }; typedef enum dbCtrlOp_e { - DB_CTRL_LOCK_RO = 1, - DB_CTRL_UNLOCK_RO = 2, - DB_CTRL_LOCK_RW = 3, - DB_CTRL_UNLOCK_RW = 4 + DB_CTRL_LOCK_RO = 1, + DB_CTRL_UNLOCK_RO = 2, + DB_CTRL_LOCK_RW = 3, + DB_CTRL_UNLOCK_RW = 4, + DB_CTRL_INDEXSYNC = 5 } dbCtrlOp; typedef struct dbiIndex_s * dbiIndex; diff --git a/lib/backend/ndb/glue.c b/lib/backend/ndb/glue.c index 2ccc8bdf8..3ed8bd3b5 100644 --- a/lib/backend/ndb/glue.c +++ b/lib/backend/ndb/glue.c @@ -166,8 +166,27 @@ static void ndb_SetFSync(rpmdb rdb, int enable) { } +static int indexSync(rpmpkgdb pkgdb, rpmxdb xdb) +{ + unsigned int generation; + int rc; + if (!pkgdb || !xdb) + return 1; + if (rpmpkgLock(pkgdb, 1)) + return 1; + if (rpmpkgGeneration(pkgdb, &generation)) { + rpmpkgUnlock(pkgdb, 1); + return 1; + } + rc = rpmxdbSetUserGeneration(xdb, generation); + rpmpkgUnlock(pkgdb, 1); + return rc; +} + static int ndb_Ctrl(rpmdb rdb, dbCtrlOp ctrl) { + struct ndbEnv_s *ndbenv = rdb->db_dbenv; + switch (ctrl) { case DB_CTRL_LOCK_RO: if (!rdb->db_pkgs) @@ -185,6 +204,10 @@ static int ndb_Ctrl(rpmdb rdb, dbCtrlOp ctrl) if (!rdb->db_pkgs) return 1; return rpmpkgUnlock(rdb->db_pkgs->dbi_db, 1); + case DB_CTRL_INDEXSYNC: + if (!ndbenv) + return 1; + return indexSync(ndbenv->pkgdb, ndbenv->xdb); default: break; } diff --git a/lib/rpmdb.c b/lib/rpmdb.c index e9ebaa2e7..3edf6fb88 100644 --- a/lib/rpmdb.c +++ b/lib/rpmdb.c @@ -92,6 +92,7 @@ static int buildIndexes(rpmdb db) } rpmdbFreeIterator(mi); + dbCtrl(db, DB_CTRL_INDEXSYNC); dbCtrl(db, DB_CTRL_UNLOCK_RW); dbSetFSync(db, !db->cfg.db_no_fsync); @@ -1051,6 +1052,7 @@ static int miFreeHeader(rpmdbMatchIterator mi, dbiIndex dbi) dbCtrl(mi->mi_db, DB_CTRL_LOCK_RW); rc = pkgdbPut(dbi, mi->mi_dbc, mi->mi_prevoffset, hdrBlob, hdrLen); + dbCtrl(mi->mi_db, DB_CTRL_INDEXSYNC); dbCtrl(mi->mi_db, DB_CTRL_UNLOCK_RW); unblockSignals(&signalMask); @@ -2162,6 +2164,7 @@ int rpmdbRemove(rpmdb db, unsigned int hdrNum) } } + dbCtrl(db, DB_CTRL_INDEXSYNC); dbCtrl(db, DB_CTRL_UNLOCK_RW); (void) unblockSignals(&signalMask); @@ -2384,6 +2387,7 @@ int rpmdbAdd(rpmdb db, Header h) } } + dbCtrl(db, DB_CTRL_INDEXSYNC); dbCtrl(db, DB_CTRL_UNLOCK_RW); (void) unblockSignals(&signalMask); @@ -2662,6 +2666,9 @@ int rpmdbCtrl(rpmdb db, rpmdbCtrlOp ctrl) case RPMDB_CTRL_UNLOCK_RW: dbctrl = DB_CTRL_UNLOCK_RW; break; + case RPMDB_CTRL_INDEXSYNC: + dbctrl = DB_CTRL_INDEXSYNC; + break; } return dbctrl ? dbCtrl(db, dbctrl) : 1; } diff --git a/lib/rpmdb.h b/lib/rpmdb.h index 9023ee35f..4bbd465d3 100644 --- a/lib/rpmdb.h +++ b/lib/rpmdb.h @@ -34,7 +34,8 @@ typedef enum rpmdbCtrlOp_e { RPMDB_CTRL_LOCK_RO = 1, RPMDB_CTRL_UNLOCK_RO = 2, RPMDB_CTRL_LOCK_RW = 3, - RPMDB_CTRL_UNLOCK_RW = 4 + RPMDB_CTRL_UNLOCK_RW = 4, + RPMDB_CTRL_INDEXSYNC = 5 } rpmdbCtrlOp; /** \ingroup rpmdb |