From cd76a5bc57c991aef76cf43595315d64e11b7cf0 Mon Sep 17 00:00:00 2001 From: Igor Zolotarev Date: Thu, 23 Nov 2023 18:08:23 +0300 Subject: [PATCH] Add members.remove function --- membership.lua | 26 +++++++++++++++++++++++++- membership/members.lua | 7 +++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/membership.lua b/membership.lua index b640737..be08192 100755 --- a/membership.lua +++ b/membership.lua @@ -478,13 +478,17 @@ local function _protocol_step() local ack_data = wait_ack(uri, loop_now, opts.ACK_TIMEOUT_SECONDS * 1.0e6) if ack_data ~= nil then local member = members.get(uri) + if member == nil then + return + end -- calculate time difference between local time and member time local delta = _get_clock_delta(ack_data) members.set(uri, member.status, member.incarnation, { clock_delta = delta }) -- update timstamp return end end - if members.get(uri).status >= opts.DEAD then + local member = members.get(uri) + if member ~= nil and member.status >= opts.DEAD then -- still dead, do nothing return end @@ -509,6 +513,9 @@ local function _protocol_step() end if sent_indirect > 0 and ack_data ~= nil then local member = members.get(uri) + if member == nil then + return + end -- calculate time difference between local time and member time local delta = _get_clock_delta(ack_data) members.set(uri, member.status, member.incarnation, { clock_delta = delta }) @@ -529,9 +536,11 @@ local function _protocol_step() end end +local protocol_step_in_progress = fiber.cond() local function protocol_step() local t1 = fiber.clock() local ok, res = xpcall(_protocol_step, debug.traceback) + protocol_step_in_progress:signal() fiber.testcancel() if not ok then @@ -929,6 +938,20 @@ local function set_payload(key, value) return true end +--- Remove a member. +-- @function remove_member +-- @tparam uri string +local function remove_member(uri) + checks('string') + protocol_step_in_progress:wait(60) + local member = members.get(uri) + if member == nil then + return + end + + members.remove(uri) +end + do -- finish module loading opts.after_reload() events.after_reload() @@ -949,6 +972,7 @@ return { probe_uri = probe_uri, add_member = add_member, get_member = get_member, + remove_member = remove_member, set_payload = set_payload, --- Encryption Functions. diff --git a/membership/members.lua b/membership/members.lua index b102ed5..510c9c1 100644 --- a/membership/members.lua +++ b/membership/members.lua @@ -117,4 +117,11 @@ function members.count() return count end +function members.remove(uri) + checks('string') + + _all_members[uri] = nil + rawget(_G, '__membership_stash')['members._all_members'][uri] = nil +end + return members