www-servers/puma: add ruby26

Backport upstream patch to fix compatibility with ruby 2.6.

Signed-off-by: Hans de Graaff <graaff@gentoo.org>
Package-Manager: Portage-2.3.62, Repoman-2.3.11
This commit is contained in:
Hans de Graaff
2019-04-29 20:15:44 +02:00
parent f040a2028e
commit 657fe39493
2 changed files with 116 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
From b94c3e34faff024a5b1930af36e4d64bd6dde57f Mon Sep 17 00:00:00 2001
From: MSP-Greg <MSP-Greg@users.noreply.github.com>
Date: Fri, 15 Mar 2019 17:26:20 -0500
Subject: [PATCH] Puma::Cluster#stop_workers - use WNOHANG with nil return
tests
Ruby 2.6 introduced a bug that affects worker shutdown (waitpid).
Added code using Process::WNOHANG along with needed logic. Adds worker status (via $?) and total shutdown time to log.
Co-authored-by: MSP-Greg <greg.mpls@gmail.com>
Co-authored-by: guilleiguaran <guilleiguaran@gmail.com>
---
lib/puma/cluster.rb | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/lib/puma/cluster.rb b/lib/puma/cluster.rb
index 93d65131..0879c96c 100644
--- a/lib/puma/cluster.rb
+++ b/lib/puma/cluster.rb
@@ -37,7 +37,25 @@ def stop_workers
@workers.each { |x| x.term }
begin
- @workers.each { |w| Process.waitpid(w.pid) }
+ if RUBY_VERSION < '2.6'
+ @workers.each { |w| Process.waitpid(w.pid) }
+ else
+ # below code is for a bug in Ruby 2.6+, above waitpid call hangs
+ t_st = Process.clock_gettime(Process::CLOCK_MONOTONIC)
+ pids = @workers.map(&:pid)
+ loop do
+ pids.reject! do |w_pid|
+ if Process.waitpid(w_pid, Process::WNOHANG)
+ log " worker status: #{$?}"
+ true
+ end
+ end
+ break if pids.empty?
+ sleep 0.5
+ end
+ t_end = Process.clock_gettime(Process::CLOCK_MONOTONIC)
+ log format(" worker shutdown time: %6.2f", t_end - t_st)
+ end
rescue Interrupt
log "! Cancelled waiting for workers"
end

View File

@@ -0,0 +1,69 @@
# Copyright 1999-2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=6
USE_RUBY="ruby24 ruby25 ruby26"
RUBY_FAKEGEM_RECIPE_DOC="rdoc"
inherit multilib ruby-fakegem
DESCRIPTION="a simple, fast, threaded, and highly concurrent HTTP 1.1 server for Ruby/Rack"
HOMEPAGE="https://puma.io/"
SRC_URI="https://github.com/puma/puma/archive/v${PV}.tar.gz -> ${P}.tar.gz"
LICENSE="BSD"
SLOT="3"
KEYWORDS="~amd64 ~arm ~arm64 ~hppa ~ppc ~ppc64 ~x86"
IUSE=""
DEPEND+=" dev-libs/openssl:0 test? ( net-misc/curl )"
RDEPEND+=" dev-libs/openssl:0"
ruby_add_bdepend "virtual/ruby-ssl
test? ( dev-ruby/rack >=dev-ruby/minitest-5.9:5 >=dev-ruby/test-unit-3.0:2 )"
all_ruby_prepare() {
eapply "${FILESDIR}/${P}-ruby26-waitpid.patch"
sed -i -e '/bundler/ s:^:#:' test/helper.rb || die
# Avoid test failing inconsistently
sed -i -e '/phased_restart_via_pumactl/,/^ end/ s:^:#:' test/test_integration.rb || die
# Avoid test that trigger a bug in ruby very easily and lead to
# failure. This affects all current puma versions in combination
# with the latest ruby versions, so we add this new version anyway
# while allowing these tests to fail.
# https://github.com/puma/puma/pull/1345
rm -f test/test_puma_server_ssl.rb || die
# Use correct ruby version
sed -i -e 's/ruby -rrubygems/#{Gem.ruby} -rrubygems/' test/shell/t{1,3}.rb || die
}
each_ruby_prepare() {
sed -i -e 's:ruby -rubygems:'${RUBY}' -rubygems:' \
-e 's/localhost/127.0.0.1/' test/shell/* || die
sed -i -e '1ilog_requests' test/shell/t{1,2}_conf.rb || die
}
each_ruby_configure() {
${RUBY} -Cext/puma_http11 extconf.rb || die
}
each_ruby_compile() {
emake V=1 -Cext/puma_http11
cp ext/puma_http11/puma_http11$(get_modname) lib/puma/ || die
}
each_ruby_test() {
einfo "Running test suite"
${RUBY} -Ilib:.:test -e "gem 'minitest', '~>5.9'; gem 'test-unit', '~>3.0'; require 'minitest/autorun'; Dir['test/**/*test_*.rb'].each{|f| require f}" || die
einfo "Running integration tests"
pushd test/shell
#sh run.sh || die
popd
}