commit:     b2a8f934671d15ac008f42976e5c4de087e31607
Author:     Kai Krakow <hurikhan77+bgo <AT> gmail <DOT> com>
AuthorDate: Thu Nov 28 11:23:02 2019 +0000
Commit:     Joonas Niilola <juippis <AT> gentoo <DOT> org>
CommitDate: Thu Nov 28 16:34:35 2019 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=b2a8f934

sys-fs/bees: Bump to v0.6.1-r1

Closes: https://bugs.gentoo.org/685714
Package-Manager: Portage-2.3.76, Repoman-2.3.16
Signed-off-by: Kai Krakow <hurikhan77+bgo <AT> gmail.com>
Signed-off-by: Joonas Niilola <juippis <AT> gentoo.org>

 sys-fs/bees/bees-0.6.1-r1.ebuild                   | 86 ++++++++++++++++++++
 ...-local-lambda-expression-cannot-have-a-ca.patch | 38 +++++++++
 ...karound-to-prevent-LOGICAL_INO-and-btrfs-.patch | 95 ++++++++++++++++++++++
 3 files changed, 219 insertions(+)

diff --git a/sys-fs/bees/bees-0.6.1-r1.ebuild b/sys-fs/bees/bees-0.6.1-r1.ebuild
new file mode 100644
index 00000000000..5d44fcd0182
--- /dev/null
+++ b/sys-fs/bees/bees-0.6.1-r1.ebuild
@@ -0,0 +1,86 @@
+# Copyright 1999-2019 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit linux-info systemd
+
+DESCRIPTION="Best-Effort Extent-Same, a btrfs dedup agent"
+HOMEPAGE="https://github.com/Zygo/bees";
+
+if [[ ${PV} == "9999" ]] ; then
+       EGIT_REPO_URI="https://github.com/Zygo/bees.git";
+       inherit git-r3
+else
+       SRC_URI="https://github.com/Zygo/bees/archive/v${PV}.tar.gz -> 
${P}.tar.gz"
+       KEYWORDS="~amd64"
+fi
+
+LICENSE="GPL-3"
+SLOT="0"
+IUSE="tools"
+
+DEPEND="
+       >=sys-apps/util-linux-2.30.2
+       >=sys-fs/btrfs-progs-4.1
+"
+RDEPEND="${DEPEND}"
+
+CONFIG_CHECK="~BTRFS_FS"
+ERROR_BTRFS_FS="CONFIG_BTRFS_FS: bees does currently only work with btrfs"
+
+PATCHES=(
+       
"${FILESDIR}/6001-lib-fix-non-local-lambda-expression-cannot-have-a-ca.patch"
+       
"${FILESDIR}/6002-context-workaround-to-prevent-LOGICAL_INO-and-btrfs-.patch"
+)
+
+pkg_pretend() {
+       if [[ ${MERGE_TYPE} != buildonly ]]; then
+               if kernel_is -lt 4 4 3; then
+                       ewarn "Kernel versions below 4.4.3 lack critical 
features needed for bees to"
+                       ewarn "properly operate, so it won't work. It's 
recommended to run at least"
+                       ewarn "kernel version 4.11 for best performance and 
reliability."
+                       ewarn
+               elif kernel_is -lt 4 11; then
+                       ewarn "With kernel versions below 4.11, bees may 
severely degrade system performance"
+                       ewarn "and responsiveness. Especially, the kernel may 
deadlock while bees is"
+                       ewarn "running, it's recommended to run at least kernel 
4.11."
+                       ewarn
+               elif kernel_is -lt 4 14 29; then
+                       ewarn "With kernel versions below 4.14.29, bees may 
generate a lot of bogus WARN_ON()"
+                       ewarn "messages in the kernel log. These messages can 
be ignored and this is fixed"
+                       ewarn "with more recent kernels:"
+                       ewarn "# WARNING: CPU: 3 PID: 18172 at 
fs/btrfs/backref.c:1391 find_parent_nodes+0xc41/0x14e0"
+                       ewarn
+               fi
+               if kernel_is -lt 5 3 4; then
+                       ewarn "With kernel versions below 5.3.4, bees may 
trigger a btrfs bug when running"
+                       ewarn "btrfs-balance in parallel. This may lead to 
meta-data corruption in the worst"
+                       ewarn "case. Especially, kernels 5.1.21 and 5.2.21 
should be avoided. Kernels 5.0.x"
+                       ewarn "after 5.0.21 should be safe. In the best case, 
affected kernels may force"
+                       ewarn "the device RO without writing corrupted 
meta-data. More details:"
+                       ewarn 
"https://github.com/Zygo/bees/blob/master/docs/btrfs-kernel.md";
+                       ewarn
+               fi
+               elog "Bees recommends running the latest current kernel for 
performance and"
+               elog "reliability reasons, see README.md."
+       fi
+}
+
+src_configure() {
+       cat >localconf <<-EOF || die
+               LIBEXEC_PREFIX=/usr/libexec
+               PREFIX=/usr
+               LIBDIR="$(get_libdir)"
+               SYSTEMD_SYSTEM_UNIT_DIR="$(systemd_get_systemunitdir)"
+               DEFAULT_MAKE_TARGET=all
+       EOF
+       if [[ ${PV} != "9999" ]] ; then
+               cat >>localconf <<-EOF || die
+                       BEES_VERSION=v${PV}
+               EOF
+       fi
+       if use tools; then
+               echo OPTIONAL_INSTALL_TARGETS=install_tools >>localconf || die
+       fi
+}

