summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGary Lockyer <gary@catalyst.net.nz>2019-06-25 16:22:15 +1200
committerGary Lockyer <gary@samba.org>2019-07-02 02:23:09 +0000
commitbbc20000791d167c5f2683ef3f217a8719b47ead (patch)
tree55176276df7efa302bd1c0b80b125402eaf56d2a /lib
parente46d5bb669d1e3bec8283df64eeedaad997f6625 (diff)
downloadsamba-bbc20000791d167c5f2683ef3f217a8719b47ead.tar.gz
lib ldb ldb_mdb: Pass the lmdb map size as an ldb option
Allow the lmdb map size to be specified in the ldb option "lmdb_env_size". Signed-off-by: Gary Lockyer <gary@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/ldb/ldb_mdb/ldb_mdb.c56
1 files changed, 39 insertions, 17 deletions
diff --git a/lib/ldb/ldb_mdb/ldb_mdb.c b/lib/ldb/ldb_mdb/ldb_mdb.c
index 35e21434ff0..6c679c214b8 100644
--- a/lib/ldb/ldb_mdb/ldb_mdb.c
+++ b/lib/ldb/ldb_mdb/ldb_mdb.c
@@ -882,10 +882,10 @@ static int lmdb_open_env(TALLOC_CTX *mem_ctx,
MDB_env **env,
struct ldb_context *ldb,
const char *path,
+ const size_t env_map_size,
unsigned int flags)
{
int ret;
- const size_t mmap_size = 8LL * GIGABYTE;
unsigned int mdb_flags = MDB_NOSUBDIR|MDB_NOTLS;
/*
* MDB_NOSUBDIR implies there is a separate file called path and a
@@ -930,20 +930,19 @@ static int lmdb_open_env(TALLOC_CTX *mem_ctx,
return ldb_mdb_err_map(ret);
}
- /*
- * Currently we set a 8Gb maximum database size
- * via the constant mmap_size above
- */
- ret = mdb_env_set_mapsize(*env, mmap_size);
- if (ret != 0) {
- ldb_asprintf_errstring(
- ldb,
- "Could not set MDB mmap() size to %llu on %s: %s\n",
- (unsigned long long)(mmap_size),
- path,
- mdb_strerror(ret));
- TALLOC_FREE(w);
- return ldb_mdb_err_map(ret);
+ if (env_map_size > 0) {
+ ret = mdb_env_set_mapsize(*env, env_map_size);
+ if (ret != 0) {
+ ldb_asprintf_errstring(
+ ldb,
+ "Could not set MDB mmap() size to %llu "
+ "on %s: %s\n",
+ (unsigned long long)(env_map_size),
+ path,
+ mdb_strerror(ret));
+ TALLOC_FREE(w);
+ return ldb_mdb_err_map(ret);
+ }
}
mdb_env_set_maxreaders(*env, 100000);
@@ -964,6 +963,19 @@ static int lmdb_open_env(TALLOC_CTX *mem_ctx,
return ldb_mdb_err_map(ret);
}
+ {
+ MDB_envinfo stat = {0};
+ ret = mdb_env_info (*env, &stat);
+ if (ret != 0) {
+ ldb_asprintf_errstring(
+ ldb,
+ "Could not get MDB environment stats %s: %s\n",
+ path,
+ mdb_strerror(ret));
+ return ldb_mdb_err_map(ret);
+ }
+ }
+
ret = mdb_env_get_fd(*env, &fd);
if (ret != 0) {
ldb_asprintf_errstring(ldb,
@@ -1010,6 +1022,7 @@ static int lmdb_open_env(TALLOC_CTX *mem_ctx,
static int lmdb_pvt_open(struct lmdb_private *lmdb,
struct ldb_context *ldb,
const char *path,
+ const size_t env_map_size,
unsigned int flags)
{
int ret;
@@ -1022,7 +1035,7 @@ static int lmdb_pvt_open(struct lmdb_private *lmdb,
}
}
- ret = lmdb_open_env(lmdb, &lmdb->env, ldb, path, flags);
+ ret = lmdb_open_env(lmdb, &lmdb->env, ldb, path, env_map_size, flags);
if (ret != 0) {
return ret;
}
@@ -1053,6 +1066,7 @@ int lmdb_connect(struct ldb_context *ldb,
struct lmdb_private *lmdb = NULL;
struct ldb_kv_private *ldb_kv = NULL;
int ret;
+ size_t env_map_size = 0;
/*
* We hold locks, so we must use a private event context
@@ -1080,7 +1094,15 @@ int lmdb_connect(struct ldb_context *ldb,
lmdb->ldb = ldb;
ldb_kv->kv_ops = &lmdb_key_value_ops;
- ret = lmdb_pvt_open(lmdb, ldb, path, flags);
+ {
+ const char *size = ldb_options_find(
+ ldb, ldb->options, "lmdb_env_size");
+ if (size != NULL) {
+ env_map_size = strtoull(size, NULL, 0);
+ }
+ }
+
+ ret = lmdb_pvt_open(lmdb, ldb, path, env_map_size, flags);
if (ret != LDB_SUCCESS) {
TALLOC_FREE(ldb_kv);
return ret;