@@ -38,7 +38,6 @@ import (
38
38
"k8s.io/apimachinery/pkg/runtime/schema"
39
39
"k8s.io/apimachinery/pkg/watch"
40
40
"k8s.io/apiserver/pkg/audit"
41
- endpointsrequest "k8s.io/apiserver/pkg/endpoints/request"
42
41
"k8s.io/apiserver/pkg/features"
43
42
"k8s.io/apiserver/pkg/storage"
44
43
"k8s.io/apiserver/pkg/storage/etcd3/metrics"
@@ -82,6 +81,7 @@ type store struct {
82
81
groupResourceString string
83
82
watcher * watcher
84
83
leaseManager * leaseManager
84
+ decoder Decoder
85
85
}
86
86
87
87
func (s * store ) RequestWatchProgress (ctx context.Context ) error {
@@ -99,12 +99,11 @@ type objState struct {
99
99
}
100
100
101
101
// New returns an etcd3 implementation of storage.Interface.
102
- func New (c * clientv3.Client , codec runtime.Codec , newFunc , newListFunc func () runtime.Object , prefix , resourcePrefix string , groupResource schema.GroupResource , transformer value.Transformer , leaseManagerConfig LeaseManagerConfig ) storage.Interface {
103
- return newStore (c , codec , newFunc , newListFunc , prefix , resourcePrefix , groupResource , transformer , leaseManagerConfig )
102
+ func New (c * clientv3.Client , codec runtime.Codec , newFunc , newListFunc func () runtime.Object , prefix , resourcePrefix string , groupResource schema.GroupResource , transformer value.Transformer , leaseManagerConfig LeaseManagerConfig , decoder Decoder , versioner storage. Versioner ) storage.Interface {
103
+ return newStore (c , codec , newFunc , newListFunc , prefix , resourcePrefix , groupResource , transformer , leaseManagerConfig , decoder , versioner )
104
104
}
105
105
106
- func newStore (c * clientv3.Client , codec runtime.Codec , newFunc , newListFunc func () runtime.Object , prefix , resourcePrefix string , groupResource schema.GroupResource , transformer value.Transformer , leaseManagerConfig LeaseManagerConfig ) * store {
107
- versioner := storage.APIObjectVersioner {}
106
+ func newStore (c * clientv3.Client , codec runtime.Codec , newFunc , newListFunc func () runtime.Object , prefix , resourcePrefix string , groupResource schema.GroupResource , transformer value.Transformer , leaseManagerConfig LeaseManagerConfig , decoder Decoder , versioner storage.Versioner ) * store {
108
107
// for compatibility with etcd2 impl.
109
108
// no-op for default prefix of '/registry'.
110
109
// keeps compatibility with etcd2 impl for custom prefixes that don't start with '/'
@@ -137,6 +136,7 @@ func newStore(c *clientv3.Client, codec runtime.Codec, newFunc, newListFunc func
137
136
groupResourceString : groupResource .String (),
138
137
watcher : w ,
139
138
leaseManager : newDefaultLeaseManager (c , leaseManagerConfig ),
139
+ decoder : decoder ,
140
140
}
141
141
142
142
w .getCurrentStorageRV = func (ctx context.Context ) (uint64 , error ) {
@@ -182,7 +182,7 @@ func (s *store) Get(ctx context.Context, key string, opts storage.GetOptions, ou
182
182
return storage .NewInternalError (err )
183
183
}
184
184
185
- err = decode ( s . codec , s . versioner , data , out , kv .ModRevision )
185
+ err = s . decoder . Decode ( data , out , kv .ModRevision )
186
186
if err != nil {
187
187
recordDecodeError (s .groupResourceString , preparedKey )
188
188
return err
@@ -248,7 +248,7 @@ func (s *store) Create(ctx context.Context, key string, obj, out runtime.Object,
248
248
249
249
if out != nil {
250
250
putResp := txnResp .Responses [0 ].GetResponsePut ()
251
- err = decode ( s . codec , s . versioner , data , out , putResp .Header .Revision )
251
+ err = s . decoder . Decode ( data , out , putResp .Header .Revision )
252
252
if err != nil {
253
253
span .AddEvent ("decode failed" , attribute .Int ("len" , len (data )), attribute .String ("err" , err .Error ()))
254
254
recordDecodeError (s .groupResourceString , preparedKey )
@@ -379,7 +379,7 @@ func (s *store) conditionalDelete(
379
379
return errors .New ("invalid DeleteRange response - nil header" )
380
380
}
381
381
if ! skipTransformDecode {
382
- err = decode ( s . codec , s . versioner , origState .data , out , deleteResp .Header .Revision )
382
+ err = s . decoder . Decode ( origState .data , out , deleteResp .Header .Revision )
383
383
if err != nil {
384
384
recordDecodeError (s .groupResourceString , key )
385
385
return err
@@ -496,7 +496,7 @@ func (s *store) GuaranteedUpdate(
496
496
}
497
497
// recheck that the data from etcd is not stale before short-circuiting a write
498
498
if ! origState .stale {
499
- err = decode ( s . codec , s . versioner , origState .data , destination , origState .rev )
499
+ err = s . decoder . Decode ( origState .data , destination , origState .rev )
500
500
if err != nil {
501
501
recordDecodeError (s .groupResourceString , preparedKey )
502
502
return err
@@ -547,7 +547,7 @@ func (s *store) GuaranteedUpdate(
547
547
}
548
548
putResp := txnResp .Responses [0 ].GetResponsePut ()
549
549
550
- err = decode ( s . codec , s . versioner , data , destination , putResp .Header .Revision )
550
+ err = s . decoder . Decode ( data , destination , putResp .Header .Revision )
551
551
if err != nil {
552
552
span .AddEvent ("decode failed" , attribute .Int ("len" , len (data )), attribute .String ("err" , err .Error ()))
553
553
recordDecodeError (s .groupResourceString , preparedKey )
@@ -779,7 +779,7 @@ func (s *store) GetList(ctx context.Context, key string, opts storage.ListOption
779
779
default :
780
780
}
781
781
782
- obj , err := decodeListItem (ctx , data , uint64 (kv .ModRevision ), s . codec , s . versioner , newItemFunc )
782
+ obj , err := s . decoder . DecodeListItem (ctx , data , uint64 (kv .ModRevision ), newItemFunc )
783
783
if err != nil {
784
784
recordDecodeError (s .groupResourceString , string (kv .Key ))
785
785
return err
@@ -939,7 +939,7 @@ func (s *store) getState(ctx context.Context, getResp *clientv3.GetResponse, key
939
939
state .data = data
940
940
state .stale = stale
941
941
942
- if err := decode ( s . codec , s . versioner , state .data , state .obj , state .rev ); err != nil {
942
+ if err := s . decoder . Decode ( state .data , state .obj , state .rev ); err != nil {
943
943
recordDecodeError (s .groupResourceString , key )
944
944
return nil , err
945
945
}
@@ -1046,42 +1046,6 @@ func (s *store) prepareKey(key string) (string, error) {
1046
1046
return s .pathPrefix + key [startIndex :], nil
1047
1047
}
1048
1048
1049
- // decode decodes value of bytes into object. It will also set the object resource version to rev.
1050
- // On success, objPtr would be set to the object.
1051
- func decode (codec runtime.Codec , versioner storage.Versioner , value []byte , objPtr runtime.Object , rev int64 ) error {
1052
- if _ , err := conversion .EnforcePtr (objPtr ); err != nil {
1053
- return fmt .Errorf ("unable to convert output object to pointer: %v" , err )
1054
- }
1055
- _ , _ , err := codec .Decode (value , nil , objPtr )
1056
- if err != nil {
1057
- return err
1058
- }
1059
- // being unable to set the version does not prevent the object from being extracted
1060
- if err := versioner .UpdateObject (objPtr , uint64 (rev )); err != nil {
1061
- klog .Errorf ("failed to update object version: %v" , err )
1062
- }
1063
- return nil
1064
- }
1065
-
1066
- // decodeListItem decodes bytes value in array into object.
1067
- func decodeListItem (ctx context.Context , data []byte , rev uint64 , codec runtime.Codec , versioner storage.Versioner , newItemFunc func () runtime.Object ) (runtime.Object , error ) {
1068
- startedAt := time .Now ()
1069
- defer func () {
1070
- endpointsrequest .TrackDecodeLatency (ctx , time .Since (startedAt ))
1071
- }()
1072
-
1073
- obj , _ , err := codec .Decode (data , nil , newItemFunc ())
1074
- if err != nil {
1075
- return nil , err
1076
- }
1077
-
1078
- if err := versioner .UpdateObject (obj , rev ); err != nil {
1079
- klog .Errorf ("failed to update object version: %v" , err )
1080
- }
1081
-
1082
- return obj , nil
1083
- }
1084
-
1085
1049
// recordDecodeError record decode error split by object type.
1086
1050
func recordDecodeError (resource string , key string ) {
1087
1051
metrics .RecordDecodeError (resource )
0 commit comments