diff options
author | Michael Schroeder <mls@suse.de> | 2019-10-11 15:44:20 +0200 |
---|---|---|
committer | Panu Matilainen <pmatilai@redhat.com> | 2019-11-18 12:46:29 +0200 |
commit | d39acb9abcb4a1309f5aa4f410e55ce4bbeaac09 (patch) | |
tree | 55e03db2a8eac68639385caf09a20cec63d99aeb | |
parent | f3773cc93e755ccd9d35302e14161963ba3526b0 (diff) | |
download | rpm-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.c | 290 |
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); |