From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 8071E138334 for ; Thu, 28 Nov 2019 16:34:59 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id B9050E08BF; Thu, 28 Nov 2019 16:34:56 +0000 (UTC) Received: from smtp.gentoo.org (dev.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 85DCAE08BF for ; Thu, 28 Nov 2019 16:34:56 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 5AF9734D532 for ; Thu, 28 Nov 2019 16:34:55 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 255958C5 for ; Thu, 28 Nov 2019 16:34:53 +0000 (UTC) From: "Joonas Niilola" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Joonas Niilola" Message-ID: <1574958875.b2a8f934671d15ac008f42976e5c4de087e31607.juippis@gentoo> Subject: [gentoo-commits] repo/gentoo:master commit in: sys-fs/bees/, sys-fs/bees/files/ X-VCS-Repository: repo/gentoo X-VCS-Files: sys-fs/bees/bees-0.6.1-r1.ebuild sys-fs/bees/files/6001-lib-fix-non-local-lambda-expression-cannot-have-a-ca.patch sys-fs/bees/files/6002-context-workaround-to-prevent-LOGICAL_INO-and-btrfs-.patch X-VCS-Directories: sys-fs/bees/ sys-fs/bees/files/ X-VCS-Committer: juippis X-VCS-Committer-Name: Joonas Niilola X-VCS-Revision: b2a8f934671d15ac008f42976e5c4de087e31607 X-VCS-Branch: master Date: Thu, 28 Nov 2019 16:34:53 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Archives-Salt: dba37c11-150b-4ada-a83f-fe75d9b894f8 X-Archives-Hash: 9c58b0adb6d31d270ebea6a79a270f62 commit: b2a8f934671d15ac008f42976e5c4de087e31607 Author: Kai Krakow gmail com> AuthorDate: Thu Nov 28 11:23:02 2019 +0000 Commit: Joonas Niilola gentoo 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 gmail.com> Signed-off-by: Joonas Niilola 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 +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 +--- + 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 current_catch_explainer = [&](string s) { ++ function 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 +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 +--- + 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(&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 { + 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 +