From 51ef2838876af5497fbacfe80ee62ba83bd954f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=A3=8E?= Date: Thu, 30 Aug 2012 16:30:52 +0800 Subject: [PATCH] bugfix : connection --- connection/lua-socket.c | 2 ++ connection/main.c | 11 ++++++++--- lualib/redis.lua | 4 ++-- lualib/socket.lua | 4 +++- service-src/service_broker.c | 7 +++---- service/launcher.lua | 2 +- service/redis-cli.lua | 9 ++++++++- service/redis-mgr.lua | 15 +++++++-------- 8 files changed, 34 insertions(+), 20 deletions(-) diff --git a/connection/lua-socket.c b/connection/lua-socket.c index 396e09d2..3021b870 100644 --- a/connection/lua-socket.c +++ b/connection/lua-socket.c @@ -65,6 +65,7 @@ _write(lua_State *L) { case EINTR: continue; } + return 0; } assert(err == sz); return 0; @@ -104,6 +105,7 @@ _writeblock(lua_State *L) { case EINTR: continue; } + return 0; } assert(err == sz +2); return 0; diff --git a/connection/main.c b/connection/main.c index 5b9d4ad8..8edaa8c5 100644 --- a/connection/main.c +++ b/connection/main.c @@ -95,6 +95,7 @@ _del(struct connection_server * server, int fd) { static void _poll(struct connection_server * server) { int timeout = 100; + void * buffer = NULL; for (;;) { struct connection * c = connection_poll(server->pool, timeout); if (c==NULL) { @@ -103,7 +104,9 @@ _poll(struct connection_server * server) { } timeout = 0; - void * buffer = malloc(DEFAULT_BUFFER_SIZE); + if (buffer == NULL) { + buffer = malloc(DEFAULT_BUFFER_SIZE); + } int size = recv(c->fd, buffer, DEFAULT_BUFFER_SIZE, MSG_DONTWAIT); if (size < 0) { @@ -112,9 +115,11 @@ _poll(struct connection_server * server) { if (size == 0) { connection_del(server->pool, c->fd); free(buffer); + buffer = NULL; skynet_send(server->ctx, 0, c->address, SESSION_CLIENT, NULL, 0, DONTCOPY); } else { skynet_send(server->ctx, 0, c->address, SESSION_CLIENT, buffer, size, DONTCOPY); + buffer = NULL; } } } @@ -137,8 +142,8 @@ _main(struct skynet_context * ctx, void * ud, int session, uint32_t source, cons char addr [addr_sz]; memcpy(addr, endptr+1, addr_sz-1); addr[addr_sz-1] = '\0'; - uint32_t address = strtoul(addr, NULL, 16); - if (address != 0) { + uint32_t address = strtoul(addr+1, NULL, 16); + if (address == 0) { skynet_error(ctx, "[connection] Invalid ADD command from %x (session = %d)", source, session); return 0; } diff --git a/lualib/redis.lua b/lualib/redis.lua index 96da61cc..688b9a2d 100644 --- a/lualib/redis.lua +++ b/lualib/redis.lua @@ -30,8 +30,8 @@ local meta = { } function redis.connect(dbname) - local handle = skynet.call(".redis-manager",dbname) - assert(handle ~= "") + local handle = skynet.call(".redis-manager",skynet.unpack, skynet.pack(dbname)) + assert(handle ~= nil) return setmetatable({ __handle = handle } , meta) end diff --git a/lualib/socket.lua b/lualib/socket.lua index 72c8eb1c..7453b162 100644 --- a/lualib/socket.lua +++ b/lualib/socket.lua @@ -12,7 +12,9 @@ function socket.connect(addr) if fd == nil then return true end - skynet.send(".connection","ADD "..fd.." "..skynet.self()) + print("connect to " .. addr) + local command = "ADD "..fd.." ".. skynet.address(skynet.self()) + skynet.send(".connection", command ) object = c.new() end diff --git a/service-src/service_broker.c b/service-src/service_broker.c index 86c47c1e..2c2528fd 100644 --- a/service-src/service_broker.c +++ b/service-src/service_broker.c @@ -56,10 +56,9 @@ _cb(struct skynet_context * context, void * ud, int session, uint32_t source, co if (b->init < DEFAULT_NUMBER) { if (source != b->launcher) return 0; - assert(sz == 9); - char addr[10]; - memcpy(addr, msg, 9); - addr[9] = '\0'; + char addr[sz+1]; + memcpy(addr, msg, sz); + addr[sz] = '\0'; uint32_t address = strtoul(addr+1, NULL, 16); assert(address != 0); _init(b, session, address); diff --git a/service/launcher.lua b/service/launcher.lua index d5d703f6..d34771f0 100644 --- a/service/launcher.lua +++ b/service/launcher.lua @@ -9,7 +9,7 @@ skynet.dispatch(function(msg, sz , session, address) -- init notice local reply = instance[address] if reply then - skynet.send(reply[2] , reply[1], address) + skynet.send(reply[2] , reply[1], skynet.address(address)) instance[address] = nil end else diff --git a/service/redis-cli.lua b/service/redis-cli.lua index 72752bd2..83ad42ec 100644 --- a/service/redis-cli.lua +++ b/service/redis-cli.lua @@ -1,5 +1,6 @@ local skynet = require "skynet" local socket = require "socket" +local int64 = require "int64" local string = string local table = table local tonumber = tonumber @@ -10,6 +11,12 @@ local redis_server, redis_db = ... local function compose_message(msg) local lines = { "*" .. #msg } for _,v in ipairs(msg) do + local t = type(v) + if t == "number" then + v = tostring(v) + elseif t == "userdata" then + v = int64.tostring(int64.new(v),10) + end table.insert(lines,"$"..#v) table.insert(lines,v) end @@ -101,6 +108,7 @@ redcmd[45] = function(data) -- '-' end redcmd[58] = function(data) -- ':' + -- todo: return string later response(true, tonumber(data)) end @@ -117,7 +125,6 @@ end local function init() while socket.connect(redis_server) do - print("Connect failed : "..redis_server) skynet.sleep(1000) end if redis_db then diff --git a/service/redis-mgr.lua b/service/redis-mgr.lua index e27c653e..6ce98fce 100644 --- a/service/redis-mgr.lua +++ b/service/redis-mgr.lua @@ -1,27 +1,26 @@ local skynet = require "skynet" local log = require "log" +local config = require "config" -local name = { - main = "127.0.0.1:6379", -} - +local redis_conf = skynet.getenv "redis" +local name = config (redis_conf) local connection = {} skynet.dispatch(function(msg, sz , session, from) - local dbname = skynet.tostring(msg,sz) + local dbname = skynet.unpack(msg,sz) if connection[dbname] then - skynet.ret(connection[dbname]) + skynet.ret(skynet.pack(connection[dbname])) return end if name[dbname] == nil then log.Error("Invalid db name : "..dbname) - skynet.ret("") + skynet.ret(skynet.pack(nil)) return end local redis_cli = skynet.launch("snlua", "redis-cli", name[dbname]) connection[dbname] = redis_cli - skynet.ret(redis_cli) + skynet.ret(skynet.pack(redis_cli)) end) skynet.register ".redis-manager"