Howard,

Here is the current diff file with all the changes discussed.

I am using version
f39bceb<https://gitorious.org/mdb/mdb/commit/f39bceb800dd1b1b4b05cfb45a3ddde94a273fff>from
November 12.

Alain


On Thu, Dec 5, 2013 at 1:28 PM, Howard Chu <[email protected]> wrote:

> Alain wrote:
>
>> I encountered a problem trying to change the mapsize of an existing store.
>>
>> It turned out to be that the newsize argument to mdb_env_map wasn't set
>> correctly when coming from
>> mdb_env_open2.
>>
>> So I had to change the call to be:
>>     rc = mdb_env_map(env, meta.mm_address, newenv || env->me_mapsize !=
>> meta.mm_mapsize);
>>
>
> Please use diff -u when discussing changes. Or git diff. And tell what
> revision you're diffing against.
>
>
>> (adding the || != test)
>>
>> Also I had some issues with large files (4GB) and I made some small
>> changes
>> which better match documentation and reported issues, but not sure if the
>> original code was flawed or not. It is in mdb_env_map when we set the file
>> pointer and EOF:
>>
>>      if (newsize) {
>>          if ((SetFilePointer(env->me_fd, sizelo, &sizehi, 0) ==
>> INVALID_SET_FILE_POINTER && GetLastError() != ERROR_SUCCESS)
>>              || !SetEndOfFile(env->me_fd)
>>              || (SetFilePointer(env->me_fd, 0, NULL, 0) ==
>> INVALID_SET_FILE_POINTER && GetLastError() != ERROR_SUCCESS))
>>              return ErrCode();
>>      }
>>
>> Again, I made those changes according to what I noticed and this might
>> not be
>> the perfect final solution.
>>
>> Cheers,
>> Alain
>>
>
>
> --
>   -- Howard Chu
>   CTO, Symas Corp.           http://www.symas.com
>   Director, Highland Sun     http://highlandsun.com/hyc/
>   Chief Architect, OpenLDAP  http://www.openldap.org/project/
>
--- ../../lmdb-git/liblmdb/mdb.c        2013-11-12 11:10:33.000000000 -0500
+++ mdb.c       2013-12-05 17:55:12.287682300 -0500
@@ -326,8 +326,13 @@
         *      Requires double parenthesis around 2 or more args.
         */
 # define DPRINTF(args) ((void) ((mdb_debug) && DPRINTF0 args))
+#ifdef _MSC_VER //MS C++ doesn't support __func__
+# define DPRINTF0(fmt, ...) \
+       fprintf(stderr, "%s:%d " fmt "\n", __FUNCTION__, __LINE__, __VA_ARGS__)
+#else
 # define DPRINTF0(fmt, ...) \
        fprintf(stderr, "%s:%d " fmt "\n", __func__, __LINE__, __VA_ARGS__)
+#endif
 #else
 # define DPRINTF(args) ((void) 0)
 #endif
@@ -2945,8 +2950,11 @@
        mdb_cursors_close(txn, 0);
 
        if (!txn->mt_u.dirty_list[0].mid &&
-               !(txn->mt_flags & (MDB_TXN_DIRTY|MDB_TXN_SPILLS)))
+               !(txn->mt_flags & (MDB_TXN_DIRTY|MDB_TXN_SPILLS))) {
+               DPRINTF(("nothing to commit txn %"Z"u %p on mdbenv %p, root 
page %"Z"u",
+                   txn->mt_txnid, (void*)txn, (void*)env, 
txn->mt_dbs[MAIN_DBI].md_root));
                goto done;
+       }
 
        DPRINTF(("committing txn %"Z"u %p on mdbenv %p, root page %"Z"u",
            txn->mt_txnid, (void*)txn, (void*)env, 
txn->mt_dbs[MAIN_DBI].md_root));
@@ -3304,9 +3312,9 @@
         * Just allocate the maxsize right now.
         */
        if (newsize) {
-               if (SetFilePointer(env->me_fd, sizelo, &sizehi, 0) != 
(DWORD)sizelo
+               if ((SetFilePointer(env->me_fd, sizelo, &sizehi, 0) == 
INVALID_SET_FILE_POINTER && GetLastError() != ERROR_SUCCESS)
                        || !SetEndOfFile(env->me_fd)
-                       || SetFilePointer(env->me_fd, 0, NULL, 0) != 0)
+                       || (SetFilePointer(env->me_fd, 0, NULL, 0) == 
INVALID_SET_FILE_POINTER && GetLastError() != ERROR_SUCCESS))
                        return ErrCode();
        }
        mh = CreateFileMapping(env->me_fd, NULL, flags & MDB_WRITEMAP ?
@@ -3470,7 +3478,7 @@
                        env->me_mapsize = minsize;
        }
 
-       rc = mdb_env_map(env, meta.mm_address, newenv);
+       rc = mdb_env_map(env, meta.mm_address, newenv || env->me_mapsize != 
meta.mm_mapsize);
        if (rc)
                return rc;
 
@@ -5352,6 +5360,8 @@
                        if (rc) {
                                if (op == MDB_GET_BOTH || rc > 0)
                                        return MDB_NOTFOUND;
+                               data->mv_data = d2.mv_data;
+                               data->mv_size = d2.mv_size;
                                rc = 0;
                        }
 

Reply via email to