Skip to content

Commit 8d75dce

Browse files
Add better logging to the dual writer (#85594)
* Make Legacy a public field * Remove duplicated Create method * Add logger to dualwriter * Use klog * Add comment about selecting the dual writer * Update pkg/apiserver/rest/dualwriter_mode1.go Co-authored-by: Arati R. <[email protected]> * Update pkg/apiserver/rest/dualwriter_mode2.go Co-authored-by: Arati R. <[email protected]> * Update pkg/apiserver/rest/dualwriter_mode3.go Co-authored-by: Arati R. <[email protected]> * Update pkg/apiserver/rest/dualwriter_mode3.go Co-authored-by: Arati R. <[email protected]> * Update pkg/apiserver/rest/dualwriter_mode2.go Co-authored-by: Arati R. <[email protected]> * Create error var * Lint --------- Co-authored-by: Arati R. <[email protected]>
1 parent 4c12d77 commit 8d75dce

File tree

4 files changed

+25
-15
lines changed

4 files changed

+25
-15
lines changed

pkg/apiserver/rest/dualwriter.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ type LegacyStorage interface {
6262
// - rest.CollectionDeleter
6363
type DualWriter struct {
6464
Storage
65-
legacy LegacyStorage
65+
Legacy LegacyStorage
6666
}
6767

6868
type DualWriterMode int
@@ -80,15 +80,17 @@ var CurrentMode = Mode2
8080

8181
// NewDualWriter returns a new DualWriter.
8282
func NewDualWriter(legacy LegacyStorage, storage Storage) *DualWriter {
83+
//TODO: replace this with
84+
// SelectDualWriter(CurrentMode, legacy, storage)
8385
return &DualWriter{
8486
Storage: storage,
85-
legacy: legacy,
87+
Legacy: legacy,
8688
}
8789
}
8890

8991
// Create overrides the default behavior of the Storage and writes to both the LegacyStorage and Storage.
9092
func (d *DualWriter) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) {
91-
if legacy, ok := d.legacy.(rest.Creater); ok {
93+
if legacy, ok := d.Legacy.(rest.Creater); ok {
9294
created, err := legacy.Create(ctx, obj, createValidation, options)
9395
if err != nil {
9496
return nil, err
@@ -113,7 +115,7 @@ func (d *DualWriter) Create(ctx context.Context, obj runtime.Object, createValid
113115

114116
// Update overrides the default behavior of the Storage and writes to both the LegacyStorage and Storage.
115117
func (d *DualWriter) Update(ctx context.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc, forceAllowCreate bool, options *metav1.UpdateOptions) (runtime.Object, bool, error) {
116-
if legacy, ok := d.legacy.(rest.Updater); ok {
118+
if legacy, ok := d.Legacy.(rest.Updater); ok {
117119
// Get the previous version from k8s storage (the one)
118120
old, err := d.Get(ctx, name, &metav1.GetOptions{})
119121
if err != nil {
@@ -168,7 +170,7 @@ func (d *DualWriter) Delete(ctx context.Context, name string, deleteValidation r
168170
// Delete from storage *first* so the item is still exists if a failure happens
169171
obj, async, err := d.Storage.Delete(ctx, name, deleteValidation, options)
170172
if err == nil {
171-
if legacy, ok := d.legacy.(rest.GracefulDeleter); ok {
173+
if legacy, ok := d.Legacy.(rest.GracefulDeleter); ok {
172174
obj, async, err = legacy.Delete(ctx, name, deleteValidation, options)
173175
}
174176
}
@@ -179,7 +181,7 @@ func (d *DualWriter) Delete(ctx context.Context, name string, deleteValidation r
179181
func (d *DualWriter) DeleteCollection(ctx context.Context, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions, listOptions *metainternalversion.ListOptions) (runtime.Object, error) {
180182
out, err := d.Storage.DeleteCollection(ctx, deleteValidation, options, listOptions)
181183
if err == nil {
182-
if legacy, ok := d.legacy.(rest.CollectionDeleter); ok {
184+
if legacy, ok := d.Legacy.(rest.CollectionDeleter); ok {
183185
out, err = legacy.DeleteCollection(ctx, deleteValidation, options, listOptions)
184186
}
185187
}

pkg/apiserver/rest/dualwriter_mode1.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,20 @@ package rest
22

33
import (
44
"context"
5-
"fmt"
5+
"errors"
66

77
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
88
"k8s.io/apimachinery/pkg/runtime"
99
"k8s.io/apiserver/pkg/registry/rest"
10+
"k8s.io/klog/v2"
1011
)
1112

1213
type DualWriterMode1 struct {
1314
DualWriter
1415
}
1516

17+
var errNoCreaterMethod = errors.New("legacy storage rest.Creater is missing")
18+
1619
// NewDualWriterMode1 returns a new DualWriter in mode 1.
1720
// Mode 1 represents writing to and reading from LegacyStorage.
1821
func NewDualWriterMode1(legacy LegacyStorage, storage Storage) *DualWriterMode1 {
@@ -21,9 +24,10 @@ func NewDualWriterMode1(legacy LegacyStorage, storage Storage) *DualWriterMode1
2124

2225
// Create overrides the default behavior of the DualWriter and writes only to LegacyStorage.
2326
func (d *DualWriterMode1) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) {
24-
legacy, ok := d.legacy.(rest.Creater)
27+
legacy, ok := d.Legacy.(rest.Creater)
2528
if !ok {
26-
return nil, fmt.Errorf("legacy storage rest.Creater is missing")
29+
klog.FromContext(ctx).Error(errNoCreaterMethod, "legacy storage rest.Creater is missing")
30+
return nil, errNoCreaterMethod
2731
}
2832

2933
return legacy.Create(ctx, obj, createValidation, options)

pkg/apiserver/rest/dualwriter_mode2.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
99
"k8s.io/apimachinery/pkg/runtime"
1010
"k8s.io/apiserver/pkg/registry/rest"
11-
"k8s.io/klog"
11+
"k8s.io/klog/v2"
1212
)
1313

1414
type DualWriterMode2 struct {
@@ -23,13 +23,14 @@ func NewDualWriterMode2(legacy LegacyStorage, storage Storage) *DualWriterMode2
2323

2424
// Create overrides the default behavior of the DualWriter and writes to LegacyStorage and Storage.
2525
func (d *DualWriterMode2) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) {
26-
legacy, ok := d.legacy.(rest.Creater)
26+
legacy, ok := d.Legacy.(rest.Creater)
2727
if !ok {
2828
return nil, fmt.Errorf("legacy storage rest.Creater is missing")
2929
}
3030

3131
created, err := legacy.Create(ctx, obj, createValidation, options)
3232
if err != nil {
33+
klog.FromContext(ctx).Error(err, "unable to create object in legacy storage", "mode", 2)
3334
return created, err
3435
}
3536

@@ -42,12 +43,14 @@ func (d *DualWriterMode2) Create(ctx context.Context, obj runtime.Object, create
4243
if err != nil {
4344
return created, err
4445
}
46+
47+
// create method expects an empty resource version
4548
accessor.SetResourceVersion("")
4649
accessor.SetUID("")
4750

4851
rsp, err := d.Storage.Create(ctx, c, createValidation, options)
4952
if err != nil {
50-
klog.Error("unable to create object in duplicate storage", "error", err, "mode", Mode2)
53+
klog.FromContext(ctx).Error(err, "unable to create object in Storage", "mode", 2)
5154
}
5255
return rsp, err
5356
}

pkg/apiserver/rest/dualwriter_mode3.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
88
"k8s.io/apimachinery/pkg/runtime"
99
"k8s.io/apiserver/pkg/registry/rest"
10-
"k8s.io/klog"
10+
"k8s.io/klog/v2"
1111
)
1212

1313
type DualWriterMode3 struct {
@@ -22,18 +22,19 @@ func NewDualWriterMode3(legacy LegacyStorage, storage Storage) *DualWriterMode3
2222

2323
// Create overrides the default behavior of the DualWriter and writes to LegacyStorage and Storage.
2424
func (d *DualWriterMode3) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) {
25-
legacy, ok := d.legacy.(rest.Creater)
25+
legacy, ok := d.Legacy.(rest.Creater)
2626
if !ok {
2727
return nil, fmt.Errorf("legacy storage rest.Creater is missing")
2828
}
2929

3030
created, err := d.Storage.Create(ctx, obj, createValidation, options)
3131
if err != nil {
32+
klog.FromContext(ctx).Error(err, "unable to create object in Storage", "mode", 3)
3233
return created, err
3334
}
3435

3536
if _, err := legacy.Create(ctx, obj, createValidation, options); err != nil {
36-
klog.Error("unable to create object in legacy storage", "error", err)
37+
klog.FromContext(ctx).Error(err, "unable to create object in legacy storage", "mode", 3)
3738
}
3839
return created, nil
3940
}

0 commit comments

Comments
 (0)