Skip to content

Commit 6e3dc83

Browse files
committed
fix: fixing panic when updating config concurrently
1 parent 93c4603 commit 6e3dc83

File tree

2 files changed

+52
-38
lines changed

2 files changed

+52
-38
lines changed

src/plugins/dataplane_status.go

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,26 @@ import (
2323
)
2424

2525
type DataPlaneStatus struct {
26-
messagePipeline core.MessagePipeInterface
27-
ctx context.Context
28-
sendStatus chan bool
29-
healthTicker *time.Ticker
30-
interval time.Duration
31-
meta *proto.Metadata
32-
binary core.NginxBinary
33-
env core.Environment
34-
version string
35-
tags *[]string
36-
configDirs string
37-
lastSendDetails time.Time
38-
envHostInfo *proto.HostInfo
39-
reportInterval time.Duration
40-
softwareDetails map[string]*proto.DataplaneSoftwareDetails
41-
nginxConfigActivityStatuses map[string]*proto.AgentActivityStatus
42-
softwareDetailsMutex sync.RWMutex
43-
structMu sync.RWMutex
44-
processes []*core.Process
26+
messagePipeline core.MessagePipeInterface
27+
ctx context.Context
28+
sendStatus chan bool
29+
healthTicker *time.Ticker
30+
interval time.Duration
31+
meta *proto.Metadata
32+
binary core.NginxBinary
33+
env core.Environment
34+
version string
35+
tags *[]string
36+
configDirs string
37+
lastSendDetails time.Time
38+
envHostInfo *proto.HostInfo
39+
reportInterval time.Duration
40+
softwareDetails map[string]*proto.DataplaneSoftwareDetails
41+
nginxConfigActivityStatuses map[string]*proto.AgentActivityStatus
42+
nginxConfigActivityStatusesMutex sync.RWMutex
43+
softwareDetailsMutex sync.RWMutex
44+
structMu sync.RWMutex
45+
processes []*core.Process
4546
}
4647

4748
const (
@@ -81,7 +82,9 @@ func (dps *DataPlaneStatus) Init(pipeline core.MessagePipeInterface) {
8182

8283
func (dps *DataPlaneStatus) Close() {
8384
log.Info("DataPlaneStatus is wrapping up")
85+
dps.nginxConfigActivityStatusesMutex.Lock()
8486
dps.nginxConfigActivityStatuses = nil
87+
dps.nginxConfigActivityStatusesMutex.Unlock()
8588
dps.softwareDetailsMutex.Lock()
8689
dps.softwareDetails = nil
8790
dps.softwareDetailsMutex.Unlock()
@@ -145,7 +148,9 @@ func (dps *DataPlaneStatus) Subscriptions() []string {
145148
func (dps *DataPlaneStatus) updateNginxConfigActivityStatuses(newAgentActivityStatus *proto.AgentActivityStatus) {
146149
log.Tracef("DataplaneStatus: Updating nginxConfigActivityStatuses with %v", newAgentActivityStatus)
147150
if _, ok := newAgentActivityStatus.GetStatus().(*proto.AgentActivityStatus_NginxConfigStatus); ok {
151+
dps.nginxConfigActivityStatusesMutex.Lock()
148152
dps.nginxConfigActivityStatuses[newAgentActivityStatus.GetNginxConfigStatus().GetNginxId()] = newAgentActivityStatus
153+
dps.nginxConfigActivityStatusesMutex.Unlock()
149154
}
150155
}
151156

@@ -184,6 +189,8 @@ func (dps *DataPlaneStatus) healthGoRoutine(pipeline core.MessagePipeInterface)
184189
func (dps *DataPlaneStatus) dataplaneStatus(forceDetails bool) *proto.DataplaneStatus {
185190
forceDetails = forceDetails || time.Now().UTC().Add(-dps.reportInterval).After(dps.lastSendDetails)
186191

192+
dps.nginxConfigActivityStatusesMutex.Lock()
193+
defer dps.nginxConfigActivityStatusesMutex.Unlock()
187194
agentActivityStatuses := []*proto.AgentActivityStatus{}
188195
for _, nginxConfigActivityStatus := range dps.nginxConfigActivityStatuses {
189196
agentActivityStatuses = append(agentActivityStatuses, nginxConfigActivityStatus)

test/performance/vendor/github.com/nginx/agent/v2/src/plugins/dataplane_status.go

Lines changed: 26 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)