[Date Prev][Date Next] [Chronological] [Thread] [Top]

(ITS#7957) [LMDB] critical error after compacting an empty database



Full_Name: Engin Lee
Version: LMDB 0.9.14 2014/9/30
OS: Linux
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (59.124.230.221)


Hi,

I found a strange issue:
If I try to compact a empty database to another one, there would be an assert
if I try to put something into the compacted one.
Here is my testing code:

====
#include <stdio.h>A#23include "lmdb.h"

int main(void)
{
         MDB_env * env;
         mdb_env_create(&env);
         int r = mdb_env_open(env, "temp", MDB_CREATE, 0664);
         if (r == MDB_SUCCESS)
         {
             r = mdb_env_copy2(env, ".", MDB_CP_COMPACT);
             if (r != MDB_SUCCESS)
                 printf("?COMPACT: %s", mdb_strerror(r));
         }
         else
         {
             printf("?COMPACT: %s", mdb_strerror(r));
         }
         mdb_env_close(env);

         mdb_env_create(&env);
         r = mdb_env_open(env, ".", 0, 0664);
         if (r == MDB_SUCCESS)
         {
             MDB_txn *txn;
             mdb_txn_begin(env, NULL, 0, &txn);
             MDB_dbi hDB;
             r = mdb_dbi_open(txn, NULL, MDB_CREATE, &B%B);
             if (r != MDB_SUCCESS)
                 printf("?OPEN: %s", mdb_strerror(r));

             MDB_val key, data;
             key.mv_data = (void*)"test";
             key.mv_size = sizeof("test");
             data.mv_data = (void*)"test";
             data.mv_size = sizeof("test");
             int rc = mdb_put(txn, hDB, &key, &data, 0);
             if (rc != MDB_SUCCESS)
                    printf("?PUT: %s", mdb_strerror(rc));
             mdb_txn_commit(txn);
         }
         else
         {
             printf("?COMPACT: %s", mdb_strerror(r));
         }
         mdb_env_close(env);

     return 0;
}
==== output:
# ./a.out
mdb.c:5115: Assertion 'root > 1' failed in mdb_page_search()
Aborted
====

Could you solve this issue or tell me if my usage is wrong?
Thank you.