Skip to content

Commit d9b07d7

Browse files
committed
config/remote/service: no need for mutex around api.API
This dependency is never changed.
1 parent fe4410f commit d9b07d7

2 files changed

Lines changed: 23 additions & 29 deletions

File tree

pkg/config/remote/service/service.go

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ type CoreAgentService struct {
123123
// help when triaging via logs.
124124
rcType string
125125

126+
api api.API
126127
clock clock.Clock
127128
hostname string
128129
tagsGetter func() []string
@@ -162,7 +163,6 @@ type CoreAgentService struct {
162163
sync.Mutex
163164

164165
uptane coreAgentUptaneClient
165-
api api.API
166166

167167
firstUpdate bool
168168

@@ -248,13 +248,15 @@ func newOrgStatusPoller(refreshInterval time.Duration) *orgStatusPoller {
248248
}
249249

250250
// start begins the periodic polling of org status
251-
func (p *orgStatusPoller) start(clock clock.Clock, getAPI func() api.API, rcType string) {
251+
func (p *orgStatusPoller) start(clock clock.Clock, apiClient api.API, rcType string) {
252252
go func() {
253-
p.poll(getAPI(), rcType)
253+
timer := clock.Timer(0)
254+
defer timer.Stop()
254255
for {
255256
select {
256-
case <-clock.After(p.refreshInterval):
257-
p.poll(getAPI(), rcType)
257+
case <-timer.C:
258+
p.poll(apiClient, rcType)
259+
timer.Reset(p.refreshInterval)
258260
case <-p.stopChan:
259261
log.Infof("[%s] Stopping Remote Config org status poller", rcType)
260262
return
@@ -601,6 +603,7 @@ func NewService(cfg model.Reader, rcType, baseRawURL, hostname string, tagsGette
601603

602604
now := clock.Now().UTC()
603605
cas := &CoreAgentService{
606+
api: http,
604607
rcType: rcType,
605608
startupTime: now,
606609
hostname: hostname,
@@ -635,7 +638,6 @@ func NewService(cfg model.Reader, rcType, baseRawURL, hostname string, tagsGette
635638
cas.mu.backoffErrorCount = 0
636639
cas.mu.products = make(map[rdata.Product]struct{})
637640
cas.mu.newProducts = make(map[rdata.Product]struct{})
638-
cas.mu.api = http
639641
cas.mu.uptane = uptaneClient
640642

641643
cfg.OnUpdate(cas.apiKeyUpdateCallback())
@@ -655,7 +657,7 @@ func newRCBackendOrgUUIDProvider(http api.API) uptane.OrgUUIDProvider {
655657
func (s *CoreAgentService) Start() {
656658
refreshBypassCh := make(chan chan<- struct{})
657659
s.refreshBypassCh = refreshBypassCh
658-
s.orgStatusPoller.start(s.clock, s.getAPI, s.rcType)
660+
s.orgStatusPoller.start(s.clock, s.api, s.rcType)
659661

660662
go func() {
661663
if s.disableConfigPollLoop {
@@ -671,9 +673,7 @@ func (s *CoreAgentService) Start() {
671673
// UpdatePARJWT updates the stored JWT for Private Action Runners
672674
// for authentication to the remote config backend.
673675
func (s *CoreAgentService) UpdatePARJWT(jwt string) {
674-
s.mu.Lock()
675-
s.mu.api.UpdatePARJWT(jwt)
676-
s.mu.Unlock()
676+
s.api.UpdatePARJWT(jwt)
677677
}
678678

679679
func startWithAgentPollLoop(s *CoreAgentService, refreshBypassRequests <-chan chan<- struct{}) {
@@ -762,12 +762,6 @@ func (s *CoreAgentService) Stop() error {
762762
return err
763763
}
764764

765-
func (s *CoreAgentService) getAPI() api.API {
766-
s.mu.Lock()
767-
defer s.mu.Unlock()
768-
return s.mu.api
769-
}
770-
771765
func (s *CoreAgentService) calculateRefreshInterval() time.Duration {
772766
s.mu.Lock()
773767
backoffErrorCount := s.mu.backoffErrorCount
@@ -824,7 +818,7 @@ func (s *CoreAgentService) refresh() error {
824818
s.mu.Unlock()
825819
defer s.mu.Lock()
826820
ctx := context.Background()
827-
response, err = s.mu.api.Fetch(ctx, request)
821+
response, err = s.api.Fetch(ctx, request)
828822
}()
829823
s.mu.lastUpdateErr = nil
830824
if err != nil {
@@ -1091,7 +1085,7 @@ func (s *CoreAgentService) apiKeyUpdateCallback() func(string, model.Source, any
10911085
s.mu.Lock()
10921086
defer s.mu.Unlock()
10931087

1094-
s.mu.api.UpdateAPIKey(newKey)
1088+
s.api.UpdateAPIKey(newKey)
10951089

10961090
// Verify that the Org UUID hasn't changed
10971091
storedOrgUUID, err := s.mu.uptane.StoredOrgUUID()
@@ -1101,7 +1095,7 @@ func (s *CoreAgentService) apiKeyUpdateCallback() func(string, model.Source, any
11011095
}
11021096

11031097
// TODO: Do not hold the mutex while calling FetchOrgData.
1104-
newOrgUUID, err := s.mu.api.FetchOrgData(context.Background())
1098+
newOrgUUID, err := s.api.FetchOrgData(context.Background())
11051099
if err != nil {
11061100
log.Warnf("Could not get org uuid: %s", err)
11071101
return
@@ -1161,7 +1155,7 @@ func (s *CoreAgentService) ConfigResetState() (*pbgo.ResetStateConfigResponse, e
11611155
}
11621156
uptaneClient, err := uptane.NewCoreAgentClientWithRecreatedTransactionalStore(
11631157
metadata,
1164-
newRCBackendOrgUUIDProvider(s.mu.api),
1158+
newRCBackendOrgUUIDProvider(s.api),
11651159
opt...,
11661160
)
11671161
if err != nil {

pkg/config/remote/service/service_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ func newTestService(t *testing.T, api *mockAPI, coreAgentUptane *mockCoreAgentUp
213213
service, err := NewService(cfg, "Remote Config", baseRawURL, "localhost", getHostTags, mockTelemetryReporter, agentVersion, options...)
214214
require.NoError(t, err)
215215
t.Cleanup(func() { service.Stop() })
216-
service.mu.api = api
216+
service.api = api
217217
service.clock = clock
218218
service.mu.uptane = coreAgentUptane
219219
return service
@@ -317,13 +317,13 @@ func TestFetchOrgStatus503And504IncrementsErrCount(t *testing.T) {
317317
assert.Equal(t, service.orgStatusPoller.mu.fetchOrgStatus503And504ErrCount, uint64(0))
318318

319319
api.On("FetchOrgStatus", mock.Anything).Return(response, httpapi.ErrGatewayTimeout)
320-
service.orgStatusPoller.poll(service.getAPI(), service.rcType)
320+
service.orgStatusPoller.poll(service.api, service.rcType)
321321
assert.Equal(t, service.orgStatusPoller.mu.fetchOrgStatus503And504ErrCount, uint64(1))
322322

323323
assert.Nil(t, service.orgStatusPoller.getPreviousStatus())
324324
api.On("FetchOrgStatus", mock.Anything).Return(response, httpapi.ErrGatewayTimeout)
325325

326-
service.orgStatusPoller.poll(service.getAPI(), service.rcType)
326+
service.orgStatusPoller.poll(service.api, service.rcType)
327327
assert.Equal(t, service.orgStatusPoller.mu.fetchOrgStatus503And504ErrCount, uint64(2))
328328
}
329329

@@ -344,7 +344,7 @@ func TestFetchOrgStatusSuccessResetsErrorCount(t *testing.T) {
344344
assert.Nil(t, service.orgStatusPoller.getPreviousStatus())
345345
api.On("FetchOrgStatus", mock.Anything).Return(response, nil)
346346

347-
service.orgStatusPoller.poll(service.getAPI(), service.rcType)
347+
service.orgStatusPoller.poll(service.api, service.rcType)
348348
assert.Equal(t, service.orgStatusPoller.mu.fetchOrgStatus503And504ErrCount, uint64(0))
349349
}
350350

@@ -460,7 +460,7 @@ func TestServiceBackoffFailureRecovery(t *testing.T) {
460460
uptaneClient.On("TUFVersionState").Return(uptane.TUFVersions{}, nil)
461461
uptaneClient.On("Update", lastConfigResponse).Return(nil)
462462
uptaneClient.On("TargetsCustom").Return([]byte{}, nil)
463-
service.mu.api = api
463+
service.api = api
464464

465465
// Artificially set the backoff error count so we can test recovery
466466
service.mu.backoffErrorCount = 3
@@ -978,7 +978,7 @@ func TestWithApiKeyUpdate(t *testing.T) {
978978
assert.NoError(t, service.Stop())
979979
assert.NoError(t, service.Stop()) // ensure idempotency
980980
})
981-
service.mu.api = api
981+
service.api = api
982982
service.mu.uptane = uptaneClient
983983

984984
cfg.SetWithoutSource("api_key", "updated")
@@ -1213,20 +1213,20 @@ func TestOrgStatus(t *testing.T) {
12131213
assert.Nil(t, service.orgStatusPoller.getPreviousStatus())
12141214
api.On("FetchOrgStatus", mock.Anything).Return(response, nil)
12151215

1216-
service.orgStatusPoller.poll(service.getAPI(), service.rcType)
1216+
service.orgStatusPoller.poll(service.api, service.rcType)
12171217
prev := service.orgStatusPoller.getPreviousStatus()
12181218
assert.True(t, prev.Enabled)
12191219
assert.True(t, prev.Authorized)
12201220

12211221
api.On("FetchOrgStatus", mock.Anything).Return(nil, fmt.Errorf("Error"))
1222-
service.orgStatusPoller.poll(service.getAPI(), service.rcType)
1222+
service.orgStatusPoller.poll(service.api, service.rcType)
12231223
prev = service.orgStatusPoller.getPreviousStatus()
12241224
assert.True(t, prev.Enabled)
12251225
assert.True(t, prev.Authorized)
12261226

12271227
response.Authorized = false
12281228
api.On("FetchOrgStatus", mock.Anything).Return(response, nil)
1229-
service.orgStatusPoller.poll(service.getAPI(), service.rcType)
1229+
service.orgStatusPoller.poll(service.api, service.rcType)
12301230
prev = service.orgStatusPoller.getPreviousStatus()
12311231
assert.True(t, prev.Enabled)
12321232
assert.False(t, prev.Authorized)

0 commit comments

Comments
 (0)