mirror of
https://github.com/gentoo-mirror/gentoo.git
synced 2026-08-06 00:48:18 -07:00
sys-fs/quota: Fixed high CPU usage with USE="rpc".
Closes: https://bugs.gentoo.org/658022 Package-Manager: Portage-2.3.49, Repoman-2.3.10
This commit is contained in:
77
sys-fs/quota/files/quota-4.04-Listen-on-a-TCP-socket.patch
Normal file
77
sys-fs/quota/files/quota-4.04-Listen-on-a-TCP-socket.patch
Normal file
@@ -0,0 +1,77 @@
|
||||
From 31ecd29b3b3f51145fd78f63087c10e9fcadf999 Mon Sep 17 00:00:00 2001
|
||||
From: Steve Dickson <steved@redhat.com>
|
||||
Date: Tue, 22 May 2018 12:41:59 +0200
|
||||
Subject: [PATCH] Listen on a TCP socket
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
rpc.rquotad spins in libtirpc's rendezvous_request() on accepting TCP
|
||||
connections because the polled TCP socket is not listening:
|
||||
|
||||
poll([{fd=4, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=5,
|
||||
events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=6,
|
||||
events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=7,
|
||||
events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 4, -1) = 2 ([{fd=5,
|
||||
revents=POLLHUP}, {fd=7, revents=POLLHUP}])
|
||||
accept(5, 0x7ffe61698700, [128]) = -1 EINVAL (Invalid argument)
|
||||
accept(7, 0x7ffe61698700, [128]) = -1 EINVAL (Invalid argument)
|
||||
|
||||
The polled descriptors are:
|
||||
|
||||
rpc.rquot 21981 root 4u IPv4 80449159 0t0 UDP *:rquotad
|
||||
rpc.rquot 21981 root 5u sock 0,9 0t0 80449162 protocol: TCP
|
||||
rpc.rquot 21981 root 6u IPv6 80449165 0t0 UDP *:rquotad
|
||||
rpc.rquot 21981 root 7u sock 0,9 0t0 80449168 protocol: TCPv6
|
||||
|
||||
That results into a high CPU usage just after staring rpc.rquotad
|
||||
process.
|
||||
|
||||
This patch adds a listen() call to svc_create_sock()
|
||||
routine which is needed with libtirpc version of svc_tli_create()
|
||||
as well as a needed IPv6 setsockopt().
|
||||
|
||||
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
||||
---
|
||||
svc_socket.c | 18 ++++++++++++++++++
|
||||
1 file changed, 18 insertions(+)
|
||||
|
||||
diff --git a/svc_socket.c b/svc_socket.c
|
||||
index 8a44604..d2e3abf 100644
|
||||
--- a/svc_socket.c
|
||||
+++ b/svc_socket.c
|
||||
@@ -118,6 +118,15 @@ static int svc_create_sock(struct addrinfo *ai)
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ if (ai->ai_family == AF_INET6) {
|
||||
+ if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,
|
||||
+ &optval, sizeof(optval)) < 0) {
|
||||
+ errstr(_("Cannot set IPv6 socket options: %s\n"), strerror(errno));
|
||||
+ close(fd);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) {
|
||||
errstr(_("Cannot set socket options: %s\n"), strerror(errno));
|
||||
close(fd);
|
||||
@@ -129,6 +138,15 @@ static int svc_create_sock(struct addrinfo *ai)
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
+
|
||||
+ if (ai->ai_protocol == IPPROTO_TCP) {
|
||||
+ if (listen(fd, SOMAXCONN) < 0) {
|
||||
+ errstr(_("Cannot listen to address: %s\n"), strerror(errno));
|
||||
+ close(fd);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
return fd;
|
||||
}
|
||||
|
||||
--
|
||||
2.14.3
|
||||
|
||||
82
sys-fs/quota/quota-4.04-r2.ebuild
Normal file
82
sys-fs/quota/quota-4.04-r2.ebuild
Normal file
@@ -0,0 +1,82 @@
|
||||
# Copyright 1999-2018 Gentoo Foundation
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
|
||||
EAPI=6
|
||||
|
||||
inherit autotools
|
||||
|
||||
DESCRIPTION="Linux quota tools"
|
||||
HOMEPAGE="https://sourceforge.net/projects/linuxquota/"
|
||||
SRC_URI="mirror://sourceforge/linuxquota/${P}.tar.gz"
|
||||
|
||||
LICENSE="GPL-2"
|
||||
SLOT="0"
|
||||
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~sparc ~x86"
|
||||
IUSE="ldap netlink nls rpc tcpd"
|
||||
|
||||
RDEPEND="
|
||||
ldap? ( >=net-nds/openldap-2.3.35 )
|
||||
netlink? (
|
||||
sys-apps/dbus
|
||||
dev-libs/libnl:3
|
||||
)
|
||||
rpc? (
|
||||
net-nds/rpcbind
|
||||
elibc_glibc? ( sys-libs/glibc[-rpc(-)] )
|
||||
net-libs/libtirpc
|
||||
net-libs/rpcsvc-proto
|
||||
)
|
||||
tcpd? ( sys-apps/tcp-wrappers )
|
||||
"
|
||||
DEPEND="
|
||||
${RDEPEND}
|
||||
nls? ( sys-devel/gettext )
|
||||
"
|
||||
|
||||
PATCHES=(
|
||||
"${FILESDIR}/${P}-glibc226.patch"
|
||||
"${FILESDIR}/${P}-Listen-on-a-TCP-socket.patch"
|
||||
)
|
||||
|
||||
src_prepare() {
|
||||
default
|
||||
eautoreconf
|
||||
}
|
||||
|
||||
src_configure() {
|
||||
local myeconfargs=(
|
||||
--docdir="${EPREFIX%/}/usr/share/doc/${PF}"
|
||||
$(use_enable nls)
|
||||
$(use_enable ldap ldapmail)
|
||||
$(use_enable netlink)
|
||||
$(use_enable rpc)
|
||||
$(use_enable rpc rpcsetquota)
|
||||
)
|
||||
econf "${myeconfargs[@]}"
|
||||
}
|
||||
|
||||
src_install() {
|
||||
emake DESTDIR="${D}" install
|
||||
dodoc doc/* README.* Changelog
|
||||
|
||||
insinto /etc
|
||||
insopts -m0644
|
||||
doins warnquota.conf quotatab
|
||||
|
||||
newinitd "${FILESDIR}"/quota.rc7 quota
|
||||
newconfd "${FILESDIR}"/quota.confd quota
|
||||
|
||||
if use rpc ; then
|
||||
newinitd "${FILESDIR}"/rpc.rquotad.initd rpc.rquotad
|
||||
fi
|
||||
|
||||
if use ldap ; then
|
||||
insinto /etc/openldap/schema
|
||||
insopts -m0644
|
||||
doins "${FILESDIR}"/ldap-scripts/quota.schema
|
||||
|
||||
exeinto /usr/share/quota/ldap-scripts
|
||||
doexe "${FILESDIR}"/ldap-scripts/*.pl
|
||||
doexe "${FILESDIR}"/ldap-scripts/edquota_editor
|
||||
fi
|
||||
}
|
||||
Reference in New Issue
Block a user