Merge 0.10->trunk
authorKim Alvefur <zash@zash.se>
Fri, 22 Jan 2016 14:03:02 +0000 (15:03 +0100)
committerKim Alvefur <zash@zash.se>
Fri, 22 Jan 2016 14:03:02 +0000 (15:03 +0100)
1  2 
net/server.lua
net/server_select.lua

diff --cc net/server.lua
index a753a19c8056e7fb7e75c6d6c13ac3ffab0d02cd,41e180faa6ce9cd5cee9518b89c0671d9a0be8ae..0e13399d28e9e331a38b392579ff79b680dab14a
@@@ -19,81 -16,64 +19,81 @@@ if server_type == "event" the
  end
  
  local server;
 -
 -if use_luaevent then
 +local set_config;
 +if server_type == "event" then
        server = require "net.server_event";
  
 -      -- Overwrite signal.signal() because we need to ask libevent to
 -      -- handle them instead
 -      local ok, signal = pcall(require, "util.signal");
 -      if ok and signal then
 -              local _signal_signal = signal.signal;
 -              function signal.signal(signal_id, handler)
 -                      if type(signal_id) == "string" then
 -                              signal_id = signal[signal_id:upper()];
 -                      end
 -                      if type(signal_id) ~= "number" then
 -                              return false, "invalid-signal";
 -                      end
 -                      return server.hook_signal(signal_id, handler);
 -              end
 -      end
 -else
 -      use_luaevent = false;
 -      server = require "net.server_select";
 -end
 -
 -if prosody then
 -      local config_get = require "core.configmanager".get;
        local defaults = {};
 -      for k,v in pairs(server.cfg or server.getsettings()) do
 +      for k,v in pairs(server.cfg) do
                defaults[k] = v;
        end
 -      local function load_config()
 -              local settings = config_get("*", "network_settings") or {};
 -              if use_luaevent then
 +      function set_config(settings)
-               local event_settings = {
-                       ACCEPT_DELAY = settings.event_accept_retry_interval;
-                       ACCEPT_QUEUE = settings.tcp_backlog;
-                       CLEAR_DELAY = settings.event_clear_interval;
-                       CONNECT_TIMEOUT = settings.connect_timeout;
-                       DEBUG = settings.debug;
-                       HANDSHAKE_TIMEOUT = settings.ssl_handshake_timeout;
-                       MAX_CONNECTIONS = settings.max_connections;
-                       MAX_HANDSHAKE_ATTEMPTS = settings.max_ssl_handshake_roundtrips;
-                       MAX_READ_LENGTH = settings.max_receive_buffer_size;
-                       MAX_SEND_LENGTH = settings.max_send_buffer_size;
-                       READ_TIMEOUT = settings.read_timeout;
-                       WRITE_TIMEOUT = settings.send_timeout;
-               };
+                       local event_settings = {
+                               ACCEPT_DELAY = settings.accept_retry_interval;
+                               ACCEPT_QUEUE = settings.tcp_backlog;
+                               CLEAR_DELAY = settings.event_clear_interval;
+                               CONNECT_TIMEOUT = settings.connect_timeout;
+                               DEBUG = settings.debug;
+                               HANDSHAKE_TIMEOUT = settings.ssl_handshake_timeout;
+                               MAX_CONNECTIONS = settings.max_connections;
+                               MAX_HANDSHAKE_ATTEMPTS = settings.max_ssl_handshake_roundtrips;
+                               MAX_READ_LENGTH = settings.max_receive_buffer_size;
+                               MAX_SEND_LENGTH = settings.max_send_buffer_size;
+                               READ_TIMEOUT = settings.read_timeout;
+                               WRITE_TIMEOUT = settings.send_timeout;
+                       };
  
-               for k,default in pairs(defaults) do
-                       server.cfg[k] = event_settings[k] or default;
-               end
+                       for k,default in pairs(defaults) do
+                               server.cfg[k] = event_settings[k] or default;
+                       end
 -              else
 +      end
 +elseif server_type == "select" then
 +      server = require "net.server_select";
 +
 +      local defaults = {};
 +      for k,v in pairs(server.getsettings()) do
 +              defaults[k] = v;
 +      end
 +      function set_config(settings)
