From 91174dc4e70afee45e7b86ca5e5637c2fef9aa87 Mon Sep 17 00:00:00 2001 From: Burak Sezer Date: Tue, 12 Jan 2021 22:01:11 +0300 Subject: [PATCH] feat: add map of bootstrapped cluster members --- stats.go | 13 +++++++++++-- stats/stats.go | 1 + stats_test.go | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/stats.go b/stats.go index 833c7d03..1796fdb7 100644 --- a/stats.go +++ b/stats.go @@ -18,6 +18,7 @@ import ( "os" "runtime" + "github.com/buraksezer/olric/internal/discovery" "github.com/buraksezer/olric/internal/protocol" "github.com/buraksezer/olric/stats" "github.com/vmihailenco/msgpack" @@ -38,10 +39,18 @@ func (db *Olric) stats() stats.Stats { NumGoroutine: runtime.NumGoroutine(), MemStats: *mem, }, - Partitions: make(map[uint64]stats.Partition), - Backups: make(map[uint64]stats.Partition), + Partitions: make(map[uint64]stats.Partition), + Backups: make(map[uint64]stats.Partition), + ClusterMembers: make(map[uint64]discovery.Member), } + db.members.mtx.RLock() + for id, member := range db.members.m { + // List of bootstrapped cluster members + s.ClusterMembers[id] = member + } + db.members.mtx.RUnlock() + collect := func(partID uint64, part *partition) stats.Partition { owners := part.loadOwners() p := stats.Partition{ diff --git a/stats/stats.go b/stats/stats.go index c1008d98..e75c31be 100644 --- a/stats/stats.go +++ b/stats/stats.go @@ -72,4 +72,5 @@ type Stats struct { ClusterCoordinator discovery.Member Partitions map[uint64]Partition Backups map[uint64]Partition + ClusterMembers map[uint64]discovery.Member } diff --git a/stats_test.go b/stats_test.go index 4ef859be..afc01ffb 100644 --- a/stats_test.go +++ b/stats_test.go @@ -16,7 +16,10 @@ package olric import ( "context" + "reflect" "testing" + + "github.com/buraksezer/olric/internal/discovery" ) func TestStatsStandalone(t *testing.T) { @@ -51,6 +54,17 @@ func TestStatsStandalone(t *testing.T) { t.Fatalf("Expected cluster coordinator: %v. Got: %v", db.this, s.ClusterCoordinator) } + if len(s.ClusterMembers) != 1 { + t.Fatalf("Expected length of ClusterMembers map: 1. Got: %d", len(s.ClusterMembers)) + } + m, ok := s.ClusterMembers[s.ClusterCoordinator.ID] + if !ok { + t.Fatalf("Member could not be found in ClusterMembers") + } + if !reflect.DeepEqual(m, s.ClusterCoordinator) { + t.Fatalf("Different member for the same ID") + } + var total int for partID, part := range s.Partitions { total += part.Length @@ -140,4 +154,24 @@ func TestStatsCluster(t *testing.T) { t.Fatalf("Expected cluster coordinator: %v. Got: %v", db1.this, s.ClusterCoordinator) } }) + + t.Run("check ClusterMembers", func(t *testing.T) { + s, err := db2.Stats() + if err != nil { + t.Fatalf("Expected nil. Got: %v", err) + } + if len(s.ClusterMembers) != 2 { + t.Fatalf("Expected length of ClusterMembers map: 2. Got: %d", len(s.ClusterMembers)) + } + + for _, member := range []discovery.Member{db1.this, db2.this} { + m, ok := s.ClusterMembers[member.ID] + if !ok { + t.Fatalf("Member: %s could not be found in ClusterMembers", member) + } + if !reflect.DeepEqual(member, m) { + t.Fatalf("Different member for the same ID: %s", member) + } + } + }) }