net.server_select: Move socket timeout cleanup code out of a timer, into the select...
[prosody.git] / net / server_select.lua
index 4d959a263ef8b93c2fdcbff8998b70b0e2d7ca04..86c9daef24ae7e8fd63a130a28177b95c9ddde05 100644 (file)
 local use = function( what )
        return _G[ what ]
 end
-local clean = function( tbl )
-       for i, k in pairs( tbl ) do
-               tbl[ i ] = nil
-       end
-end
 
 local log, table_concat = require ("util.logger").init("socket"), table.concat;
 local out_put = function (...) return log("debug", table_concat{...}); end
@@ -117,8 +112,6 @@ local _checkinterval
 local _sendtimeout
 local _readtimeout
 
-local _cleanqueue
-
 local _timer
 
 local _maxselectlen
@@ -154,8 +147,6 @@ _checkinterval = 1200000 -- interval in secs to check idle clients
 _sendtimeout = 60000 -- allowed send idle time in secs
 _readtimeout = 6 * 60 * 60 -- allowed read idle time in secs
 
-_cleanqueue = false -- clean bufferqueue after using
-
 _maxfd = luasocket._SETSIZE or 1024 -- We should ignore this on Windows.  Perhaps by simply setting it to math.huge or something.
 _maxselectlen = luasocket._SETSIZE or 1024 -- But this still applies on Windows
 
@@ -349,9 +340,6 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
        handler.force_close = function ( self, err )
                if bufferqueuelen ~= 0 then
                        out_put("server.lua: discarding unwritten data for ", tostring(ip), ":", tostring(clientport))
-                       for i = bufferqueuelen, 1, -1 do
-                               bufferqueue[i] = nil;
-                       end
                        bufferqueuelen = 0;
                end
                return self:close(err);
@@ -513,7 +501,9 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                        count = ( succ or byte or 0 ) * STAT_UNIT
                        sendtraffic = sendtraffic + count
                        _sendtraffic = _sendtraffic + count
-                       _ = _cleanqueue and clean( bufferqueue )
+                       for i = bufferqueuelen,1,-1 do
+                               bufferqueue[ i ] = nil
+                       end
                        --out_put( "server.lua: sended '", buffer, "', bytes: ", tostring(succ), ", error: ", tostring(err), ", part: ", tostring(byte), ", to: ", tostring(ip), ":", tostring(clientport) )
                else
                        succ, err, count = false, "unexpected close", 0;
@@ -561,9 +551,6 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                                                handler.readbuffer = _readbuffer        -- when handshake is done, replace the handshake function with regular functions
                                                handler.sendbuffer = _sendbuffer
                                                _ = status and status( handler, "ssl-handshake-complete" )
-                                               if self.autostart_ssl and listeners.onconnect then
-                                                       listeners.onconnect(self);
-                                               end
                                                _readlistlen = addsocket(_readlist, client, _readlistlen)
                                                return true
                                        else
@@ -582,7 +569,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                                end
                                out_put( "server.lua: ssl handshake error: ", tostring(err or "handshake too long") )
                                _ = handler and handler:force_close("ssl handshake failed")
-               return false, err -- handshake failed
+                               return false, err -- handshake failed
                        end
                )
        end
@@ -626,7 +613,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
 
                        handler.readbuffer = handshake
                        handler.sendbuffer = handshake
-                       return handshake( socket ) -- do handshake
+                       return handshake( socket ) -- do handshake
                end
        end
 
@@ -642,10 +629,10 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
        if sslctx and luasec then
                out_put "server.lua: auto-starting ssl negotiation..."
                handler.autostart_ssl = true;
-               local ok, err = handler:starttls(sslctx);
-               if ok == false then
-                       return nil, nil, err
-               end
+               local ok, err = handler:starttls(sslctx);
+               if ok == false then
+                       return nil, nil, err
+               end
        end
 
        return handler, socket
