From f110b51290dbb5222ef74363aa6f67d791e2b86d Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Wed, 17 Oct 2018 14:54:44 +0800 Subject: [PATCH] add socketchannel.overload --- lualib/skynet/db/mongo.lua | 1 + lualib/skynet/db/mysql.lua | 14 +++----------- lualib/skynet/db/redis.lua | 1 + lualib/skynet/socketchannel.lua | 28 ++++++++++++++++++++++++++++ 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/lualib/skynet/db/mongo.lua b/lualib/skynet/db/mongo.lua index e020ebcb..441b74bf 100644 --- a/lualib/skynet/db/mongo.lua +++ b/lualib/skynet/db/mongo.lua @@ -173,6 +173,7 @@ function mongo.client( conf ) auth = mongo_auth(obj), backup = backup, nodelay = true, + overload = conf.overload, } setmetatable(obj, client_meta) obj.__sock:connect(true) -- try connect only once diff --git a/lualib/skynet/db/mysql.lua b/lualib/skynet/db/mysql.lua index f08995b0..606c7efa 100644 --- a/lualib/skynet/db/mysql.lua +++ b/lualib/skynet/db/mysql.lua @@ -21,26 +21,17 @@ local sha1= crypt.sha1 local setmetatable = setmetatable local error = error local tonumber = tonumber -local new_tab = function (narr, nrec) return {} end +local new_tab = function (narr, nrec) return {} end -local _M = { _VERSION = '0.13' } +local _M = { _VERSION = '0.14' } -- constants -local STATE_CONNECTED = 1 -local STATE_COMMAND_SENT = 2 - local COM_QUERY = 0x03 - local SERVER_MORE_RESULTS_EXISTS = 8 --- 16MB - 1, the default max allowed packet size used by libmysqlclient -local FULL_PACKET_SIZE = 16777215 - - local mt = { __index = _M } - -- mysql field value type converters local converters = new_tab(0, 8) @@ -640,6 +631,7 @@ function _M.connect(opts) host = opts.host, port = opts.port or 3306, auth = _mysql_login(self,user,password,database,opts.on_connect), + overload = opts.overload, } self.sockchannel = channel -- try connect first only once diff --git a/lualib/skynet/db/redis.lua b/lualib/skynet/db/redis.lua index e838a978..37aeb00e 100644 --- a/lualib/skynet/db/redis.lua +++ b/lualib/skynet/db/redis.lua @@ -143,6 +143,7 @@ function redis.connect(db_conf) port = db_conf.port or 6379, auth = redis_login(db_conf.auth, db_conf.db), nodelay = true, + overload = db_conf.overload, } -- try connect first only once channel:connect(true) diff --git a/lualib/skynet/socketchannel.lua b/lualib/skynet/socketchannel.lua index 737f0926..2fbf08af 100644 --- a/lualib/skynet/socketchannel.lua +++ b/lualib/skynet/socketchannel.lua @@ -39,6 +39,8 @@ function socket_channel.channel(desc) __closed = false, __authcoroutine = false, __nodelay = desc.nodelay, + __overload_notify = desc.overload, + __overload = false, } return setmetatable(c, channel_meta) @@ -246,6 +248,32 @@ local function connect_once(self) socketdriver.nodelay(fd) end + -- register overload warning + + local overload = self.__overload_notify + if overload then + local function overload_trigger(id, size) + if id == self.__sock[1] then + if size == 0 then + if self.__overload then + self.__overload = false + overload(false) + end + else + if not self.__overload then + self.__overload = true + overload(true) + else + skynet.error(string.format("WARNING: %d K bytes need to send out (fd = %d %s:%s)", size, id, self.__host, self.__port)) + end + end + end + end + + skynet.fork(overload_trigger, fd, 0) + socket.warning(fd, overload_trigger) + end + while self.__dispatch_thread do -- wait for dispatch thread exit skynet.yield()