diff --git a/lualib/skynet/datasheet/builder.lua b/lualib/skynet/datasheet/builder.lua index f3ffdf2a..ed2b7d47 100644 --- a/lualib/skynet/datasheet/builder.lua +++ b/lualib/skynet/datasheet/builder.lua @@ -80,6 +80,24 @@ local function releasehandle(handle) end end +local function register_collector(name) + local function collect() + local m = dataset[name].monitor + local i = 1 + while m[i] do + if not m[i] "TEST" then + local n = #m + m[i] = m[n] + m[n] = nil + else + i = i + 1 + end + end + skynet.timeout(10 * 60 * 100, collect) -- 10 mins + end + collect() +end + -- from builder, create or update handle function datasheet.update(name, handle) local t = dataset[name] @@ -88,6 +106,7 @@ function datasheet.update(name, handle) t = { handle = handle, monitor = {} } dataset[name] = t handles[handle] = { ref = 1, name = name } + register_collector(name) else t.handle = handle -- report update to customers diff --git a/test/testdatasheet.lua b/test/testdatasheet.lua index 5b63a268..53c748ca 100644 --- a/test/testdatasheet.lua +++ b/test/testdatasheet.lua @@ -1,6 +1,6 @@ local skynet = require "skynet" -local builder = require "skynet.datasheet.builder" -local datasheet = require "skynet.datasheet" + +local mode = ... local function dump(t, prefix) for k,v in pairs(t) do @@ -11,8 +11,26 @@ local function dump(t, prefix) end end +if mode == "child" then + + local datasheet = require "skynet.datasheet" + + skynet.start(function() + local t = datasheet.query("foobar") + dump(t, "[CHILD]") + + skynet.sleep(100) + skynet.exit() + end) + +else + +local builder = require "skynet.datasheet.builder" +local datasheet = require "skynet.datasheet" + skynet.start(function() builder.new("foobar", {a = 1, b = 2 , c = {3} }) + skynet.newservice(SERVICE_NAME, "child") local t = datasheet.query "foobar" local c = t.c dump(t, "[1]") @@ -26,3 +44,5 @@ skynet.start(function() skynet.sleep(100) dump(t, "[3]") end) + +end \ No newline at end of file