summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Schroeder <mls@suse.de>2019-10-11 15:44:20 +0200
committerPanu Matilainen <pmatilai@redhat.com>2019-11-18 12:46:29 +0200
commitd39acb9abcb4a1309f5aa4f410e55ce4bbeaac09 (patch)
tree55e03db2a8eac68639385caf09a20cec63d99aeb
parentf3773cc93e755ccd9d35302e14161963ba3526b0 (diff)
downloadrpm-d39acb9abcb4a1309f5aa4f410e55ce4bbeaac09.tar.gz
Delete all the IDXDB_FILESUPPORT code in the ndb backend
Rpm will always use xdb instead of plain files for the database indexes. (cherry picked from commit 1c45d96b3218b4ecedb290f89d5230ed1acdd5ff)
-rw-r--r--lib/backend/ndb/rpmidx.c290
1 files changed, 30 insertions, 260 deletions
diff --git a/lib/backend/ndb/rpmidx.c b/lib/backend/ndb/rpmidx.c
index 707c47934..25d2502f2 100644
--- a/lib/backend/ndb/rpmidx.c
+++ b/lib/backend/ndb/rpmidx.c
@@ -66,8 +66,6 @@
typedef struct rpmidxdb_s {
rpmpkgdb pkgdb; /* master database */
- char *filename;
- int fd; /* our file descriptor */
int flags;
int mode;
@@ -166,36 +164,13 @@ static void mapcb(rpmxdb xdb, void *data, void *newaddr, size_t newsize) {
set_mapped((rpmidxdb)data, newaddr, (unsigned int)newsize);
}
-static int rpmidxReadHeader(rpmidxdb idxdb);
-
static int rpmidxMap(rpmidxdb idxdb)
{
- if (idxdb->xdb) {
- if (rpmxdbMapBlob(idxdb->xdb, idxdb->xdbid, idxdb->rdonly ? O_RDONLY : O_RDWR, mapcb, idxdb))
- return RPMRC_FAIL;
- if (idxdb->file_size < 4096) {
- rpmxdbUnmapBlob(idxdb->xdb, idxdb->xdbid);
- return RPMRC_FAIL;
- }
- } else {
-#ifdef IDXDB_FILESUPPORT
- struct stat stb;
- size_t size;
- void *mapped;
- if (fstat(idxdb->fd, &stb))
- return RPMRC_FAIL;
- size = stb.st_size;
- if (size < 4096)
- return RPMRC_FAIL;
- /* round up for mmap */
- size = (size + idxdb->pagesize - 1) & ~(idxdb->pagesize - 1);
- mapped = mmap(0, size, idxdb->rdonly ? PROT_READ : PROT_READ | PROT_WRITE, MAP_SHARED, idxdb->fd, 0);
- if (mapped == MAP_FAILED)
- return RPMRC_FAIL;
- set_mapped(idxdb, mapped, (unsigned int)stb.st_size);
-#else
+ if (rpmxdbMapBlob(idxdb->xdb, idxdb->xdbid, idxdb->rdonly ? O_RDONLY : O_RDWR, mapcb, idxdb))
+ return RPMRC_FAIL;
+ if (idxdb->file_size < 4096) {
+ rpmxdbUnmapBlob(idxdb->xdb, idxdb->xdbid);
return RPMRC_FAIL;
-#endif
}
return RPMRC_OK;
}
@@ -204,50 +179,9 @@ static void rpmidxUnmap(rpmidxdb idxdb)
{
if (!idxdb->head_mapped)
return;
- if (idxdb->xdb) {
- rpmxdbUnmapBlob(idxdb->xdb, idxdb->xdbid);
- } else {
-#ifdef IDXDB_FILESUPPORT
- size_t size = idxdb->file_size;
- /* round up for munmap */
- size = (size + idxdb->pagesize - 1) & ~(idxdb->pagesize - 1);
- munmap(idxdb->head_mapped, size);
- set_mapped(idxdb, 0, 0);
-#else
- return;
-#endif
- }
+ rpmxdbUnmapBlob(idxdb->xdb, idxdb->xdbid);
}
-#ifdef IDXDB_FILESUPPORT
-static int rpmidxReadHeader(rpmidxdb idxdb);
-
-/* re-open file to get the new version */
-static int rpmidxHandleObsolete(rpmidxdb idxdb)
-{
- int nfd;
- struct stat stb1, stb2;
-
- if (fstat(idxdb->fd, &stb1))
- return RPMRC_FAIL;
- nfd = open(idxdb->filename, idxdb->rdonly ? O_RDONLY : O_RDWR, 0);
- if (nfd == -1)
- return RPMRC_FAIL;
- if (fstat(nfd, &stb2)) {
- close(nfd);
- return RPMRC_FAIL;
- }
- if (stb1.st_dev == stb2.st_dev && stb1.st_ino == stb2.st_ino) {
- close(nfd);
- return RPMRC_FAIL; /* opened the same obsolete file */
- }
- rpmidxUnmap(idxdb);
- close(idxdb->fd);
- idxdb->fd = nfd;
- return rpmidxReadHeader(idxdb); /* re-try with new file */
-}
-#endif
-
static int rpmidxReadHeader(rpmidxdb idxdb)
{
unsigned int version;
@@ -272,10 +206,6 @@ static int rpmidxReadHeader(rpmidxdb idxdb)
rpmidxUnmap(idxdb);
return RPMRC_FAIL;
}
-#ifdef IDXDB_FILESUPPORT
- if (!idxdb->xdb && le2ha(idxdb->head_mapped + IDXDB_OFFSET_OBSOLETE))
- return rpmidxHandleObsolete(idxdb);
-#endif
idxdb->generation = le2ha(idxdb->head_mapped + IDXDB_OFFSET_GENERATION);
idxdb->nslots = le2ha(idxdb->head_mapped + IDXDB_OFFSET_NSLOTS);
idxdb->usedslots = le2ha(idxdb->head_mapped + IDXDB_OFFSET_USEDSLOTS);
@@ -338,23 +268,6 @@ static inline void bumpGeneration(rpmidxdb idxdb)
h2lea(idxdb->generation, idxdb->head_mapped + IDXDB_OFFSET_GENERATION);
}
-#ifdef IDXDB_FILESUPPORT
-static int createempty(rpmidxdb idxdb, off_t off, size_t size)
-{
- char buf[4096];
- memset(buf, 0, sizeof(buf));
- while (size >= 4096) {
- if (pwrite(idxdb->fd, buf, 4096, off) != 4096)
- return RPMRC_FAIL;
- off += 4096;
- size -= 4096;
- }
- if (size > 0 && pwrite(idxdb->fd, buf, size , off) != size)
- return RPMRC_FAIL;
- return RPMRC_OK;
-}
-#endif
-
/*** Key management ***/
#define MURMUR_M 0x5bd1e995
@@ -454,29 +367,8 @@ static inline int equalkey(rpmidxdb idxdb, unsigned int off, const unsigned char
static int addkeypage(rpmidxdb idxdb) {
unsigned int addsize = idxdb->pagesize > IDXDB_KEY_CHUNKSIZE ? idxdb->pagesize : IDXDB_KEY_CHUNKSIZE;
- if (idxdb->xdb) {
- if (rpmxdbResizeBlob(idxdb->xdb, idxdb->xdbid, idxdb->file_size + addsize))
- return RPMRC_FAIL;
- } else {
-#ifdef IDXDB_FILESUPPORT
- /* don't use ftruncate because we want to create a "backed" page */
- void *newaddr;
- size_t oldsize, newsize;
- if (createempty(idxdb, idxdb->file_size, addsize))
- return RPMRC_FAIL;
- oldsize = idxdb->file_size;
- newsize = idxdb->file_size + addsize;
- /* round up for mremap */
- oldsize = (oldsize + idxdb->pagesize - 1) & ~(idxdb->pagesize - 1);
- newsize = (newsize + idxdb->pagesize - 1) & ~(idxdb->pagesize - 1);
- newaddr = mremap(idxdb->head_mapped, oldsize, newsize, MREMAP_MAYMOVE);
- if (newaddr == MAP_FAILED)
- return RPMRC_FAIL;
- set_mapped(idxdb, newaddr, idxdb->file_size + addsize);
-#else
+ if (rpmxdbResizeBlob(idxdb->xdb, idxdb->xdbid, idxdb->file_size + addsize))
return RPMRC_FAIL;
-#endif
- }
return RPMRC_OK;
}
@@ -629,45 +521,16 @@ static int rpmidxRebuildInternal(rpmidxdb idxdb)
nidxdb->xmask = xmask;
/* create new database */
- if (idxdb->xdb) {
- nidxdb->xdb = idxdb->xdb;
- nidxdb->xdbtag = idxdb->xdbtag;
- if (rpmxdbLookupBlob(nidxdb->xdb, &nidxdb->xdbid, idxdb->xdbtag, IDXDB_XDB_SUBTAG_REBUILD, O_CREAT|O_TRUNC)) {
- return RPMRC_FAIL;
- }
- if (rpmxdbResizeBlob(nidxdb->xdb, nidxdb->xdbid, file_size)) {
- return RPMRC_FAIL;
- }
- if (rpmidxMap(nidxdb)) {
- return RPMRC_FAIL;
- }
- } else {
-#ifdef IDXDB_FILESUPPORT
- void *mapped;
- nidxdb->filename = xmalloc(strlen(idxdb->filename) + 8);
- sprintf(nidxdb->filename, "%s-XXXXXX", idxdb->filename);
- nidxdb->fd = mkstemp(nidxdb->filename);
- if (nidxdb->fd == -1) {
- free(nidxdb->filename);
- return RPMRC_FAIL;
- }
- if (createempty(nidxdb, 0, file_size)) {
- close(nidxdb->fd);
- unlink(nidxdb->filename);
- free(nidxdb->filename);
- return RPMRC_FAIL;
- }
- mapped = mmap(0, file_size, idxdb->rdonly ? PROT_READ : PROT_READ | PROT_WRITE, MAP_SHARED, nidxdb->fd, 0);
- if (mapped == MAP_FAILED) {
- close(nidxdb->fd);
- unlink(nidxdb->filename);
- free(nidxdb->filename);
- return RPMRC_FAIL;
- }
- set_mapped(nidxdb, mapped, file_size);
-#else
+ nidxdb->xdb = idxdb->xdb;
+ nidxdb->xdbtag = idxdb->xdbtag;
+ if (rpmxdbLookupBlob(nidxdb->xdb, &nidxdb->xdbid, idxdb->xdbtag, IDXDB_XDB_SUBTAG_REBUILD, O_CREAT|O_TRUNC)) {
+ return RPMRC_FAIL;
+ }
+ if (rpmxdbResizeBlob(nidxdb->xdb, nidxdb->xdbid, file_size)) {
+ return RPMRC_FAIL;
+ }
+ if (rpmidxMap(nidxdb)) {
return RPMRC_FAIL;
-#endif
}
/* copy all entries */
@@ -700,42 +563,14 @@ static int rpmidxRebuildInternal(rpmidxdb idxdb)
/* shrink if we have allocated excessive key space */
xfile_size = file_size - key_size + keyend + IDXDB_KEY_CHUNKSIZE;
xfile_size = (xfile_size + nidxdb->pagesize - 1) & ~(nidxdb->pagesize - 1);
- if (xfile_size < file_size) {
- if (nidxdb->xdb) {
- rpmxdbResizeBlob(nidxdb->xdb, nidxdb->xdbid, xfile_size);
- } else {
- if (ftruncate(nidxdb->fd, xfile_size)) {
- rpmlog(RPMLOG_WARNING, _("truncate failed: %s\n"), strerror(errno));
- }
- }
- }
+ if (xfile_size < file_size)
+ rpmxdbResizeBlob(nidxdb->xdb, nidxdb->xdbid, xfile_size);
/* now switch over to new database */
- if (idxdb->xdb) {
- rpmidxUnmap(idxdb);
- if (rpmxdbRenameBlob(nidxdb->xdb, &nidxdb->xdbid, idxdb->xdbtag, IDXDB_XDB_SUBTAG))
- return RPMRC_FAIL;
- idxdb->xdbid = nidxdb->xdbid;
- } else {
-#ifdef IDXDB_FILESUPPORT
- if (rename(nidxdb->filename, idxdb->filename)) {
- close(nidxdb->fd);
- unlink(nidxdb->filename);
- free(nidxdb->filename);
- return RPMRC_FAIL;
- }
- if (idxdb->head_mapped) {
- h2lea(1, idxdb->head_mapped + IDXDB_OFFSET_OBSOLETE);
- bumpGeneration(idxdb);
- rpmidxUnmap(idxdb);
- }
- free(nidxdb->filename);
- close(idxdb->fd);
- idxdb->fd = nidxdb->fd;
-#else
+ rpmidxUnmap(idxdb);
+ if (rpmxdbRenameBlob(nidxdb->xdb, &nidxdb->xdbid, idxdb->xdbtag, IDXDB_XDB_SUBTAG))
return RPMRC_FAIL;
-#endif
- }
+ idxdb->xdbid = nidxdb->xdbid;
if (rpmidxReadHeader(idxdb))
return RPMRC_FAIL;
return RPMRC_OK;
@@ -1001,26 +836,14 @@ static int rpmidxListInternal(rpmidxdb idxdb, unsigned int **keylistp, unsigned
static int rpmidxInitInternal(rpmidxdb idxdb)
{
- if (idxdb->xdb) {
- unsigned int id;
- int rc = rpmxdbLookupBlob(idxdb->xdb, &id, idxdb->xdbtag, IDXDB_XDB_SUBTAG, 0);
- if (rc == RPMRC_OK && id) {
- idxdb->xdbid = id;
- return RPMRC_OK; /* somebody else was faster */
- }
- if (rc && rc != RPMRC_NOTFOUND)
- return rc;
- } else {
-#ifdef IDXDB_FILESUPPORT
- struct stat stb;
- if (stat(idxdb->filename, &stb))
- return RPMRC_FAIL;
- if (stb.st_size) /* somebody else was faster */
- return rpmidxHandleObsolete(idxdb);
-#else
- return RPMRC_FAIL;
-#endif
+ unsigned int id;
+ int rc = rpmxdbLookupBlob(idxdb->xdb, &id, idxdb->xdbtag, IDXDB_XDB_SUBTAG, 0);
+ if (rc == RPMRC_OK && id) {
+ idxdb->xdbid = id;
+ return RPMRC_OK; /* somebody else was faster */
}
+ if (rc && rc != RPMRC_NOTFOUND)
+ return rc;
return rpmidxRebuildInternal(idxdb);
}
@@ -1028,18 +851,12 @@ static int rpmidxLock(rpmidxdb idxdb, int excl)
{
if (excl && idxdb->rdonly)
return RPMRC_FAIL;
- if (idxdb->xdb)
- return rpmxdbLock(idxdb->xdb, excl);
- else
- return rpmpkgLock(idxdb->pkgdb, excl);
+ return rpmxdbLock(idxdb->xdb, excl);
}
static int rpmidxUnlock(rpmidxdb idxdb, int excl)
{
- if (idxdb->xdb)
- return rpmxdbUnlock(idxdb->xdb, excl);
- else
- return rpmpkgUnlock(idxdb->pkgdb, excl);
+ return rpmxdbUnlock(idxdb->xdb, excl);
}
static int rpmidxLockReadHeader(rpmidxdb idxdb, int excl)
@@ -1065,43 +882,7 @@ static int rpmidxInit(rpmidxdb idxdb)
int rpmidxOpen(rpmidxdb *idxdbp, rpmpkgdb pkgdb, const char *filename, int flags, int mode)
{
-#ifdef IDXDB_FILESUPPORT
- struct stat stb;
- rpmidxdb idxdb;
-
- *idxdbp = 0;
- idxdb = xcalloc(1, sizeof(*idxdb));
- idxdb->filename = xstrdup(filename);
- if ((flags & (O_RDONLY|O_RDWR)) == O_RDONLY)
- idxdb->rdonly = 1;
- if ((idxdb->fd = open(filename, flags, mode)) == -1) {
- free(idxdb->filename);
- free(idxdb);
- return RPMRC_FAIL;
- }
- if (fstat(idxdb->fd, &stb)) {
- close(idxdb->fd);
- free(idxdb->filename);
- free(idxdb);
- return RPMRC_FAIL;
- }
- idxdb->pkgdb = pkgdb;
- idxdb->flags = flags;
- idxdb->mode = mode;
- idxdb->pagesize = sysconf(_SC_PAGE_SIZE);
- if (stb.st_size == 0) {
- if (rpmidxInit(idxdb)) {
- close(idxdb->fd);
- free(idxdb->filename);
- free(idxdb);
- return RPMRC_FAIL;
- }
- }
- *idxdbp = idxdb;
- return RPMRC_OK;
-#else
return RPMRC_FAIL;
-#endif
}
int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag)
@@ -1121,7 +902,6 @@ int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdb
return RPMRC_FAIL;
}
idxdb = xcalloc(1, sizeof(*idxdb));
- idxdb->fd = -1;
idxdb->xdb = xdb;
idxdb->xdbtag = xdbtag;
idxdb->xdbid = id;
@@ -1165,12 +945,6 @@ int rpmidxDelXdb(rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag)
void rpmidxClose(rpmidxdb idxdb)
{
rpmidxUnmap(idxdb);
- if (idxdb->fd >= 0) {
- close(idxdb->fd);
- idxdb->fd = -1;
- }
- if (idxdb->filename)
- free(idxdb->filename);
free(idxdb);
}
@@ -1229,11 +1003,7 @@ int rpmidxStats(rpmidxdb idxdb)
if (rpmidxLockReadHeader(idxdb, 0))
return RPMRC_FAIL;
printf("--- IndexDB Stats\n");
- if (idxdb->xdb) {
- printf("Xdb tag: %d, id: %d\n", idxdb->xdbtag, idxdb->xdbid);
- } else {
- printf("Filename: %s\n", idxdb->filename);
- }
+ printf("Xdb tag: %d, id: %d\n", idxdb->xdbtag, idxdb->xdbid);
printf("Generation: %u\n", idxdb->generation);
printf("Slots: %u\n", idxdb->nslots);
printf("Used slots: %u\n", idxdb->usedslots);