[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
(ITS#9155) LMDB: List of spill pages leaks after transaction
Full_Name: Alexander Babayants
Version: LMDB 0.9.24
OS: Linux
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (188.170.78.53)
Hi!
ASAN shows that the list of spill pages is not freed after transaction:
=================================================================
==test==13046==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 20971376 byte(s) in 1 object(s) allocated from:
#0 0x4bcbb2 in realloc (test+0x4bcbb2)
#1 0x7f067ef5ed59 in mdb_midl_grow liblmdb/src/midl.c:135:8
#2 0x7f067ef5ec83 in mdb_midl_append liblmdb/src/midl.c:162:7
#3 0x7f067ef4456b in mdb_page_spill liblmdb/src/mdb.c:2077:13
#4 0x7f067ef3960b in mdb_cursor_put liblmdb/src/mdb.c:6640:14
#5 0x7f067ef5106c in mdb_put liblmdb/src/mdb.c:9027:7
#6 0x4ec674 in main test.c:28:14
#7 0x7f067b46d544 in __libc_start_main (/lib64/libc.so.6+0x22544)
SUMMARY: AddressSanitizer: 20971376 byte(s) leaked in 1 allocation(s).
Reproducible on LMDB 0.9.24 with the following code (anything doing
long write transaction will trigger this):
#include "lmdb.h"
int main(int argc,char * argv[])
{
int rc;
MDB_env *env;
MDB_dbi dbi;
MDB_val key, data;
MDB_txn *txn;
int kval;
char sval[1024] = {0}; // fine to fill with zeroes
rc = mdb_env_create(&env);
rc = mdb_env_set_mapsize(env, 10ULL * 1024 * 1024 * 1024); // 10 GiB
rc = mdb_env_open(env, "./testdb", 0, 0664);
rc = mdb_txn_begin(env, NULL, 0, &txn);
rc = mdb_dbi_open(txn, NULL, 0, &dbi);
key.mv_size = sizeof(int);
key.mv_data = &kval;
data.mv_size = sizeof(sval);
data.mv_data = sval;
for (kval = 0; kval < 100'000'000; ++kval) {
rc = mdb_put(txn, dbi, &key, &data, 0);
}
rc = mdb_txn_commit(txn);
mdb_dbi_close(env, dbi);
mdb_env_close(env);
return 0;
}
>From my point of view the leak looks benign (=does not lead to
database corruption or such), but I didn't dive deep enough in LMDB
internals to be completely certain about that.
Regards,
Alexander Babayants.