mirror of
https://github.com/isar/libmdbx.git
synced 2025-08-25 09:44:27 +08:00
mdbx: dynamic mapsize/geometry and API (mostly done).
Change-Id: Ifb768ff3207cae1755c53c211a3ae552c6455e12
This commit is contained in:
@@ -345,10 +345,10 @@ static int handle_freedb(const uint64_t record_number, const MDBX_val *key,
|
||||
reclaimable_pages += number;
|
||||
for (i = number, prev = 1; --i >= 0;) {
|
||||
pg = iptr[i];
|
||||
if (pg < NUM_METAS || pg > envinfo.me_recent_pgno)
|
||||
if (pg < NUM_METAS || pg > envinfo.me_last_pgno)
|
||||
problem_add("entry", record_number, "wrong idl entry",
|
||||
"%u < %" PRIiPTR " < %" PRIiPTR "", NUM_METAS, pg,
|
||||
envinfo.me_recent_pgno);
|
||||
envinfo.me_last_pgno);
|
||||
else if (pg <= prev) {
|
||||
bad = " [bad sequence]";
|
||||
problem_add("entry", record_number, "bad sequence",
|
||||
@@ -727,6 +727,17 @@ static int check_meta_head(bool steady) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void print_size(const char *prefix, const uint64_t value,
|
||||
const char *suffix) {
|
||||
const char sf[] =
|
||||
"KMGTPEZY"; /* LY: Kilo, Mega, Giga, Tera, Peta, Exa, Zetta, Yotta! */
|
||||
double k = 1024.0;
|
||||
size_t i;
|
||||
for (i = 0; sf[i + 1] && value / k > 1000.0; ++i)
|
||||
k *= 1024;
|
||||
print("%s%" PRIu64 " (%.2f %cb)%s", prefix, value, value / k, sf[i], suffix);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
int i, rc;
|
||||
char *prog = argv[0];
|
||||
@@ -858,21 +869,26 @@ int main(int argc, char *argv[]) {
|
||||
goto bailout;
|
||||
}
|
||||
|
||||
lastpgno = envinfo.me_recent_pgno + 1;
|
||||
lastpgno = envinfo.me_last_pgno + 1;
|
||||
errno = 0;
|
||||
|
||||
if (verbose) {
|
||||
double k = 1024.0;
|
||||
const char sf[] =
|
||||
"KMGTPEZY"; /* LY: Kilo, Mega, Giga, Tera, Peta, Exa, Zetta, Yotta! */
|
||||
for (i = 0; sf[i + 1] && envinfo.me_mapsize / k > 1000.0; ++i)
|
||||
k *= 1024;
|
||||
print(" - map size %" PRIu64 " (%.2f %cb)\n", envinfo.me_mapsize,
|
||||
envinfo.me_mapsize / k, sf[i]);
|
||||
if (envinfo.me_mapaddr)
|
||||
print(" - mapaddr %p\n", envinfo.me_mapaddr);
|
||||
print(" - pagesize %u, max keysize %" PRIuPTR ", max readers %u\n",
|
||||
envstat.ms_psize, maxkeysize, envinfo.me_maxreaders);
|
||||
print(" - pagesize %u (%u system), max keysize %" PRIuPTR
|
||||
", max readers %u\n",
|
||||
envinfo.me_dxb_pagesize, envinfo.me_sys_pagesize, maxkeysize,
|
||||
envinfo.me_maxreaders);
|
||||
print_size(" - mapsize ", envinfo.me_mapsize, "\n");
|
||||
if (envinfo.me_geo.lower == envinfo.me_geo.upper)
|
||||
print_size(" - fixed datafile: ", envinfo.me_geo.current, "");
|
||||
else {
|
||||
print_size(" - dynamic datafile: ", envinfo.me_geo.lower, "");
|
||||
print_size(" .. ", envinfo.me_geo.upper, ", ");
|
||||
print_size("+", envinfo.me_geo.grow, ", ");
|
||||
print_size("-", envinfo.me_geo.shrink, "\n");
|
||||
print_size(" - current datafile: ", envinfo.me_geo.current, "");
|
||||
}
|
||||
printf(", %" PRIu64 " pages\n",
|
||||
envinfo.me_geo.current / envinfo.me_dxb_pagesize);
|
||||
print(" - transactions: recent %" PRIu64 ", latter reader %" PRIu64
|
||||
", lag %" PRIi64 "\n",
|
||||
envinfo.me_recent_txnid, envinfo.me_latter_reader_txnid,
|
||||
@@ -884,7 +900,7 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
if (verbose)
|
||||
print(" - performs check for meta-pages overlap\n");
|
||||
print(" - performs check for meta-pages clashes\n");
|
||||
if (meta_eq(envinfo.me_meta0_txnid, envinfo.me_meta0_sign,
|
||||
envinfo.me_meta1_txnid, envinfo.me_meta1_sign)) {
|
||||
print(" - meta-%d and meta-%d are clashed\n", 0, 1);
|
||||
@@ -1008,6 +1024,8 @@ int main(int argc, char *argv[]) {
|
||||
uint64_t value = envinfo.me_mapsize / envstat.ms_psize;
|
||||
double percent = value / 100.0;
|
||||
print(" - pages info: %" PRIu64 " total", value);
|
||||
value = envinfo.me_geo.current / envinfo.me_dxb_pagesize;
|
||||
print(", backed %" PRIu64 " (%.1f%%)", value, value / percent);
|
||||
print(", allocated %" PRIu64 " (%.1f%%)", lastpgno, lastpgno / percent);
|
||||
|
||||
if (verbose > 1) {
|
||||
|
@@ -110,8 +110,6 @@ static int dumpit(MDBX_txn *txn, MDBX_dbi dbi, char *name) {
|
||||
printf("database=%s\n", name);
|
||||
printf("type=btree\n");
|
||||
printf("mapsize=%" PRIu64 "\n", info.me_mapsize);
|
||||
if (info.me_mapaddr)
|
||||
printf("mapaddr=%p\n", info.me_mapaddr);
|
||||
printf("maxreaders=%u\n", info.me_maxreaders);
|
||||
|
||||
for (i = 0; dbflags[i].bit; i++)
|
||||
|
@@ -107,8 +107,8 @@ static void readhdr(void) {
|
||||
ptr = memchr(dbuf.iov_base, '\n', dbuf.iov_len);
|
||||
if (ptr)
|
||||
*ptr = '\0';
|
||||
i = sscanf((char *)dbuf.iov_base + STRLENOF("mapaddr="), "%p",
|
||||
&envinfo.me_mapaddr);
|
||||
void *unused;
|
||||
i = sscanf((char *)dbuf.iov_base + STRLENOF("mapaddr="), "%p", &unused);
|
||||
if (i != 1) {
|
||||
fprintf(stderr, "%s: line %" PRIiPTR ": invalid mapaddr %s\n", prog,
|
||||
lineno, (char *)dbuf.iov_base + STRLENOF("mapaddr="));
|
||||
|
@@ -13,15 +13,17 @@
|
||||
* top-level directory of the distribution or, alternatively, at
|
||||
* <http://www.OpenLDAP.org/license.html>. */
|
||||
|
||||
#include "../../mdbx.h"
|
||||
#include <inttypes.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../../mdbx.h"
|
||||
#include "../bits.h"
|
||||
|
||||
static void prstat(MDBX_stat *ms) {
|
||||
printf(" Page size: %u\n", ms->ms_psize);
|
||||
printf(" Pagesize: %u\n", ms->ms_psize);
|
||||
printf(" Tree depth: %u\n", ms->ms_depth);
|
||||
printf(" Branch pages: %" PRIu64 "\n", ms->ms_branch_pages);
|
||||
printf(" Leaf pages: %" PRIu64 "\n", ms->ms_leaf_pages);
|
||||
@@ -121,11 +123,24 @@ int main(int argc, char *argv[]) {
|
||||
(void)mdbx_env_stat(env, &mst, sizeof(mst));
|
||||
(void)mdbx_env_info(env, &mei, sizeof(mei));
|
||||
printf("Environment Info\n");
|
||||
printf(" Map address: %p\n", mei.me_mapaddr);
|
||||
printf(" Map size: %" PRIu64 "\n", mei.me_mapsize);
|
||||
printf(" Page size: %u\n", mst.ms_psize);
|
||||
printf(" Max pages: %" PRIu64 "\n", mei.me_mapsize / mst.ms_psize);
|
||||
printf(" Number of pages used: %" PRIu64 "\n", mei.me_recent_pgno + 1);
|
||||
printf(" Pagesize: %u\n", mst.ms_psize);
|
||||
if (mei.me_geo.lower != mei.me_geo.upper) {
|
||||
printf(" Dynamic datafile: %" PRIu64 "..%" PRIu64 " bytes (+%" PRIu64
|
||||
"/-%" PRIu64 "), %" PRIu64 "..%" PRIu64 " pages (+%" PRIu64
|
||||
"/-%" PRIu64 ")\n",
|
||||
mei.me_geo.lower, mei.me_geo.upper, mei.me_geo.grow,
|
||||
mei.me_geo.shrink, mei.me_geo.lower / mst.ms_psize,
|
||||
mei.me_geo.upper / mst.ms_psize, mei.me_geo.grow / mst.ms_psize,
|
||||
mei.me_geo.shrink / mst.ms_psize);
|
||||
printf(" Current datafile: %" PRIu64 " bytes, %" PRIu64 " pages\n",
|
||||
mei.me_geo.current, mei.me_geo.current / mst.ms_psize);
|
||||
} else {
|
||||
printf(" Fixed datafile: %" PRIu64 " bytes, %" PRIu64 " pages\n",
|
||||
mei.me_geo.current, mei.me_geo.current / mst.ms_psize);
|
||||
}
|
||||
printf(" Current mapsize: %" PRIu64 " bytes, %" PRIu64 " pages \n",
|
||||
mei.me_mapsize, mei.me_mapsize / mst.ms_psize);
|
||||
printf(" Number of pages used: %" PRIu64 "\n", mei.me_last_pgno + 1);
|
||||
printf(" Last transaction ID: %" PRIu64 "\n", mei.me_recent_txnid);
|
||||
printf(" Tail transaction ID: %" PRIu64 " (%" PRIi64 ")\n",
|
||||
mei.me_latter_reader_txnid,
|
||||
@@ -161,8 +176,8 @@ int main(int argc, char *argv[]) {
|
||||
if (freinfo) {
|
||||
MDBX_cursor *cursor;
|
||||
MDBX_val key, data;
|
||||
size_t pages = 0, *iptr;
|
||||
size_t reclaimable = 0;
|
||||
pgno_t pages = 0, *iptr;
|
||||
pgno_t reclaimable = 0;
|
||||
|
||||
printf("Freelist Status\n");
|
||||
dbi = 0;
|
||||
@@ -186,7 +201,7 @@ int main(int argc, char *argv[]) {
|
||||
reclaimable += *iptr;
|
||||
if (freinfo > 1) {
|
||||
char *bad = "";
|
||||
size_t pg, prev;
|
||||
pgno_t pg, prev;
|
||||
ssize_t i, j, span = 0;
|
||||
j = *iptr++;
|
||||
for (i = j, prev = 1; --i >= 0;) {
|
||||
@@ -198,53 +213,52 @@ int main(int argc, char *argv[]) {
|
||||
for (; i >= span && iptr[i - span] == pg; span++, pg++)
|
||||
;
|
||||
}
|
||||
printf(" Transaction %" PRIuPTR ", %" PRIiPTR
|
||||
printf(" Transaction %" PRIaTXN ", %" PRIiPTR
|
||||
" pages, maxspan %" PRIiPTR "%s\n",
|
||||
*(size_t *)key.iov_base, j, span, bad);
|
||||
*(txnid_t *)key.iov_base, j, span, bad);
|
||||
if (freinfo > 2) {
|
||||
for (--j; j >= 0;) {
|
||||
pg = iptr[j];
|
||||
for (span = 1; --j >= 0 && iptr[j] == pg + span; span++)
|
||||
;
|
||||
if (span > 1)
|
||||
printf(" %9zu[%" PRIiPTR "]\n", pg, span);
|
||||
printf(" %9" PRIaPGNO "[%" PRIiPTR "]\n", pg, span);
|
||||
else
|
||||
printf(" %9zu\n", pg);
|
||||
printf(" %9" PRIaPGNO "\n", pg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
mdbx_cursor_close(cursor);
|
||||
if (envinfo) {
|
||||
size_t value = mei.me_mapsize / mst.ms_psize;
|
||||
uint64_t value = mei.me_mapsize / mst.ms_psize;
|
||||
double percent = value / 100.0;
|
||||
printf("Page Allocation Info\n");
|
||||
printf(" Max pages: %9zu 100%%\n", value);
|
||||
printf(" Max pages: %" PRIu64 " 100%%\n", value);
|
||||
|
||||
value = mei.me_recent_pgno + 1;
|
||||
printf(" Number of pages used: %" PRIuPTR " %.1f%%\n", value,
|
||||
value / percent);
|
||||
value = mei.me_last_pgno + 1;
|
||||
printf(" Pages used: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||
|
||||
value = mei.me_mapsize / mst.ms_psize - (mei.me_recent_pgno + 1);
|
||||
printf(" Remained: %" PRIuPTR " %.1f%%\n", value, value / percent);
|
||||
value = mei.me_mapsize / mst.ms_psize - (mei.me_last_pgno + 1);
|
||||
printf(" Remained: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||
|
||||
value = mei.me_recent_pgno + 1 - pages;
|
||||
printf(" Used now: %" PRIuPTR " %.1f%%\n", value, value / percent);
|
||||
value = mei.me_last_pgno + 1 - pages;
|
||||
printf(" Used now: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||
|
||||
value = pages;
|
||||
printf(" Unallocated: %" PRIuPTR " %.1f%%\n", value, value / percent);
|
||||
printf(" Unallocated: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||
|
||||
value = pages - reclaimable;
|
||||
printf(" Detained: %" PRIuPTR " %.1f%%\n", value, value / percent);
|
||||
printf(" Detained: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||
|
||||
value = reclaimable;
|
||||
printf(" Reclaimable: %" PRIuPTR " %.1f%%\n", value, value / percent);
|
||||
printf(" Reclaimable: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||
|
||||
value = mei.me_mapsize / mst.ms_psize - (mei.me_recent_pgno + 1) +
|
||||
reclaimable;
|
||||
printf(" Available: %" PRIuPTR " %.1f%%\n", value, value / percent);
|
||||
value =
|
||||
mei.me_mapsize / mst.ms_psize - (mei.me_last_pgno + 1) + reclaimable;
|
||||
printf(" Available: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||
} else
|
||||
printf(" Free pages: %" PRIuPTR "\n", pages);
|
||||
printf(" Free pages: %" PRIaPGNO "\n", pages);
|
||||
}
|
||||
|
||||
rc = mdbx_dbi_open(txn, subname, 0, &dbi);
|
||||
|
Reference in New Issue
Block a user