summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMichael Schroeder <mls@suse.de>2015-07-16 17:42:10 +0200
committerMichael Schroeder <mls@suse.de>2015-07-16 17:42:10 +0200
commite8a38dba598c4d089d723c0650bd662fc2fdbafc (patch)
treebb8959f9d0cb10542a449247cb0ee607a06e9abf /lib
parent278216e6b326ba0e2612b937cf3dc8e6d8d99685 (diff)
downloadrpm-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.h9
-rw-r--r--lib/backend/ndb/glue.c23
-rw-r--r--lib/rpmdb.c7
-rw-r--r--lib/rpmdb.h3
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