tka: keep the CompactionDefaults alongside the other limits #6
@@ -106,23 +106,13 @@ func TestGroupPolicyReadLockClose(t *testing.T) {
|
|||||||
|
|
||||||
doWithCustomEnterLeaveFuncs(t, func(gpLock *PolicyLock) {
|
doWithCustomEnterLeaveFuncs(t, func(gpLock *PolicyLock) {
|
||||||
done := make(chan struct{})
|
done := make(chan struct{})
|
||||||
|
var lockErr error
|
||||||
go func() {
|
go func() {
|
||||||
defer close(done)
|
defer close(done)
|
||||||
|
lockErr = gpLock.Lock()
|
||||||
err := gpLock.Lock()
|
if lockErr == nil {
|
||||||
if err == nil {
|
|
||||||
defer gpLock.Unlock()
|
defer gpLock.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
// We closed gpLock before the enter function returned.
|
|
||||||
// (*PolicyLock).Lock is expected to fail.
|
|
||||||
if err == nil || !errors.Is(err, ErrInvalidLockState) {
|
|
||||||
t.Errorf("(*PolicyLock).Lock: got %v; want %v", err, ErrInvalidLockState)
|
|
||||||
}
|
|
||||||
// gpLock must not be held as Lock() failed.
|
|
||||||
if lockCnt := gpLock.lockCnt.Load(); lockCnt != 0 {
|
|
||||||
t.Errorf("lockCnt: got %v; want 0", lockCnt)
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
<-init
|
<-init
|
||||||
@@ -130,7 +120,22 @@ func TestGroupPolicyReadLockClose(t *testing.T) {
|
|||||||
if err := gpLock.Close(); err != nil {
|
if err := gpLock.Close(); err != nil {
|
||||||
t.Fatalf("(*PolicyLock).Close failed: %v", err)
|
t.Fatalf("(*PolicyLock).Close failed: %v", err)
|
||||||
}
|
}
|
||||||
|
// Wait for Lock to fully unwind before reading lockCnt.
|
||||||
|
// Otherwise we race with Close clearing the LSB:
|
||||||
|
// close(lk.closing) wakes lockSlow's select, whose defer
|
||||||
|
// runs Add(-2) on lockCnt before Close completes its CAS,
|
||||||
|
// briefly leaving lockCnt at 1 instead of 0.
|
||||||
<-done
|
<-done
|
||||||
|
|
||||||
|
// We closed gpLock before the enter function returned.
|
||||||
|
// (*PolicyLock).Lock is expected to fail.
|
||||||
|
if lockErr == nil || !errors.Is(lockErr, ErrInvalidLockState) {
|
||||||
|
t.Errorf("(*PolicyLock).Lock: got %v; want %v", lockErr, ErrInvalidLockState)
|
||||||
|
}
|
||||||
|
// gpLock must not be held as Lock() failed.
|
||||||
|
if lockCnt := gpLock.lockCnt.Load(); lockCnt != 0 {
|
||||||
|
t.Errorf("lockCnt: got %v; want 0", lockCnt)
|
||||||
|
}
|
||||||
}, enter, leave)
|
}, enter, leave)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user