From fe1256471a2de22e0ccaf27e7c62d6861bec197f Mon Sep 17 00:00:00 2001
From: Howard Chu <hyc@symas.com>
Date: Tue, 25 Sep 2018 20:59:37 +0100
Subject: [PATCH] Fixup RENAME_DB() macro

Make sure target DB's record is on a writable page
---
 src/blockchain_db/lmdb/db_lmdb.cpp | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp
index b0f3ca5f0..d8f7df5f7 100644
--- a/src/blockchain_db/lmdb/db_lmdb.cpp
+++ b/src/blockchain_db/lmdb/db_lmdb.cpp
@@ -3490,7 +3490,17 @@ void BlockchainLMDB::fixup()
   BlockchainDB::fixup();
 }
 
-#define RENAME_DB(name) \
+#define RENAME_DB(name) do { \
+    char n2[] = name; \
+    MDB_dbi tdbi; \
+    n2[sizeof(n2)-2]--; \
+    /* play some games to put (name) on a writable page */ \
+    result = mdb_dbi_open(txn, n2, MDB_CREATE, &tdbi); \
+    if (result) \
+      throw0(DB_ERROR(lmdb_error("Failed to create " + std::string(n2) + ": ", result).c_str())); \
+    result = mdb_drop(txn, tdbi, 1); \
+    if (result) \
+      throw0(DB_ERROR(lmdb_error("Failed to delete " + std::string(n2) + ": ", result).c_str())); \
     k.mv_data = (void *)name; \
     k.mv_size = sizeof(name)-1; \
     result = mdb_cursor_open(txn, 1, &c_cur); \
@@ -3500,7 +3510,7 @@ void BlockchainLMDB::fixup()
     if (result) \
       throw0(DB_ERROR(lmdb_error("Failed to get DB record for " name ": ", result).c_str())); \
     ptr = (char *)k.mv_data; \
-    ptr[sizeof(name)-2]++
+    ptr[sizeof(name)-2]++; } while(0)
 
 #define LOGIF(y)    if (ELPP->vRegistry()->allowed(y, "global"))