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
b77689f97572980d5de729e2fe6d8a5e6e9d6218
>
> A 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
>
>
>