Full_Name: Carlo Pires
Version: LMDB 0.9.14
OS: Ubuntu Linux 14.04 LTS
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (177.53.184.142)


LMDB 0.9.14 is refusing to process new transactions after map resize. The
following test case shows the error:

/* mtest7.c - memory-mapped database tester/toy */
/* Tests for DB map resize */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "lmdb.h"

#define E(expr) CHECK((rc = (expr)) == MDB_SUCCESS, #expr)
#define EX(err, expr) CHECK((rc = (expr)) == (err), #expr)
#define RES(err, expr) ((rc = expr) == (err) || (CHECK(!rc, #expr), 0))
#define CHECK(test, msg) ((test) ? (void)0 : ((void)fprintf(stderr, \
        "%s:%d: %s: %s\n", __FILE__, __LINE__, msg, mdb_strerror(rc)), abort()))

int main(int argc,char * argv[])
{
        int rc;
        MDB_env *env;
        MDB_dbi dbi;
        MDB_val key, data;
        MDB_txn *txn;
        MDB_envinfo minfo;

        char kval[32];
        char* sval = calloc(1, 8*1024*1024);
        assert(sval);

        // create database
        E(mdb_env_create(&env));
        E(mdb_env_set_mapsize(env, 10*1024*1024));
        E(mdb_env_set_maxdbs(env, 0));
        E(mdb_env_open(env, "./testdb", MDB_NORDAHEAD|MDB_NOLOCK|MDB_NOSYNC, 
0664));

        // starts dbi
        E(mdb_txn_begin(env, NULL, 0, &txn));
        E(mdb_open(txn, NULL, MDB_CREATE, &dbi));
        E(mdb_txn_commit(txn));

        // check database mapsize
        E(mdb_env_info(env, &minfo));
        printf("map size is %ldMB\n%, C minfo.me_mapsize/1048576);

        // try to insert data
        E(mdb_txn_begin(env, NULL, 0, &txn));

        key.mv_size = sizeof(kval);
        key.mv_data = &kval;
        data.mv_size = 8*1024*1024;
        data.mv_data = sval;

        sprintf(kval, "0");
        E(mdb_put(txn, dbi, %kekey, &data, 0));

        sprintf(kval, "1");
        EX(MDB_MAP_FULL, mdb_put(txn, dbi, &key, &data, 0));

        // abort transaction and increase map size
        mdb_txn_abort(txn);
        mdb_env_set_mapsize(env, 20*1024*1024);

        // check database mapsize
        E(mdb_env_info(env, &minfo));
        printf("new map size is %ldMB\n", minfo.me_mapsize/1048576);

        // try to insert data again
        E(mdb_txn_begin(env, NULL, 0, &txn));

        sprintf(kval, "0");
        E(mdb_put(txn, dbi, &key, &data, 0));

        sprintf(kval, "1");
        E(mdb_put(txn, dbi, &key, &data, 0));

        E(mdb_txn_commit(txn));
        mdb_env_close(env);

        free(sval);
        return 0;
}

The code worked fine until LMDB 0.9.13. 

Reply via email to