Rainbows! Rack HTTP server user/dev discussion
 help / color / mirror / code / Atom feed
* [ANN] Rainbows! 5.2.1
From: Eric Wong @ 2020-01-29 23:40 UTC (permalink / raw)
  To: rainbows-public

Changes:

    Some documentation updates, mainly to to switch bogomips.org
    to yhbt.net since the .org TLD won't be affordable in the near
    future.

    It should also be easier for devs to build gems themselves,
    since pandoc is no longer a dependency for building manpages.

Rainbows! is maintained as long as anybody uses it,
but I don't recommend using it (or Ruby :P) for new apps:

https://yhbt.net/rainbows-public/20151020095934.GA19114@dcvr.yhbt.net/

* https://yhbt.net/rainbows/
* rainbows-public@yhbt.net
* https://yhbt.net/rainbows-public/
* git clone https://yhbt.net/rainbows.git
* https://yhbt.net/rainbows/NEWS.atom.xml
* nntp://news.public-inbox.org/inbox.comp.lang.ruby.rainbows
* nntp://news.gmane.io/gmane.comp.lang.ruby.rainbows.general

/me goes back to Perl 5 like it's 1999!

^ permalink raw reply

* [PATCH] doc: switch bogomips.org to yhbt.net
From: Eric Wong @ 2020-01-09  7:29 UTC (permalink / raw)
  To: rainbows-public

bogomips.org is due to expire, soon, and I'm not willing to pay
extortionists at Ethos Capital/PIR/ICANN to keep a .org.  So
it's at yhbt.net, for now...  Identity is overrated.

Tor users can use .onions and kick ICANN to the curb:

  torsocks w3m http://rainbows.ou63pmih66umazou.onion/
  torsocks git clone http://ou63pmih66umazou.onion/rainbows.git/
  torsocks w3m http://ou63pmih66umazou.onion/rainbows-public/

While we're at it, switch news.gmane.org => news.gmane.io
(but I suspect that'll need to be resynched since our mail
"List-Id:" header is changing).
---
 .olddoc.yml                   | 20 ++++++++++++--------
 Documentation/comparison.haml |  2 +-
 Documentation/rainbows.1.txt  |  6 +++---
 FAQ                           |  2 +-
 GNUmakefile                   |  2 +-
 HACKING                       |  4 ++--
 README                        | 18 ++++++++++--------
 Sandbox                       |  2 +-
 TUNING                        |  4 ++--
 archive/rfmig.rb              | 32 --------------------------------
 archive/slrnpull.conf         |  2 +-
 examples/reverse_proxy.ru     |  2 +-
 lib/rainbows.rb               |  2 +-
 lib/rainbows/configurator.rb  |  4 ++--
 lib/rainbows/epoll.rb         |  2 +-
 lib/rainbows/reverse_proxy.rb |  2 +-
 rainbows.gemspec              | 16 ++++++++--------
 vs_Unicorn                    |  2 +-
 18 files changed, 49 insertions(+), 75 deletions(-)
 delete mode 100644 archive/rfmig.rb

diff --git a/.olddoc.yml b/.olddoc.yml
index 3e776ef..a10528a 100644
--- a/.olddoc.yml
+++ b/.olddoc.yml
@@ -1,12 +1,10 @@
 ---
-cgit_url: https://bogomips.org/rainbows.git
-git_url: https://bogomips.org/rainbows.git
-rdoc_url: https://bogomips.org/rainbows/
+cgit_url: https://yhbt.net/rainbows.git/
+rdoc_url: https://yhbt.net/rainbows/
 merge_html:
   rainbows_1: Documentation/rainbows.1.html
   Summary: Documentation/comparison.html
-public_email: rainbows-public@bogomips.org
-private_email: rainbows@bogomips.org
+public_email: rainbows-public@yhbt.net
 noindex:
 - TODO
 - LATEST
@@ -15,7 +13,13 @@ noindex:
 - Unicorn::SocketHelper
 - EM
 - Revactor
-ml_url: https://bogomips.org/rainbows-public/
+ml_url:
+- https://yhbt.net/rainbows-public/
+- http://ou63pmih66umazou.onion/rainbows-public/
+source_code:
+- git clone https://yhbt.net/rainbows.git
+- torsocks git clone http://ou63pmih66umazou.onion/rainbows.git
 nntp_url:
-  - nntp://news.public-inbox.org/inbox.comp.lang.ruby.rainbows
-  - nntp://news.gmane.org/gmane.comp.lang.ruby.rainbows.general
+- nntp://news.public-inbox.org/inbox.comp.lang.ruby.rainbows
+- nntp://ou63pmih66umazou.onion/inbox.comp.lang.ruby.rainbows
+- nntp://news.gmane.io/gmane.comp.lang.ruby.rainbows.general
diff --git a/Documentation/comparison.haml b/Documentation/comparison.haml
index 4fd02eb..8586a0b 100644
--- a/Documentation/comparison.haml
+++ b/Documentation/comparison.haml
@@ -153,7 +153,7 @@
     CoolioThread* and CoolioThread* requires Ruby 1.9 reasonable performance
   %li
     rack.input streaming is what makes
-    %a(href="http://upr.bogomips.org/") upload progress,
+    %a(href="http://yhbt.net/upr/") upload progress,
     and BOSH possible
   %li
     rack.input streaming is NOT compatible with current versions of nginx
diff --git a/Documentation/rainbows.1.txt b/Documentation/rainbows.1.txt
index cdf7863..94adb8a 100644
--- a/Documentation/rainbows.1.txt
+++ b/Documentation/rainbows.1.txt
@@ -1,5 +1,5 @@
 % rainbows(1) Rainbows! User Manual
-% Rainbows! Hackers <rainbows-public@bogomips.org>
+% Rainbows! Hackers <rainbows-public@yhbt.net>
 % December 3, 2009
 
 # NAME
@@ -155,7 +155,7 @@ RACKUP_FILE, some frameworks do not require them.
 * [Rack RDoc][2]
 * [Rackup HowTo][3]
 
-[1]: https://bogomips.org/rainbows/
+[1]: https://yhbt.net/rainbows/
 [2]: http://rdoc.info/gems/r#/gems/rack/frames
 [3]: http://wiki.github.com/rack/rack/tutorial-rackup-howto
