]> git.sur5r.net Git - openldap/commitdiff
Add msync support for WRITEMAP option
authorHoward Chu <hyc@symas.com>
Wed, 5 Sep 2012 15:40:17 +0000 (08:40 -0700)
committerHoward Chu <hyc@symas.com>
Wed, 5 Sep 2012 15:40:17 +0000 (08:40 -0700)
libraries/libmdb/mdb.c
libraries/libmdb/mdb.h

index 79e842366707958c1b76a82f9d7f9d7a0ba50286..d44b1ec191a264015b55a68d4ca0de5dcfca5b5c 100644 (file)
 #define UNLOCK_MUTEX_W(env)    pthread_mutex_unlock((env)->me_wmutex)
 #define getpid()       GetCurrentProcessId()
 #define        MDB_FDATASYNC(fd)       (!FlushFileBuffers(fd))
+#define        MDB_MSYNC(addr,len,flags)       (!FlushViewOfFile(addr,len))
 #define        ErrCode()       GetLastError()
 #define GET_PAGESIZE(x) {SYSTEM_INFO si; GetSystemInfo(&si); (x) = si.dwPageSize;}
 #define        close(fd)       CloseHandle(fd)
  */
 #ifndef MDB_FDATASYNC
 # define MDB_FDATASYNC fdatasync
+#endif
+
+#ifndef MDB_MSYNC
+# define MDB_MSYNC(addr,len,flags)     msync(addr,len,flags)
+#endif
+
+#ifndef MS_SYNC
+#define        MS_SYNC 1
+#endif
+
+#ifndef MS_ASYNC
+#define        MS_ASYNC        0
 #endif
 
        /** A page number in the database.
@@ -1464,8 +1477,18 @@ mdb_env_sync(MDB_env *env, int force)
 {
        int rc = 0;
        if (force || !F_ISSET(env->me_flags, MDB_NOSYNC)) {
-               if (MDB_FDATASYNC(env->me_fd))
-                       rc = ErrCode();
+               if (env->me_flags & MDB_WRITEMAP) {
+                       int flags = (env->me_flags & MDB_MAPSYNC) ? MS_SYNC : MS_ASYNC;
+                       if (MDB_MSYNC(env->me_map, env->me_mapsize, flags))
+                               rc = ErrCode();
+#ifdef _WIN32
+                       else if (flags == MS_SYNC && MDB_FDATASYNC(env->me_fd))
+                               rc = ErrCode();
+#endif
+               } else {
+                       if (MDB_FDATASYNC(env->me_fd))
+                               rc = ErrCode();
+               }
        }
        return rc;
 }
@@ -2359,6 +2382,16 @@ mdb_env_write_meta(MDB_txn *txn)
                mp->mm_dbs[1] = txn->mt_dbs[1];
                mp->mm_last_pg = txn->mt_next_pgno - 1;
                mp->mm_txnid = txn->mt_txnid;
+               if (!(env->me_flags & (MDB_NOMETASYNC|MDB_NOSYNC))) {
+                       rc = (env->me_flags & MDB_MAPSYNC) ? MS_SYNC : MS_ASYNC;
+                       ptr = env->me_map;
+                       if (toggle)
+                               ptr += env->me_psize;
+                       if (MDB_MSYNC(ptr, env->me_psize, rc)) {
+                               rc = ErrCode();
+                               goto fail;
+                       }
+               }
                goto done;
        }
        metab.mm_txnid = env->me_metas[toggle]->mm_txnid;
@@ -2403,6 +2436,7 @@ mdb_env_write_meta(MDB_txn *txn)
 #else
                r2 = pwrite(env->me_fd, ptr, len, off);
 #endif
+fail:
                env->me_flags |= MDB_FATAL_ERROR;
                return rc;
        }
@@ -2530,12 +2564,14 @@ mdb_env_open2(MDB_env *env, unsigned int flags)
                                return ErrCode();
                        SetFilePointer(env->me_fd, 0, NULL, 0);
                }
-               mh = CreateFileMapping(env->me_fd, NULL, PAGE_READONLY,
+               mh = CreateFileMapping(env->me_fd, NULL, flags & MDB_WRITEMAP ?
+                       PAGE_READWRITE : PAGE_READONLY,
                        sizehi, sizelo, NULL);
                if (!mh)
                        return ErrCode();
-               env->me_map = MapViewOfFileEx(mh, FILE_MAP_READ, 0, 0, env->me_mapsize,
-                       meta.mm_address);
+               env->me_map = MapViewOfFileEx(mh, flags & MDB_WRITEMAP ?
+                       FILE_MAP_WRITE : FILE_MAP_READ,
+                       0, 0, env->me_mapsize, meta.mm_address);
                CloseHandle(mh);
                if (!env->me_map)
                        return ErrCode();
index db07f4b3c3b64ca5120dc08b31863abc9351b48e..8eefc7d5167339f5300ee82f64bb4fcedcf87f86 100644 (file)
@@ -163,6 +163,8 @@ typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *rel
 #define MDB_NOMETASYNC         0x40000
        /** use writable mmap */
 #define MDB_WRITEMAP           0x80000
+       /** use synchronous msync */
+#define MDB_MAPSYNC            0x100000
 /** @} */
 
 /**    @defgroup       mdb_open        Database Flags