From c9489da920cef43d3b9270c6c37d4e3374bc50b6 Mon Sep 17 00:00:00 2001 From: Leo Yuriev Date: Sat, 20 Sep 2014 07:16:15 +0400 Subject: [PATCH] lmdb: lock meta-pages in writemap-mode to avoid unordered write. Without locking the meta-pages may be writen by OS before data pages, in this case database would be inconsistent. Change-Id: I6a262709b0741d7b57cb68231c4ae1c62a10a743 --- mdb.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mdb.c b/mdb.c index 2bda1a5b..3e322030 100644 --- a/mdb.c +++ b/mdb.c @@ -3882,6 +3882,16 @@ mdb_env_map(MDB_env *env, void *addr) env->me_metas[0] = METADATA(p); env->me_metas[1] = (MDB_meta *)((char *)env->me_metas[0] + env->me_psize); + /* Lock meta pages to avoid unexpected write, + * before the data pages would be synchronized. */ +#ifdef _WIN32 + if ((flags & MDB_WRITEMAP) && !VirtualLock(env->me_map, env->me_psize * 2)) + return ErrCode(); +#else + if ((flags & MDB_WRITEMAP) && mlock(env->me_map, env->me_psize * 2)) + return ErrCode(); +#endif /* _WIN32 */ + return MDB_SUCCESS; }