Skip to content
Snippets Groups Projects
Commit 0eec80af authored by Dmitry E. Oboukhov's avatar Dmitry E. Oboukhov
Browse files

socket.tcp_server removes old socket if it exists and dead. closes #414

parent 3ee859f0
No related branches found
No related tags found
No related merge requests found
......@@ -6,6 +6,7 @@ local TIMEOUT_INFINITY = 500 * 365 * 86400
local ffi = require 'ffi'
local os_remove = os.remove
local boxerrno = box.errno
local internal = box.socket.internal
box.socket.internal = nil
package.loaded['box.socket.internal'] = nil
......@@ -1003,6 +1004,38 @@ local function tcp_server_usage()
error('Usage: socket.tcp_server(host, port, handler | opts)')
end
local function tcp_server_bind(s, addr)
if s:bind(addr.host, addr.port) then
return true
end
if addr.family ~= 'AF_UNIX' then
return false
end
if boxerrno() ~= boxerrno.EADDRINUSE then
return false
end
local save_errno = boxerrno()
local sc = tcp_connect(addr.host, addr.port)
if sc ~= nil then
sc:close()
boxerrno(save_errno)
return false
end
if boxerrno() ~= boxerrno.ECONNREFUSED then
boxerrno(save_errno)
return false
end
os_remove(addr.port)
return s:bind(addr.host, addr.port)
end
local function tcp_server(host, port, opts, timeout)
local server = {}
if type(opts) == 'function' then
......@@ -1040,7 +1073,7 @@ local function tcp_server(host, port, opts, timeout)
else
s:setsockopt('SOL_SOCKET', 'SO_REUSEADDR', 1) -- ignore error
end
if not s:bind(addr.host, addr.port) or not s:listen(backlog) then
if not tcp_server_bind(s, addr) or not s:listen(backlog) then
local save_errno = box.errno()
s:close()
box.errno(save_errno)
......
......@@ -222,7 +222,7 @@ lua s:getsockopt('SOL_SOCKET', 'SO_DEBUG')
...
lua s:setsockopt('SOL_SOCKET', 'SO_ACCEPTCONN', 1)
---
error: '[string "-- bsdsocket.lua (internal file)..."]:347: Socket option SO_ACCEPTCONN is read only'
error: '[string "-- bsdsocket.lua (internal file)..."]:348: Socket option SO_ACCEPTCONN is read only'
...
lua s:getsockopt('SOL_SOCKET', 'SO_RCVBUF') > 32
---
......@@ -1149,3 +1149,37 @@ lua errno == box.errno.ECONNREFUSED
---
- true
...
test bind unix socket if old socket is exists
lua s = box.socket('AF_UNIX', 'SOCK_STREAM', 0)
---
...
lua s:bind('unix/', '/tmp/tarantool-test-socket')
---
- true
...
lua s:listen()
---
- true
...
lua s:close()
---
- true
...
lua s = box.socket('AF_UNIX', 'SOCK_STREAM', 0)
---
...
lua s:bind('unix/', '/tmp/tarantool-test-socket')
---
- false
...
lua s = box.socket.tcp_server('unix/', '/tmp/tarantool-test-socket', function() end)
---
...
lua s ~= nil
---
- true
...
lua s:close()
---
- true
...
......@@ -370,3 +370,18 @@ exec admin "lua collectgarbage('collect')"
exec admin "lua client, errno = box.socket.tcp_connect('unix/', '{}'), box.errno()".format(path)
exec admin "lua errno == box.errno.ECONNREFUSED"
os.unlink(path)
print 'test bind unix socket if old socket is exists'
exec admin "lua s = box.socket('AF_UNIX', 'SOCK_STREAM', 0)"
exec admin "lua s:bind('unix/', '{}')".format(path)
exec admin "lua s:listen()"
exec admin "lua s:close()"
if not os.path.exists(path):
print 'unix socket was removed: test failed'
exec admin "lua s = box.socket('AF_UNIX', 'SOCK_STREAM', 0)"
exec admin "lua s:bind('unix/', '{}')".format(path)
exec admin "lua s = box.socket.tcp_server('unix/', '{}', function() end)".format(path)
exec admin "lua s ~= nil"
exec admin "lua s:close()"
if os.path.exists(path):
print 'unix socket was not removed: test failed'
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment