@@ -271,13 +271,15 @@ func (s *store) Delete(
271
271
if err != nil {
272
272
return fmt .Errorf ("unable to convert output object to pointer: %v" , err )
273
273
}
274
- return s .conditionalDelete (ctx , preparedKey , out , v , preconditions , validateDeletion , cachedExistingObject )
274
+
275
+ skipTransformDecode := false
276
+ return s .conditionalDelete (ctx , preparedKey , out , v , preconditions , validateDeletion , cachedExistingObject , skipTransformDecode )
275
277
}
276
278
277
279
func (s * store ) conditionalDelete (
278
280
ctx context.Context , key string , out runtime.Object , v reflect.Value , preconditions * storage.Preconditions ,
279
- validateDeletion storage.ValidateObjectFunc , cachedExistingObject runtime.Object ) error {
280
- getCurrentState := s .getCurrentState (ctx , key , v , false )
281
+ validateDeletion storage.ValidateObjectFunc , cachedExistingObject runtime.Object , skipTransformDecode bool ) error {
282
+ getCurrentState := s .getCurrentState (ctx , key , v , false , skipTransformDecode )
281
283
282
284
var origState * objState
283
285
var err error
@@ -361,7 +363,7 @@ func (s *store) conditionalDelete(
361
363
if ! txnResp .Succeeded {
362
364
getResp := (* clientv3 .GetResponse )(txnResp .Responses [0 ].GetResponseRange ())
363
365
klog .V (4 ).Infof ("deletion of %s failed because of a conflict, going to retry" , key )
364
- origState , err = s .getState (ctx , getResp , key , v , false )
366
+ origState , err = s .getState (ctx , getResp , key , v , false , skipTransformDecode )
365
367
if err != nil {
366
368
return err
367
369
}
@@ -376,10 +378,12 @@ func (s *store) conditionalDelete(
376
378
if deleteResp .Header == nil {
377
379
return errors .New ("invalid DeleteRange response - nil header" )
378
380
}
379
- err = decode (s .codec , s .versioner , origState .data , out , deleteResp .Header .Revision )
380
- if err != nil {
381
- recordDecodeError (s .groupResourceString , key )
382
- return err
381
+ if ! skipTransformDecode {
382
+ err = decode (s .codec , s .versioner , origState .data , out , deleteResp .Header .Revision )
383
+ if err != nil {
384
+ recordDecodeError (s .groupResourceString , key )
385
+ return err
386
+ }
383
387
}
384
388
return nil
385
389
}
@@ -405,7 +409,8 @@ func (s *store) GuaranteedUpdate(
405
409
return fmt .Errorf ("unable to convert output object to pointer: %v" , err )
406
410
}
407
411
408
- getCurrentState := s .getCurrentState (ctx , preparedKey , v , ignoreNotFound )
412
+ skipTransformDecode := false
413
+ getCurrentState := s .getCurrentState (ctx , preparedKey , v , ignoreNotFound , skipTransformDecode )
409
414
410
415
var origState * objState
411
416
var origStateIsCurrent bool
@@ -531,7 +536,8 @@ func (s *store) GuaranteedUpdate(
531
536
if ! txnResp .Succeeded {
532
537
getResp := (* clientv3 .GetResponse )(txnResp .Responses [0 ].GetResponseRange ())
533
538
klog .V (4 ).Infof ("GuaranteedUpdate of %s failed because of a conflict, going to retry" , preparedKey )
534
- origState , err = s .getState (ctx , getResp , preparedKey , v , ignoreNotFound )
539
+ skipTransformDecode := false
540
+ origState , err = s .getState (ctx , getResp , preparedKey , v , ignoreNotFound , skipTransformDecode )
535
541
if err != nil {
536
542
return err
537
543
}
@@ -878,19 +884,25 @@ func (s *store) watchContext(ctx context.Context) context.Context {
878
884
return clientv3 .WithRequireLeader (ctx )
879
885
}
880
886
881
- func (s * store ) getCurrentState (ctx context.Context , key string , v reflect.Value , ignoreNotFound bool ) func () (* objState , error ) {
887
+ func (s * store ) getCurrentState (ctx context.Context , key string , v reflect.Value , ignoreNotFound bool , skipTransformDecode bool ) func () (* objState , error ) {
882
888
return func () (* objState , error ) {
883
889
startTime := time .Now ()
884
890
getResp , err := s .client .KV .Get (ctx , key )
885
891
metrics .RecordEtcdRequest ("get" , s .groupResourceString , err , startTime )
886
892
if err != nil {
887
893
return nil , err
888
894
}
889
- return s .getState (ctx , getResp , key , v , ignoreNotFound )
895
+ return s .getState (ctx , getResp , key , v , ignoreNotFound , skipTransformDecode )
890
896
}
891
897
}
892
898
893
- func (s * store ) getState (ctx context.Context , getResp * clientv3.GetResponse , key string , v reflect.Value , ignoreNotFound bool ) (* objState , error ) {
899
+ // getState constructs a new objState from the given response from the storage.
900
+ // skipTransformDecode: if true, the function will neither transform the data
901
+ // from the storage nor decode it into an object; otherwise, data from the
902
+ // storage will be transformed and decoded.
903
+ // NOTE: when skipTransformDecode is true, the 'data', and the 'obj' fields
904
+ // of the objState will be nil, and 'stale' will be set to true.
905
+ func (s * store ) getState (ctx context.Context , getResp * clientv3.GetResponse , key string , v reflect.Value , ignoreNotFound bool , skipTransformDecode bool ) (* objState , error ) {
894
906
state := & objState {
895
907
meta : & storage.ResponseMeta {},
896
908
}
@@ -909,14 +921,24 @@ func (s *store) getState(ctx context.Context, getResp *clientv3.GetResponse, key
909
921
return nil , err
910
922
}
911
923
} else {
924
+ state .rev = getResp .Kvs [0 ].ModRevision
925
+ state .meta .ResourceVersion = uint64 (state .rev )
926
+
927
+ if skipTransformDecode {
928
+ // be explicit that we don't have the object
929
+ state .obj = nil
930
+ state .stale = true // this seems a more sane value here
931
+ return state , nil
932
+ }
933
+
912
934
data , stale , err := s .transformer .TransformFromStorage (ctx , getResp .Kvs [0 ].Value , authenticatedDataString (key ))
913
935
if err != nil {
914
936
return nil , storage .NewInternalError (err .Error ())
915
937
}
916
- state .rev = getResp .Kvs [0 ].ModRevision
917
- state .meta .ResourceVersion = uint64 (state .rev )
938
+
918
939
state .data = data
919
940
state .stale = stale
941
+
920
942
if err := decode (s .codec , s .versioner , state .data , state .obj , state .rev ); err != nil {
921
943
recordDecodeError (s .groupResourceString , key )
922
944
return nil , err
0 commit comments