@@ -29,7 +29,6 @@ import (
29
29
"github.com/NVIDIA/aistore/nl"
30
30
"github.com/NVIDIA/aistore/reb"
31
31
"github.com/NVIDIA/aistore/res"
32
- "github.com/NVIDIA/aistore/stats"
33
32
"github.com/NVIDIA/aistore/xact"
34
33
"github.com/NVIDIA/aistore/xact/xreg"
35
34
jsoniter "github.com/json-iterator/go"
@@ -183,34 +182,38 @@ func (t *target) daeputMsg(w http.ResponseWriter, r *http.Request) {
183
182
errorsOnly := msg .Value .(bool )
184
183
t .statsT .ResetStats (errorsOnly )
185
184
case apc .ActReloadBackendCreds :
186
- var (
187
- tstats = t .statsT .(* stats.Trunner )
188
- provider = msg .Name
189
- )
190
- if provider == "" { // all
191
- if err := t .initBuiltTagged (t .statsT .(* stats.Trunner ), cmn .GCO .Get (), false ); err != nil {
185
+ provider := msg .Name
186
+
187
+ // all
188
+ if provider == "" {
189
+ if err := t .initBuiltTagged (cmn .GCO .Get (), false ); err != nil {
192
190
t .writeErr (w , r , err )
193
191
}
192
+ // rate-limited wrappers, respectively
193
+ for provider , bp := range t .bps {
194
+ t .rlbps [provider ] = & rlbackend {Backend : bp , t : t }
195
+ }
194
196
return
195
197
}
196
-
197
198
// one
198
- var add core.Backend
199
+ var bp core.Backend
199
200
switch provider {
200
201
case apc .AWS :
201
- add , err = backend .NewAWS (t , tstats , false /*starting up*/ )
202
+ bp , err = backend .NewAWS (t , t . statsT , false /*starting up*/ )
202
203
case apc .GCP :
203
- add , err = backend .NewGCP (t , tstats , false )
204
+ bp , err = backend .NewGCP (t , t . statsT , false )
204
205
case apc .Azure :
205
- add , err = backend .NewAzure (t , tstats , false )
206
+ bp , err = backend .NewAzure (t , t . statsT , false )
206
207
case apc .OCI :
207
- add , err = backend .NewOCI (t , tstats , false )
208
+ bp , err = backend .NewOCI (t , t . statsT , false )
208
209
}
209
210
if err != nil {
210
211
t .writeErr (w , r , err )
211
212
return
212
213
}
213
- t .bps [provider ] = add
214
+ debug .Assert (bp != nil )
215
+ t .bps [provider ] = bp
216
+ t .rlbps [provider ] = & rlbackend {Backend : bp , t : t }
214
217
case apc .ActStartMaintenance :
215
218
if ! t .ensureIntraControl (w , r , true /* from primary */ ) {
216
219
return
@@ -246,7 +249,7 @@ func (t *target) daeputMsg(w http.ResponseWriter, r *http.Request) {
246
249
}
247
250
248
251
func (t * target ) daeputItems (w http.ResponseWriter , r * http.Request , apiItems []string ) {
249
- switch apiItems [0 ] {
252
+ switch act := apiItems [0 ]; act {
250
253
case apc .Proxy :
251
254
// PUT /v1/daemon/proxy/newprimaryproxyid
252
255
t .daeSetPrimary (w , r , apiItems )
@@ -263,41 +266,53 @@ func (t *target) daeputItems(w http.ResponseWriter, r *http.Request, apiItems []
263
266
t .handleMpathReq (w , r )
264
267
case apc .ActSetConfig : // set-config #1 - via query parameters and "?n1=v1&n2=v2..."
265
268
t .setDaemonConfigQuery (w , r )
266
- case apc .ActEnableBackend :
267
- t .regstate .mu .Lock ()
268
- t .enableBackend (w , r , apiItems )
269
- t .regstate .mu .Unlock ()
270
- case apc .ActDisableBackend :
269
+ case apc .ActEnableBackend , apc .ActDisableBackend :
271
270
t .regstate .mu .Lock ()
272
- t .disableBackend (w , r , apiItems )
273
- t .regstate .mu .Unlock ()
271
+ defer t .regstate .mu .Unlock ()
272
+ if len (apiItems ) < 3 { // act, provider, phase
273
+ t .writeErrURL (w , r )
274
+ return
275
+ }
276
+ var (
277
+ provider = apiItems [1 ]
278
+ phase = apiItems [2 ]
279
+ )
280
+ if ! apc .IsCloudProvider (provider ) {
281
+ t .writeErrf (w , r , "expecting cloud storage provider (have %q)" , provider )
282
+ return
283
+ }
284
+ if phase != apc .ActBegin && phase != apc .ActCommit {
285
+ t .writeErrf (w , r , "expecting 'begin' or 'commit' phase (have %q)" , phase )
286
+ return
287
+ }
288
+ if act == apc .ActEnableBackend {
289
+ t .enableBackend (w , r , provider , phase )
290
+ } else {
291
+ t .disableBackend (w , r , provider , phase )
292
+ }
274
293
case apc .LoadX509 :
275
294
t .daeLoadX509 (w , r )
276
295
}
277
296
}
278
297
279
- func (t * target ) enableBackend (w http.ResponseWriter , r * http.Request , items [] string ) {
298
+ func (t * target ) enableBackend (w http.ResponseWriter , r * http.Request , provider , phase string ) {
280
299
var (
281
- provider = items [1 ]
282
- phase = items [2 ]
283
- config = cmn .GCO .Get ()
300
+ config = cmn .GCO .Get ()
284
301
)
285
- debug .Assert (apc .IsCloudProvider (provider ), provider )
286
- debug .Assert (phase == apc .ActBegin || phase == apc .ActCommit , phase )
287
-
288
302
_ , ok := config .Backend .Providers [provider ]
289
303
if ! ok {
290
304
t .writeErrf (w , r , "backend %q is not configured, cannot enable" , provider )
291
305
return
292
306
}
293
307
bp , k := t .bps [provider ]
294
308
debug .Assert (k , provider )
295
- if bp != nil {
296
- // TODO: return http.StatusNoContent
309
+
310
+ switch {
311
+ case bp != nil :
297
312
t .writeErrf (w , r , "backend %q is already enabled, nothing to do" , provider )
298
- return
299
- }
300
- if phase == apc . ActCommit {
313
+ case phase == apc . ActBegin :
314
+ nlog . Infof ( "ready to enable backend %q" , provider )
315
+ default :
301
316
var err error
302
317
switch provider {
303
318
case apc .AWS :
@@ -314,37 +329,37 @@ func (t *target) enableBackend(w http.ResponseWriter, r *http.Request, items []s
314
329
t .writeErr (w , r , err )
315
330
return
316
331
}
332
+
333
+ debug .Assert (bp != nil )
317
334
t .bps [provider ] = bp
335
+ t .rlbps [provider ] = & rlbackend {Backend : bp , t : t }
336
+
337
+ nlog .Infof ("enabled backend %q" , provider )
318
338
}
319
- nlog .Infoln (phase + ":" , "enable" , provider )
320
339
}
321
340
322
- func (t * target ) disableBackend (w http.ResponseWriter , r * http.Request , items [] string ) {
341
+ func (t * target ) disableBackend (w http.ResponseWriter , r * http.Request , provider , phase string ) {
323
342
var (
324
- provider = items [1 ]
325
- phase = items [2 ]
326
- config = cmn .GCO .Get ()
343
+ config = cmn .GCO .Get ()
327
344
)
328
- debug .Assert (apc .IsCloudProvider (provider ), provider )
329
- debug .Assert (phase == apc .ActBegin || phase == apc .ActCommit , phase )
330
-
331
345
_ , ok := config .Backend .Providers [provider ]
332
346
if ! ok {
333
- // TODO: return http.StatusNoContent
334
347
t .writeErrf (w , r , "backend %q is not configured, nothing to do" , provider )
335
348
return
336
349
}
337
350
bp , k := t .bps [provider ]
338
351
debug .Assert (k , provider )
339
- if bp == nil {
340
- // TODO: return http.StatusNoContent
352
+
353
+ switch {
354
+ case bp == nil :
341
355
t .writeErrf (w , r , "backend %q is already disabled, nothing to do" , provider )
342
- return
343
- }
344
- if phase == apc .ActCommit {
356
+ case phase == apc .ActBegin :
357
+ nlog .Infof ("ready to disable backend %q" , provider )
358
+ default :
359
+ // NOTE: not locking bp := t.Backend()
345
360
t .bps [provider ] = nil
361
+ nlog .Infof ("disabled backend %q" , provider )
346
362
}
347
- nlog .Infoln (phase + ":" , "disable" , provider )
348
363
}
349
364
350
365
func (t * target ) daeSetPrimary (w http.ResponseWriter , r * http.Request , apiItems []string ) {
@@ -1205,7 +1220,9 @@ func (t *target) receiveConfig(newConfig *globalConfig, msg *actMsgExt, payload
1205
1220
if aisConf := newConfig .Backend .Get (apc .AIS ); aisConf != nil {
1206
1221
err = t .attachDetachRemAis (newConfig , msg )
1207
1222
} else {
1208
- t .bps [apc .AIS ] = backend .NewAIS (t , t .statsT , false )
1223
+ aisbp := backend .NewAIS (t , t .statsT , false )
1224
+ t .bps [apc .AIS ] = aisbp
1225
+ t .rlbps [apc .AIS ] = & rlbackend {Backend : aisbp , t : t }
1209
1226
}
1210
1227
}
1211
1228
return
0 commit comments