155 lines
5.1 KiB
Diff
155 lines
5.1 KiB
Diff
From cbe9bcf954b2043dcefabbda6722ee3e149d8a8b Mon Sep 17 00:00:00 2001
|
|
From: Michael Schroeder <mls@suse.de>
|
|
Date: Fri, 10 Jan 2020 11:44:01 +0100
|
|
Subject: [PATCH] ndb: make "ordered slots" flag a boolean
|
|
|
|
We never needed to order by pkgid or slot number, so simplify
|
|
the code.
|
|
|
|
https://github.com/rpm-software-management/rpm/commit/cbe9bcf954b2043dcefabbda6722ee3e149d8a8b
|
|
---
|
|
lib/backend/ndb/rpmpkg.c | 43 +++++++++++++++++++------------------------
|
|
1 file changed, 19 insertions(+), 24 deletions(-)
|
|
|
|
diff --git a/lib/backend/ndb/rpmpkg.c b/lib/backend/ndb/rpmpkg.c
|
|
index b8e33bf..eb65049 100644
|
|
--- a/lib/backend/ndb/rpmpkg.c
|
|
+++ b/lib/backend/ndb/rpmpkg.c
|
|
@@ -52,16 +52,13 @@ typedef struct rpmpkgdb_s {
|
|
unsigned int nslothash;
|
|
|
|
unsigned int freeslot; /* first free slot */
|
|
- int slotorder;
|
|
+ int ordered; /* slots are ordered by the blk offsets */
|
|
|
|
char *filename;
|
|
unsigned int fileblks; /* file size in blks */
|
|
int dofsync;
|
|
} * rpmpkgdb;
|
|
|
|
-#define SLOTORDER_UNORDERED 0
|
|
-#define SLOTORDER_BLKOFF 1
|
|
-
|
|
|
|
static inline unsigned int le2h(unsigned char *p)
|
|
{
|
|
@@ -296,7 +293,7 @@ static int rpmpkgReadSlots(rpmpkgdb pkgdb)
|
|
}
|
|
}
|
|
pkgdb->nslots = i;
|
|
- pkgdb->slotorder = SLOTORDER_UNORDERED; /* XXX: always order? */
|
|
+ pkgdb->ordered = 0;
|
|
pkgdb->fileblks = fileblks;
|
|
pkgdb->freeslot = freeslot;
|
|
if (rpmpkgHashSlots(pkgdb)) {
|
|
@@ -314,15 +311,13 @@ static int orderslots_blkoff_cmp(const void *a, const void *b)
|
|
return blkoffa > blkoffb ? 1 : blkoffa < blkoffb ? -1 : 0;
|
|
}
|
|
|
|
-static void rpmpkgOrderSlots(rpmpkgdb pkgdb, int slotorder)
|
|
+static void rpmpkgOrderSlots(rpmpkgdb pkgdb)
|
|
{
|
|
- if (pkgdb->slotorder == slotorder)
|
|
+ if (pkgdb->ordered)
|
|
return;
|
|
- if (slotorder == SLOTORDER_BLKOFF) {
|
|
- if (pkgdb->nslots > 1)
|
|
- qsort(pkgdb->slots, pkgdb->nslots, sizeof(*pkgdb->slots), orderslots_blkoff_cmp);
|
|
- }
|
|
- pkgdb->slotorder = slotorder;
|
|
+ if (pkgdb->nslots > 1)
|
|
+ qsort(pkgdb->slots, pkgdb->nslots, sizeof(*pkgdb->slots), orderslots_blkoff_cmp);
|
|
+ pkgdb->ordered = 1;
|
|
rpmpkgHashSlots(pkgdb);
|
|
}
|
|
|
|
@@ -347,8 +342,8 @@ static int rpmpkgFindEmptyOffset(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned i
|
|
unsigned int lastblkend = pkgdb->slotnpages * (PAGE_SIZE / BLK_SIZE);
|
|
pkgslot *slot, *oldslot = 0;
|
|
|
|
- if (pkgdb->slotorder != SLOTORDER_BLKOFF)
|
|
- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
|
|
+ if (!pkgdb->ordered)
|
|
+ rpmpkgOrderSlots(pkgdb);
|
|
|
|
if (dontprepend && nslots) {
|
|
lastblkend = pkgdb->slots[0].blkoff;
|
|
@@ -388,8 +383,8 @@ static int rpmpkgNeighbourCheck(rpmpkgdb pkgdb, unsigned int blkoff, unsigned in
|
|
unsigned int lastblkend = pkgdb->slotnpages * (PAGE_SIZE / BLK_SIZE);
|
|
pkgslot *slot, *left = 0, *right = 0;
|
|
|
|
- if (pkgdb->slotorder != SLOTORDER_BLKOFF)
|
|
- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
|
|
+ if (!pkgdb->ordered)
|
|
+ rpmpkgOrderSlots(pkgdb);
|
|
if (blkoff < lastblkend)
|
|
return RPMRC_FAIL;
|
|
for (i = 0, slot = pkgdb->slots; i < nslots; i++, slot++) {
|
|
@@ -704,15 +699,15 @@ static int rpmpkgMoveBlob(rpmpkgdb pkgdb, pkgslot *slot, unsigned int newblkoff)
|
|
return RPMRC_FAIL;
|
|
}
|
|
slot->blkoff = newblkoff;
|
|
- pkgdb->slotorder = SLOTORDER_UNORDERED;
|
|
+ pkgdb->ordered = 0;
|
|
return RPMRC_OK;
|
|
}
|
|
|
|
static int rpmpkgAddSlotPage(rpmpkgdb pkgdb)
|
|
{
|
|
unsigned int cutoff;
|
|
- if (pkgdb->slotorder != SLOTORDER_BLKOFF)
|
|
- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
|
|
+ if (!pkgdb->ordered)
|
|
+ rpmpkgOrderSlots(pkgdb);
|
|
cutoff = (pkgdb->slotnpages + 1) * (PAGE_SIZE / BLK_SIZE);
|
|
|
|
/* now move every blob before cutoff */
|
|
@@ -730,7 +725,7 @@ static int rpmpkgAddSlotPage(rpmpkgdb pkgdb)
|
|
if (rpmpkgMoveBlob(pkgdb, slot, newblkoff)) {
|
|
return RPMRC_FAIL;
|
|
}
|
|
- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
|
|
+ rpmpkgOrderSlots(pkgdb);
|
|
}
|
|
|
|
/* make sure our new page is empty */
|
|
@@ -1008,7 +1003,7 @@ static int rpmpkgPutInternal(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char
|
|
/* just update the slot, no need to free the slot data */
|
|
oldslot->blkoff = blkoff;
|
|
oldslot->blkcnt = blkcnt;
|
|
- pkgdb->slotorder = SLOTORDER_UNORDERED;
|
|
+ pkgdb->ordered = 0;
|
|
} else {
|
|
free(pkgdb->slots);
|
|
pkgdb->slots = 0;
|
|
@@ -1025,7 +1020,7 @@ static int rpmpkgDelInternal(rpmpkgdb pkgdb, unsigned int pkgidx)
|
|
if (rpmpkgReadSlots(pkgdb)) {
|
|
return RPMRC_FAIL;
|
|
}
|
|
- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
|
|
+ rpmpkgOrderSlots(pkgdb);
|
|
slot = rpmpkgFindSlot(pkgdb, pkgidx);
|
|
if (!slot) {
|
|
return RPMRC_OK;
|
|
@@ -1068,7 +1063,7 @@ static int rpmpkgDelInternal(rpmpkgdb pkgdb, unsigned int pkgidx)
|
|
blkoff += slot->blkcnt;
|
|
blkcnt -= slot->blkcnt;
|
|
}
|
|
- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
|
|
+ rpmpkgOrderSlots(pkgdb);
|
|
} else {
|
|
slot->blkoff = 0;
|
|
slot->blkcnt = 0;
|
|
@@ -1107,7 +1102,7 @@ static int rpmpkgListInternal(rpmpkgdb pkgdb, unsigned int **pkgidxlistp, unsign
|
|
*npkgidxlistp = pkgdb->nslots;
|
|
return RPMRC_OK;
|
|
}
|
|
- rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
|
|
+ rpmpkgOrderSlots(pkgdb);
|
|
nslots = pkgdb->nslots;
|
|
pkgidxlist = xcalloc(nslots + 1, sizeof(unsigned int));
|
|
for (i = 0, slot = pkgdb->slots; i < nslots; i++, slot++) {
|
|
--
|
|
1.8.3.1
|
|
|