Comparison

net/server_select.lua @ 5338:3df649ec43ea

net.server_select: Optimization, clean bufferqueue when it makes sense.
author Kim Alvefur <zash@zash.se>
date Fri, 01 Mar 2013 11:41:26 +0100
parent 5337:c22dd451487f
child 5385:d663483036db
comparison
equal deleted inserted replaced
5337:c22dd451487f 5338:3df649ec43ea
7 7
8 -- // wrapping luadch stuff // -- 8 -- // wrapping luadch stuff // --
9 9
10 local use = function( what ) 10 local use = function( what )
11 return _G[ what ] 11 return _G[ what ]
12 end
13 local clean = function( tbl )
14 for i, k in pairs( tbl ) do
15 tbl[ i ] = nil
16 end
17 end 12 end
18 13
19 local log, table_concat = require ("util.logger").init("socket"), table.concat; 14 local log, table_concat = require ("util.logger").init("socket"), table.concat;
20 local out_put = function (...) return log("debug", table_concat{...}); end 15 local out_put = function (...) return log("debug", table_concat{...}); end
21 local out_error = function (...) return log("warn", table_concat{...}); end 16 local out_error = function (...) return log("warn", table_concat{...}); end
115 110
116 local _checkinterval 111 local _checkinterval
117 local _sendtimeout 112 local _sendtimeout
118 local _readtimeout 113 local _readtimeout
119 114
120 local _cleanqueue
121
122 local _timer 115 local _timer
123 116
124 local _maxselectlen 117 local _maxselectlen
125 local _maxfd 118 local _maxfd
126 119
151 _maxreadlen = 25000 * 1024 -- max len of read buffer 144 _maxreadlen = 25000 * 1024 -- max len of read buffer
152 145
153 _checkinterval = 1200000 -- interval in secs to check idle clients 146 _checkinterval = 1200000 -- interval in secs to check idle clients
154 _sendtimeout = 60000 -- allowed send idle time in secs 147 _sendtimeout = 60000 -- allowed send idle time in secs
155 _readtimeout = 6 * 60 * 60 -- allowed read idle time in secs 148 _readtimeout = 6 * 60 * 60 -- allowed read idle time in secs
156
157 _cleanqueue = false -- clean bufferqueue after using
158 149
159 _maxfd = luasocket._SETSIZE or 1024 -- We should ignore this on Windows. Perhaps by simply setting it to math.huge or something. 150 _maxfd = luasocket._SETSIZE or 1024 -- We should ignore this on Windows. Perhaps by simply setting it to math.huge or something.
160 _maxselectlen = luasocket._SETSIZE or 1024 -- But this still applies on Windows 151 _maxselectlen = luasocket._SETSIZE or 1024 -- But this still applies on Windows
161 152
162 _maxsslhandshake = 30 -- max handshake round-trips 153 _maxsslhandshake = 30 -- max handshake round-trips
347 return false, "setoption not implemented"; 338 return false, "setoption not implemented";
348 end 339 end
349 handler.force_close = function ( self, err ) 340 handler.force_close = function ( self, err )
350 if bufferqueuelen ~= 0 then 341 if bufferqueuelen ~= 0 then
351 out_put("server.lua: discarding unwritten data for ", tostring(ip), ":", tostring(clientport)) 342 out_put("server.lua: discarding unwritten data for ", tostring(ip), ":", tostring(clientport))
352 for i = bufferqueuelen, 1, -1 do
353 bufferqueue[i] = nil;
354 end
355 bufferqueuelen = 0; 343 bufferqueuelen = 0;
356 end 344 end
357 return self:close(err); 345 return self:close(err);
358 end 346 end
359 handler.close = function( self, err ) 347 handler.close = function( self, err )
511 buffer = table_concat( bufferqueue, "", 1, bufferqueuelen ) 499 buffer = table_concat( bufferqueue, "", 1, bufferqueuelen )
512 succ, err, byte = send( socket, buffer, 1, bufferlen ) 500 succ, err, byte = send( socket, buffer, 1, bufferlen )
513 count = ( succ or byte or 0 ) * STAT_UNIT 501 count = ( succ or byte or 0 ) * STAT_UNIT
514 sendtraffic = sendtraffic + count 502 sendtraffic = sendtraffic + count
515 _sendtraffic = _sendtraffic + count 503 _sendtraffic = _sendtraffic + count
516 _ = _cleanqueue and clean( bufferqueue ) 504 for i = bufferqueuelen,1,-1 do
505 bufferqueue[ i ] = nil
506 end
517 --out_put( "server.lua: sended '", buffer, "', bytes: ", tostring(succ), ", error: ", tostring(err), ", part: ", tostring(byte), ", to: ", tostring(ip), ":", tostring(clientport) ) 507 --out_put( "server.lua: sended '", buffer, "', bytes: ", tostring(succ), ", error: ", tostring(err), ", part: ", tostring(byte), ", to: ", tostring(ip), ":", tostring(clientport) )
518 else 508 else
519 succ, err, count = false, "unexpected close", 0; 509 succ, err, count = false, "unexpected close", 0;
520 end 510 end
521 if succ then -- sending succesful 511 if succ then -- sending succesful
777 _socketlist = { } 767 _socketlist = { }
778 --mem_free( ) 768 --mem_free( )
779 end 769 end
780 770
781 getsettings = function( ) 771 getsettings = function( )
782 return _selecttimeout, _sleeptime, _maxsendlen, _maxreadlen, _checkinterval, _sendtimeout, _readtimeout, _cleanqueue, _maxselectlen, _maxsslhandshake, _maxfd 772 return _selecttimeout, _sleeptime, _maxsendlen, _maxreadlen, _checkinterval, _sendtimeout, _readtimeout, nil, _maxselectlen, _maxsslhandshake, _maxfd
783 end 773 end
784 774
785 changesettings = function( new ) 775 changesettings = function( new )
786 if type( new ) ~= "table" then 776 if type( new ) ~= "table" then
787 return nil, "invalid settings table" 777 return nil, "invalid settings table"
791 _maxsendlen = tonumber( new.max_send_buffer_size ) or _maxsendlen 781 _maxsendlen = tonumber( new.max_send_buffer_size ) or _maxsendlen
792 _maxreadlen = tonumber( new.max_receive_buffer_size ) or _maxreadlen 782 _maxreadlen = tonumber( new.max_receive_buffer_size ) or _maxreadlen
793 _checkinterval = tonumber( new.select_idle_check_interval ) or _checkinterval 783 _checkinterval = tonumber( new.select_idle_check_interval ) or _checkinterval
794 _sendtimeout = tonumber( new.send_timeout ) or _sendtimeout 784 _sendtimeout = tonumber( new.send_timeout ) or _sendtimeout
795 _readtimeout = tonumber( new.read_timeout ) or _readtimeout 785 _readtimeout = tonumber( new.read_timeout ) or _readtimeout
796 _cleanqueue = new.select_clean_queue
797 _maxselectlen = new.max_connections or _maxselectlen 786 _maxselectlen = new.max_connections or _maxselectlen
798 _maxsslhandshake = new.max_ssl_handshake_roundtrips or _maxsslhandshake 787 _maxsslhandshake = new.max_ssl_handshake_roundtrips or _maxsslhandshake
799 _maxfd = new.highest_allowed_fd or _maxfd 788 _maxfd = new.highest_allowed_fd or _maxfd
800 return true 789 return true
801 end 790 end
844 end 833 end
845 end 834 end
846 for handler, err in pairs( _closelist ) do 835 for handler, err in pairs( _closelist ) do
847 handler.disconnect( )( handler, err ) 836 handler.disconnect( )( handler, err )
848 handler:force_close() -- forced disconnect 837 handler:force_close() -- forced disconnect
849 end 838 _closelist[ handler ] = nil;
850 clean( _closelist ) 839 end
851 _currenttime = luasocket_gettime( ) 840 _currenttime = luasocket_gettime( )
852 if _currenttime - _timer >= math_min(next_timer_time, 1) then 841 if _currenttime - _timer >= math_min(next_timer_time, 1) then
853 next_timer_time = math_huge; 842 next_timer_time = math_huge;
854 for i = 1, _timerlistlen do 843 for i = 1, _timerlistlen do
855 local t = _timerlist[ i ]( _currenttime ) -- fire timers 844 local t = _timerlist[ i ]( _currenttime ) -- fire timers