Hi, I was already on that revision.The problems goes away by using mdb_del instead. However I am still getting strange behaviour. In particular on deletion. It seems as though the cursor gets confused when the data it refers to has been removed.
Unfortunately I am unable to reproduce the error in a simple scenario. It is happening from java code calling lmdb via JNI.
In general I keep a cursor open on the db. Then I remove an entry and after that call MDB_NEXT on the cursor. Occasionally it then crashes.
I noticed that before it crashes it enters the following code in mdb_cursor_next
static int mdb_cursor_next(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op) {
... skip: ... (line 5098) if (F_ISSET(leaf->mn_flags, F_DUPDATA)) { mdb_xcursor_init1(mc, leaf); //this crashes } ... } Trying to duplicate the error from c I can not get that code to execute. Any pointers as to what I might be doing incorrect?When removing data, can MDB_NEXT be called or should the cursor be reset first?
Thanks Pieter On 23/12/2013 15:55, Howard Chu wrote:
Pieter Martin wrote:Hi, I am using lmdb to implement a graph db via java JNI. Initial results are amazing. Anyhow I am having trouble with deletions. I am getting MDB_PAGE_FULL when trying to delete.Sounds like ITS#7756, you should try with git rev b77689f97572980d5de729e2fe6d8a5e6e9d6218A simplified version of the code is as follows. //set the key ... while ((rc = mdb_cursor_get(vertexCursor, &key, &data, MDB_SET_RANGE)) == 0) { rc = mdb_cursor_del(vertexCursor, 0); if (rc != 0) { printf("removeVertex 4 %i\n", rc); goto fail; } //set the key ... } The mdb_cursor_del returns a error code -30786 (MDB_PAGE_FULL) on about the 38th loop. if there are very few entries then the exception does not happen. Is there something obvious that I am doing wrong to cause a MDB_PAGE_FULL exception? Thanks Pieter