@@ -779,7 +766,18 @@ closeall = function( )
 end
 
 getsettings = function( )
-       return  _selecttimeout, _sleeptime, _maxsendlen, _maxreadlen, _checkinterval, _sendtimeout, _readtimeout, _cleanqueue, _maxselectlen, _maxsslhandshake, _maxfd
+       return {
+               select_timeout = _selecttimeout;
+               select_sleep_time = _sleeptime;
+               max_send_buffer_size = _maxsendlen;
+               max_receive_buffer_size = _maxreadlen;
+               select_idle_check_interval = _checkinterval;
+               send_timeout = _sendtimeout;
+               read_timeout = _readtimeout;
+               max_connections = _maxselectlen;
+               max_ssl_handshake_roundtrips = _maxsslhandshake;
+               highest_allowed_fd = _maxfd;
+       }
 end
 
 changesettings = function( new )
@@ -793,7 +791,6 @@ changesettings = function( new )
        _checkinterval = tonumber( new.select_idle_check_interval ) or _checkinterval
        _sendtimeout = tonumber( new.send_timeout ) or _sendtimeout
        _readtimeout = tonumber( new.read_timeout ) or _readtimeout
-       _cleanqueue = new.select_clean_queue
        _maxselectlen = new.max_connections or _maxselectlen
        _maxsslhandshake = new.max_ssl_handshake_roundtrips or _maxsslhandshake
        _maxfd = new.highest_allowed_fd or _maxfd
@@ -846,9 +843,29 @@ loop = function(once) -- this is the main loop of the program
                for handler, err in pairs( _closelist ) do
                        handler.disconnect( )( handler, err )
                        handler:force_close()    -- forced disconnect
+                       _closelist[ handler ] = nil;
                end
-               clean( _closelist )
                _currenttime = luasocket_gettime( )
+
+               local difftime = os_difftime( _currenttime - _starttime )
+               if difftime > _checkinterval then
+                       _starttime = _currenttime
+                       for handler, timestamp in pairs( _writetimes ) do
+                               if os_difftime( _currenttime - timestamp ) > _sendtimeout then
+                                       --_writetimes[ handler ] = nil
+                                       handler.disconnect( )( handler, "send timeout" )
+                                       handler:force_close()    -- forced disconnect
+                               end
+                       end
+                       for handler, timestamp in pairs( _readtimes ) do
+                               if os_difftime( _currenttime - timestamp ) > _readtimeout then
+                                       --_readtimes[ handler ] = nil
+                                       handler.disconnect( )( handler, "read timeout" )
+                                       handler:close( )        -- forced disconnect?
+                               end
+                       end
+               end
+
                if _currenttime - _timer >= math_min(next_timer_time, 1) then
                        next_timer_time = math_huge;
                        for i = 1, _timerlistlen do
@@ -924,28 +941,6 @@ use "setmetatable" ( _writetimes, { __mode = "k" } )
 _timer = luasocket_gettime( )
 _starttime = luasocket_gettime( )
 
-addtimer( function( )
-               local difftime = os_difftime( _currenttime - _starttime )
-               if difftime > _checkinterval then
-                       _starttime = _currenttime
-                       for handler, timestamp in pairs( _writetimes ) do
-                               if os_difftime( _currenttime - timestamp ) > _sendtimeout then
-                                       --_writetimes[ handler ] = nil
-                                       handler.disconnect( )( handler, "send timeout" )
-                                       handler:force_close()    -- forced disconnect
-                               end
-                       end
-                       for handler, timestamp in pairs( _readtimes ) do
-                               if os_difftime( _currenttime - timestamp ) > _readtimeout then
-                                       --_readtimes[ handler ] = nil
-                                       handler.disconnect( )( handler, "read timeout" )
-                                       handler:close( )        -- forced disconnect?
-                               end
-                       end
-               end
-       end
-)
-
 local function setlogger(new_logger)
        local old_logger = log;
        if new_logger then