Pretty excited about the 32bit support! I was just kicking the tires on it today and I realize this is still a work in progress, but I wanted to report a possible bug with VL32/Windows.
When I open a database with MDB_RDONLY and seek a cursor to MDB_LAST, I get a system error code of 0xc000004e (STATUS_SECTION_PROTECTION) from NtMapViewOfSection. This is presumably because of the MEM_RESERVE_FLAG is present on the open of the db when MDB_RDONLY is used.
After patching up the NtMapViewOfSection, I get a 0xc000001f(STATUS_INVALID_VIEW_SIZE) from NtMapViewOfSection. I believe this happens because it is requesting a view that goes beyond the size of the db. A quick adjustment on the “len” being requested seems to have “fixed” it.
I have included a diff patch below. I realize this is a naïve hack, but hoped it could be useful in reproducing and fixing.
-Jer
diff --git a/src/lmdb/mdb.c b/src/lmdb/mdb.c index 297d3e3..d594a6f 100644 --- a/src/lmdb/mdb.c +++ b/src/lmdb/mdb.c @@ -5655,7 +5655,7 @@ mdb_rpage_get(MDB_txn *txn, pgno_t pg0, MDB_page **ret) #define MAP(rc,env,addr,len,off) \ addr = NULL; \ rc = NtMapViewOfSection(env->me_fmh, GetCurrentProcess(), &addr, 0, \ - len, &off, &len, ViewUnmap, MEM_RESERVE, PAGE_READONLY) + len, &off, &len, ViewUnmap, ((env->me_flags & MDB_RDONLY) == 0) ? MEM_RESERVE : 0, PAGE_READONLY) #else off_t off; size_t len; @@ -5835,6 +5835,14 @@ retry: } } SET_OFF(off, pgno * env->me_psize); + +#ifdef MDB_VL32 + if(off.QuadPart + len > env->me_mapsize) + { + len = env->me_mapsize - off.QuadPart; + } +#endif + MAP(rc, env, id3.mptr, len, off); if (rc) { fail: