From 38171f3bc9a29bba267ae8dd9f62b6233d9c9444 Mon Sep 17 00:00:00 2001 From: RJie Date: Thu, 22 Jun 2017 21:18:41 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=9B=B4=E6=AD=A3connection=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根据test文件中,输入端口号为number类型,此处应该使用d%,否则只format直进来ip,容易造成同一个ip地址的connection丢失。 --- lualib/skynet/db/redis/cluster.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lualib/skynet/db/redis/cluster.lua b/lualib/skynet/db/redis/cluster.lua index 99e37577..ecac5460 100644 --- a/lualib/skynet/db/redis/cluster.lua +++ b/lualib/skynet/db/redis/cluster.lua @@ -33,7 +33,7 @@ function _M.new(startup_nodes,opt) end local function nodename(node) - return string.format("%s:%s",node.host,node.port) + return string.format("%s:%d",node.host,node.port) end function rediscluster:get_redis_link(node) From 2553afd6c9bd375b999ceb4432a80e755fe655dd Mon Sep 17 00:00:00 2001 From: sundream Date: Tue, 27 Jun 2017 18:59:06 +0800 Subject: [PATCH 2/4] redis-cluster: ensure port is integer --- lualib/skynet/db/redis/cluster.lua | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lualib/skynet/db/redis/cluster.lua b/lualib/skynet/db/redis/cluster.lua index 99e37577..9c83a929 100644 --- a/lualib/skynet/db/redis/cluster.lua +++ b/lualib/skynet/db/redis/cluster.lua @@ -33,7 +33,7 @@ function _M.new(startup_nodes,opt) end local function nodename(node) - return string.format("%s:%s",node.host,node.port) + return string.format("%s:%d",node.host,node.port) end function rediscluster:get_redis_link(node) @@ -74,20 +74,22 @@ function rediscluster:initialize_slots_cache() local conn = self.connections[name] or self:get_redis_link(startup_node) local list = conn:cluster("slots") for _,result in ipairs(list) do - local ip,port,runid = table.unpack(result[3]) + local ip,port = table.unpack(result[3]) + assert(ip) + port = assert(tonumber(port)) local master_node = { host = ip, port = port, - runid = runid, slaves = {}, } self:set_node_name(master_node) for i=4,#result do - local ip,port,runid = table.unpack(result[i]) + local ip,port = table.unpack(result[i]) + assert(ip) + port = assert(tonumber(port)) local slave_node = { host = ip, port = port, - runid = runid, } self:set_node_name(slave_node) table.insert(master_node.slaves,slave_node) @@ -184,10 +186,7 @@ function rediscluster:close_all_connection() end function rediscluster:get_connection(node) - if type(node) == "string" then - local ip,port = string.match(node,"^([^:]+):([^:]+)$") - node = {host=ip,port=port} - end + node.port = assert(tonumber(node.port)) local name = node.name or nodename(node) local conn = self.connections[name] if not conn then @@ -346,9 +345,10 @@ function rediscluster:call(...) end local newslot = tonumber(errlist[2]) local node_ip,node_port = string.match(errlist[3],"^([^:]+):([^:]+)$") + node_port = assert(tonumber(node_port)) local node = { host = node_ip, - port = tonumber(node_port), + port = node_port, } if not asking then self:set_node_name(node) From d6eb49e4eb05fd8fcade50ca965aa17011530d2c Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Tue, 4 Jul 2017 21:32:04 +0800 Subject: [PATCH 3/4] bson dictionary's key can't be number --- lualib-src/lua-bson.c | 9 +++------ test/testbson.lua | 12 ++++++------ 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/lualib-src/lua-bson.c b/lualib-src/lua-bson.c index 76daef40..eacecf3c 100644 --- a/lualib-src/lua-bson.c +++ b/lualib-src/lua-bson.c @@ -415,6 +415,8 @@ append_one(struct bson *bs, lua_State *L, const char *key, size_t sz, int depth) append_key(bs, L, BSON_BOOLEAN, key, sz); write_byte(bs, lua_toboolean(L,-1)); break; + case LUA_TNIL: + luaL_error(L, "Bson array has a hole (nil), Use bson.null instead"); default: luaL_error(L, "Invalid value type : %s", lua_typename(L,vt)); } @@ -452,12 +454,7 @@ pack_dict_data(lua_State *L, struct bson *b, int depth, int kt) { size_t sz; switch(kt) { case LUA_TNUMBER: - // copy key, don't change key type - lua_pushvalue(L,-2); - lua_insert(L,-2); - key = lua_tolstring(L,-2,&sz); - append_one(b, L, key, sz, depth); - lua_pop(L,2); + luaL_error(L, "Bson dictionary's key can't be number"); break; case LUA_TSTRING: key = lua_tolstring(L,-2,&sz); diff --git a/test/testbson.lua b/test/testbson.lua index 815ffdef..214d70cd 100644 --- a/test/testbson.lua +++ b/test/testbson.lua @@ -22,9 +22,9 @@ end local obj_a = { __data = { - [1] = 2, - [3] = 4, - [5] = 6, + ["1"] = 2, + ["3"] = 4, + ["5"] = 6, } } @@ -38,9 +38,9 @@ setmetatable( local obj_b = { __data = { - [7] = 8, - [9] = 10, - [11] = obj_a, + ["7"] = 8, + ["9"] = 10, + ["11"] = obj_a, } } From 2b5c5e3dd343f21f7ccc729d2a7fce73170a3518 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Fri, 14 Jul 2017 21:28:45 +0800 Subject: [PATCH 4/4] see pr #683 --- skynet-src/socket_server.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/skynet-src/socket_server.c b/skynet-src/socket_server.c index 3841f233..b40f20ba 100644 --- a/skynet-src/socket_server.c +++ b/skynet-src/socket_server.c @@ -1307,14 +1307,16 @@ socket_server_poll(struct socket_server *ss, struct socket_message * result, int int error; socklen_t len = sizeof(error); int code = getsockopt(s->fd, SOL_SOCKET, SO_ERROR, &error, &len); + const char * err = NULL; if (code < 0) { - result->data = strerror(errno); + err = strerror(errno); } else if (error != 0) { - result->data = strerror(error); + err = strerror(error); } else { - result->data = "Unknown error"; + err = "Unknown error"; } force_close(ss, s, result); + result->data = (char *)err; return SOCKET_ERR; } break;