diff --git 
a/sys-fs/bees/files/6001-lib-fix-non-local-lambda-expression-cannot-have-a-ca.patch
 
b/sys-fs/bees/files/6001-lib-fix-non-local-lambda-expression-cannot-have-a-ca.patch
new file mode 100644
index 00000000000..60ab748eb2b
--- /dev/null
+++ 
b/sys-fs/bees/files/6001-lib-fix-non-local-lambda-expression-cannot-have-a-ca.patch
@@ -0,0 +1,38 @@
+From 566df54a3f7458559b75455a95b1991b515ba6bf Mon Sep 17 00:00:00 2001
+From: Zygo Blaxell <[email protected]>
+Date: Wed, 12 Jun 2019 21:27:50 -0400
+Subject: [PATCH 1/2] lib: fix non-local lambda expression cannot have a
+ capture-default
+
+We got away with this because GCC 4.8 (and apparently every GCC prior
+to 9) didn't notice or care, and because there is nothing referenced
+inside the lambda function body that isn't accessible from any other
+kind of function body (i.e. the capture wasn't needed at all).
+
+GCC 9 now enforces what the C++ standard said all along:  there is
+no need to allow capture-default in this case, so it is not.
+
+Fix by removing the offending capture-default.
+
+Fixes: https://github.com/Zygo/bees/issues/112
+Signed-off-by: Zygo Blaxell <[email protected]>
+---
+ lib/error.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/error.cc b/lib/error.cc
+index f2a6db0..1d16a0a 100644
+--- a/lib/error.cc
++++ b/lib/error.cc
+@@ -32,7 +32,7 @@ namespace crucible {
+ 
+       // FIXME:  could probably avoid some of these levels of indirection
+       static
+-      function<void(string s)> current_catch_explainer = [&](string s) {
++      function<void(string s)> current_catch_explainer = [](string s) {
+               cerr << s << endl;
+       };
+ 
+-- 
+2.23.0
+

diff --git 
a/sys-fs/bees/files/6002-context-workaround-to-prevent-LOGICAL_INO-and-btrfs-.patch
 
b/sys-fs/bees/files/6002-context-workaround-to-prevent-LOGICAL_INO-and-btrfs-.patch
new file mode 100644
index 00000000000..6d8d2ea530d
--- /dev/null
+++ 
b/sys-fs/bees/files/6002-context-workaround-to-prevent-LOGICAL_INO-and-btrfs-.patch
@@ -0,0 +1,95 @@
+From f731ea8016c570243c783adef96681b535d9c927 Mon Sep 17 00:00:00 2001
+From: Zygo Blaxell <[email protected]>
+Date: Tue, 19 Nov 2019 16:01:31 -0500
+Subject: [PATCH 2/2] context: workaround to prevent LOGICAL_INO and btrfs
+ balance from running concurrently
+
+This avoids some kernel bugs.  One of them is fixed in 5.3.4 and later:
+
+       efad8a853a "Btrfs: fix use-after-free when using the tree modification 
log"
+
+There are apparently others in current kernels, so for now just put bees
+on pause until the balance is done.
+
+At some point we may want to provide an option to disable this
+workaround; however, running bees and balance at the same time makes
+neither particularly fast, so maybe we'll just leave it this way.
+
+Signed-off-by: Zygo Blaxell <[email protected]>
+---
+ src/bees-context.cc | 31 +++++++++++++++++++++++++++++++
+ src/bees.h          |  4 ++++
+ 2 files changed, 35 insertions(+)
+
+diff --git a/src/bees-context.cc b/src/bees-context.cc
+index 4e0a43e..0665019 100644
+--- a/src/bees-context.cc
++++ b/src/bees-context.cc
+@@ -760,11 +760,42 @@ BeesResolveAddrResult::BeesResolveAddrResult()
+ {
+ }
+ 
++void
++BeesContext::wait_for_balance()
++{
++      Timer balance_timer;
++      BEESNOTE("WORKAROUND: waiting for balance to stop");
++      while (true) {
++              btrfs_ioctl_balance_args args;
++              memset_zero<btrfs_ioctl_balance_args>(&args);
++              const int ret = ioctl(root_fd(), BTRFS_IOC_BALANCE_PROGRESS, 
&args);
++              if (ret < 0) {
++                      // Either can't get balance status or not running, exit 
either way
++                      break;
++              }
++
++              if (!(args.state & BTRFS_BALANCE_STATE_RUNNING)) {
++                      // Balance not running, doesn't matter if paused or 
cancelled
++                      break;
++              }
++
++              BEESLOGDEBUG("WORKAROUND: Waiting " << balance_timer << "s for 
balance to stop");
++              sleep(BEES_BALANCE_POLL_INTERVAL);
++      }
++}
++
+ BeesResolveAddrResult
+ BeesContext::resolve_addr_uncached(BeesAddress addr)
+ {
+       THROW_CHECK1(invalid_argument, addr, !addr.is_magic());
+       THROW_CHECK0(invalid_argument, !!root_fd());
++
++      // Is there a bug where resolve and balance cause a crash (BUG_ON at 
fs/btrfs/ctree.c:1227)?
++      // Apparently yes, and more than one.
++      // Wait for the balance to finish before we run LOGICAL_INO
++      wait_for_balance();
++
++      // Time how long this takes
+       Timer resolve_timer;
+ 
+       // There is no performance benefit if we restrict the buffer size.
+diff --git a/src/bees.h b/src/bees.h
+index da87d88..5c9375c 100644
+--- a/src/bees.h
++++ b/src/bees.h
+@@ -114,6 +114,9 @@ const size_t BEES_TRANSID_FACTOR = 10;
+ // The actual limit in LOGICAL_INO seems to be 2730, but let's leave a little 
headroom
+ const size_t BEES_MAX_EXTENT_REF_COUNT = 2560;
+ 
++// Wait this long for a balance to stop
++const double BEES_BALANCE_POLL_INTERVAL = 60.0;
++
+ // Flags
+ const int FLAGS_OPEN_COMMON   = O_NOFOLLOW | O_NONBLOCK | O_CLOEXEC | 
O_NOATIME | O_LARGEFILE | O_NOCTTY;
+ const int FLAGS_OPEN_DIR      = FLAGS_OPEN_COMMON | O_RDONLY | O_DIRECTORY;
+@@ -708,6 +711,7 @@ class BeesContext : public 
enable_shared_from_this<BeesContext> {
+       void set_root_fd(Fd fd);
+ 
+       BeesResolveAddrResult resolve_addr_uncached(BeesAddress addr);
++      void wait_for_balance();
+ 
+       BeesFileRange scan_one_extent(const BeesFileRange &bfr, const Extent 
&e);
+       void rewrite_file_range(const BeesFileRange &bfr);
+-- 
+2.23.0
+

Reply via email to