Skip to content

Commit 6d21d8f

Browse files
committed
Test continue with negative RV for reading consistent RV
1 parent e2a77c2 commit 6d21d8f

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
@@ -1596,45 +1596,62 @@ func RunTestConsistentList(ctx context.Context, t *testing.T, store storage.Inte
15961596
inPod := &example.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: "default", Name: "foo"}}
15971597
err := store.Create(ctx, computePodKey(inPod), inPod, outPod, 0)
15981598
require.NoError(t, err)
1599-
writeRV, err := strconv.Atoi(outPod.ResourceVersion)
1599+
lastResourceWriteRV, err := strconv.Atoi(outPod.ResourceVersion)
16001600
require.NoError(t, err)
16011601

16021602
increaseRV(ctx, t)
1603-
consistentRV := writeRV + 1
1603+
consistentRV := lastResourceWriteRV + 1
1604+
cacheSyncRV := 0
16041605

16051606
tcs := []struct {
16061607
name string
16071608
requestRV string
1609+
continueToken string
16081610
validateResponseRV func(*testing.T, int)
16091611
}{
16101612
{
1611-
name: "Non-consistent list before sync",
1613+
name: "Non-consistent list before consistent read",
16121614
requestRV: "0",
16131615
validateResponseRV: func(t *testing.T, rv int) {
16141616
if cacheEnabled {
16151617
// Cache might not yet observed write
1616-
assert.LessOrEqual(t, rv, writeRV)
1618+
assert.LessOrEqual(t, rv, lastResourceWriteRV)
16171619
} else {
16181620
// Etcd should always be up to date with consistent RV
16191621
assert.Equal(t, consistentRV, rv)
16201622
}
16211623
},
16221624
},
16231625
{
1624-
name: "Consistent request returns currentRV",
1626+
name: "LIST without RV returns consistent RV",
16251627
requestRV: "",
16261628
validateResponseRV: func(t *testing.T, rv int) {
16271629
assert.Equal(t, consistentRV, rv)
1630+
cacheSyncRV = rv
16281631
},
16291632
},
16301633
{
1631-
name: "Non-consistent request after sync",
1634+
name: "List with negative continue RV returns consistent RV",
1635+
continueToken: encodeContinueOrDie("/pods/a", -1),
1636+
validateResponseRV: func(t *testing.T, rv int) {
1637+
// TODO: Update cacheSyncRV after continue is served from cache.
1638+
assert.Equal(t, consistentRV, rv)
1639+
},
1640+
},
1641+
{
1642+
name: "Non-consistent request after consistent read",
16321643
requestRV: "0",
16331644
validateResponseRV: func(t *testing.T, rv int) {
1634-
// Consistent read is required to sync cache
1635-
if cacheEnabled && !consistentReadsSupported {
1636-
assert.LessOrEqual(t, rv, writeRV)
1645+
if cacheEnabled {
1646+
if consistentReadsSupported {
1647+
// Consistent read will sync cache
1648+
assert.Equal(t, cacheSyncRV, rv)
1649+
} else {
1650+
// Without consisten reads cache is not synced
1651+
assert.LessOrEqual(t, rv, lastResourceWriteRV)
1652+
}
16371653
} else {
1654+
// Etcd always points to newest RV
16381655
assert.Equal(t, consistentRV, rv)
16391656
}
16401657
},
@@ -1645,7 +1662,11 @@ func RunTestConsistentList(ctx context.Context, t *testing.T, store storage.Inte
16451662
out := &example.PodList{}
16461663
opts := storage.ListOptions{
16471664
ResourceVersion: tc.requestRV,
1648-
Predicate: storage.Everything,
1665+
Predicate: storage.SelectionPredicate{
1666+
Label: labels.Everything(),
1667+
Field: fields.Everything(),
1668+
Continue: tc.continueToken,
1669+
},
16491670
}
16501671
err = store.GetList(ctx, "/pods/empty", opts, out)
16511672
require.NoError(t, err)
@@ -1654,6 +1675,9 @@ func RunTestConsistentList(ctx context.Context, t *testing.T, store storage.Inte
16541675
require.NoError(t, err)
16551676
tc.validateResponseRV(t, parsedOutRV)
16561677
})
1678+
// Update RV on each read to test multiple reads for consistent RV.
1679+
increaseRV(ctx, t)
1680+
consistentRV++
16571681
}
16581682
}
16591683

0 commit comments

Comments
 (0)