Mercurial > prosody-hg
comparison net/server_select.lua @ 7098:5286e79c6829
Merge 0.9->0.10
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Fri, 22 Jan 2016 14:49:05 +0100 |
| parents | 7d5a1fb9bf9e 5a71aaa2c542 |
| children | 8e64e7b82928 a1570219b865 |
comparison
equal
deleted
inserted
replaced
| 7090:7aa37d70944b | 7098:5286e79c6829 |
|---|---|
| 87 local _sendlist | 87 local _sendlist |
| 88 local _socketlist | 88 local _socketlist |
| 89 local _closelist | 89 local _closelist |
| 90 local _readtimes | 90 local _readtimes |
| 91 local _writetimes | 91 local _writetimes |
| 92 local _fullservers | |
| 92 | 93 |
| 93 --// simple data types //-- | 94 --// simple data types //-- |
| 94 | 95 |
| 95 local _ | 96 local _ |
| 96 local _readlistlen | 97 local _readlistlen |
| 101 local _readtraffic | 102 local _readtraffic |
| 102 | 103 |
| 103 local _selecttimeout | 104 local _selecttimeout |
| 104 local _sleeptime | 105 local _sleeptime |
| 105 local _tcpbacklog | 106 local _tcpbacklog |
| 107 local _accepretry | |
| 106 | 108 |
| 107 local _starttime | 109 local _starttime |
| 108 local _currenttime | 110 local _currenttime |
| 109 | 111 |
| 110 local _maxsendlen | 112 local _maxsendlen |
| 129 _timerlist = { } -- array of timer functions | 131 _timerlist = { } -- array of timer functions |
| 130 _socketlist = { } -- key = socket, value = wrapped socket (handlers) | 132 _socketlist = { } -- key = socket, value = wrapped socket (handlers) |
| 131 _readtimes = { } -- key = handler, value = timestamp of last data reading | 133 _readtimes = { } -- key = handler, value = timestamp of last data reading |
| 132 _writetimes = { } -- key = handler, value = timestamp of last data writing/sending | 134 _writetimes = { } -- key = handler, value = timestamp of last data writing/sending |
| 133 _closelist = { } -- handlers to close | 135 _closelist = { } -- handlers to close |
| 136 _fullservers = { } -- servers in a paused state while there are too many clients | |
| 134 | 137 |
| 135 _readlistlen = 0 -- length of readlist | 138 _readlistlen = 0 -- length of readlist |
| 136 _sendlistlen = 0 -- length of sendlist | 139 _sendlistlen = 0 -- length of sendlist |
| 137 _timerlistlen = 0 -- lenght of timerlist | 140 _timerlistlen = 0 -- lenght of timerlist |
| 138 | 141 |
| 140 _readtraffic = 0 | 143 _readtraffic = 0 |
| 141 | 144 |
| 142 _selecttimeout = 1 -- timeout of socket.select | 145 _selecttimeout = 1 -- timeout of socket.select |
| 143 _sleeptime = 0 -- time to wait at the end of every loop | 146 _sleeptime = 0 -- time to wait at the end of every loop |
| 144 _tcpbacklog = 128 -- some kind of hint to the OS | 147 _tcpbacklog = 128 -- some kind of hint to the OS |
| 148 _accepretry = 10 -- seconds to wait until the next attempt of a full server to accept | |
| 145 | 149 |
| 146 _maxsendlen = 51000 * 1024 -- max len of send buffer | 150 _maxsendlen = 51000 * 1024 -- max len of send buffer |
| 147 _maxreadlen = 25000 * 1024 -- max len of read buffer | 151 _maxreadlen = 25000 * 1024 -- max len of read buffer |
| 148 | 152 |
| 149 _checkinterval = 30 -- interval in secs to check idle clients | 153 _checkinterval = 30 -- interval in secs to check idle clients |
| 208 _socketlist[ socket ] = nil | 212 _socketlist[ socket ] = nil |
| 209 socket:close( ) | 213 socket:close( ) |
| 210 socket = nil; | 214 socket = nil; |
| 211 end | 215 end |
| 212 handler.paused = true; | 216 handler.paused = true; |
| 217 out_put("server.lua: server [", ip, "]:", serverport, " paused") | |
| 213 end | 218 end |
| 214 end | 219 end |
| 215 handler.resume = function( ) | 220 handler.resume = function( ) |
| 216 if handler.paused then | 221 if handler.paused then |
| 217 if not socket then | 222 if not socket then |
| 218 socket = socket_bind( ip, serverport, _tcpbacklog ); | 223 socket = socket_bind( ip, serverport, _tcpbacklog ); |
| 219 socket:settimeout( 0 ) | 224 socket:settimeout( 0 ) |
| 220 end | 225 end |
| 221 _readlistlen = addsocket(_readlist, socket, _readlistlen) | 226 _readlistlen = addsocket(_readlist, socket, _readlistlen) |
| 222 _socketlist[ socket ] = handler | 227 _socketlist[ socket ] = handler |
| 228 _fullservers[ handler ] = nil | |
| 223 handler.paused = false; | 229 handler.paused = false; |
| 230 out_put("server.lua: server [", ip, "]:", serverport, " resumed") | |
| 224 end | 231 end |
| 225 end | 232 end |
| 226 handler.ip = function( ) | 233 handler.ip = function( ) |
| 227 return ip | 234 return ip |
| 228 end | 235 end |
| 233 return socket | 240 return socket |
| 234 end | 241 end |
| 235 handler.readbuffer = function( ) | 242 handler.readbuffer = function( ) |
| 236 if _readlistlen >= _maxselectlen or _sendlistlen >= _maxselectlen then | 243 if _readlistlen >= _maxselectlen or _sendlistlen >= _maxselectlen then |
| 237 handler.pause( ) | 244 handler.pause( ) |
| 245 _fullservers[ handler ] = _currenttime | |
| 238 out_put( "server.lua: refused new client connection: server full" ) | 246 out_put( "server.lua: refused new client connection: server full" ) |
| 239 return false | 247 return false |
| 240 end | 248 end |
| 241 local client, err = accept( socket ) -- try to accept | 249 local client, err = accept( socket ) -- try to accept |
| 242 if client then | 250 if client then |
| 251 return dispatch( handler ); | 259 return dispatch( handler ); |
| 252 end | 260 end |
| 253 return; | 261 return; |
| 254 elseif err then -- maybe timeout or something else | 262 elseif err then -- maybe timeout or something else |
| 255 out_put( "server.lua: error with new client connection: ", tostring(err) ) | 263 out_put( "server.lua: error with new client connection: ", tostring(err) ) |
| 264 handler.pause( ) | |
| 265 _fullservers[ handler ] = _currenttime | |
| 256 return false | 266 return false |
| 257 end | 267 end |
| 258 end | 268 end |
| 259 return handler | 269 return handler |
| 260 end | 270 end |
| 263 | 273 |
| 264 if socket:getfd() >= _maxfd then | 274 if socket:getfd() >= _maxfd then |
| 265 out_error("server.lua: Disallowed FD number: "..socket:getfd()) -- PROTIP: Switch to libevent | 275 out_error("server.lua: Disallowed FD number: "..socket:getfd()) -- PROTIP: Switch to libevent |
| 266 socket:close( ) -- Should we send some kind of error here? | 276 socket:close( ) -- Should we send some kind of error here? |
| 267 if server then | 277 if server then |
| 278 _fullservers[ server ] = _currenttime | |
| 268 server.pause( ) | 279 server.pause( ) |
| 269 end | 280 end |
| 270 return nil, nil, "fd-too-large" | 281 return nil, nil, "fd-too-large" |
| 271 end | 282 end |
| 272 socket:settimeout( 0 ) | 283 socket:settimeout( 0 ) |
| 804 send_timeout = _sendtimeout; | 815 send_timeout = _sendtimeout; |
| 805 read_timeout = _readtimeout; | 816 read_timeout = _readtimeout; |
| 806 max_connections = _maxselectlen; | 817 max_connections = _maxselectlen; |
| 807 max_ssl_handshake_roundtrips = _maxsslhandshake; | 818 max_ssl_handshake_roundtrips = _maxsslhandshake; |
| 808 highest_allowed_fd = _maxfd; | 819 highest_allowed_fd = _maxfd; |
| 820 accept_retry_interval = _accepretry; | |
| 809 } | 821 } |
| 810 end | 822 end |
| 811 | 823 |
| 812 changesettings = function( new ) | 824 changesettings = function( new ) |
| 813 if type( new ) ~= "table" then | 825 if type( new ) ~= "table" then |
| 819 _maxreadlen = tonumber( new.max_receive_buffer_size ) or _maxreadlen | 831 _maxreadlen = tonumber( new.max_receive_buffer_size ) or _maxreadlen |
| 820 _checkinterval = tonumber( new.select_idle_check_interval ) or _checkinterval | 832 _checkinterval = tonumber( new.select_idle_check_interval ) or _checkinterval |
| 821 _tcpbacklog = tonumber( new.tcp_backlog ) or _tcpbacklog | 833 _tcpbacklog = tonumber( new.tcp_backlog ) or _tcpbacklog |
| 822 _sendtimeout = tonumber( new.send_timeout ) or _sendtimeout | 834 _sendtimeout = tonumber( new.send_timeout ) or _sendtimeout |
| 823 _readtimeout = tonumber( new.read_timeout ) or _readtimeout | 835 _readtimeout = tonumber( new.read_timeout ) or _readtimeout |
| 836 _accepretry = tonumber( new.accept_retry_interval ) or _accepretry | |
| 824 _maxselectlen = new.max_connections or _maxselectlen | 837 _maxselectlen = new.max_connections or _maxselectlen |
| 825 _maxsslhandshake = new.max_ssl_handshake_roundtrips or _maxsslhandshake | 838 _maxsslhandshake = new.max_ssl_handshake_roundtrips or _maxsslhandshake |
| 826 _maxfd = new.highest_allowed_fd or _maxfd | 839 _maxfd = new.highest_allowed_fd or _maxfd |
| 827 return true | 840 return true |
| 828 end | 841 end |
| 907 if t then next_timer_time = math_min(next_timer_time, t); end | 920 if t then next_timer_time = math_min(next_timer_time, t); end |
| 908 end | 921 end |
| 909 _timer = _currenttime | 922 _timer = _currenttime |
| 910 else | 923 else |
| 911 next_timer_time = next_timer_time - (_currenttime - _timer); | 924 next_timer_time = next_timer_time - (_currenttime - _timer); |
| 925 end | |
| 926 | |
| 927 for server, paused_time in pairs( _fullservers ) do | |
| 928 if _currenttime - paused_time > _accepretry then | |
| 929 _fullservers[ server ] = nil; | |
| 930 server.resume(); | |
| 931 end | |
| 912 end | 932 end |
| 913 | 933 |
| 914 -- wait some time (0 by default) | 934 -- wait some time (0 by default) |
| 915 socket_sleep( _sleeptime ) | 935 socket_sleep( _sleeptime ) |
| 916 until quitting; | 936 until quitting; |
