mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 21:47:07 +00:00
apiserver/storage: factor PrepareContinueToken to a new function (#125548)
* apiserver/storage/continue: intro PrepareContinueToken PrepareContinueToken prepares optional parameters for retrieving additional results for a paginated request. This function sets up parameters that a client can use to fetch the remaining results from the server if they are available. * apiserver/storage/etcd3: refactor to use PrepareContinueToken
This commit is contained in:
parent
fb7bbd2e5d
commit
efef32652a
@ -91,3 +91,30 @@ func EncodeContinue(key, keyPrefix string, resourceVersion int64) (string, error
|
|||||||
}
|
}
|
||||||
return base64.RawURLEncoding.EncodeToString(out), nil
|
return base64.RawURLEncoding.EncodeToString(out), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PrepareContinueToken prepares optional
|
||||||
|
// parameters for retrieving additional results for a paginated request.
|
||||||
|
//
|
||||||
|
// This function sets up parameters that a client can use to fetch the remaining results
|
||||||
|
// from the server if they are available.
|
||||||
|
func PrepareContinueToken(keyLastItem, keyPrefix string, resourceVersion int64, itemsCount int64, hasMoreItems bool, opts ListOptions) (string, *int64, error) {
|
||||||
|
var remainingItemCount *int64
|
||||||
|
var continueValue string
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if hasMoreItems {
|
||||||
|
// Instruct the client to begin querying from immediately after the last key.
|
||||||
|
continueValue, err = EncodeContinue(keyLastItem+"\x00", keyPrefix, resourceVersion)
|
||||||
|
if err != nil {
|
||||||
|
return "", remainingItemCount, err
|
||||||
|
}
|
||||||
|
// Etcd response counts in objects that do not match the pred.
|
||||||
|
// Instead of returning inaccurate count for non-empty selectors, we return nil.
|
||||||
|
// We only set remainingItemCount if the predicate is empty.
|
||||||
|
if opts.Predicate.Empty() {
|
||||||
|
remainingItems := itemsCount - opts.Predicate.Limit
|
||||||
|
remainingItemCount = &remainingItems
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return continueValue, remainingItemCount, err
|
||||||
|
}
|
||||||
|
@ -811,27 +811,11 @@ func (s *store) GetList(ctx context.Context, key string, opts storage.ListOption
|
|||||||
v.Set(reflect.MakeSlice(v.Type(), 0, 0))
|
v.Set(reflect.MakeSlice(v.Type(), 0, 0))
|
||||||
}
|
}
|
||||||
|
|
||||||
// instruct the client to begin querying from immediately after the last key we returned
|
continueValue, remainingItemCount, err := storage.PrepareContinueToken(string(lastKey), keyPrefix, withRev, getResp.Count, hasMore, opts)
|
||||||
// we never return a key that the client wouldn't be allowed to see
|
if err != nil {
|
||||||
if hasMore {
|
return err
|
||||||
// we want to start immediately after the last key
|
|
||||||
next, err := storage.EncodeContinue(string(lastKey)+"\x00", keyPrefix, withRev)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var remainingItemCount *int64
|
|
||||||
// getResp.Count counts in objects that do not match the pred.
|
|
||||||
// Instead of returning inaccurate count for non-empty selectors, we return nil.
|
|
||||||
// Only set remainingItemCount if the predicate is empty.
|
|
||||||
if opts.Predicate.Empty() {
|
|
||||||
c := int64(getResp.Count - opts.Predicate.Limit)
|
|
||||||
remainingItemCount = &c
|
|
||||||
}
|
|
||||||
return s.versioner.UpdateList(listObj, uint64(withRev), next, remainingItemCount)
|
|
||||||
}
|
}
|
||||||
|
return s.versioner.UpdateList(listObj, uint64(withRev), continueValue, remainingItemCount)
|
||||||
// no continuation
|
|
||||||
return s.versioner.UpdateList(listObj, uint64(withRev), "", nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// growSlice takes a slice value and grows its capacity up
|
// growSlice takes a slice value and grows its capacity up
|
||||||
|
Loading…
Reference in New Issue
Block a user