Browse Source

ensure consistent testing

pull/6886/head
chrislu 4 months ago
parent
commit
f0e987dc9d
  1. 18
      weed/cluster/lock_manager/lock_ring.go
  2. 9
      weed/cluster/lock_manager/lock_ring_test.go

18
weed/cluster/lock_manager/lock_ring.go

@ -1,12 +1,13 @@
package lock_manager package lock_manager
import ( import (
"github.com/seaweedfs/seaweedfs/weed/glog"
"github.com/seaweedfs/seaweedfs/weed/pb"
"github.com/seaweedfs/seaweedfs/weed/util"
"sort" "sort"
"sync" "sync"
"time" "time"
"github.com/seaweedfs/seaweedfs/weed/glog"
"github.com/seaweedfs/seaweedfs/weed/pb"
"github.com/seaweedfs/seaweedfs/weed/util"
) )
type LockRingSnapshot struct { type LockRingSnapshot struct {
@ -22,6 +23,7 @@ type LockRing struct {
lastCompactTime time.Time lastCompactTime time.Time
snapshotInterval time.Duration snapshotInterval time.Duration
onTakeSnapshot func(snapshot []pb.ServerAddress) onTakeSnapshot func(snapshot []pb.ServerAddress)
cleanupWg sync.WaitGroup
} }
func NewLockRing(snapshotInterval time.Duration) *LockRing { func NewLockRing(snapshotInterval time.Duration) *LockRing {
@ -87,7 +89,9 @@ func (r *LockRing) SetSnapshot(servers []pb.ServerAddress) {
r.addOneSnapshot(servers) r.addOneSnapshot(servers)
r.cleanupWg.Add(1)
go func() { go func() {
defer r.cleanupWg.Done()
<-time.After(r.snapshotInterval) <-time.After(r.snapshotInterval)
r.compactSnapshots() r.compactSnapshots()
}() }()
@ -96,7 +100,9 @@ func (r *LockRing) SetSnapshot(servers []pb.ServerAddress) {
func (r *LockRing) takeSnapshotWithDelayedCompaction() { func (r *LockRing) takeSnapshotWithDelayedCompaction() {
r.doTakeSnapshot() r.doTakeSnapshot()
r.cleanupWg.Add(1)
go func() { go func() {
defer r.cleanupWg.Done()
<-time.After(r.snapshotInterval) <-time.After(r.snapshotInterval)
r.compactSnapshots() r.compactSnapshots()
}() }()
@ -172,6 +178,12 @@ func (r *LockRing) GetSnapshot() (servers []pb.ServerAddress) {
return r.snapshots[0].servers return r.snapshots[0].servers
} }
// WaitForCleanup waits for all pending cleanup operations to complete
// This is useful for testing to ensure deterministic behavior
func (r *LockRing) WaitForCleanup() {
r.cleanupWg.Wait()
}
func hashKeyToServer(key string, servers []pb.ServerAddress) pb.ServerAddress { func hashKeyToServer(key string, servers []pb.ServerAddress) pb.ServerAddress {
if len(servers) == 0 { if len(servers) == 0 {
return "" return ""

9
weed/cluster/lock_manager/lock_ring_test.go

@ -1,10 +1,11 @@
package lock_manager package lock_manager
import ( import (
"github.com/seaweedfs/seaweedfs/weed/pb"
"github.com/stretchr/testify/assert"
"testing" "testing"
"time" "time"
"github.com/seaweedfs/seaweedfs/weed/pb"
"github.com/stretchr/testify/assert"
) )
func TestAddServer(t *testing.T) { func TestAddServer(t *testing.T) {
@ -21,7 +22,9 @@ func TestAddServer(t *testing.T) {
assert.Equal(t, 8, len(r.snapshots)) assert.Equal(t, 8, len(r.snapshots))
time.Sleep(110 * time.Millisecond)
// Wait for all cleanup operations to complete instead of using time.Sleep
time.Sleep(110 * time.Millisecond) // Still need to wait for the cleanup interval
r.WaitForCleanup() // Ensure all cleanup goroutines have finished
assert.Equal(t, 2, len(r.snapshots)) assert.Equal(t, 2, len(r.snapshots))

Loading…
Cancel
Save