From a074cd79bd8ee52083242877d27a9ce69a59d55b Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Mon, 13 Oct 2014 20:58:41 +0800 Subject: [PATCH 1/3] add nodelay option in socketchannel --- lualib/mongo.lua | 1 + lualib/redis.lua | 2 ++ lualib/socketchannel.lua | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/lualib/mongo.lua b/lualib/mongo.lua index b1e87ca7..458e1a6c 100644 --- a/lualib/mongo.lua +++ b/lualib/mongo.lua @@ -129,6 +129,7 @@ function mongo.client( conf ) response = dispatch_reply, auth = mongo_auth(obj), backup = backup, + nodelay = true, } setmetatable(obj, client_meta) obj.__sock:connect(true) -- try connect only once diff --git a/lualib/redis.lua b/lualib/redis.lua index cd9f43f4..87069e28 100644 --- a/lualib/redis.lua +++ b/lualib/redis.lua @@ -84,6 +84,7 @@ function redis.connect(db_conf) host = db_conf.host, port = db_conf.port or 6379, auth = redis_login(db_conf.auth, db_conf.db), + nodelay = true, } -- try connect first only once channel:connect(true) @@ -199,6 +200,7 @@ function redis.watch(db_conf) host = db_conf.host, port = db_conf.port or 6379, auth = watch_login(obj, db_conf.auth), + nodelay = true, } obj.__sock = channel diff --git a/lualib/socketchannel.lua b/lualib/socketchannel.lua index 1086cd79..e8207489 100644 --- a/lualib/socketchannel.lua +++ b/lualib/socketchannel.lua @@ -1,5 +1,6 @@ local skynet = require "skynet" local socket = require "socket" +local socketdriver = require "socketdriver" -- channel support auto reconnect , and capture socket error in request/response transaction -- { host = "", port = , auth = function(so) , response = function(so) session, data } @@ -37,6 +38,7 @@ function socket_channel.channel(desc) __sock = false, __closed = false, __authcoroutine = false, + __nodelay = desc.nodelay, } return setmetatable(c, channel_meta) @@ -186,6 +188,9 @@ local function connect_once(self) return false end end + if self.__nodelay then + socketdriver.nodelay(fd) + end self.__sock = setmetatable( {fd} , channel_socket_meta ) skynet.fork(dispatch_function(self), self) From b39fc6ee23f26a4e2f0183ef8493c42e54a73e24 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Tue, 14 Oct 2014 18:34:04 +0800 Subject: [PATCH 2/3] update sproto for bugfix --- lualib-src/sproto/sproto.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/lualib-src/sproto/sproto.c b/lualib-src/sproto/sproto.c index 0f519d14..ca43cd9b 100644 --- a/lualib-src/sproto/sproto.c +++ b/lualib-src/sproto/sproto.c @@ -1076,9 +1076,15 @@ pack_seg(const uint8_t *src, uint8_t * buffer, int sz, int n) { static inline void write_ff(const uint8_t * src, uint8_t * des, int n) { + int i; + int align8_n = (n+7)&(~7); + des[0] = 0xff; - des[1] = n-1; - memcpy(des+2, src, n * 8); + des[1] = align8_n/8 - 1; + memcpy(des+2, src, n); + for(i=0; i< align8_n-n; i++){ + des[n+2+i] = 0; + } } int @@ -1092,6 +1098,7 @@ sproto_pack(const void * srcv, int srcsz, void * bufferv, int bufsz) { const uint8_t * src = srcv; uint8_t * buffer = bufferv; for (i=0;i 0) { int j; @@ -1101,7 +1108,7 @@ sproto_pack(const void * srcv, int srcsz, void * bufferv, int bufsz) { } src = tmp; } - int n = pack_seg(src, buffer, bufsz, ff_n); + n = pack_seg(src, buffer, bufsz, ff_n); bufsz -= n; if (n == 10) { // first FF @@ -1112,14 +1119,14 @@ sproto_pack(const void * srcv, int srcsz, void * bufferv, int bufsz) { ++ff_n; if (ff_n == 256) { if (bufsz >= 0) { - write_ff(ff_srcstart, ff_desstart, 256); + write_ff(ff_srcstart, ff_desstart, 256*8); } ff_n = 0; } } else { if (ff_n > 0) { if (bufsz >= 0) { - write_ff(ff_srcstart, ff_desstart, ff_n); + write_ff(ff_srcstart, ff_desstart, ff_n*8); } ff_n = 0; } @@ -1128,8 +1135,11 @@ sproto_pack(const void * srcv, int srcsz, void * bufferv, int bufsz) { buffer += n; size += n; } - if (ff_n > 0 && bufsz >= 0) { - write_ff(ff_srcstart, ff_desstart, ff_n); + if(bufsz >= 0){ + if(ff_n == 1) + write_ff(ff_srcstart, ff_desstart, 8); + else if (ff_n > 1) + write_ff(ff_srcstart, ff_desstart, srcsz - (intptr_t)(ff_srcstart - (const uint8_t*)srcv)); } return size; } @@ -1144,10 +1154,11 @@ sproto_unpack(const void * srcv, int srcsz, void * bufferv, int bufsz) { --srcsz; ++src; if (header == 0xff) { + int n; if (srcsz < 0) { return -1; } - int n = (src[0] + 1) * 8; + n = (src[0] + 1) * 8; if (srcsz < n + 1) return -1; srcsz -= n + 1; From 1ef5430e0ad0ec45ce1d7e9d9b40bf3eb25c21eb Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Wed, 15 Oct 2014 10:16:28 +0800 Subject: [PATCH 3/3] should not copy the ending 0 --- skynet-src/skynet_socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skynet-src/skynet_socket.c b/skynet-src/skynet_socket.c index e9af5d26..573b9f0e 100644 --- a/skynet-src/skynet_socket.c +++ b/skynet-src/skynet_socket.c @@ -47,7 +47,7 @@ forward_message(int type, bool padding, struct socket_message * result) { sm->ud = result->ud; if (padding) { sm->buffer = NULL; - strcpy((char*)(sm+1), result->data); + memcpy(sm+1, result->data, sz - sizeof(*sm)); } else { sm->buffer = result->data; }