From f65783b5a107fb515b46b17998b276d0fafd4be1 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 29 Mar 2009 17:38:01 -0700 Subject: configurator: per-listener backlog, {rcv,snd}buf config Instead of having global options for all listeners, make all socket options per-listener. This allows reverse-proxies to pick different listeners to get different options on different sockets. Given a cluster of machines (10.0.0.1, 10.0.0.2, 10.0.0.3) running Unicorn with the following config: ------------------ 8< ---------------- listen "/tmp/local.sock", :backlog => 1 listen "*:8080" # use the backlog=1024 default ------------------ 8< ---------------- It is possible to configure a reverse proxy to try to use "/tmp/local.sock" first and then fall back to using the TCP listener on port 8080 in a failover configuration. Thus the nginx upstream configuration on 10.0.0.1 to compliment this would be: ------------------ 8< ---------------- upstream unicorn_cluster { # reject connections ASAP if we are overloaded server unix:/tmp/local.sock; # fall back to other machines in the cluster via "backup" # listeners which have a large backlog queue. server 10.0.0.2:8080 backup; server 10.0.0.3:8080 backup; } ------------------ 8< ---------------- This removes the global "backlog" config option which was inflexible with multiple machines in a cluster and exposes the ability to change SO_SNDBUF/SO_RCVBUF via setsockopt(2) for the first time. --- test/exec/test_exec.rb | 1 - test/unit/test_configurator.rb | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/test/exec/test_exec.rb b/test/exec/test_exec.rb index caada3b..5f91dc5 100644 --- a/test/exec/test_exec.rb +++ b/test/exec/test_exec.rb @@ -47,7 +47,6 @@ end HEAVY_CFG = <<-EOS worker_processes 4 timeout 30 -backlog 128 logger Logger.new('#{COMMON_TMP.path}') before_fork do |server, worker_nr| server.logger.info "before_fork: worker=\#{worker_nr}" diff --git a/test/unit/test_configurator.rb b/test/unit/test_configurator.rb index 8de0b13..623d717 100644 --- a/test/unit/test_configurator.rb +++ b/test/unit/test_configurator.rb @@ -45,4 +45,28 @@ class TestConfigurator < Test::Unit::TestCase assert_nil @logger end + def test_listen_options + tmp = Tempfile.new('unicorn_config') + expect = { :sndbuf => 1, :rcvbuf => 2, :backlog => 10 }.freeze + listener = "127.0.0.1:12345" + tmp.syswrite("listen '#{listener}', #{expect.inspect}\n") + cfg = nil + assert_nothing_raised do + cfg = Unicorn::Configurator.new(:config_file => tmp.path) + end + assert_nothing_raised { cfg.commit!(self) } + assert(listener_opts = instance_variable_get("@listener_opts")) + assert_equal expect, listener_opts[listener] + end + + def test_listen_option_bad + tmp = Tempfile.new('unicorn_config') + expect = { :sndbuf => "five" } + listener = "127.0.0.1:12345" + tmp.syswrite("listen '#{listener}', #{expect.inspect}\n") + assert_raises(ArgumentError) do + Unicorn::Configurator.new(:config_file => tmp.path) + end + end + end -- cgit v1.2.3-24-ge0c7