]> git.sur5r.net Git - openldap/blobdiff - libraries/liblmdb/mdb.c
Merge remote-tracking branch 'origin/mdb.master' into OPENLDAP_REL_ENG_2_4
[openldap] / libraries / liblmdb / mdb.c
index cc4dd6ddc9dedd6c49817e6873ab26bc536ffb81..84477c428585303a5cd7edfdc63818f947ffd51f 100644 (file)
@@ -3474,6 +3474,7 @@ mdb_env_write_meta(MDB_txn *txn)
 {
        MDB_env *env;
        MDB_meta        meta, metab, *mp;
+       size_t mapsize;
        off_t off;
        int rc, len, toggle;
        char *ptr;
@@ -3490,11 +3491,13 @@ mdb_env_write_meta(MDB_txn *txn)
 
        env = txn->mt_env;
        mp = env->me_metas[toggle];
+       mapsize = env->me_metas[toggle ^ 1]->mm_mapsize;
+       /* Persist any increases of mapsize config */
+       if (mapsize < env->me_mapsize)
+               mapsize = env->me_mapsize;
 
        if (env->me_flags & MDB_WRITEMAP) {
-               /* Persist any increases of mapsize config */
-               if (env->me_mapsize > mp->mm_mapsize)
-                       mp->mm_mapsize = env->me_mapsize;
+               mp->mm_mapsize = mapsize;
                mp->mm_dbs[0] = txn->mt_dbs[0];
                mp->mm_dbs[1] = txn->mt_dbs[1];
                mp->mm_last_pg = txn->mt_next_pgno - 1;
@@ -3521,22 +3524,15 @@ mdb_env_write_meta(MDB_txn *txn)
        metab.mm_txnid = env->me_metas[toggle]->mm_txnid;
        metab.mm_last_pg = env->me_metas[toggle]->mm_last_pg;
 
-       ptr = (char *)&meta;
-       if (env->me_mapsize > mp->mm_mapsize) {
-               /* Persist any increases of mapsize config */
-               meta.mm_mapsize = env->me_mapsize;
-               off = offsetof(MDB_meta, mm_mapsize);
-       } else {
-               off = offsetof(MDB_meta, mm_dbs[0].md_depth);
-       }
-       len = sizeof(MDB_meta) - off;
-
-       ptr += off;
+       meta.mm_mapsize = mapsize;
        meta.mm_dbs[0] = txn->mt_dbs[0];
        meta.mm_dbs[1] = txn->mt_dbs[1];
        meta.mm_last_pg = txn->mt_next_pgno - 1;
        meta.mm_txnid = txn->mt_txnid;
 
+       off = offsetof(MDB_meta, mm_mapsize);
+       ptr = (char *)&meta + off;
+       len = sizeof(MDB_meta) - off;
        if (toggle)
                off += env->me_psize;
        off += PAGEHDRSZ;
@@ -6966,6 +6962,9 @@ mdb_cursor_count(MDB_cursor *mc, size_t *countp)
        if (!(mc->mc_flags & C_INITIALIZED))
                return EINVAL;
 
+       if (!mc->mc_snum || (mc->mc_flags & C_EOF))
+               return MDB_NOTFOUND;
+
        leaf = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
        if (!F_ISSET(leaf->mn_flags, F_DUPDATA)) {
                *countp = 1;
@@ -8414,13 +8413,13 @@ mdb_env_copyfd1(MDB_env *env, HANDLE fd)
 #ifdef _WIN32
        my.mc_mutex = CreateMutex(NULL, FALSE, NULL);
        my.mc_cond = CreateEvent(NULL, FALSE, FALSE, NULL);
-       my.mc_wbuf[0] = _aligned_malloc(MDB_WBUF*2, env->me_psize);
+       my.mc_wbuf[0] = _aligned_malloc(MDB_WBUF*2, env->me_os_psize);
        if (my.mc_wbuf[0] == NULL)
                return errno;
 #else
        pthread_mutex_init(&my.mc_mutex, NULL);
        pthread_cond_init(&my.mc_cond, NULL);
-       rc = posix_memalign((void **)&my.mc_wbuf[0], env->me_psize, MDB_WBUF*2);
+       rc = posix_memalign((void **)&my.mc_wbuf[0], env->me_os_psize, MDB_WBUF*2);
        if (rc)
                return rc;
 #endif
@@ -8658,6 +8657,7 @@ mdb_env_copy2(MDB_env *env, const char *path, unsigned int flags)
                goto leave;
        }
 
+       if (env->me_psize >= env->me_os_psize) {
 #ifdef O_DIRECT
        /* Set O_DIRECT if the file system supports it */
        if ((rc = fcntl(newfd, F_GETFL)) != -1)
@@ -8670,6 +8670,7 @@ mdb_env_copy2(MDB_env *env, const char *path, unsigned int flags)
                goto leave;
        }
 #endif
+       }
 
        rc = mdb_env_copyfd2(env, newfd, flags);