diff --git a/fix-remove-loose-pg-from-dirty-list.patch b/fix-remove-loose-pg-from-dirty-list.patch new file mode 100644 index 0000000..6b8f1e3 --- /dev/null +++ b/fix-remove-loose-pg-from-dirty-list.patch @@ -0,0 +1,56 @@ +From 1ffe472a080fcd3c7dab6e352848703ad7adbe14 Mon Sep 17 00:00:00 2001 +From: Howard Chu +Date: Fri, 22 Jun 2018 16:30:13 +0100 +Subject: [PATCH] ITS#8756 remove loose pg from dirty list in freelist_save + +--- + libraries/liblmdb/mdb.c | 33 ++++++++++++++++++++++++++++++++- + 1 file changed, 32 insertions(+), 1 deletion(-) + +diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c +index a487e156..63872c92 100644 +--- a/libraries/liblmdb/mdb.c ++++ b/libraries/liblmdb/mdb.c +@@ -3444,10 +3444,41 @@ mdb_freelist_save(MDB_txn *txn) + * we may be unable to return them to me_pghead. + */ + MDB_page *mp = txn->mt_loose_pgs; ++ MDB_ID2 *dl = txn->mt_u.dirty_list; ++ unsigned x; + if ((rc = mdb_midl_need(&txn->mt_free_pgs, txn->mt_loose_count)) != 0) + return rc; +- for (; mp; mp = NEXT_LOOSE_PAGE(mp)) ++ for (; mp; mp = NEXT_LOOSE_PAGE(mp)) { + mdb_midl_xappend(txn->mt_free_pgs, mp->mp_pgno); ++ /* must also remove from dirty list */ ++ if (txn->mt_flags & MDB_TXN_WRITEMAP) { ++ for (x=1; x<=dl[0].mid; x++) ++ if (dl[x].mid == mp->mp_pgno) ++ break; ++ mdb_tassert(txn, x <= dl[0].mid); ++ } else { ++ x = mdb_mid2l_search(dl, mp->mp_pgno); ++ mdb_tassert(txn, dl[x].mid == mp->mp_pgno); ++ } ++ dl[x].mptr = NULL; ++ mdb_dpage_free(env, mp); ++ } ++ { ++ /* squash freed slots out of the dirty list */ ++ unsigned y; ++ for (y=1; dl[y].mptr && y <= dl[0].mid; y++); ++ if (y <= dl[0].mid) { ++ for(x=y, y++;;) { ++ while (!dl[y].mptr && y <= dl[0].mid) y++; ++ if (y > dl[0].mid) break; ++ dl[x++] = dl[y++]; ++ } ++ dl[0].mid = x-1; ++ } else { ++ /* all slots freed */ ++ dl[0].mid = 0; ++ } ++ } + txn->mt_loose_pgs = NULL; + txn->mt_loose_count = 0; + } diff --git a/lmdb.spec b/lmdb.spec index fcd15b1..178bff0 100644 --- a/lmdb.spec +++ b/lmdb.spec @@ -3,7 +3,7 @@ Name: lmdb Version: 0.9.22 -Release: 3%{?dist} +Release: 4%{?dist} Summary: Memory-mapped key-value database License: OpenLDAP @@ -14,6 +14,9 @@ Source1: lmdb.pc.in Patch0: lmdb-make.patch Patch1: lmdb-s390-check.patch +# Upstream fix for rhbz#1645114 +Patch2: fix-remove-loose-pg-from-dirty-list.patch + BuildRequires: make BuildRequires: gcc BuildRequires: doxygen @@ -54,6 +57,8 @@ The %{name}-doc package contains automatically generated documentation for %{nam %patch0 -p1 -b .make %patch1 -p1 -b .s390-check +%patch2 -p1 -b .page_dirty + %build pushd %{archive_path} @@ -121,6 +126,9 @@ popd %changelog +* Mon Nov 05 2018 Jan Staněk - 0.9.22-4 +- Import upstream fix for rhbz#1645114 + * Fri Jul 13 2018 Fedora Release Engineering - 0.9.22-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild