d06308ca0b
- 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
99 lines
3.0 KiB
Diff
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);
|