@@ -45,7 +45,7 @@ type storeKey struct {
45
45
46
46
// wrappedProvider wraps a provider instance with a reference count.
47
47
type wrappedProvider struct {
48
- provider Provider
48
+ Provider
49
49
refCount int
50
50
51
51
// A reference to the key and store are also kept here to override the
@@ -54,11 +54,21 @@ type wrappedProvider struct {
54
54
store * store
55
55
}
56
56
57
- // wrappedProviderCloser wraps a provider instance with a reference count to avoid double
57
+ // closedProvider always returns errProviderClosed error.
58
+ type closedProvider struct {}
59
+
60
+ func (c closedProvider ) KeyMaterial (ctx context.Context ) (* KeyMaterial , error ) {
61
+ return nil , errProviderClosed
62
+ }
63
+
64
+ func (c closedProvider ) Close () {
65
+ }
66
+
67
+ // singleCloseWrappedProvider wraps a provider instance with a reference count to avoid double
58
68
// close still in use provider.
59
- type wrappedProviderCloser struct {
60
- mu sync.RWMutex
61
- wp * wrappedProvider
69
+ type singleCloseWrappedProvider struct {
70
+ mu sync.RWMutex
71
+ provider Provider
62
72
}
63
73
64
74
// store is a collection of provider instances, safe for concurrent access.
@@ -78,32 +88,27 @@ func (wp *wrappedProvider) Close() {
78
88
79
89
wp .refCount --
80
90
if wp .refCount == 0 {
81
- wp .provider .Close ()
91
+ wp .Provider .Close ()
82
92
delete (ps .providers , wp .storeKey )
83
93
}
84
94
}
85
95
86
96
// Close overrides the Close method of the embedded provider to avoid release the
87
97
// already released reference.
88
- func (w * wrappedProviderCloser ) Close () {
98
+ func (w * singleCloseWrappedProvider ) Close () {
89
99
w .mu .Lock ()
90
100
defer w .mu .Unlock ()
91
- if wp := w .wp ; wp != nil {
92
- w .wp = nil
93
- wp .Close ()
94
- }
101
+ w .provider .Close ()
102
+ w .provider = closedProvider {}
95
103
}
96
104
97
105
// KeyMaterial returns the key material sourced by the Provider.
98
106
// Callers are expected to use the returned value as read-only.
99
- func (w * wrappedProviderCloser ) KeyMaterial (ctx context.Context ) (* KeyMaterial , error ) {
107
+ func (w * singleCloseWrappedProvider ) KeyMaterial (ctx context.Context ) (* KeyMaterial , error ) {
100
108
w .mu .RLock ()
101
109
defer w .mu .RUnlock ()
102
110
103
- if w .wp == nil {
104
- return nil , errProviderClosed
105
- }
106
- return w .wp .provider .KeyMaterial (ctx )
111
+ return w .provider .KeyMaterial (ctx )
107
112
}
108
113
109
114
// BuildableConfig wraps parsed provider configuration and functionality to
@@ -143,21 +148,21 @@ func (bc *BuildableConfig) Build(opts BuildOptions) (Provider, error) {
143
148
}
144
149
if wp , ok := provStore .providers [sk ]; ok {
145
150
wp .refCount ++
146
- return & wrappedProviderCloser { wp : wp }, nil
151
+ return & singleCloseWrappedProvider { provider : wp }, nil
147
152
}
148
153
149
154
provider := bc .starter (opts )
150
155
if provider == nil {
151
156
return nil , fmt .Errorf ("provider(%q, %q).Build(%v) failed" , sk .name , sk .config , opts )
152
157
}
153
158
wp := & wrappedProvider {
154
- provider : provider ,
159
+ Provider : provider ,
155
160
refCount : 1 ,
156
161
storeKey : sk ,
157
162
store : provStore ,
158
163
}
159
164
provStore .providers [sk ] = wp
160
- return & wrappedProviderCloser { wp : wp }, nil
165
+ return & singleCloseWrappedProvider { provider : wp }, nil
161
166
}
162
167
163
168
// String returns the provider name and config as a colon separated string.
0 commit comments