From d481bcdc7746161efb47a20760c920196c73eece Mon Sep 17 00:00:00 2001 From: matst80 Date: Wed, 13 Nov 2024 09:52:47 +0100 Subject: [PATCH] testing locks --- pool-server.go | 2 ++ synced-pool.go | 23 ++++++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/pool-server.go b/pool-server.go index 1b75cd9..007c5b1 100644 --- a/pool-server.go +++ b/pool-server.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "log" "net/http" "strconv" @@ -22,6 +23,7 @@ func NewPoolServer(pool GrainPool, pod_name string) *PoolServer { func (s *PoolServer) HandleGet(w http.ResponseWriter, r *http.Request) error { id := r.PathValue("id") + log.Printf("Getting cart %s\n", id) data, err := s.pool.Get(ToCartId(id)) if err != nil { return err diff --git a/synced-pool.go b/synced-pool.go index e364b7e..03c84d2 100644 --- a/synced-pool.go +++ b/synced-pool.go @@ -319,11 +319,23 @@ func (p *SyncedPool) Negotiate() { } +func (p *SyncedPool) GetHealthyRemotes() []*RemoteHost { + p.mu.RLock() + defer p.mu.RUnlock() + remotes := make([]*RemoteHost, 0, len(p.remotes)) + for _, r := range p.remotes { + if r.IsHealthy() { + remotes = append(remotes, r) + } + } + return remotes +} + func (p *SyncedPool) RequestOwnership(id CartId) error { ok := 0 all := 0 - p.mu.RLock() - for _, r := range p.remotes { + + for _, r := range p.GetHealthyRemotes() { if !r.IsHealthy() { continue } @@ -342,7 +354,7 @@ func (p *SyncedPool) RequestOwnership(id CartId) error { } ok++ } - p.mu.RUnlock() + if ok == 0 && all > 0 { p.removeLocalGrain(id) return fmt.Errorf("no remotes confirmed change") @@ -361,8 +373,7 @@ func (p *SyncedPool) removeLocalGrain(id CartId) { } func (p *SyncedPool) AddRemote(host string) error { - p.mu.Lock() - defer p.mu.Unlock() + _, hasHost := p.remotes[host] if host == "" || p.IsKnown(host) || hasHost { return nil @@ -378,7 +389,9 @@ func (p *SyncedPool) AddRemote(host string) error { MissedPings: 0, Host: host, } + p.mu.Lock() p.remotes[host] = &remote + p.mu.Unlock() go func() { <-remote.PersistentConnection.Died log.Printf("Removing host, remote died %s", host)