-               local select_settings = {};
-               for k,default in pairs(defaults) do
-                       select_settings[k] = settings[k] or default;
+                       local select_settings = {};
+                       for k,default in pairs(defaults) do
+                               select_settings[k] = settings[k] or default;
+                       end
+                       server.changesettings(select_settings);
                end
-               server.changesettings(select_settings);
-       end
 +else
 +      error("Unsupported server type")
 +end
 +
 +-- If server.hook_signal exists, replace signal.signal()
 +local has_signal, signal = pcall(require, "util.signal");
 +if has_signal then
 +      if server.hook_signal then
 +              function signal.signal(signal_id, handler)
 +                      if type(signal_id) == "string" then
 +                              signal_id = signal[signal_id:upper()];
 +                      end
 +                      if type(signal_id) ~= "number" then
 +                              return false, "invalid-signal";
 +                      end
 +                      return server.hook_signal(signal_id, handler);
 +              end
 +      else
 +              server.hook_signal = signal.signal;
 +      end
 +else
 +      if not server.hook_signal then
 +              server.hook_signal = function()
 +                      return false, "signal hooking not supported"
 +              end
 +      end
 +end
 +
 +if prosody then
 +      local config_get = require "core.configmanager".get;
 +      local function load_config()
 +              local settings = config_get("*", "network_settings") or {};
 +              return set_config(settings);
        end
        load_config();
        prosody.events.add_handler("config-reloaded", load_config);
index c89747bba606fe9f9a5e37d950c45ced289d9086,52a0d5f1a1fd572d81609f76640f926886188891..37d57d29ae4afd5ffeab9960c5686d60f3c1700d
@@@ -99,7 -102,9 +100,8 @@@ local _sendtraffi
  local _readtraffic
  
  local _selecttimeout
 -local _sleeptime
  local _tcpbacklog
+ local _accepretry
  
  local _starttime
  local _currenttime
@@@ -135,7 -143,9 +138,8 @@@ _sendtraffic = 0 -- some stat
  _readtraffic = 0
  
  _selecttimeout = 1 -- timeout of socket.select
 -_sleeptime = 0 -- time to wait at the end of every loop
  _tcpbacklog = 128 -- some kind of hint to the OS
+ _accepretry = 10 -- seconds to wait until the next attempt of a full server to accept
  
  _maxsendlen = 51000 * 1024 -- max len of send buffer
  _maxreadlen = 25000 * 1024 -- max len of read buffer
@@@ -881,15 -862,8 +894,15 @@@ en
  loop = function(once) -- this is the main loop of the program
        if quitting then return "quitting"; end
        if once then quitting = "once"; end
 -      local next_timer_time = math_huge;
 +      _currenttime = luasocket_gettime( )
        repeat
-               local next_timer_time = math_huge;
 +              -- Fire timers
++      local next_timer_time = math_huge;
 +              for i = 1, _timerlistlen do
 +                      local t = _timerlist[ i ]( _currenttime ) -- fire timers
 +                      if t then next_timer_time = math_min(next_timer_time, t); end
 +              end
 +
                local read, write, err = socket_select( _readlist, _sendlist, math_min(_selecttimeout, next_timer_time) )
                for i, socket in ipairs( write ) do -- send data waiting in writequeues
                        local handler = _socketlist[ socket ]
                                end
                        end
                end
 -              -- Fire timers
 -              if _currenttime - _timer >= math_min(next_timer_time, 1) then
 -                      next_timer_time = math_huge;
 -                      for i = 1, _timerlistlen do
 -                              local t = _timerlist[ i ]( _currenttime ) -- fire timers
 -                              if t then next_timer_time = math_min(next_timer_time, t); end
 -                      end
 -                      _timer = _currenttime
 -              else
 -                      next_timer_time = next_timer_time - (_currenttime - _timer);
 -              end
 -
 -
 -              -- wait some time (0 by default)
 -              socket_sleep( _sleeptime )
+               for server, paused_time in pairs( _fullservers ) do
+                       if _currenttime - paused_time > _accepretry then
+                               _fullservers[ server ] = nil;
+                               server.resume();
+                       end
+               end
        until quitting;
        if once and quitting == "once" then quitting = nil; return; end
        closeall();