Skip to content

Commit c7972d9

Browse files
authored
Merge pull request kubernetes#78553 from caesarxuchao/alpha-gate-remainingItemCount
Protecting remainingItemCount behind a feature flag. Also updating the API doc
2 parents 78220fe + a64b389 commit c7972d9

File tree

11 files changed

+86
-34
lines changed

11 files changed

+86
-34
lines changed

api/openapi-spec/swagger.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

staging/src/k8s.io/apiextensions-apiserver/pkg/generated/openapi/zz_generated.openapi.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto

Lines changed: 11 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,18 @@ type ListMeta struct {
8282
// message.
8383
Continue string `json:"continue,omitempty" protobuf:"bytes,3,opt,name=continue"`
8484

85-
// RemainingItemCount is the number of subsequent items in the list which are not included in this
85+
// remainingItemCount is the number of subsequent items in the list which are not included in this
8686
// list response. If the list request contained label or field selectors, then the number of
87-
// remaining items is unknown and this field will be unset. If the list is complete (either
88-
// because it is unpaginated or because this is the last page), then there are no more remaining
89-
// items and this field will also be unset. Servers older than v1.15 do not set this field.
87+
// remaining items is unknown and the field will be left unset and omitted during serialization.
88+
// If the list is complete (either because it is not chunking or because this is the last chunk),
89+
// then there are no more remaining items and this field will be left unset and omitted during
90+
// serialization.
91+
// Servers older than v1.15 do not set this field.
92+
// The intended use of the remainingItemCount is *estimating* the size of a collection. Clients
93+
// should not rely on the remainingItemCount to be set or to be exact.
94+
//
95+
// This field is alpha and can be changed or removed without notice.
96+
//
9097
// +optional
9198
RemainingItemCount *int64 `json:"remainingItemCount,omitempty" protobuf:"bytes,4,opt,name=remainingItemCount"`
9299
}

staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

