From 53089782bd89ed9a8187ca4f995bc625c2382e6a Mon Sep 17 00:00:00 2001 From: Saeid Aghapour Date: Thu, 6 Jul 2023 14:09:15 +0330 Subject: [PATCH] removePeer function implementation --- cluster/region/region.go | 11 ++++++++++- cluster/region/region_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/cluster/region/region.go b/cluster/region/region.go index 6bf27ae7..692775d3 100644 --- a/cluster/region/region.go +++ b/cluster/region/region.go @@ -1,6 +1,7 @@ package region import ( + "errors" "github.com/ByteStorage/FlyDB/engine" "github.com/hashicorp/raft" "sync" @@ -97,7 +98,15 @@ func (r *region) AddPeer(peer string) error { } func (r *region) RemovePeer(peer string) error { - panic("implement me") + r.mu.RLock() + defer r.mu.RUnlock() + for i := 0; i < len(r.peers); i++ { + if r.peers[i] == peer { + r.peers = append(r.peers[:i], r.peers[i+1:]...) + return r.raft.DemoteVoter(raft.ServerID(peer), 0, 0).Error() + } + } + return errors.New("the specified peer does not exist") } func (r *region) GetSize() int64 { diff --git a/cluster/region/region_test.go b/cluster/region/region_test.go index c0201cf8..66d4bdf3 100644 --- a/cluster/region/region_test.go +++ b/cluster/region/region_test.go @@ -121,3 +121,32 @@ func TestRegion_GetSize(t *testing.T) { size := region.GetSize() assert.Equal(t, int64(100), size) } + +func TestRegion_RemovePeer(t *testing.T) { + // Create a test region instance + region := NewTestRegion() + _ = []struct { + name string + peers []string + peerToAdd string + expectedPeers []string + expectError bool + }{ + { + name: "remove a peer", + peers: region.GetPeers(), + peerToAdd: "peer2", + expectedPeers: []string{"peer1"}, + expectError: false, + }, + { + name: "remove a non existing peer", + peers: region.GetPeers(), + peerToAdd: "peer3", + expectedPeers: []string{"peer1", "peer2"}, + expectError: true, + }, + } + destroyRegion(region) + +}