From c9942deaa9b8c1e9bafd346f760be1fecd58a4c3 Mon Sep 17 00:00:00 2001 From: hong Date: Thu, 2 Aug 2018 11:37:55 +0800 Subject: [PATCH] =?UTF-8?q?queryname=E5=B9=B6=E5=8F=91=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E4=B9=B1=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当有1个以上的co进入queryname,后面的协程有在第1个以后某个的co先执行(第一个已经返回),导致cluster消息乱序 --- service/clusteragent.lua | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/service/clusteragent.lua b/service/clusteragent.lua index 04b14eab..b4af47e4 100644 --- a/service/clusteragent.lua +++ b/service/clusteragent.lua @@ -11,14 +11,29 @@ fd = tonumber(fd) local large_request = {} local register_name = {} +local inquery_name = {} setmetatable(register_name, { __index = function(self, name) - local addr = skynet.call(clusterd, "lua", "queryname", name:sub(2)) -- name must be '@xxxx' - if addr then - self[name] = addr + local waitco = inquery_name[name] + if waitco then + local co=coroutine.runnging() + table.insert(waitco, co) + skynet.wait(co) + return rawget(self, name) + else + waitco = {} + inquery_name[name] = waitco + local addr = skynet.call(clusterd, "lua", "queryname", name:sub(2)) -- name must be '@xxxx' + if addr then + self[name] = addr + end + inquery_name[name] = nil + for _, co in ipairs(waitco) do + skynet.wakeup(co) + end + return addr end - return addr end })