-[4]: https://bogomips.org/rainbows/SIGNALS.html
+[4]: https://yhbt.net/rainbows/SIGNALS.html
diff --git a/FAQ b/FAQ
index e3dd762..5f64786 100644
--- a/FAQ
+++ b/FAQ
@@ -64,7 +64,7 @@ requires a extra {patch}[http://haproxy.1wt.eu/download/patches/].
 If you don't need streaming "rack.input", then nginx is a great HTTPS
 reverse proxy.
 
-Refer to the {unicorn FAQ}[https://bogomips.org/unicorn/FAQ.html] on how
+Refer to the {unicorn FAQ}[https://yhbt.net/unicorn/FAQ.html] on how
 to ensure redirects go to "https://" URLs.
 
 
diff --git a/GNUmakefile b/GNUmakefile
index af8be80..70cc708 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -1,6 +1,6 @@
 # use GNU Make to run tests in parallel, and without depending on RubyGems
 all::
-RSYNC_DEST := bogomips.org:/srv/bogomips/rainbows
+RSYNC_DEST := yhbt.net:/srv/yhbt/rainbows
 rfpackage := rainbows
 PLACEHOLDERS := rainbows_1 Summary
 
diff --git a/HACKING b/HACKING
index 31f2111..b2f30e5 100644
--- a/HACKING
+++ b/HACKING
@@ -13,7 +13,7 @@ Please wrap documentation at 72 characters-per-line or less (long URLs
 are exempt) so it is comfortably readable from terminals.
 
 When referencing mailing list posts, use
-"https://bogomips.org/rainbows-public/<Message-ID>/" if possible since
+"https://yhbt.net/rainbows-public/<Message-ID>/" if possible since
 the Message-ID remains searchable even if the website becomes unavailable.
 
 == Contributing
@@ -38,7 +38,7 @@ distributed with git on on patch submission guidelines to follow.  Just
 don't email the git mailing list or maintainer with Rainbows! patches :)
 
 No subscription is required to post to the mailing list at
-rainbows-public@bogomips.org
+rainbows-public@yhbt.net
 
 Please Cc: everyone on replies, as not everyone is subscribed.
 
diff --git a/README b/README
index 178990d..5fc3a31 100644
--- a/README
+++ b/README
@@ -51,7 +51,7 @@ network concurrency.
 * Designed for {Rack}[http://rack.github.io/], the standard for
   modern Ruby HTTP applications.
 
-* Built on {unicorn}[https://bogomips.org/unicorn/], inheriting its
+* Built on {unicorn}[https://yhbt.net/unicorn/], inheriting its
   process/socket management features such as transparent upgrades and
   Ruby configuration DSL.
 
@@ -116,7 +116,7 @@ In APP_ROOT (where config.ru is located), run:
 For deployments, it can use a config file for Unicorn and
 \Rainbows!-specific options specified by the +--config-file/-c+
 command-line switch.  \Rainbows! accepts all options found in
-{Unicorn::Configurator}[https://bogomips.org/unicorn/Unicorn/Configurator.html]
+{Unicorn::Configurator}[https://yhbt.net/unicorn/Unicorn/Configurator.html]
 as well as the "\Rainbows!" block, so you can have the following in your
 config file:
 
@@ -135,13 +135,13 @@ for more details.
 You can get the latest source via git from the following locations
 (these versions may not be stable):
 
-  https://bogomips.org/rainbows.git
+  https://yhbt.net/rainbows.git
   https://repo.or.cz/rainbows.git (mirror)
 
 You may browse the code from the web and download the latest snapshot
 tarballs here:
 
-* https://bogomips.org/rainbows.git
+* https://yhbt.net/rainbows.git
 * https://repo.or.cz/rainbows.git (gitweb)
 
 Inline patches (from "git format-patch") to the mailing list are
@@ -175,8 +175,10 @@ requests) go to the mailing list.  Patches must be sent inline
 (git format-patch -M + git send-email).  No subscription is necessary
 to post on the mailing list.  No top posting.
 
-* email: mailto:rainbows-public@bogomips.org
-* subscribe: mailto:rainbows-public+subscribe@bogomips.org
-* archives: https://bogomips.org/rainbows-public/
+* email: mailto:rainbows-public@yhbt.net
+* subscribe: mailto:rainbows-public+subscribe@yhbt.net
+* archives: https://yhbt.net/rainbows-public/
+  http://ou63pmih66umazou.onion/rainbows-public/
   nntp://news.public-inbox.org/inbox.comp.lang.ruby.rainbows
-  nntp://news.gmane.org/gmane.comp.lang.ruby.rainbows.general
+  nntp://ou63pmih66umazou.onion/inbox.comp.lang.ruby.rainbows
+  nntp://news.gmane.io/gmane.comp.lang.ruby.rainbows.general
diff --git a/Sandbox b/Sandbox
index 63c44c4..538c792 100644
--- a/Sandbox
+++ b/Sandbox
@@ -1,6 +1,6 @@
 = Tips for using \Rainbows! with Sandbox installation tools
 
-Most {tips for unicorn}[https://bogomips.org/unicorn/Sandbox.html]
+Most {tips for unicorn}[https://yhbt.net/unicorn/Sandbox.html]
 for Bundler and Isolate apply to \Rainbows! as well.
 
 == TLDR (Bundler)
diff --git a/TUNING b/TUNING
index 55a9ad4..7686624 100644
--- a/TUNING
+++ b/TUNING
@@ -1,6 +1,6 @@
 = Tuning \Rainbows!
 
-Most of the {tuning notes}[https://bogomips.org/unicorn/TUNING.html]
+Most of the {tuning notes}[https://yhbt.net/unicorn/TUNING.html]
 apply to \Rainbows! as well.  \Rainbows! is not particularly optimized
 at the moment and is designed for applications that spend large amounts
 of the time waiting on network activity.  Thus memory usage and memory
@@ -26,7 +26,7 @@ never be the primary goal of the project.
   the kernel.
 
 * If your workers do not seem to be releasing memory to the OS after
-  traffic spikes, consider the {mall}[https://bogomips.org/mall/] library
+  traffic spikes, consider the {mall}[https://yhbt.net/mall/] library
   which allows access to the mallopt(3) function from Ruby. As of
   October 2009 tcmalloc (the default allocator for Ruby Enterprise
   Edition) does not release memory back to the kernel, the best it can
diff --git a/archive/rfmig.rb b/archive/rfmig.rb
deleted file mode 100644
index a7d31e5..0000000
--- a/archive/rfmig.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env ruby
-require 'find'
-require 'fileutils'
-rfdir = 'rubyforge.org:/var/www/gforge-projects/rainbows/'
-newbase = 'https://bogomips.org/rainbows/'
-refresh = '<meta http-equiv="refresh" content="0; url=%s" />'
-old = 'rf.old'
-new = 'rf.new'
-cmd = %W(rsync -av #{rfdir} #{old}/)
-unless File.directory?(old)
-  system(*cmd) or abort "#{cmd.inspect} failed: #$?"
-end
-
-Find.find(old) do |path|
-  path =~ /\.html\z/ or next
-  data = File.read(path)
-  tmp = path.split(%r{/})
-  tmp.shift == old or abort "BUG"
-  dst = "#{new}/#{tmp.join('/')}"
-
-  tmp[-1] = '' if tmp[-1] == "index.html"
-  url = "#{newbase}#{tmp.join('/')}"
-  meta = sprintf(refresh, url)
-  data.sub!(/(<head[^>]*>)/i, "#$1#{meta}")
-  data.sub!(/(<body[^>]*>)/i,
-            "#{$1}Redirecting to <a href=\"#{url}\">#{url}</a> ...<br/>")
-  FileUtils.mkdir_p(File.dirname(dst))
-  File.open(dst, "w") { |fp| fp.write(data) }
-end
-
-print "Verify results in #{new}/, then run:\n  "
-puts %W(rsync -av #{new}/ #{rfdir}).join(' ')
diff --git a/archive/slrnpull.conf b/archive/slrnpull.conf
index 9cf80ba..480cbec 100644
--- a/archive/slrnpull.conf
+++ b/archive/slrnpull.conf
@@ -1,4 +1,4 @@
 # group_name                         max        expire     headers_only
 gmane.comp.lang.ruby.rainbows.general 1000000000 1000000000 0
 
-# usage: slrnpull -d $PWD -h news.gmane.org --no-post
+# usage: slrnpull -d $PWD -h news.gmane.io --no-post
diff --git a/examples/reverse_proxy.ru b/examples/reverse_proxy.ru
index fcb9e74..432a37f 100644
--- a/examples/reverse_proxy.ru
+++ b/examples/reverse_proxy.ru
@@ -2,7 +2,7 @@
 cfg = {
   :upstreams => [
     "/tmp/.r.sock",
-    "http://bogomips.org/",
+    "http://yhbt.net/",
     [ "http://10.6.6.6:666/", { :weight => 666 } ],
   ]
 }
diff --git a/lib/rainbows.rb b/lib/rainbows.rb
index 584c94b..9d6d103 100644
--- a/lib/rainbows.rb
+++ b/lib/rainbows.rb
@@ -4,7 +4,7 @@
 # the value passed to TCP_DEFER_ACCEPT actually matters in Linux 2.6.32+
 Unicorn::SocketHelper::DEFAULTS[:tcp_defer_accept] = 60
 
-# See https://bogomips.org/rainbows/ for documentation
+# See https://yhbt.net/rainbows/ for documentation
 module Rainbows
   # :stopdoc:
   O = {}
diff --git a/lib/rainbows/configurator.rb b/lib/rainbows/configurator.rb
index 83077cb..5eb7606 100644
--- a/lib/rainbows/configurator.rb
+++ b/lib/rainbows/configurator.rb
@@ -1,7 +1,7 @@
 # -*- encoding: binary -*-
 
 # This module adds \Rainbows! to the
-# {Unicorn::Configurator}[https://bogomips.org/unicorn/Unicorn/Configurator.html]
+# {Unicorn::Configurator}[https://yhbt.net/unicorn/Unicorn/Configurator.html]
 # \Rainbows!-specific configuration options must be inside a the Rainbows!
 # block, otherwise Unicorn::Configurator directives may be used anywhere
 # in the file.
@@ -9,7 +9,7 @@
 # Warning: The "timeout" directive in unicorn is far more dangerous
 # in Rainbows!, since ALL requests running on a process will be lost
 # on worker death, not just one.  Instead, handle application-level
-# timeouts yourself: https://bogomips.org/unicorn/Application_Timeouts.html
+# timeouts yourself: https://yhbt.net/unicorn/Application_Timeouts.html
 #
 #   Rainbows! do
 #     use :ThreadSpawn # concurrency model to use
diff --git a/lib/rainbows/epoll.rb b/lib/rainbows/epoll.rb
index 45c4d08..1e0c7a2 100644
--- a/lib/rainbows/epoll.rb
+++ b/lib/rainbows/epoll.rb
@@ -3,7 +3,7 @@
 require 'sendfile'
 
 # Edge-triggered epoll concurrency model using
-# {sleepy_penguin}[https://bogomips.org/sleepy_penguin/] for epoll.
+# {sleepy_penguin}[https://yhbt.net/sleepy_penguin/] for epoll.
 #
 # Unlike more portable options like Coolio and EventMachine, this
 # is Linux-only, but uses edge-triggering instead of level-triggering,
diff --git a/lib/rainbows/reverse_proxy.rb b/lib/rainbows/reverse_proxy.rb
index a4d8390..f844c1d 100644
--- a/lib/rainbows/reverse_proxy.rb
+++ b/lib/rainbows/reverse_proxy.rb
@@ -3,7 +3,7 @@
 require 'socket'
 require 'thread'
 require 'uri'
-require 'kcar' # https://bogomips.org/kcar/ -- gem install kcar
+require 'kcar' # https://yhbt.net/kcar/ -- gem install kcar
 
 # This is lightly tested and has an unstable configuration interface.
 # ***** Do not rely on anything under the ReverseProxy namespace! *****
diff --git a/rainbows.gemspec b/rainbows.gemspec
index 259e2ab..558799e 100644
--- a/rainbows.gemspec
+++ b/rainbows.gemspec
@@ -8,13 +8,13 @@
 
   s.authors = ['Rainbows! hackers']
   s.description = File.read('README').split("\n\n")[1]
-  s.email = %q{rainbows-public@bogomips.org}
+  s.email = %q{rainbows-public@yhbt.net}
   s.executables = %w(rainbows)
   s.extra_rdoc_files = IO.readlines('.document').map!(&:chomp!).keep_if do |f|
     File.exist?(f)
   end
   s.files = manifest
-  s.homepage = 'https://bogomips.org/rainbows/'
+  s.homepage = 'https://yhbt.net/rainbows/'
   s.summary = 'Rack app server for sleepy apps and slow clients'
 
   # we want a newer Rack for a valid HeaderHash#each
@@ -59,11 +59,11 @@
   ruby_1_8 = 'Nonstandard'
   s.licenses = [ 'GPL-2.0+', ruby_1_8 ]
   s.metadata = {
-    'bug_tracker_uri' => 'https://bogomips.org/rainbows/#label-Contact',
-    'changelog_uri' => 'https://bogomips.org/rainbows/NEWS.html',
-    'documentation_uri' => 'https://bogomips.org/rainbows/',
-    'homepage_uri' => 'https://bogomips.org/rainbows/',
-    'mailing_list_uri' => 'https://bogomips.org/rainbows-public/',
-    'source_code_uri' => 'https://bogomips.org/rainbows.git',
+    'bug_tracker_uri' => 'https://yhbt.net/rainbows/#label-Contact',
+    'changelog_uri' => 'https://yhbt.net/rainbows/NEWS.html',
+    'documentation_uri' => 'https://yhbt.net/rainbows/',
+    'homepage_uri' => 'https://yhbt.net/rainbows/',
+    'mailing_list_uri' => 'https://yhbt.net/rainbows-public/',
+    'source_code_uri' => 'https://yhbt.net/rainbows.git',
   }
 end
diff --git a/vs_Unicorn b/vs_Unicorn
index 1ae2db3..88f08ff 100644
--- a/vs_Unicorn
+++ b/vs_Unicorn
@@ -82,7 +82,7 @@ unicorn code), some things are not:
   to different worker processes, and if your listen() +:backlog+ is
   overflowing: to other machines in your cluster.
 
-* Accepts the same {signals}[https://bogomips.org/unicorn/SIGNALS.html]
+* Accepts the same {signals}[https://yhbt.net/unicorn/SIGNALS.html]
   for process management, so you can share scripts to manage them (and
   nginx, too).
 

^ permalink raw reply related

* [ANN] Rainbows! 5.2.0
From: Eric Wong @ 2019-01-05 20:43 UTC (permalink / raw)
  To: rainbows-public

Mainly fixes some mismatched indentation warnings with Ruby 2.6+
Some doc updates, too.

4 changes since v5.1.1 (2017-04-02)
      quiet mismatched indentation warnings
      t/hijack.ru: avoid shadow warning
      t/test_isolate: various version updates
      various documentation updates

Rainbows! is maintained as long as anybody uses it,
but I don't recommend using it for new apps:

https://bogomips.org/rainbows-public/20151020095934.GA19114@dcvr.yhbt.net/

* https://bogomips.org/rainbows/
* rainbows-public@bogomips.org
* https://bogomips.org/rainbows-public/
* git clone https://bogomips.org/rainbows.git
* https://bogomips.org/rainbows/NEWS.atom.xml
* nntp://news.public-inbox.org/inbox.comp.lang.ruby.rainbows
* nntp://news.gmane.org/gmane.comp.lang.ruby.rainbows.general

^ permalink raw reply

* [PATCH] various documentation updates
From: Eric Wong @ 2019-01-05 20:36 UTC (permalink / raw)
  To: rainbows-public

Point to HTTPS to discourage sniffable traffic.
olddoc and pandoc are only necessary for packaging
gems/updating-the-website, not development.
Update some references to other projects.
---
 .olddoc.yml      |  2 +-
 HACKING          |  6 +++---
 README           | 20 ++++++++++----------
 rainbows.gemspec | 33 ++++++++++++++++++++-------------
 4 files changed, 34 insertions(+), 27 deletions(-)

diff --git a/.olddoc.yml b/.olddoc.yml
index d9bb974..3e776ef 100644
--- a/.olddoc.yml
+++ b/.olddoc.yml
@@ -1,6 +1,6 @@
 ---
 cgit_url: https://bogomips.org/rainbows.git
-git_url: git://bogomips.org/rainbows.git
+git_url: https://bogomips.org/rainbows.git
 rdoc_url: https://bogomips.org/rainbows/
 merge_html:
   rainbows_1: Documentation/rainbows.1.html
diff --git a/HACKING b/HACKING
index 39a68ef..31f2111 100644
--- a/HACKING
+++ b/HACKING
@@ -44,12 +44,12 @@ Please Cc: everyone on replies, as not everyone is subscribed.
 
 == Building a Gem
 
-In order to build the gem, you must install the following components:
+In order to build the gem, you must install the following components
+for documentation:
 
- * olddoc (RubyGem)
  * pandoc
 
-You can build the Unicorn gem with the following command:
+You can build the Rainbows! gem with the following command:
 
   gmake gem
 
diff --git a/README b/README
index 027f58a..178990d 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-= Rainbows! - unicorn for sleepy apps and slow clients
+= Rainbows! - Rack app server for sleepy apps and slow clients
 
 \Rainbows! is an HTTP server for sleepy Rack applications.  It is based on
 unicorn, but designed to handle applications that expect long
@@ -51,7 +51,7 @@ network concurrency.
 * Designed for {Rack}[http://rack.github.io/], the standard for
   modern Ruby HTTP applications.
 
-* Built on {Unicorn}[https://bogomips.org/unicorn/], inheriting its
+* Built on {unicorn}[https://bogomips.org/unicorn/], inheriting its
   process/socket management features such as transparent upgrades and
   Ruby configuration DSL.
 
@@ -81,7 +81,6 @@ network concurrency.
 * HTTP server push
 * Long polling
 * Reverse AJAX
-* real-time upload processing (via {upr}[http://upr.bogomips.org/])
 
 \Rainbows! can also be used to service slow clients directly even with
 fast applications.
@@ -123,7 +122,7 @@ config file:
 
     worker_processes 4 # assuming four CPU cores
     Rainbows! do
-      use :FiberSpawn
+      use :ThreadSpawn
       worker_connections 100
     end
 
@@ -136,23 +135,24 @@ for more details.
 You can get the latest source via git from the following locations
 (these versions may not be stable):
 
-  git://bogomips.org/rainbows.git
-  git://repo.or.cz/rainbows.git (mirror)
+  https://bogomips.org/rainbows.git
+  https://repo.or.cz/rainbows.git (mirror)
 
 You may browse the code from the web and download the latest snapshot
 tarballs here:
 
 * https://bogomips.org/rainbows.git
-* http://repo.or.cz/w/rainbows.git (gitweb)
+* https://repo.or.cz/rainbows.git (gitweb)
 
 Inline patches (from "git format-patch") to the mailing list are
 preferred because they allow code review and comments in the reply to
 the patch.
 
 We will adhere to mostly the same conventions for patch submissions as
-git itself.  See the Documentation/SubmittingPatches document
-distributed with git on on patch submission guidelines to follow.  Just
-don't email the git mailing list or maintainer with \Rainbows! patches.
+git itself.  See the
+https://80x24.org/mirrors/git.git/tree/Documentation/SubmittingPatches?h=v2.20.1
+document distributed with git on on patch submission guidelines to follow.
+Just don't email the git mailing list or maintainer with \Rainbows! patches.
 
 == Disclaimer
 
diff --git a/rainbows.gemspec b/rainbows.gemspec
index 4283a85..259e2ab 100644
--- a/rainbows.gemspec
+++ b/rainbows.gemspec
@@ -1,22 +1,21 @@
 # -*- encoding: binary -*-
-ENV["VERSION"] or abort "VERSION= must be specified"
-manifest = File.readlines('.manifest').map! { |x| x.chomp! }
-require 'olddoc'
-extend Olddoc::Gemspec
-name, summary, title = readme_metadata
+manifest = File.exist?('.manifest') ?
+  IO.readlines('.manifest').map!(&:chomp!) : `git ls-files`.split("\n")
 
 Gem::Specification.new do |s|
   s.name = %q{rainbows}
-  s.version = ENV["VERSION"].dup
+  s.version = (ENV["VERSION"] || '5.1.1').dup
 
-  s.authors = ["#{name} hackers"]
-  s.description = readme_description
+  s.authors = ['Rainbows! hackers']
+  s.description = File.read('README').split("\n\n")[1]
   s.email = %q{rainbows-public@bogomips.org}
   s.executables = %w(rainbows)
-  s.extra_rdoc_files = extra_rdoc_files(manifest)
+  s.extra_rdoc_files = IO.readlines('.document').map!(&:chomp!).keep_if do |f|
+    File.exist?(f)
+  end
   s.files = manifest
-  s.homepage = Olddoc.config['rdoc_url']
-  s.summary = summary
+  s.homepage = 'https://bogomips.org/rainbows/'
+  s.summary = 'Rack app server for sleepy apps and slow clients'
 
   # we want a newer Rack for a valid HeaderHash#each
   s.add_dependency(%q<rack>, ['>= 1.1', '< 3.0'])
@@ -29,7 +28,6 @@
   s.add_dependency(%q<unicorn>, ["~> 5.1"])
 
   s.add_development_dependency(%q<isolate>, "~> 3.1")
-  s.add_development_dependency(%q<olddoc>, "~> 1.2")
 
   # optional runtime dependencies depending on configuration
   # see t/test_isolate.rb for the exact versions we've tested with
@@ -58,5 +56,14 @@
   # We cannot automatically switch licenses when Ruby changes their license,
   # so we remain optionally-licensed under the terms of Ruby 1.8 despite
   # not having a good way to specify this in an SPDX-compatible way...
-  s.licenses = ['GPL-2.0+', 'Nonstandard'] # Nonstandard = 'Ruby 1.8'
+  ruby_1_8 = 'Nonstandard'
+  s.licenses = [ 'GPL-2.0+', ruby_1_8 ]
+  s.metadata = {
+    'bug_tracker_uri' => 'https://bogomips.org/rainbows/#label-Contact',
+    'changelog_uri' => 'https://bogomips.org/rainbows/NEWS.html',
+    'documentation_uri' => 'https://bogomips.org/rainbows/',
+    'homepage_uri' => 'https://bogomips.org/rainbows/',
+    'mailing_list_uri' => 'https://bogomips.org/rainbows-public/',
+    'source_code_uri' => 'https://bogomips.org/rainbows.git',
+  }
 end
-- 
EW


^ permalink raw reply related

* [PATCH 3/3] t/test_isolate: various version updates
From: Eric Wong @ 2019-01-02 21:43 UTC (permalink / raw)
  To: rainbows-public
In-Reply-To: <20190102214322.31290-1-e@80x24.org>

---
 t/test_isolate.rb | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/t/test_isolate.rb b/t/test_isolate.rb
index b1aaf13..b1aa5bb 100644
--- a/t/test_isolate.rb
+++ b/t/test_isolate.rb
@@ -16,11 +16,11 @@
 lock = File.open(__FILE__, "rb")
 lock.flock(File::LOCK_EX)
 Isolate.now!(opts) do
-  gem 'kgio', '2.11.0'
-  gem 'rack', '2.0.1'
+  gem 'kgio', '2.11.2'
+  gem 'rack', '2.0.6'
   gem 'kcar', '0.6.0'
-  gem 'raindrops', '0.18.0'
-  gem 'unicorn', '5.3.0'
+  gem 'raindrops', '0.19.0'
+  gem 'unicorn', '5.4.1'
 
   if engine == "ruby"
     gem 'sendfile', '1.2.2'
@@ -43,7 +43,7 @@
   end
 
   if RUBY_PLATFORM =~ /linux/
-    gem 'sleepy_penguin', '3.4.1'
+    gem 'sleepy_penguin', '3.5.1'
 
     # is 2.6.32 new enough?
     gem 'io_splice', '4.4.0' if `uname -r`.strip > '2.6.32'
-- 
EW


^ permalink raw reply related

* [PATCH 1/3] quiet mismatched indentation warnings
From: Eric Wong @ 2019-01-02 21:43 UTC (permalink / raw)
  To: rainbows-public
In-Reply-To: <20190102214322.31290-1-e@80x24.org>

Ruby trunk started warning about more mismatched indentations
starting around r62836.
---
 lib/rainbows/app_pool.rb                     |  4 +--
 lib/rainbows/base.rb                         |  4 +--
 lib/rainbows/configurator.rb                 |  4 +--
 lib/rainbows/coolio/client.rb                |  8 +++---
 lib/rainbows/coolio/thread_client.rb         |  4 +--
 lib/rainbows/epoll/client.rb                 | 30 ++++++++++----------
 lib/rainbows/epoll/response_pipe.rb          |  6 ++--
 lib/rainbows/error.rb                        |  6 ++--
 lib/rainbows/ev_core.rb                      |  8 +++---
 lib/rainbows/fiber/body.rb                   |  4 +--
 lib/rainbows/fiber/io.rb                     |  4 +--
 lib/rainbows/http_server.rb                  |  8 +++---
 lib/rainbows/process_client.rb               |  4 +--
 lib/rainbows/response.rb                     | 16 +++++------
 lib/rainbows/revactor.rb                     |  4 +--
 lib/rainbows/revactor/client/methods.rb      |  4 +--
 lib/rainbows/revactor/client/tee_socket.rb   |  2 +-
 lib/rainbows/reverse_proxy/coolio.rb         | 22 +++++++-------
 lib/rainbows/stream_response_epoll/client.rb |  6 ++--
 lib/rainbows/thread_timeout.rb               | 10 +++----
 lib/rainbows/xepoll/client.rb                |  4 +--
 lib/rainbows/xepoll_thread_pool/client.rb    |  8 +++---
 lib/rainbows/xepoll_thread_spawn/client.rb   |  8 +++---
 t/bin/unused_listen                          |  2 +-
 t/hijack.ru                                  |  4 +--
 t/sha1-random-size.ru                        |  2 +-
 26 files changed, 93 insertions(+), 93 deletions(-)

diff --git a/lib/rainbows/app_pool.rb b/lib/rainbows/app_pool.rb
index 44c6bf5..2d71604 100644
--- a/lib/rainbows/app_pool.rb
+++ b/lib/rainbows/app_pool.rb
@@ -97,7 +97,7 @@ def call(env) # :nodoc:
 
     app = pool.shift
     app.call(env)
-    ensure
-      pool << app
+  ensure
+    pool << app
   end
 end
diff --git a/lib/rainbows/base.rb b/lib/rainbows/base.rb
index a7ba17d..d0e7342 100644
--- a/lib/rainbows/base.rb
+++ b/lib/rainbows/base.rb
@@ -49,8 +49,8 @@ def reopen_worker_logs(worker_nr)
     logger.info "worker=#{worker_nr} reopening logs..."
     Unicorn::Util.reopen_logs
     logger.info "worker=#{worker_nr} done reopening logs"
-    rescue
-      Rainbows.quit! # let the master reopen and refork us
+  rescue
+    Rainbows.quit! # let the master reopen and refork us
   end
   # :startdoc:
 end
diff --git a/lib/rainbows/configurator.rb b/lib/rainbows/configurator.rb
index d82002e..83077cb 100644
--- a/lib/rainbows/configurator.rb
+++ b/lib/rainbows/configurator.rb
@@ -46,8 +46,8 @@ def Rainbows!(&block)
     block_given? or raise ArgumentError, "Rainbows! requires a block"
     @block = true
     instance_eval(&block)
-    ensure
-      @block = false
+  ensure
+    @block = false
   end
 
   def check! # :nodoc:
diff --git a/lib/rainbows/coolio/client.rb b/lib/rainbows/coolio/client.rb
index cd22c22..12c1434 100644
--- a/lib/rainbows/coolio/client.rb
+++ b/lib/rainbows/coolio/client.rb
@@ -160,8 +160,8 @@ def on_write_complete
         on_read(''.freeze)
       end
     end
-    rescue => e
-      handle_error(e)
+  rescue => e
+    handle_error(e)
   end
 
   def handle_error(e)
@@ -170,8 +170,8 @@ def handle_error(e)
       @_io.kgio_trywrite(msg) rescue nil
     end
     @_write_buffer.clear
-    ensure
-      quit
+  ensure
+    quit
   end
 
   def close_deferred
diff --git a/lib/rainbows/coolio/thread_client.rb b/lib/rainbows/coolio/thread_client.rb
index a3a2ebf..e977381 100644
--- a/lib/rainbows/coolio/thread_client.rb
+++ b/lib/rainbows/coolio/thread_client.rb
@@ -16,8 +16,8 @@ def app_call input
   def response_write(response)
     return hijacked if @hp.hijacked?
     ev_write_response(*response, @hp.next?)
-    rescue => e
-      handle_error(e)
+  rescue => e
+    handle_error(e)
   end
 
   # fails-safe application dispatch, we absolutely cannot
diff --git a/lib/rainbows/epoll/client.rb b/lib/rainbows/epoll/client.rb
index 85e504c..6ed141e 100644
--- a/lib/rainbows/epoll/client.rb
+++ b/lib/rainbows/epoll/client.rb
@@ -39,8 +39,8 @@ def epoll_once
     @wr_queue = [] # may contain String, ResponsePipe, and StreamFile objects
     post_init
     on_readable
-    rescue => e
-      handle_error(e)
+  rescue => e
+    handle_error(e)
   end
 
   def on_readable
@@ -56,9 +56,9 @@ def on_readable
       break
     end until :close == @state
     close unless closed?
-    rescue Errno::ECONNRESET
-      close
-    rescue IOError
+  rescue Errno::ECONNRESET
+    close
+  rescue IOError
   end
 
   def app_call input # called by on_read()
@@ -146,8 +146,8 @@ def on_deferred_write_complete
 
   def handle_error(e)
     msg = Rainbows::Error.response(e) and kgio_trywrite(msg) rescue nil
-    ensure
-      close
+  ensure
+    close
   end
 
   def write_deferred(obj)
@@ -171,8 +171,8 @@ def on_writable
     when :deferred
       return
     end while true
-    rescue => e
-      handle_error(e)
+  rescue => e
+    handle_error(e)
   end
 
   def write(buf)
@@ -227,9 +227,9 @@ def stream_file(sf) # +sf+ is a Rainbows::StreamFile object
     else
       return n # :wait_writable or nil
     end while true
-    rescue
-      sf.close
-      raise
+  rescue
+    sf.close
+    raise
   end
 
   def defer_file_stream(offset, count, io, body)
@@ -263,8 +263,8 @@ def stream_pipe(pipe)
     else # nil => EOF
       return pipe.close # nil
     end while true
-    rescue
-      pipe.close
-      raise
+  rescue
+    pipe.close
+    raise
   end
 end
diff --git a/lib/rainbows/epoll/response_pipe.rb b/lib/rainbows/epoll/response_pipe.rb
index 64b1547..87b2818 100644
--- a/lib/rainbows/epoll/response_pipe.rb
+++ b/lib/rainbows/epoll/response_pipe.rb
@@ -14,9 +14,9 @@ def initialize(io, client, body)
   def epoll_run
     return close if @client.closed?
     @client.stream_pipe(self) or @client.on_deferred_write_complete
-    rescue => e
-      close
-      @client.handle_error(e)
+  rescue => e
+    close
+    @client.handle_error(e)
   end
 
   def close
diff --git a/lib/rainbows/error.rb b/lib/rainbows/error.rb
index 3686eab..57c9173 100644
--- a/lib/rainbows/error.rb
+++ b/lib/rainbows/error.rb
@@ -8,18 +8,18 @@ module Rainbows::Error
   # the socket is closed at the end of this function
   def self.write(io, e)
     msg = response(e) and Kgio.trywrite(io, msg)
-    rescue
+  rescue
   end
 
   def self.app(e)
     Unicorn.log_error(Rainbows.server.logger, "app error", e)
-    rescue
+  rescue
   end
 
   def self.listen_loop(e)
     Rainbows.alive or return
     Unicorn.log_error(Rainbows.server.logger, "listen loop error", e)
-    rescue
+  rescue
   end
 
   def self.response(e)
diff --git a/lib/rainbows/ev_core.rb b/lib/rainbows/ev_core.rb
index fd33786..0537f6f 100644
--- a/lib/rainbows/ev_core.rb
+++ b/lib/rainbows/ev_core.rb
@@ -43,8 +43,8 @@ def want_more
 
   def handle_error(e)
     msg = Rainbows::Error.response(e) and write(msg)
-    ensure
-      quit
+  ensure
+    quit
   end
 
   # returns whether to enable response chunking for autochunk models
@@ -119,8 +119,8 @@ def on_read(data)
         want_more
       end
     end
-    rescue => e
-      handle_error(e)
+  rescue => e
+    handle_error(e)
   end
 
   def err_413(msg)
diff --git a/lib/rainbows/fiber/body.rb b/lib/rainbows/fiber/body.rb
index 5b2c74b..d9e925f 100644
--- a/lib/rainbows/fiber/body.rb
+++ b/lib/rainbows/fiber/body.rb
@@ -19,8 +19,8 @@ def write_body_file(body, range)
       else # nil
         return
       end while true
-      ensure
-        close_if_private(body)
+    ensure
+      close_if_private(body)
     end
   end
 
diff --git a/lib/rainbows/fiber/io.rb b/lib/rainbows/fiber/io.rb
index 111132f..dcd8c14 100644
--- a/lib/rainbows/fiber/io.rb
+++ b/lib/rainbows/fiber/io.rb
@@ -37,8 +37,8 @@ def each
     buf = readpartial(16384)
     yield buf
     yield buf while readpartial(16384, buf)
-    rescue EOFError
-      self
+  rescue EOFError
+    self
   end
 
   def closed?
diff --git a/lib/rainbows/http_server.rb b/lib/rainbows/http_server.rb
index 33bb96c..e925d80 100644
--- a/lib/rainbows/http_server.rb
+++ b/lib/rainbows/http_server.rb
@@ -71,10 +71,10 @@ def trysetrlimit(resource, want)
       @logger.warn "#{svc} may monopolize resources dictated by #{resource}" \
                    " and leave none for your app"
     end
-    rescue => e
-      @logger.error e.message
-      @logger.error "#{resource} needs to be increased to >=#{want} before" \
-                    " starting #{svc}"
+  rescue => e
+    @logger.error e.message
+    @logger.error "#{resource} needs to be increased to >=#{want} before" \
+                  " starting #{svc}"
   end
 
   def svc
diff --git a/lib/rainbows/process_client.rb b/lib/rainbows/process_client.rb
index 4bf9878..b500b75 100644
--- a/lib/rainbows/process_client.rb
+++ b/lib/rainbows/process_client.rb
@@ -83,8 +83,8 @@ def process_pipeline(env, hp)
       write_response(status, headers, body, alive = hp.next?) or return
     end while alive && pipeline_ready(hp)
     alive or close
-    rescue => e
-      handle_error(e)
+  rescue => e
+    handle_error(e)
   end
 
   # override this in subclass/module
diff --git a/lib/rainbows/response.rb b/lib/rainbows/response.rb
index 62dfa39..a76821f 100644
--- a/lib/rainbows/response.rb
+++ b/lib/rainbows/response.rb
@@ -91,8 +91,8 @@ def write_response(status, headers, body, alive)
       body = write_headers(status, headers, alive, body)
       write_body_each(body) if body
       body
-      ensure
-        body.close if body.respond_to?(:close)
+    ensure
+      body.close if body.respond_to?(:close)
     end
   end
   include Each
@@ -102,8 +102,8 @@ module Sendfile
       def write_body_file(body, range)
         io = body_to_io(body)
         range ? sendfile(io, range[0], range[1]) : sendfile(io, 0)
-        ensure
-          close_if_private(io)
+      ensure
+        close_if_private(io)
       end
     end
     include Sendfile
@@ -129,8 +129,8 @@ def write_body_file(body, range)
     # isn't used or available.
     def write_body_stream(body)
       COPY_STREAM.copy_stream(io = body_to_io(body), self)
-      ensure
-        close_if_private(io)
+    ensure
+      close_if_private(io)
     end
   else # ! COPY_STREAM
     alias write_body_stream write_body_each
@@ -199,8 +199,8 @@ def write_response_path(status, headers, body, alive)
         write_body_stream(body) if body
       end
       body
-      ensure
-        body.close if body.respond_to?(:close)
+    ensure
+      body.close if body.respond_to?(:close)
     end
 
     module ToPath
diff --git a/lib/rainbows/revactor.rb b/lib/rainbows/revactor.rb
index fae5f16..69a791c 100644
--- a/lib/rainbows/revactor.rb
+++ b/lib/rainbows/revactor.rb
@@ -75,8 +75,8 @@ def worker_loop(worker) #:nodoc:
     end
 
     Actor.sleep 1 while Rainbows.tick || nr > 0
-    rescue Errno::EMFILE
-      # ignore, let another worker process take it
+  rescue Errno::EMFILE
+    # ignore, let another worker process take it
   end
 
   def revactorize_listeners #:nodoc:
diff --git a/lib/rainbows/revactor/client/methods.rb b/lib/rainbows/revactor/client/methods.rb
index 592c996..defb23a 100644
--- a/lib/rainbows/revactor/client/methods.rb
+++ b/lib/rainbows/revactor/client/methods.rb
@@ -26,8 +26,8 @@ def write_body_file(body, range)
       else # nil
         return
       end while true
-      ensure
-        close_if_private(body)
+    ensure
+      close_if_private(body)
     end
   end
 
diff --git a/lib/rainbows/revactor/client/tee_socket.rb b/lib/rainbows/revactor/client/tee_socket.rb
index 2f9f52e..31b8dec 100644
--- a/lib/rainbows/revactor/client/tee_socket.rb
+++ b/lib/rainbows/revactor/client/tee_socket.rb
@@ -34,7 +34,7 @@ def kgio_read(length, dst = "")
     # ugh, read returned too much
     @rbuf << tmp[length, tmp.size]
     dst.replace(tmp[0, length])
-    rescue EOFError
+  rescue EOFError
   end
 
   # just proxy any remaining methods TeeInput may use
diff --git a/lib/rainbows/reverse_proxy/coolio.rb b/lib/rainbows/reverse_proxy/coolio.rb
index 86f2b79..e3b33b5 100644
--- a/lib/rainbows/reverse_proxy/coolio.rb
+++ b/lib/rainbows/reverse_proxy/coolio.rb
@@ -36,17 +36,17 @@ def on_readable
         return close
       end while true # we always read until EAGAIN or EOF
 
-      rescue => e
-        case e
-        when Errno::ECONNRESET
-          @env['async.callback'].call(@response)
-          return close
-        when SystemCallError
-        else
-          Unicorn.log_error(@env["rack.logger"], "on_readable", e)
-        end
-        @env['async.callback'].call(Rainbows::ReverseProxy::E502)
-        close
+    rescue => e
+      case e
+      when Errno::ECONNRESET
+        @env['async.callback'].call(@response)
+        return close
+      when SystemCallError
+      else
+        Unicorn.log_error(@env["rack.logger"], "on_readable", e)
+      end
+      @env['async.callback'].call(Rainbows::ReverseProxy::E502)
+      close
     end
   end
 
diff --git a/lib/rainbows/stream_response_epoll/client.rb b/lib/rainbows/stream_response_epoll/client.rb
index dc226d6..b757469 100644
--- a/lib/rainbows/stream_response_epoll/client.rb
+++ b/lib/rainbows/stream_response_epoll/client.rb
@@ -47,9 +47,9 @@ def epoll_run
     when :wait_writable
       return @wr_queue.unshift(buf)
     end while true
-    rescue => err
-      @to_io.close
-      N.decr(0, 1)
+  rescue
+    @to_io.close
+    N.decr(0, 1)
   end
 
   def on_write_complete
diff --git a/lib/rainbows/thread_timeout.rb b/lib/rainbows/thread_timeout.rb
index 8739d29..bea1631 100644
--- a/lib/rainbows/thread_timeout.rb
+++ b/lib/rainbows/thread_timeout.rb
@@ -134,11 +134,11 @@ def call(env)
       @lock.synchronize { @active.delete(Thread.current) }
       # Thread#raise no longer possible here
     end
-    rescue ExecutionExpired
-      # If we got here, it's because the watchdog thread raised an exception
-      # here to kill us.  The watchdog uses @active.delete_if with a lock,
-      # so we guaranteed it's
-      [ 408, { 'Content-Type' => 'text/plain', 'Content-Length' => '0' }, [] ]
+  rescue ExecutionExpired
+    # If we got here, it's because the watchdog thread raised an exception
+    # here to kill us.  The watchdog uses @active.delete_if with a lock,
+    # so we guaranteed it's
+    [ 408, { 'Content-Type' => 'text/plain', 'Content-Length' => '0' }, [] ]
   end
 
   # The watchdog thread is the one that does the job of killing threads
diff --git a/lib/rainbows/xepoll/client.rb b/lib/rainbows/xepoll/client.rb
index f518db5..748b4af 100644
--- a/lib/rainbows/xepoll/client.rb
+++ b/lib/rainbows/xepoll/client.rb
@@ -40,8 +40,8 @@ def epoll_once
     @wr_queue = [] # may contain String, ResponsePipe, and StreamFile objects
     post_init
     EP.set(self, IN) # wake up the main thread
-    rescue => e
-      Rainbows::Error.write(self, e)
+  rescue => e
+    Rainbows::Error.write(self, e)
   end
 
   def on_close
diff --git a/lib/rainbows/xepoll_thread_pool/client.rb b/lib/rainbows/xepoll_thread_pool/client.rb
index ca62727..810d992 100644
--- a/lib/rainbows/xepoll_thread_pool/client.rb
+++ b/lib/rainbows/xepoll_thread_pool/client.rb
@@ -95,8 +95,8 @@ def close
 
   def handle_error(e)
     super
-    ensure
-      closed? or close
+  ensure
+    closed? or close
   end
 
   def queue!
@@ -114,8 +114,8 @@ def epoll_run(buf)
     else
       return close
     end while true
-    rescue => e
-      handle_error(e)
+  rescue => e
+    handle_error(e)
   end
 
   def run
diff --git a/lib/rainbows/xepoll_thread_spawn/client.rb b/lib/rainbows/xepoll_thread_spawn/client.rb
index 218db3e..8eebbb0 100644
--- a/lib/rainbows/xepoll_thread_spawn/client.rb
+++ b/lib/rainbows/xepoll_thread_spawn/client.rb
@@ -84,8 +84,8 @@ def close
 
   def handle_error(e)
     super
-    ensure
-      closed? or close
+  ensure
+    closed? or close
   end
 
   def epoll_run(buf)
@@ -98,8 +98,8 @@ def epoll_run(buf)
     else
       return close
     end while true
-    rescue => e
-      handle_error(e)
+  rescue => e
+    handle_error(e)
   end
 
   def spawn(env, hp)
diff --git a/t/bin/unused_listen b/t/bin/unused_listen
index b638f54..8cce645 100755
--- a/t/bin/unused_listen
+++ b/t/bin/unused_listen
@@ -31,7 +31,7 @@ begin
   # when running tests in parallel with gmake.  Create a lock file while
   # we have the port here to ensure that does not happen.
   lock_path = "#{Dir::tmpdir}/unicorn_test.#{addr}:#{port}.lock"
-  lock = File.open(lock_path, File::WRONLY|File::CREAT|File::EXCL, 0600)
+  File.open(lock_path, File::WRONLY|File::CREAT|File::EXCL, 0600)
 rescue Errno::EEXIST
   sock.close rescue nil
   retry
diff --git a/t/hijack.ru b/t/hijack.ru
index 64c23d7..16b5f38 100644
--- a/t/hijack.ru
+++ b/t/hijack.ru
@@ -45,9 +45,9 @@ def lazy_close(io)
     [ 200,
       {
         "Content-Length" => r.bytesize.to_s,
-        "rack.hijack" => proc do |io|
+        "rack.hijack" => proc do |sock|
           io.write(r)
-          lazy_close(io)
+          lazy_close(sock)
         end
       },
       DieIfUsed.new
diff --git a/t/sha1-random-size.ru b/t/sha1-random-size.ru
index 4ef5d7b..9251221 100644
--- a/t/sha1-random-size.ru
+++ b/t/sha1-random-size.ru
@@ -18,7 +18,7 @@
       end while input.read(rand(cap), buf)
     end
   when "/each"
-    input.each { |buf| digest.update(buf) }
+    input.each { |chunk| digest.update(chunk) }
   else
     if buf = input.read(rand(cap))
       begin
-- 
EW


^ permalink raw reply related

* [PATCH 2/3] t/hijack.ru: avoid shadow warning
From: Eric Wong @ 2019-01-02 21:43 UTC (permalink / raw)
  To: rainbows-public
In-Reply-To: <20190102214322.31290-1-e@80x24.org>

---
 t/hijack.ru | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/t/hijack.ru b/t/hijack.ru
index 16b5f38..f02507f 100644
--- a/t/hijack.ru
+++ b/t/hijack.ru
@@ -46,7 +46,7 @@ def lazy_close(io)
       {
         "Content-Length" => r.bytesize.to_s,
         "rack.hijack" => proc do |sock|
-          io.write(r)
+          sock.write(r)
           lazy_close(sock)
         end
       },
-- 
EW


^ permalink raw reply related

* [PATCH 0/3] various updates for Ruby 2.6
From: Eric Wong @ 2019-01-02 21:43 UTC (permalink / raw)
  To: rainbows-public

Ruby 2.6 started warning on mismatched indentation,
so fix that...

Eric Wong (3):
  quiet mismatched indentation warnings
  t/hijack.ru: avoid shadow warning
  t/test_isolate: various version updates

 lib/rainbows/app_pool.rb                     |  4 +--
 lib/rainbows/base.rb                         |  4 +--
 lib/rainbows/configurator.rb                 |  4 +--
 lib/rainbows/coolio/client.rb                |  8 +++---
 lib/rainbows/coolio/thread_client.rb         |  4 +--
 lib/rainbows/epoll/client.rb                 | 30 ++++++++++----------
 lib/rainbows/epoll/response_pipe.rb          |  6 ++--
 lib/rainbows/error.rb                        |  6 ++--
 lib/rainbows/ev_core.rb                      |  8 +++---
 lib/rainbows/fiber/body.rb                   |  4 +--
 lib/rainbows/fiber/io.rb                     |  4 +--
 lib/rainbows/http_server.rb                  |  8 +++---
 lib/rainbows/process_client.rb               |  4 +--
 lib/rainbows/response.rb                     | 16 +++++------
 lib/rainbows/revactor.rb                     |  4 +--
 lib/rainbows/revactor/client/methods.rb      |  4 +--
 lib/rainbows/revactor/client/tee_socket.rb   |  2 +-
 lib/rainbows/reverse_proxy/coolio.rb         | 22 +++++++-------
 lib/rainbows/stream_response_epoll/client.rb |  6 ++--
 lib/rainbows/thread_timeout.rb               | 10 +++----
 lib/rainbows/xepoll/client.rb                |  4 +--
 lib/rainbows/xepoll_thread_pool/client.rb    |  8 +++---
 lib/rainbows/xepoll_thread_spawn/client.rb   |  8 +++---
 t/bin/unused_listen                          |  2 +-
 t/hijack.ru                                  |  6 ++--
 t/sha1-random-size.ru                        |  2 +-
 t/test_isolate.rb                            | 10 +++----
 27 files changed, 99 insertions(+), 99 deletions(-)

-- 
EW

^ permalink raw reply

* anybody still using Rainbows?
From: Eric Wong @ 2019-01-01 15:18 UTC (permalink / raw)
  To: rainbows-public

Might try some experiments on it, soon, using non-blocking accept
(which means no migration/parallel-running with yahns)

There could be a flood of patch emails coming, soon...

^ permalink raw reply

* [ANN] kgio 2.11.2 - legacy I/O for legacy Ruby + Unix
From: Eric Wong @ 2018-01-30 21:15 UTC (permalink / raw)
  To: kgio-public, ruby-talk; +Cc: Claudio Poli, rainbows-public
In-Reply-To: <20171215-kgio-2.11.1-released@fail>

This is a legacy project, do not use it for new projects.  Ruby
2.3 and later should make this obsolete.  kgio provides
non-blocking I/O methods for Ruby without raising exceptions on
EAGAIN and EINPROGRESS.

Note: I do not recommend using kgio for future applications, Ruby 2.x
has a lot of the functionality of kgio and Ruby 2.3+ has even more.

* homepage: https://bogomips.org/kgio/
* public mailing list: kgio-public@bogomips.org
* git clone git://bogomips.org/kgio.git
* Atom feed https://bogomips.org/kgio/NEWS.atom.xml
* mailing list archives: https://bogomips.org/kgio-public/

Changes:

  kgio 2.11.2 - fix Ruby 2.5 compatibility for accept_class

  This release fixes a bug affecting the Rainbows! web server
  which uses Kgio.accept_class:

  https://bogomips.org/rainbows-public/CANp6QoJXRbPLqmOPpG7XmZBc+oYqLWCcq1ipvOyNEQPXDEwx9Q@mail.gmail.com/

  * accept: avoid passing unnecessary arg to rb_funcall

Again, using kgio for new projects is strongly discouraged.
Use Ruby 2.3+ instead.

^ permalink raw reply

* Re: undefined method `process_loop' for #<Unicorn::TCPClient:fd 14>
From: Eric Wong @ 2018-01-30 21:13 UTC (permalink / raw)
  To: Claudio Poli; +Cc: rainbows-public, kgio-public
In-Reply-To: <B05FC728-A46F-4056-997D-0BEE64A9A110@gmail.com>

Claudio Poli <masterkain@gmail.com> wrote:
> hello Eric,
> I can confirm the bugs goes away with this version

Thanks for confirming.

Btw, please don't send HTML mail in the future since it's
spammy and too expensive to archive.  Thanks again.

^ permalink raw reply

* Re: undefined method `process_loop' for #<Unicorn::TCPClient:fd 14>
From: Eric Wong @ 2018-01-19 17:07 UTC (permalink / raw)
  To: kain; +Cc: rainbows-public, kgio-public
In-Reply-To: <CANp6QoJXRbPLqmOPpG7XmZBc+oYqLWCcq1ipvOyNEQPXDEwx9Q@mail.gmail.com>

kain <masterkain@gmail.com> wrote:
> hello Eric,
> I tried upgrading ruby to 2.5.0 from 2.3.4 on our big project, I have this
> issue on rainbows if you would like to look into:
> 
> E, [2018-01-19T16:17:56.595280 #76399] ERROR -- : wrong number of arguments
> (given 16, expected 0) (ArgumentError)

Ah, this might be a bug in kgio with clang and 2.5.
The following patch should fix it:
	https://bogomips.org/kgio-public/20180119170307.19295-1-e@80x24.org/raw

and I've uploaded kgio 2.11.1.1.g36ea to Rubygems.org.
Can you try it and give it a shot?

	gem install --pre kgio -v 2.11.1.1.g36ea

I'll make a real kgio release with your confirmation.  Thanks

> /Users/kain/.rvm/gems/ruby-2.5.0/gems/rainbows-5.1.1/lib/rainbows/response.rb:13:in
> `included_modules'
> 
> /Users/kain/.rvm/gems/ruby-2.5.0/gems/rainbows-5.1.1/lib/rainbows/response.rb:13:in
> `accept_class='

^ permalink raw reply

* minor mailing list header changes
From: Eric Wong @ 2017-06-26  3:54 UTC (permalink / raw)
  To: rainbows-public

For anybody who's reading this through a mailing list
subscription, it turns out I screwed up setting the List-Id:
header back in 2014 and didn't read RFC 2919 :x

   https://public-inbox.org/meta/20170626030733.6069-1-e@80x24.org/


Before:		List-Id: <rainbows-public@bogomips.org>

 After:		List-Id: <rainbows-public.bogomips.org>

So if you rely on the List-Id header, for filtering (as you
should, actually); I suggest updating your filters.  Thanks.

I'm also setting "Precedence: bulk" which may help
deliverability with certain large email providers.

Of course, those of you reading this inbox via HTTPS / NNTP, or
the Tor .onions; you can ignore this message :)

	https://bogomips.org/rainbows-public/
        http://ou63pmih66umazou.onion/rainbows-public
	nntp://news.public-inbox.org/inbox.comp.lang.ruby.rainbows
	nntp://ou63pmih66umazou.onion/inbox.comp.lang.ruby.rainbows

HAND.

^ permalink raw reply

* Re: undefined method `process_loop' for #<Unicorn::TCPClient:fd 14>
From: Claudio Poli @ 2017-04-02 23:21 UTC (permalink / raw)
  To: Eric Wong; +Cc: rainbows-public
In-Reply-To: <20170402003206.GA13245@starla>

Thanks Eric,
sorry I had didn’t have a chance to test the patch, but I installed the new release and everything seems fine.

Rainbows! best web server out there.

Best,
c

> On 2 Apr 2017, at 02:32, Eric Wong <e@80x24.org> wrote:
> 
> Eric Wong <e@80x24.org> wrote:
>> the report.  Can you give the following a try?
> 
> Nm, better patch coming.


^ permalink raw reply

* [ANN] Rainbows! 5.1.1 - unicorn 5.3.x compatibility fix
From: Eric Wong @ 2017-04-02  2:11 UTC (permalink / raw)
  To: rainbows-public; +Cc: Claudio Poli

Rainbows! 5.1.1

This release fixes an incompatibility introduced with
the release of unicorn 5.3.0, yesterday :x.

Thanks to Claudio Poli for reporting the bug (and reminding
me this project exists).

Two changes since 5.1.0 (2017-01-12):
      workaround for unicorn 5.3.0
      tests: update isolate deps for unicorn and raindrops

Rainbows! is maintained as long as anybody uses it,
but I don't recommend using it for new apps:

  https://bogomips.org/rainbows-public/20151020095934.GA19114@dcvr.yhbt.net/

* https://bogomips.org/rainbows/
* rainbows-public@bogomips.org
* https://bogomips.org/rainbows-public/
* git clone git://bogomips.org/rainbows.git
* https://bogomips.org/rainbows/NEWS.atom.xml
* nntp://news.public-inbox.org/inbox.comp.lang.ruby.rainbows
* nntp://news.gmane.org/gmane.comp.lang.ruby.rainbows.general

^ permalink raw reply

* [PATCH] workaround for unicorn 5.3.0
From: Eric Wong @ 2017-04-02  1:54 UTC (permalink / raw)
  To: Claudio Poli; +Cc: rainbows-public
In-Reply-To: <9267B33C-D13C-47E1-8892-4777B96DDCD1@gmail.com>

unicorn 5.3.0 introduced a new Unicorn::TCPSrv and
Unicorn::TCPClient constants to distinguish TCP sockets
from Unix ones from its check_client_connection feature.

These classes screw up our direct inheritance of Kgio::Socket
from the Rainbows::Client class.  Since we do not support
check_client_connection, we do not need these new classes in
unicorn.  Removing Unicorn::TCPSrv and aliasing it as
Kgio::TCPServer is sufficient for now.  In the future,
removing all kgio dependencies from Rainbows! will be prioritized.

Thanks to Claudio Poli for reporting the bug:

  https://bogomips.org/rainbows-public/9267B33C-D13C-47E1-8892-4777B96DDCD1@gmail.com/
---
  This patch passes all tests, expect a release coming ASAP.
  Thanks again.

 lib/rainbows.rb | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/lib/rainbows.rb b/lib/rainbows.rb
index acfe911..584c94b 100644
--- a/lib/rainbows.rb
+++ b/lib/rainbows.rb
@@ -149,3 +149,12 @@ def self.now # Ruby <= 2.0
 
 require 'rainbows/error'
 require 'rainbows/configurator'
+
+module Unicorn
+  # this interferes with Rainbows::Client creation with unicorn 5.3
+  begin
+    remove_const :TCPSrv
+    TCPSrv = Kgio::TCPServer
+  rescue NameError # unicorn < 5.3.0
+  end
+end
-- 
EW

^ permalink raw reply related

* Re: undefined method `process_loop' for #<Unicorn::TCPClient:fd 14>
From: Eric Wong @ 2017-04-02  0:32 UTC (permalink / raw)
  To: Claudio Poli; +Cc: rainbows-public
In-Reply-To: <20170402002615.GA32751@starla>

Eric Wong <e@80x24.org> wrote:
> the report.  Can you give the following a try?

Nm, better patch coming.

^ permalink raw reply

* Re: undefined method `process_loop' for #<Unicorn::TCPClient:fd 14>
From: Eric Wong @ 2017-04-02  0:26 UTC (permalink / raw)
  To: Claudio Poli; +Cc: rainbows-public
In-Reply-To: <9267B33C-D13C-47E1-8892-4777B96DDCD1@gmail.com>

Claudio Poli <masterkain@gmail.com> wrote:
> hello,
> I’m using Rainbows! 5.1.0 and I did a bundle update, unicorn got upgraded from 5.2.0 to 5.3.0 and I’m getting this:
> 

Oops!  I totally forget about this project, again.  Thanks for
the report.  Can you give the following a try?  Should be
compatible with all unicorn 5.1+.

(It'll take me a while to test on my Centrino laptop)

diff --git a/lib/rainbows/coolio/server.rb b/lib/rainbows/coolio/server.rb
index 0d8af8c..a24d65e 100644
--- a/lib/rainbows/coolio/server.rb
+++ b/lib/rainbows/coolio/server.rb
@@ -6,6 +6,6 @@ class Rainbows::Coolio::Server < Coolio::IO
 
   def on_readable
     return if CONN.size >= MAX
-    io = @_io.kgio_tryaccept and CL.new(io).attach(LOOP)
+    io = @_io.kgio_tryaccept(Rainbows::Client) and CL.new(io).attach(LOOP)
   end
 end
diff --git a/lib/rainbows/epoll/server.rb b/lib/rainbows/epoll/server.rb
index ab5a49f..daa6df3 100644
--- a/lib/rainbows/epoll/server.rb
+++ b/lib/rainbows/epoll/server.rb
@@ -23,7 +23,7 @@ def self.extended(sock)
 
   def epoll_run
     return EP.delete(self) if @@nr >= MAX
-    while io = kgio_tryaccept
+    while io = kgio_tryaccept(Rainbows::Client)
       @@nr += 1
       # there's a chance the client never even sees epoll for simple apps
       io.epoll_once
diff --git a/lib/rainbows/fiber/coolio/server.rb b/lib/rainbows/fiber/coolio/server.rb
index 3d8d85e..51c4054 100644
--- a/lib/rainbows/fiber/coolio/server.rb
+++ b/lib/rainbows/fiber/coolio/server.rb
@@ -17,7 +17,7 @@ def close
 
   def on_readable
     return if Rainbows.cur >= MAX
-    c = @io.kgio_tryaccept and Fiber.new { process(c) }.resume
+    c = @io.kgio_tryaccept(Rainbows::Client) and Fiber.new { process(c) }.resume
   end
 
   def process(io)
diff --git a/lib/rainbows/fiber_spawn.rb b/lib/rainbows/fiber_spawn.rb
index 2c6d13d..3f0ec4a 100644
--- a/lib/rainbows/fiber_spawn.rb
+++ b/lib/rainbows/fiber_spawn.rb
@@ -23,7 +23,7 @@ def worker_loop(worker) # :nodoc:
     begin
       schedule do |l|
         break if Rainbows.cur >= limit
-        io = l.kgio_tryaccept or next
+        io = l.kgio_tryaccept(Rainbows::Client) or next
         Fiber.new { process(io) }.resume
       end
     rescue => e
diff --git a/lib/rainbows/thread_pool.rb b/lib/rainbows/thread_pool.rb
index 63d57cb..04305ed 100644
--- a/lib/rainbows/thread_pool.rb
+++ b/lib/rainbows/thread_pool.rb
@@ -38,7 +38,7 @@ def worker_loop(worker) # :nodoc:
   def sync_worker # :nodoc:
     s = LISTENERS[0]
     begin
-      c = s.kgio_accept and c.process_loop
+      c = s.kgio_accept(Rainbows::Client) and c.process_loop
     rescue => e
       Rainbows::Error.listen_loop(e)
     end while Rainbows.alive
@@ -52,7 +52,7 @@ def async_worker # :nodoc:
       # problem.  On the other hand, a thundering herd may not
       # even incur as much overhead as an extra Mutex#synchronize
       ret = select(LISTENERS) and ret[0].each do |s|
-        s = s.kgio_tryaccept and s.process_loop
+        s = s.kgio_tryaccept(Rainbows::Client) and s.process_loop
       end
     rescue Errno::EINTR
     rescue => e
diff --git a/lib/rainbows/thread_spawn.rb b/lib/rainbows/thread_spawn.rb
index b304688..8ea75bf 100644
--- a/lib/rainbows/thread_spawn.rb
+++ b/lib/rainbows/thread_spawn.rb
@@ -29,7 +29,7 @@ def accept_loop(klass) #:nodoc:
         begin
           if lock.synchronize { nr >= limit }
             worker_yield
-          elsif client = l.kgio_accept
+          elsif client = l.kgio_accept(Rainbows::Client)
             klass.new(client) do |c|
               begin
                 lock.synchronize { nr += 1 }

^ permalink raw reply related

* undefined method `process_loop' for #<Unicorn::TCPClient:fd 14>
From: Claudio Poli @ 2017-04-02  0:05 UTC (permalink / raw)
  To: rainbows-public

hello,
I’m using Rainbows! 5.1.0 and I did a bundle update, unicorn got upgraded from 5.2.0 to 5.3.0 and I’m getting this:

02:02:27 web.1     | E, [2017-04-02T02:02:27.407688 #23360] ERROR -- : listen loop error: undefined method `process_loop' for #<Unicorn::TCPClient:fd 14> (NoMethodError)
02:02:27 web.1     | E, [2017-04-02T02:02:27.407805 #23360] ERROR -- : /Users/kain/.rvm/gems/ruby-2.4.1/gems/rainbows-5.1.0/lib/rainbows/thread_pool.rb:55:in `block in async_worker'
02:02:27 web.1     | E, [2017-04-02T02:02:27.407855 #23360] ERROR -- : /Users/kain/.rvm/gems/ruby-2.4.1/gems/rainbows-5.1.0/lib/rainbows/thread_pool.rb:54:in `each'
02:02:27 web.1     | E, [2017-04-02T02:02:27.407899 #23360] ERROR -- : /Users/kain/.rvm/gems/ruby-2.4.1/gems/rainbows-5.1.0/lib/rainbows/thread_pool.rb:54:in `async_worker'
02:02:27 web.1     | E, [2017-04-02T02:02:27.407939 #23360] ERROR -- : /Users/kain/.rvm/gems/ruby-2.4.1/gems/rainbows-5.1.0/lib/rainbows/thread_pool.rb:25:in `block (2 levels) in worker_loop'

thanks,
c

^ permalink raw reply

* Re: [PATCH] support rack 2.x
From: Julia López @ 2017-01-13 17:56 UTC (permalink / raw)
  To: e; +Cc: julialopez, rainbows-public
In-Reply-To: <20170109194835.GA16799@starla>

Hi Eric,

Sorry it took me that long to test this but I finally finished the 
migration and deployed the app in staging (we don't use rainbows in 
development mode) and after a quick click testing everything works as 
expected with the latest release 5.1.0.

Thanks again for your support!

^ permalink raw reply

* [ANN] Rainbows! 5.1.0 - rack 2.x compat, EM fixes
From: Eric Wong @ 2017-01-12 22:48 UTC (permalink / raw)
  To: rainbows-public; +Cc: Julia López Aladro, alex0375

This release now supports rack 2.x along with existing rack 1.x
applications.  Additionally, we now wait for deferred actions
for EventMachine users on graceful shutdown.

Thanks to Julia López Aladro and <alex0375@gmail.com> for
bringing up these changes in the open-to-all
rainbows-public@bogomips.org mailing list:

  https://bogomips.org/rainbows-public/CAPhSs6OAU+motd+MF=WOSek9==StLjEQJsNwAO3-aRWCZzhs=g@mail.gmail.com/T/

  https://bogomips.org/rainbows-public/CAKwvcL-VH3we4qA1pkNAstTmWvqNA=Rir2N_YiWztV_qbaLQvA@mail.gmail.com/T/

There's also a few documentation and test fixes.

9 changes since Rainbows! 5.0.0:

      doc: bump olddoc to ~> 1.2 for extra NNTP URLs
      doc: move homepage and update URLs to HTTPS
      doc: Static_Files: remove Future section
      tests: use correct file:// URL for random_blob path
      support rack 2.x
      Revert "t/t0044-autopush.sh: remove test"
      tests: re-enable EventMachine tests, again
      eventmachine: wait for deferred actions to finish
      doc: additional disclaimers

Rainbows! is maintained as long as anybody uses it,
but I don't recommend using it for new apps:

  https://bogomips.org/rainbows-public/20151020095934.GA19114@dcvr.yhbt.net/

* https://bogomips.org/rainbows/
* rainbows-public@bogomips.org
* https://bogomips.org/rainbows-public/
* git clone git://bogomips.org/rainbows.git
* https://bogomips.org/rainbows/NEWS.atom.xml
* nntp://news.public-inbox.org/inbox.comp.lang.ruby.rainbows
* nntp://news.gmane.org/gmane.comp.lang.ruby.rainbows.general

*zzz*

^ permalink raw reply

* [PATCH] doc: additional disclaimers
From: Eric Wong @ 2017-01-12 22:45 UTC (permalink / raw)
  To: rainbows-public

Honestly, these disclaimers should've been there all along;
and should apply to all servers handling multiple clients
within a single process.
---
 README                       | 9 +++++++++
 lib/rainbows/configurator.rb | 5 +++++
 2 files changed, 14 insertions(+)

diff --git a/README b/README
index ac10375..027f58a 100644
--- a/README
+++ b/README
@@ -159,6 +159,15 @@ don't email the git mailing list or maintainer with \Rainbows! patches.
 There is NO WARRANTY whatsoever if anything goes wrong, but let us know
 and we'll try our best to fix it.
 
+Rainbows! is extremely sensitive to fatal bugs in the apps it hosts.
+Each Rainbows! worker process may be handling thousands of clients;
+unexpectedly killing the process will abort _all_ of those
+connections.  Lives may be lost!
+
+Rainbows! hackers are not responsible for your application/library bugs.
+Use an application server which is tolerant of buggy applications
+if you cannot be bothered to fix all your fatal bugs.
+
 == Contact
 
 All feedback (bug reports, user/development discussion, patches, pull
diff --git a/lib/rainbows/configurator.rb b/lib/rainbows/configurator.rb
index 10cb60d..d82002e 100644
--- a/lib/rainbows/configurator.rb
+++ b/lib/rainbows/configurator.rb
@@ -6,6 +6,11 @@
 # block, otherwise Unicorn::Configurator directives may be used anywhere
 # in the file.
 #
+# Warning: The "timeout" directive in unicorn is far more dangerous
+# in Rainbows!, since ALL requests running on a process will be lost
+# on worker death, not just one.  Instead, handle application-level
+# timeouts yourself: https://bogomips.org/unicorn/Application_Timeouts.html
+#
 #   Rainbows! do
 #     use :ThreadSpawn # concurrency model to use
 #     worker_connections 400
-- 
EW


^ permalink raw reply related

* Re: Waiting for deferred actions to finish
From: alex0375 @ 2017-01-10  7:31 UTC (permalink / raw)
  To: Eric Wong; +Cc: rainbows-public
In-Reply-To: <20170109194337.GA16111@starla>

Hi, Eric

I have tried the new revision (rainbows-5.0.0.8.gf385) and it works
great for me.

Thanks!

On Mon, Jan 9, 2017 at 10:43 PM, Eric Wong <e@80x24.org> wrote:
> alex0375@gmail.com wrote:
>> Am I missing something? Can this be a part of Rainbows?
>
> Nope, you're not missing anything :)
> Rainbows! was missing an EM feature introduced in 2012 :x
>
> I'll make a 5.1.0 release with following patches
> (coming in-reply-to this email) soon.
>
> There's also rack 2.x compatibility sitting in rainbows.git.
> https://bogomips.org/rainbows-public/20161117033531.GA4454@dcvr/T/
>
> The following changes since commit bd7596e50bd094edf5e5842afb8239c158fe2491:
>
>   Revert "t/t0044-autopush.sh: remove test" (2016-12-24 21:42:06 +0000)
>
> are available in the git repository at:
>
>   git://bogomips.org/rainbows em-deferred
>
> for you to fetch changes up to f385ed423e11ad40822f688bc592eaa78efa5b34:
>
>   eventmachine: wait for deferred actions to finish (2017-01-09 18:59:00 +0000)
>
> ----------------------------------------------------------------
> Eric Wong (2):
>       tests: re-enable EventMachine tests, again
>       eventmachine: wait for deferred actions to finish
>
>  SIGNALS                       |  6 +++---
>  lib/rainbows/event_machine.rb | 10 +++++++++-
>  t/GNUmakefile                 |  2 +-
>  t/app_deferred.ru             |  8 +++++++-
>  t/t0700-app-deferred.sh       | 18 +++++++++++++++---
>  5 files changed, 35 insertions(+), 9 deletions(-)

^ permalink raw reply

* Re: [PATCH] support rack 2.x
From: Eric Wong @ 2017-01-09 19:48 UTC (permalink / raw)
  To: Julia López Aladro; +Cc: rainbows-public
In-Reply-To: <e9975f6d-9f16-40ac-4813-c5825e9702ab@gmail.com>

Julia López Aladro <julialopez@gmail.com> wrote:
> PS: Sorry about the late response!

Hey, just wondering if you've had a chance to run with rack 2.x
support in rainbows.   Anyways I took an extra look at the
changes and it seems fine.  I'll probably release 5.1.0 final
in a day or two now that holidays are over and there's some
improvements ready to drop into 'master'.

Thanks.

^ permalink raw reply

* [PATCH 2/2] eventmachine: wait for deferred actions to finish
From: Eric Wong @ 2017-01-09 19:45 UTC (permalink / raw)
  To: rainbows-public; +Cc: alex0375
In-Reply-To: <20170109194337.GA16111@starla>

Since EventMachine 1.0.0 in 2012, the EM.defers_finish? API
exists to check for the existence of deferred actions.
Support it if it exists in the running version of EM and
update the note in our SIGNALS document.

Thanks to <alex0375@gmail.com> on the mailing list for bringing
this up:
https://bogomips.org/rainbows-public/CAKwvcL-VH3we4qA1pkNAstTmWvqNA=Rir2N_YiWztV_qbaLQvA@mail.gmail.com/
---
 SIGNALS                       |  6 +++---
 lib/rainbows/event_machine.rb | 10 +++++++++-
 t/app_deferred.ru             |  8 +++++++-
 t/t0700-app-deferred.sh       | 18 +++++++++++++++---
 4 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/SIGNALS b/SIGNALS
index e53c3e4..fa95a1c 100644
--- a/SIGNALS
+++ b/SIGNALS
@@ -24,9 +24,9 @@ between \Rainbows!, unicorn and nginx.
 * INT/TERM - quick shutdown, kills all workers immediately
 
 * QUIT - graceful shutdown, waits for workers to finish their
-  current request before finishing.  This currently does not
-  wait for requests deferred to a separate thread when using
-  EventMachine (when app.deferred?(env) => true)
+  current request before finishing.  Since Rainbows 5.1.0 (Jan 2017),
+  this waits requests deferred to a separate thread with
+  EventMachine (app.deferred?(env) => true).
 
 * USR1 - reopen all logs owned by the master and all workers
   See Unicorn::Util.reopen_logs for what is considered a log.
diff --git a/lib/rainbows/event_machine.rb b/lib/rainbows/event_machine.rb
index b326e26..896fdac 100644
--- a/lib/rainbows/event_machine.rb
+++ b/lib/rainbows/event_machine.rb
@@ -65,6 +65,11 @@ def em_client_class
     end
   end
 
+  def defers_finished?
+    # EventMachine 1.0.0+ has defers_finished?
+    EM.respond_to?(:defers_finished?) ? EM.defers_finished? : true
+  end
+
   # runs inside each forked worker, this sits around and waits
   # for connections and doesn't die until the parent dies (or is
   # given a INT, QUIT, or TERM signal)
@@ -101,7 +106,10 @@ def worker_loop(worker) # :nodoc:
         end
       end
       EM.add_periodic_timer(1) do
-        EM.stop if ! Rainbows.tick && conns.empty? && EM.reactor_running?
+        if ! Rainbows.tick && conns.empty? && defers_finished? &&
+            EM.reactor_running?
+          EM.stop
+        end
       end
       LISTENERS.map! do |s|
         EM.watch(s, Rainbows::EventMachine::Server) do |c|
diff --git a/t/app_deferred.ru b/t/app_deferred.ru
index a70b33b..b3d7ff1 100644
--- a/t/app_deferred.ru
+++ b/t/app_deferred.ru
@@ -6,12 +6,18 @@
 
 class DeferredApp < Struct.new(:app)
   def deferred?(env)
-    env["PATH_INFO"] == "/deferred"
+    env["PATH_INFO"] =~ %r{\A/deferred}
   end
 
   def call(env)
     env["rack.multithread"] or raise RuntimeError, "rack.multithread not true"
     body = "#{Thread.current.inspect}\n"
+    if env["PATH_INFO"] =~ %r{\A/deferred(\d+)}
+      delay = $1.to_i
+      File.open(ENV['fifo'], 'w') { |fp| fp.write "sleeping #{delay}s\n" }
+      body = "deferred sleep\n"
+      sleep(delay)
+    end
     headers = {
       "Content-Type" => "text/plain",
       "Content-Length" => body.size.to_s,
diff --git a/t/t0700-app-deferred.sh b/t/t0700-app-deferred.sh
index 90614b2..188fdde 100755
--- a/t/t0700-app-deferred.sh
+++ b/t/t0700-app-deferred.sh
@@ -15,7 +15,7 @@ CONFIG_RU=app_deferred.ru
 t_begin "setup and start" && {
 	rainbows_setup
 	rtmpfiles deferred_err deferred_out sync_err sync_out
-	rainbows -D -c $unicorn_config $CONFIG_RU
+	fifo=$fifo rainbows -D -c $unicorn_config $CONFIG_RU
 	rainbows_wait_start
 }
 
@@ -36,8 +36,20 @@ t_begin "deferred requests run in a different thread" && {
 	test x"$(uniq < $deferred_out)" != x"$sync_thread"
 }
 
-t_begin "termination signal sent" && {
-	kill $rainbows_pid
+t_begin "deferred requests run after graceful shutdown" && {
+	# XXX sleeping 5s ought to be enough for SIGQUIT to arrive,
+	# hard to tell with overloaded systems...
+	s=5
+	curl -sSf --no-buffer http://$listen/deferred$s \
+		>$deferred_out 2>$deferred_err &
+	curl_pid=$!
+	msg="$(cat $fifo)"
+	kill -QUIT $rainbows_pid
+	test x"$msg" = x"sleeping ${s}s"
+	wait $curl_pid # for curl to finish
+	test $? -eq 0
+	test ! -s $deferred_err
+	test x"$(cat $deferred_out)" = 'xdeferred sleep'
 }
 
 t_begin "no errors in stderr" && check_stderr
-- 
EW

^ permalink raw reply related


Code repositories for project(s) associated with this public inbox

	https://yhbt.net/rainbows.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).