Update comment and declaration of storage.GuaranteedUpdate to be clearer.

Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
This commit is contained in:
Sanskar Jaiswal 2022-04-16 17:19:06 +05:30
parent a750d8054a
commit f8df26ae80
6 changed files with 31 additions and 30 deletions

View File

@ -506,11 +506,11 @@ func (p *applyPatcher) createNewObject(requestContext context.Context) (runtime.
return p.applyPatchToCurrentObject(requestContext, obj) return p.applyPatchToCurrentObject(requestContext, obj)
} }
// strategicPatchObject applies a strategic merge patch of <patchBytes> to // strategicPatchObject applies a strategic merge patch of `patchBytes` to
// <originalObject> and stores the result in <objToUpdate>. // `originalObject` and stores the result in `objToUpdate`.
// It additionally returns the map[string]interface{} representation of the // It additionally returns the map[string]interface{} representation of the
// <originalObject> and <patchBytes>. // `originalObject` and `patchBytes`.
// NOTE: Both <originalObject> and <objToUpdate> are supposed to be versioned. // NOTE: Both `originalObject` and `objToUpdate` are supposed to be versioned.
func strategicPatchObject( func strategicPatchObject(
requestContext context.Context, requestContext context.Context,
defaulter runtime.ObjectDefaulter, defaulter runtime.ObjectDefaulter,

View File

@ -69,28 +69,28 @@ func (s *DryRunnableStorage) GetList(ctx context.Context, key string, opts stora
} }
func (s *DryRunnableStorage) GuaranteedUpdate( func (s *DryRunnableStorage) GuaranteedUpdate(
ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, ctx context.Context, key string, destination runtime.Object, ignoreNotFound bool,
preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, dryRun bool, cachedExistingObject runtime.Object) error { preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, dryRun bool, cachedExistingObject runtime.Object) error {
if dryRun { if dryRun {
err := s.Storage.Get(ctx, key, storage.GetOptions{IgnoreNotFound: ignoreNotFound}, ptrToType) err := s.Storage.Get(ctx, key, storage.GetOptions{IgnoreNotFound: ignoreNotFound}, destination)
if err != nil { if err != nil {
return err return err
} }
err = preconditions.Check(key, ptrToType) err = preconditions.Check(key, destination)
if err != nil { if err != nil {
return err return err
} }
rev, err := s.Versioner().ObjectResourceVersion(ptrToType) rev, err := s.Versioner().ObjectResourceVersion(destination)
if err != nil { if err != nil {
return err return err
} }
out, _, err := tryUpdate(ptrToType, storage.ResponseMeta{ResourceVersion: rev}) updated, _, err := tryUpdate(destination, storage.ResponseMeta{ResourceVersion: rev})
if err != nil { if err != nil {
return err return err
} }
return s.copyInto(out, ptrToType) return s.copyInto(updated, destination)
} }
return s.Storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, cachedExistingObject) return s.Storage.GuaranteedUpdate(ctx, key, destination, ignoreNotFound, preconditions, tryUpdate, cachedExistingObject)
} }
func (s *DryRunnableStorage) Count(key string) (int64, error) { func (s *DryRunnableStorage) Count(key string) (int64, error) {

View File

@ -2627,9 +2627,9 @@ type staleGuaranteedUpdateStorage struct {
// GuaranteedUpdate overwrites the method with one that always suggests the cachedObj. // GuaranteedUpdate overwrites the method with one that always suggests the cachedObj.
func (s *staleGuaranteedUpdateStorage) GuaranteedUpdate( func (s *staleGuaranteedUpdateStorage) GuaranteedUpdate(
ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, ctx context.Context, key string, destination runtime.Object, ignoreNotFound bool,
preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, _ runtime.Object) error { preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, _ runtime.Object) error {
return s.Interface.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, s.cachedObj) return s.Interface.GuaranteedUpdate(ctx, key, destination, ignoreNotFound, preconditions, tryUpdate, s.cachedObj)
} }
func TestDeleteWithCachedObject(t *testing.T) { func TestDeleteWithCachedObject(t *testing.T) {

View File

@ -693,7 +693,7 @@ func (c *Cacher) GetList(ctx context.Context, key string, opts storage.ListOptio
// GuaranteedUpdate implements storage.Interface. // GuaranteedUpdate implements storage.Interface.
func (c *Cacher) GuaranteedUpdate( func (c *Cacher) GuaranteedUpdate(
ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, ctx context.Context, key string, destination runtime.Object, ignoreNotFound bool,
preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, _ runtime.Object) error { preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, _ runtime.Object) error {
// Ignore the suggestion and try to pass down the current version of the object // Ignore the suggestion and try to pass down the current version of the object
// read from cache. // read from cache.
@ -703,10 +703,10 @@ func (c *Cacher) GuaranteedUpdate(
// DeepCopy the object since we modify resource version when serializing the // DeepCopy the object since we modify resource version when serializing the
// current object. // current object.
currObj := elem.(*storeElement).Object.DeepCopyObject() currObj := elem.(*storeElement).Object.DeepCopyObject()
return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, currObj) return c.storage.GuaranteedUpdate(ctx, key, destination, ignoreNotFound, preconditions, tryUpdate, currObj)
} }
// If we couldn't get the object, fallback to no-suggestion. // If we couldn't get the object, fallback to no-suggestion.
return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, nil) return c.storage.GuaranteedUpdate(ctx, key, destination, ignoreNotFound, preconditions, tryUpdate, nil)
} }
// Count implements storage.Interface. // Count implements storage.Interface.

View File

@ -316,12 +316,12 @@ func (s *store) conditionalDelete(
// GuaranteedUpdate implements storage.Interface.GuaranteedUpdate. // GuaranteedUpdate implements storage.Interface.GuaranteedUpdate.
func (s *store) GuaranteedUpdate( func (s *store) GuaranteedUpdate(
ctx context.Context, key string, out runtime.Object, ignoreNotFound bool, ctx context.Context, key string, destination runtime.Object, ignoreNotFound bool,
preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, cachedExistingObject runtime.Object) error { preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, cachedExistingObject runtime.Object) error {
trace := utiltrace.New("GuaranteedUpdate etcd3", utiltrace.Field{"type", getTypeName(out)}) trace := utiltrace.New("GuaranteedUpdate etcd3", utiltrace.Field{"type", getTypeName(destination)})
defer trace.LogIfLong(500 * time.Millisecond) defer trace.LogIfLong(500 * time.Millisecond)
v, err := conversion.EnforcePtr(out) v, err := conversion.EnforcePtr(destination)
if err != nil { if err != nil {
return fmt.Errorf("unable to convert output object to pointer: %v", err) return fmt.Errorf("unable to convert output object to pointer: %v", err)
} }
@ -330,7 +330,7 @@ func (s *store) GuaranteedUpdate(
getCurrentState := func() (*objState, error) { getCurrentState := func() (*objState, error) {
startTime := time.Now() startTime := time.Now()
getResp, err := s.client.KV.Get(ctx, key) getResp, err := s.client.KV.Get(ctx, key)
metrics.RecordEtcdRequestLatency("get", getTypeName(out), startTime) metrics.RecordEtcdRequestLatency("get", getTypeName(destination), startTime)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -418,7 +418,7 @@ func (s *store) GuaranteedUpdate(
} }
// recheck that the data from etcd is not stale before short-circuiting a write // recheck that the data from etcd is not stale before short-circuiting a write
if !origState.stale { if !origState.stale {
return decode(s.codec, s.versioner, origState.data, out, origState.rev) return decode(s.codec, s.versioner, origState.data, destination, origState.rev)
} }
} }
@ -441,7 +441,7 @@ func (s *store) GuaranteedUpdate(
).Else( ).Else(
clientv3.OpGet(key), clientv3.OpGet(key),
).Commit() ).Commit()
metrics.RecordEtcdRequestLatency("update", getTypeName(out), startTime) metrics.RecordEtcdRequestLatency("update", getTypeName(destination), startTime)
if err != nil { if err != nil {
return err return err
} }
@ -459,7 +459,7 @@ func (s *store) GuaranteedUpdate(
} }
putResp := txnResp.Responses[0].GetResponsePut() putResp := txnResp.Responses[0].GetResponsePut()
return decode(s.codec, s.versioner, data, out, putResp.Header.Revision) return decode(s.codec, s.versioner, data, destination, putResp.Header.Revision)
} }
} }

