Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package common | |
import ( | |
"sync" | |
"testing" | |
) | |
func TestShardedLocks_ParallelLocksAll(t *testing.T) { | |
// no asserts | |
// ensures parallel LockAll does not fall into deadlock | |
count := 10 | |
sl := NewDefaultShardedLocks() | |
wg := new(sync.WaitGroup) | |
wg.Add(count) | |
for i := 0; i < count; i++ { | |
go func() { | |
defer wg.Done() | |
sl.LockAll() | |
sl.UnlockAll() | |
}() | |
} | |
wg.Wait() | |
} | |
func TestShardedLocks_ParallelRLocksAll(t *testing.T) { | |
// no asserts | |
// ensures parallel RLockAll does not fall into deadlock | |
count := 10 | |
sl := NewDefaultShardedLocks() | |
wg := new(sync.WaitGroup) | |
wg.Add(count) | |
for i := 0; i < count; i++ { | |
go func() { | |
defer wg.Done() | |
sl.RLockAll() | |
sl.RUnlockAll() | |
}() | |
} | |
wg.Wait() | |
} | |
func TestShardedLocks_ParallelLocksAllAndRLocksAll(t *testing.T) { | |
// no asserts | |
// ensures parallel LockAll + RLockAll does not fall into deadlock | |
count := 50 | |
sl := NewDefaultShardedLocks() | |
wg := new(sync.WaitGroup) | |
wg.Add(count) | |
for i := 0; i < count; i++ { | |
go func(i int) { | |
defer wg.Done() | |
if i%2 == 0 { | |
sl.LockAll() | |
sl.UnlockAll() | |
} else { | |
sl.RLockAll() | |
sl.RUnlockAll() | |
} | |
}(i) | |
} | |
wg.Wait() | |
} | |
func TestShardedLocks_MixedLocks(t *testing.T) { | |
// no asserts | |
// ensures parallel LockAll + RLockAll + Lock + RLock does not fall into deadlock | |
count := 1000 | |
sl := NewShardedLocks(10) | |
wg := new(sync.WaitGroup) | |
wg.Add(count) | |
for i := 0; i < count; i++ { | |
go func(i int) { | |
defer wg.Done() | |
id := uint64(i) | |
if i%5 == 0 { | |
if i%2 == 0 { | |
sl.LockAll() | |
sl.UnlockAll() | |
} else { | |
sl.RLockAll() | |
sl.RUnlockAll() | |
} | |
} else { | |
if i%2 == 0 { | |
sl.Lock(id) | |
sl.Unlock(id) | |
} else { | |
sl.RLock(id) | |
sl.RUnlock(id) | |
} | |
} | |
}(i) | |
} | |
wg.Wait() | |
} | |