Skip to content

Commit 77fcbcd

Browse files
Add mark_left function
1 parent f5b67f0 commit 77fcbcd

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,18 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
66

77
## [Unreleased]
88

9+
### Added
10+
11+
- `mark_left` function to mark removed members as `left`.
12+
913
## [2.4.5] - 2024-06-24
1014

1115
### Fixed
1216

1317
- Invalid events parsing.
1418

1519
## [2.4.4] - 2024-04-09
20+
1621
### Fixed
1722

1823
- Invalid payload parsing in anti entropy step.

membership.lua

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,39 @@ local function leave()
736736
return true
737737
end
738738

739+
--- Forcefully send leave message about an instance.
740+
-- @function mark_left
741+
-- @treturn boolean
742+
-- `true` if call succeeds,
743+
-- `false` if member has already left.
744+
local function mark_left(uri_to_leave)
745+
if _sock == nil then
746+
return false
747+
end
748+
749+
-- Perform artificial events.generate() and instantly send it
750+
local myself = members.get(uri_to_leave)
751+
if not myself then
752+
return false
753+
end
754+
local event = events.pack({
755+
uri = uri_to_leave,
756+
status = opts.LEFT,
757+
incarnation = myself.incarnation,
758+
ttl = members.count(),
759+
})
760+
local msg_msgpacked = msgpack.encode({uri_to_leave, 'LEAVE', msgpack.NULL, {event}})
761+
local msg_encrypted = opts.encrypt(msg_msgpacked)
762+
for _, uri in ipairs(members.filter_excluding('unhealthy', uri_to_leave)) do
763+
local addr = resolve(uri)
764+
if addr then
765+
_sock:sendto(addr.host, addr.port, msg_encrypted)
766+
end
767+
end
768+
769+
return true
770+
end
771+
739772
--- Member data structure.
740773
-- A member is represented by the table with the following fields:
741774
--
@@ -984,6 +1017,7 @@ end
9841017
return {
9851018
init = init,
9861019
leave = leave,
1020+
mark_left = mark_left,
9871021
members = get_members,
9881022
broadcast = broadcast,
9891023
pairs = function() return pairs(get_members()) end,

0 commit comments

Comments
 (0)