View File

@ -198,15 +198,16 @@ type Interface interface {
// match 'opts.ResourceVersion' according 'opts.ResourceVersionMatch'. // match 'opts.ResourceVersion' according 'opts.ResourceVersionMatch'.
GetList(ctx context.Context, key string, opts ListOptions, listObj runtime.Object) error GetList(ctx context.Context, key string, opts ListOptions, listObj runtime.Object) error
// GuaranteedUpdate keeps calling 'tryUpdate()' to update key 'key' (of type 'ptrToType') // GuaranteedUpdate keeps calling 'tryUpdate()' to update key 'key' (of type 'destination')
// retrying the update until success if there is index conflict. // retrying the update until success if there is index conflict.
// Note that object passed to tryUpdate may change across invocations of tryUpdate() if // Note that object passed to tryUpdate may change across invocations of tryUpdate() if
// other writers are simultaneously updating it, so tryUpdate() needs to take into account // other writers are simultaneously updating it, so tryUpdate() needs to take into account
// the current contents of the object when deciding how the update object should look. // the current contents of the object when deciding how the update object should look.
// If the key doesn't exist, it will return NotFound storage error if ignoreNotFound=false // If the key doesn't exist, it will return NotFound storage error if ignoreNotFound=false
// or zero value in 'ptrToType' parameter otherwise. // else `destination` will be set to the zero value of it's type.
// If the object to update has the same value as previous, it won't do any update // If the eventual successful invocation of `tryUpdate` returns an output with the same serialized
// but will return the object in 'ptrToType' parameter. // contents as the input, it won't perform any update, but instead set `destination` to an object with those
// contents.
// If 'cachedExistingObject' is non-nil, it can be used as a suggestion about the // If 'cachedExistingObject' is non-nil, it can be used as a suggestion about the
// current version of the object to avoid read operation from storage to get it. // current version of the object to avoid read operation from storage to get it.
// However, the implementations have to retry in case suggestion is stale. // However, the implementations have to retry in case suggestion is stale.
@ -215,7 +216,7 @@ type Interface interface {
// //
// s := /* implementation of Interface */ // s := /* implementation of Interface */
// err := s.GuaranteedUpdate( // err := s.GuaranteedUpdate(
// "myKey", &MyType{}, true, // "myKey", &MyType{}, true, preconditions,
// func(input runtime.Object, res ResponseMeta) (runtime.Object, *uint64, error) { // func(input runtime.Object, res ResponseMeta) (runtime.Object, *uint64, error) {
// // Before each invocation of the user defined function, "input" is reset to // // Before each invocation of the user defined function, "input" is reset to
// // current contents for "myKey" in database. // // current contents for "myKey" in database.
@ -227,10 +228,10 @@ type Interface interface {
// // Return the modified object - return an error to stop iterating. Return // // Return the modified object - return an error to stop iterating. Return
// // a uint64 to alter the TTL on the object, or nil to keep it the same value. // // a uint64 to alter the TTL on the object, or nil to keep it the same value.
// return cur, nil, nil // return cur, nil, nil
// }, // }, cachedExistingObject
// ) // )
GuaranteedUpdate( GuaranteedUpdate(
ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, ctx context.Context, key string, destination runtime.Object, ignoreNotFound bool,
preconditions *Preconditions, tryUpdate UpdateFunc, cachedExistingObject runtime.Object) error preconditions *Preconditions, tryUpdate UpdateFunc, cachedExistingObject runtime.Object) error
// Count returns number of different entries under the key (generally being path prefix). // Count returns number of different entries under the key (generally being path prefix).