]> git.sur5r.net Git - openldap/commitdiff
ITS#7453 Fix reset of MDB_NOSYNC/MDB_NOMETASYNC.
authorHallvard Furuseth <hallvard@openldap.org>
Tue, 27 Nov 2012 22:56:47 +0000 (23:56 +0100)
committerHallvard Furuseth <hallvard@openldap.org>
Tue, 27 Nov 2012 23:59:00 +0000 (00:59 +0100)
mdb_env_open() with these flags did not open a synchronizing
file descriptor.  Thus disabling them later did not work.

libraries/libmdb/mdb.c

index 32dbf63544c40100b3509edb7d034414b2fe8a39..d760387ff4d2a9ba4029d2d624124dceb2c4e5cf 100644 (file)
@@ -2423,6 +2423,7 @@ mdb_env_write_meta(MDB_txn *txn)
        off_t off;
        int rc, len, toggle;
        char *ptr;
+       HANDLE mfd;
 #ifdef _WIN32
        OVERLAPPED ov;
 #endif
@@ -2481,14 +2482,16 @@ mdb_env_write_meta(MDB_txn *txn)
        off += PAGEHDRSZ;
 
        /* Write to the SYNC fd */
+       mfd = env->me_flags & (MDB_NOSYNC|MDB_NOMETASYNC) ?
+               env->me_fd : env->me_mfd;
 #ifdef _WIN32
        {
                memset(&ov, 0, sizeof(ov));
                ov.Offset = off;
-               WriteFile(env->me_mfd, ptr, len, (DWORD *)&rc, &ov);
+               WriteFile(mfd, ptr, len, (DWORD *)&rc, &ov);
        }
 #else
-       rc = pwrite(env->me_mfd, ptr, len, off);
+       rc = pwrite(mfd, ptr, len, off);
 #endif
        if (rc != len) {
                int r2;
@@ -3221,10 +3224,12 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mode_t mode)
        }
 
        if ((rc = mdb_env_open2(env)) == MDB_SUCCESS) {
-               if (flags & (MDB_RDONLY|MDB_NOSYNC|MDB_NOMETASYNC|MDB_WRITEMAP)) {
+               if (flags & (MDB_RDONLY|MDB_WRITEMAP)) {
                        env->me_mfd = env->me_fd;
                } else {
-                       /* synchronous fd for meta writes */
+                       /* Synchronous fd for meta writes. Needed even with
+                        * MDB_NOSYNC/MDB_NOMETASYNC, in case these get reset.
+                        */
 #ifdef _WIN32
                        env->me_mfd = CreateFile(dpath, oflags,
                                FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, len,