test(pools): cover aliases of other sets in a shared lock table

The implementation review of the lock fixes found two gaps in the merge
test of lockObjects:

- Where the sets share one local table, it only tried an alias of the
  clean name's own set, so dropping the shared-table normalization of
  the lock domain still passed. It now tries an alias of another set in
  every mode; with that mutation the shared case times out.
- In a split distributed domain it probed readers before writers. The
  reader probe releases asynchronously and could hold off the writer
  probe right after it, so a missing alias read lock passed some runs.
  Writers are probed first now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Feng Ruohang <rh@vonng.com>
This commit is contained in:
Feng Ruohang
2026-11-06 19:41:32 +08:00
parent 3268fbea7e
commit 04c657d03f
+8 -8
View File
@@ -135,11 +135,9 @@ func TestLockObjectsMergesByResource(t *testing.T) {
t.Fatalf("no names with sameSet=%v", sameSet) t.Fatalf("no names with sameSet=%v", sameSet)
return "", "" return "", ""
} }
cases := []bool{true} // Where the sets share one table, an alias of another set still
if split { // names the same resource there.
cases = append(cases, false) for _, sameSet := range []bool{true, false} {
}
for _, sameSet := range cases {
clean, alias := pick(sameSet) clean, alias := pick(sameSet)
ctx, cancel := context.WithTimeout(t.Context(), 3*time.Second) ctx, cancel := context.WithTimeout(t.Context(), 3*time.Second)
start := time.Now() start := time.Now()
@@ -159,13 +157,15 @@ func TestLockObjectsMergesByResource(t *testing.T) {
} }
if split && !sameSet { if split && !sameSet {
// The alias's table holds the alias's read lock. // The alias's table holds the alias's read lock.
// Writers first: a reader probe's release is asynchronous
// and would hold off a writer probe right after it.
aliasSet := pool.getHashedSet(alias) aliasSet := pool.getHashedSet(alias)
if !ldTry(t, aliasSet.NewNSLock(bucket, alias), false) {
t.Errorf("%s: readers excluded in its own table", alias)
}
if ldTry(t, aliasSet.NewNSLock(bucket, alias), true) { if ldTry(t, aliasSet.NewNSLock(bucket, alias), true) {
t.Errorf("%s: writers admitted in its own table, the alias lock is missing", alias) t.Errorf("%s: writers admitted in its own table, the alias lock is missing", alias)
} }
if !ldTry(t, aliasSet.NewNSLock(bucket, alias), false) {
t.Errorf("%s: readers excluded in its own table", alias)
}
} }
unlock() unlock()
} }