? mdb_cursor_unref(mc) \
: (void)0)
+/* Unref ovpage \b omp in \b mc and tracked cursors */
+static void
+mdb_ovpage_unref_all(MDB_cursor *mc, MDB_page *omp)
+{
+ MDB_txn *txn = mc->mc_txn;
+ MDB_cursor *next = txn->mt_cursors[mc->mc_dbi];
+ for (;; mc = next, next = mc->mc_next) {
+ if (MC_OVPG(mc) == omp) {
+ mdb_page_unref(mc->mc_txn, omp);
+ MC_SET_OVPG(mc, NULL);
+ }
+ if (next == NULL)
+ break;
+ }
+}
+
#else
#define MDB_REMAPPING(flags) 0
#define MDB_PAGE_UNREF(txn, mp)
#define MDB_CURSOR_UNREF(mc, force) ((void)0)
+#define mdb_ovpage_unref_all(mc, omp, pgno) ((void)0)
#endif /* MDB_RPAGE_CACHE */
/** Loosen or free a single page.
unsigned x = 0, ovpages = mp->mp_pages;
MDB_env *env = txn->mt_env;
MDB_ID pn = pg << 1;
+ MDB_page *freeme = NULL;
int rc;
DPRINTF(("free ov page %"Yu" (%d)", pg, ovpages));
}
}
txn->mt_dirty_room++;
- mdb_dpage_free(env, mp);
+ freeme = mp;
release:
/* Insert in me_pghead */
mop = env->me_pghead;
return rc;
}
mc->mc_db->md_overflow_pages -= ovpages;
+
+ if (MDB_REMAPPING(env->me_flags))
+ mdb_ovpage_unref_all(mc, mp);
+ if (freeme)
+ mdb_dpage_free(env, freeme);
+
return 0;
}