rpm/rpm-4.9.x-rpmdb-dsi.patch
Panu Matilainen d06308ca0b - fix memory corruption on rpmdb size estimation (#766260)
- fix couple of memleaks in python bindings (#782147)
- fix regression in verify output formatting (#797964)
- dont process spec include in false branch of if (#782970)
- only warn on missing excluded files on build (#745629)
- dont free up file info sets on test transactions
2012-03-07 12:08:22 +02:00

99 lines
3.0 KiB
Diff

diff --git a/lib/transaction.c b/lib/transaction.c
index 7adf60b..5acc08e 100644
--- a/lib/transaction.c
+++ b/lib/transaction.c
@@ -227,46 +227,12 @@ static void rpmtsUpdateDSI(const rpmts ts, dev_t dev, const char *dirName,
if (dsi->ineeded < dsi->oineeded) dsi->oineeded = dsi->ineeded;
}
-/* return DSI of the device the rpmdb lives on */
-static rpmDiskSpaceInfo rpmtsDbDSI(const rpmts ts) {
- const char *dbhome = rpmdbHome(rpmtsGetRdb(ts));
- struct stat sb;
- int rc;
-
- rc = stat(dbhome, &sb);
- if (rc) {
- return NULL;
- }
- return rpmtsGetDSI(ts, sb.st_dev, dbhome);
-}
-
-/* Update DSI for changing size of the rpmdb */
-static void rpmtsUpdateDSIrpmDBSize(const rpmte p,
- rpmDiskSpaceInfo dsi) {
- rpm_loff_t headerSize;
- int64_t bneeded;
-
- /* XXX somehow we can end up here with bsize 0 (RhBug:671056) */
- if (dsi == NULL || dsi->bsize == 0) return;
-
- headerSize = rpmteHeaderSize(p);
- bneeded = BLOCK_ROUND(headerSize, dsi->bsize);
- /* REMOVE doesn't neccessarily shrink the database */
- if (rpmteType(p) == TR_ADDED) {
- /* guessing that db grows 4 times more than the header size */
- dsi->bneeded += (bneeded * 4);
- }
-}
-
-
static void rpmtsCheckDSIProblems(const rpmts ts, const rpmte te)
{
rpmDiskSpaceInfo dsi = ts->dsi;
if (dsi == NULL || !dsi->bsize)
return;
- if (rpmfiFC(rpmteFI(te)) <= 0)
- return;
for (; dsi->bsize; dsi++) {
@@ -1294,11 +1260,12 @@ static int rpmtsPrepare(rpmts ts)
rpmfi fi;
int rc = 0;
uint64_t fileCount = countFiles(ts);
+ const char *dbhome = NULL;
+ struct stat dbstat;
fingerPrintCache fpc = fpCacheCreate(fileCount/2 + 10001);
rpmFpHash ht = rpmFpHashCreate(fileCount/2+1, fpHashFunction, fpEqual,
NULL, NULL);
- rpmDiskSpaceInfo dsi;
rpmlog(RPMLOG_DEBUG, "computing %" PRIu64 " file fingerprints\n", fileCount);
@@ -1326,7 +1293,10 @@ static int rpmtsPrepare(rpmts ts)
/* check against files in the rpmdb */
checkInstalledFiles(ts, fileCount, ht, fpc);
- dsi = rpmtsDbDSI(ts);
+ dbhome = rpmdbHome(rpmtsGetRdb(ts));
+ /* If we can't stat, ignore db growth. Probably not right but... */
+ if (dbhome && stat(dbhome, &dbstat))
+ dbhome = NULL;
pi = rpmtsiInit(ts);
while ((p = rpmtsiNext(pi, 0)) != NULL) {
@@ -1338,10 +1308,18 @@ static int rpmtsPrepare(rpmts ts)
needs on each partition for this package. */
handleOverlappedFiles(ts, ht, p, fi);
- rpmtsUpdateDSIrpmDBSize(p, dsi);
-
/* Check added package has sufficient space on each partition used. */
if (rpmteType(p) == TR_ADDED) {
+ /*
+ * Try to estimate space needed for rpmdb growth: guess that the
+ * db grows 4 times the header size (indexes and all).
+ */
+ if (dbhome) {
+ int64_t hsize = rpmteHeaderSize(p) * 4;
+ rpmtsUpdateDSI(ts, dbstat.st_dev, dbhome,
+ hsize, 0, 0, FA_CREATE);
+ }
+
rpmtsCheckDSIProblems(ts, p);
}
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_FINGERPRINT), 0);