Skip to content

Commit 4b848a5

Browse files
authored
Merge pull request kubernetes#130863 from serathius/watchcache-negative-RV-consistent
Extend tests for negative RV with consistent reads
2 parents 8312d8e + 6d21d8f commit 4b848a5

File tree

1 file changed

+34
-10
lines changed

1 file changed

+34
-10
lines changed

staging/src/k8s.io/apiserver/pkg/storage/testing/store_tests.go

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1663,45 +1663,62 @@ func RunTestConsistentList(ctx context.Context, t *testing.T, store storage.Inte
16631663
inPod := &example.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: "default", Name: "foo"}}
16641664
err := store.Create(ctx, computePodKey(inPod), inPod, outPod, 0)
16651665
require.NoError(t, err)
1666-
writeRV, err := strconv.Atoi(outPod.ResourceVersion)
1666+
lastResourceWriteRV, err := strconv.Atoi(outPod.ResourceVersion)
16671667
require.NoError(t, err)
16681668

16691669
increaseRV(ctx, t)
1670-
consistentRV := writeRV + 1
1670+
consistentRV := lastResourceWriteRV + 1
1671+
cacheSyncRV := 0
16711672

16721673
tcs := []struct {
16731674
name string
16741675
requestRV string
1676+
continueToken string
16751677
validateResponseRV func(*testing.T, int)
16761678
}{
16771679
{
1678-
name: "Non-consistent list before sync",
1680+
name: "Non-consistent list before consistent read",
16791681
requestRV: "0",
16801682
validateResponseRV: func(t *testing.T, rv int) {
16811683
if cacheEnabled {
16821684
// Cache might not yet observed write
1683-
assert.LessOrEqual(t, rv, writeRV)
1685+
assert.LessOrEqual(t, rv, lastResourceWriteRV)
16841686
} else {
16851687
// Etcd should always be up to date with consistent RV
16861688
assert.Equal(t, consistentRV, rv)
16871689
}
16881690
},
16891691
},
16901692
{
1691-
name: "Consistent request returns currentRV",
1693+
name: "LIST without RV returns consistent RV",
16921694
requestRV: "",
16931695
validateResponseRV: func(t *testing.T, rv int) {
16941696
assert.Equal(t, consistentRV, rv)
1697+
cacheSyncRV = rv
16951698
},
16961699
},
16971700
{
1698-
name: "Non-consistent request after sync",
1701+
name: "List with negative continue RV returns consistent RV",
1702+
continueToken: encodeContinueOrDie("/pods/a", -1),
1703+
validateResponseRV: func(t *testing.T, rv int) {
1704+
// TODO: Update cacheSyncRV after continue is served from cache.
1705+
assert.Equal(t, consistentRV, rv)
1706+
},
1707+
},
1708+
{
1709+
name: "Non-consistent request after consistent read",
16991710
requestRV: "0",
17001711
validateResponseRV: func(t *testing.T, rv int) {
1701-
// Consistent read is required to sync cache
1702-
if cacheEnabled && !consistentReadsSupported {
1703-
assert.LessOrEqual(t, rv, writeRV)
1712+
if cacheEnabled {
1713+
if consistentReadsSupported {
1714+
// Consistent read will sync cache
1715+
assert.Equal(t, cacheSyncRV, rv)
1716+
} else {
1717+
// Without consisten reads cache is not synced
1718+
assert.LessOrEqual(t, rv, lastResourceWriteRV)
1719+
}
17041720
} else {
1721+
// Etcd always points to newest RV
17051722
assert.Equal(t, consistentRV, rv)
17061723
}
17071724
},
@@ -1712,7 +1729,11 @@ func RunTestConsistentList(ctx context.Context, t *testing.T, store storage.Inte
17121729
out := &example.PodList{}
17131730
opts := storage.ListOptions{
17141731
ResourceVersion: tc.requestRV,
1715-
Predicate: storage.Everything,
1732+
Predicate: storage.SelectionPredicate{
1733+
Label: labels.Everything(),
1734+
Field: fields.Everything(),
1735+
Continue: tc.continueToken,
1736+
},
17161737
}
17171738
err = store.GetList(ctx, "/pods/empty", opts, out)
17181739
require.NoError(t, err)
@@ -1721,6 +1742,9 @@ func RunTestConsistentList(ctx context.Context, t *testing.T, store storage.Inte
17211742
require.NoError(t, err)
17221743
tc.validateResponseRV(t, parsedOutRV)
17231744
})
1745+
// Update RV on each read to test multiple reads for consistent RV.
1746+
increaseRV(ctx, t)
1747+
consistentRV++
17241748
}
17251749
}
17261750

0 commit comments

Comments
 (0)