We implement support for a fifth parameter, which allows to specify the
mapsize. The parameter defaults to zero, in which case the compiled in
default mapsize (usually
1048576) will be used. The mapsize should be
a multiple of the page size of the OS.
- Date:
. Fixed bug #79015 (undefined-behavior in php_date.c). (cmb)
+- DBA:
+ . Fixed bug #78808 ([LMDB] MDB_MAP_FULL: Environment mapsize limit reached).
+ (cmb)
+
- Fileinfo:
. Fixed bug #74170 (locale information change after mime_content_type).
(Sergei Turchanov)
Curl:
. libcurl >= 7.15.5 is now required.
+ DBA:
+ . As of PHP 7.3.14, dba_open() accepts a fifth optional parameter for lmdb
+ databases which allows to specify the mapsize. The parameter defaults to
+ zero, in which case the compiled in default mapsize (usually 1048576) will
+ be used. The mapsize should be a multiple of the page size of the OS.
+
Filter:
. FILTER_VALIDATE_FLOAT now also supports a `thousand` option, which
defines the set of allowed thousand separator chars. The default (`"',."`)
MDB_env *env;
MDB_txn *txn;
int rc, mode = 0644, flags = MDB_NOSUBDIR;
+ zend_long mapsize = 0;
if(info->argc > 0) {
mode = zval_get_long(&info->argv[0]);
+ if (info->argc > 1) {
+ mapsize = zval_get_long(&info->argv[1]);
+ if (mapsize < 0) {
+ *error = "mapsize must be greater than or equal to zero";
+ return FAILURE;
+ }
+ }
/* TODO implement handling of the additional flags. */
}
return FAILURE;
}
+ if (mapsize > 0) {
+ rc = mdb_env_set_mapsize(env, (size_t) mapsize);
+ if (rc) {
+ *error = mdb_strerror(rc);
+ return FAILURE;
+ }
+ }
+
rc = mdb_env_open(env, info->path, flags, mode);
if (rc) {
*error = mdb_strerror(rc);
--- /dev/null
+--TEST--
+Bug #78808 ([LMDB] MDB_MAP_FULL: Environment mapsize limit reached)
+--SKIPIF--
+<?php
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+$handler = 'lmdb';
+require_once __DIR__ .'/skipif.inc';
+?>
+--FILE--
+<?php
+$handler = 'lmdb';
+require_once __DIR__ .'/test.inc';
+$lmdb_h = dba_open($db_filename, 'c', 'lmdb', 0644, 5*1048576);
+for ($i = 0; $i < 50000; $i++) {
+ dba_insert('key' . $i, 'value '. $i, $lmdb_h);
+}
+dba_close($lmdb_h);
+echo "done\n";
+?>
+--EXPECT--
+done
+--CLEAN--
+<?php
+require_once dirname(__FILE__) .'/clean.inc';
+?>