staging/src/k8s.io/apiserver/pkg/features/kube_features.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@ const (
8686
// committing.
8787
DryRun featuregate.Feature = "DryRun"
8888

89+
// owner: @caesarxuchao
90+
// alpha: v1.15
91+
//
92+
// Allow apiservers to show a count of remaining items in the response
93+
// to a chunking list request.
94+
RemainingItemCount featuregate.Feature = "RemainingItemCount"
95+
8996
// owner: @apelisse, @lavalamp
9097
// alpha: v1.14
9198
//
@@ -141,6 +148,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
141148
APIResponseCompression: {Default: false, PreRelease: featuregate.Alpha},
142149
APIListChunking: {Default: true, PreRelease: featuregate.Beta},
143150
DryRun: {Default: true, PreRelease: featuregate.Beta},
151+
RemainingItemCount: {Default: false, PreRelease: featuregate.Alpha},
144152
ServerSideApply: {Default: false, PreRelease: featuregate.Alpha},
145153
StorageVersionHash: {Default: true, PreRelease: featuregate.Beta},
146154
WinOverlay: {Default: false, PreRelease: featuregate.Alpha},

staging/src/k8s.io/apiserver/pkg/storage/etcd3/BUILD

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ go_test(
3131
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
3232
"//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library",
3333
"//staging/src/k8s.io/apiserver/pkg/apis/example/v1:go_default_library",
34+
"//staging/src/k8s.io/apiserver/pkg/features:go_default_library",
3435
"//staging/src/k8s.io/apiserver/pkg/storage:go_default_library",
3536
"//staging/src/k8s.io/apiserver/pkg/storage/etcd:go_default_library",
3637
"//staging/src/k8s.io/apiserver/pkg/storage/tests:go_default_library",
3738
"//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library",
39+
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
40+
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
3841
"//vendor/github.com/coreos/etcd/clientv3:go_default_library",
3942
"//vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes:go_default_library",
4043
"//vendor/github.com/coreos/etcd/integration:go_default_library",
@@ -66,10 +69,12 @@ go_library(
6669
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
6770
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
6871
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
72+
"//staging/src/k8s.io/apiserver/pkg/features:go_default_library",
6973
"//staging/src/k8s.io/apiserver/pkg/storage:go_default_library",
7074
"//staging/src/k8s.io/apiserver/pkg/storage/etcd:go_default_library",
7175
"//staging/src/k8s.io/apiserver/pkg/storage/etcd/metrics:go_default_library",
7276
"//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library",
77+
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
7378
"//vendor/github.com/coreos/etcd/clientv3:go_default_library",
7479
"//vendor/github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes:go_default_library",
7580
"//vendor/github.com/coreos/etcd/mvcc/mvccpb:go_default_library",

staging/src/k8s.io/apiserver/pkg/storage/etcd3/store.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ import (
3636
"k8s.io/apimachinery/pkg/conversion"
3737
"k8s.io/apimachinery/pkg/runtime"
3838
"k8s.io/apimachinery/pkg/watch"
39+
"k8s.io/apiserver/pkg/features"
3940
"k8s.io/apiserver/pkg/storage"
4041
"k8s.io/apiserver/pkg/storage/etcd"
4142
"k8s.io/apiserver/pkg/storage/etcd/metrics"
4243
"k8s.io/apiserver/pkg/storage/value"
44+
utilfeature "k8s.io/apiserver/pkg/util/feature"
4345
utiltrace "k8s.io/utils/trace"
4446
)
4547

@@ -622,9 +624,11 @@ func (s *store) List(ctx context.Context, key, resourceVersion string, pred stor
622624
// getResp.Count counts in objects that do not match the pred.
623625
// Instead of returning inaccurate count for non-empty selectors, we return nil.
624626
// Only set remainingItemCount if the predicate is empty.
625-
if pred.Empty() {
626-
c := int64(getResp.Count - pred.Limit)
627-
remainingItemCount = &c
627+
if utilfeature.DefaultFeatureGate.Enabled(features.RemainingItemCount) {
628+
if pred.Empty() {
629+
c := int64(getResp.Count - pred.Limit)
630+
remainingItemCount = &c
631+
}
628632
}
629633
return s.versioner.UpdateList(listObj, uint64(returnedRV), next, remainingItemCount)
630634
}

staging/src/k8s.io/apiserver/pkg/storage/etcd3/store_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,13 @@ import (
4444
"k8s.io/apimachinery/pkg/watch"
4545
"k8s.io/apiserver/pkg/apis/example"
4646
examplev1 "k8s.io/apiserver/pkg/apis/example/v1"
47+
"k8s.io/apiserver/pkg/features"
4748
"k8s.io/apiserver/pkg/storage"
4849
"k8s.io/apiserver/pkg/storage/etcd"
4950
storagetests "k8s.io/apiserver/pkg/storage/tests"
5051
"k8s.io/apiserver/pkg/storage/value"
52+
utilfeature "k8s.io/apiserver/pkg/util/feature"
53+
featuregatetesting "k8s.io/component-base/featuregate/testing"
5154
utilpointer "k8s.io/utils/pointer"
5255
)
5356

@@ -752,6 +755,7 @@ func TestTransformationFailure(t *testing.T) {
752755
}
753756

754757
func TestList(t *testing.T) {
758+
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RemainingItemCount, true)()
755759
codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion)
756760
cluster := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1})
757761
defer cluster.Terminate(t)

test/e2e/apimachinery/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,10 @@ go_library(
6565
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
6666
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
6767
"//staging/src/k8s.io/apiserver/pkg/endpoints/discovery:go_default_library",
68+
"//staging/src/k8s.io/apiserver/pkg/features:go_default_library",
6869
"//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library",
6970
"//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library",
71+
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
7072
"//staging/src/k8s.io/client-go/discovery:go_default_library",
7173
"//staging/src/k8s.io/client-go/dynamic:go_default_library",
7274
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",

0 commit comments

Comments
 (0)