Skip to content

Commit cf05d50

Browse files
authored
Use sync.Map for websocket cancelContext map (#3368)
1 parent 3e83a30 commit cf05d50

File tree

1 file changed

+27
-20
lines changed

1 file changed

+27
-20
lines changed

api/ws_objects.go

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"encoding/json"
2222
"fmt"
2323
"strings"
24+
"sync"
2425
"time"
2526

2627
"github.com/minio/console/models"
@@ -29,15 +30,16 @@ import (
2930

3031
func (wsc *wsMinioClient) objectManager(session *models.Principal) {
3132
// Storage of Cancel Contexts for this connection
32-
cancelContexts := make(map[int64]context.CancelFunc)
33+
var cancelContexts sync.Map
3334
// Initial goroutine
3435
defer func() {
3536
// We close socket at the end of requests
3637
wsc.conn.close()
37-
for _, c := range cancelContexts {
38-
// invoke cancel
39-
c()
40-
}
38+
cancelContexts.Range(func(_, value interface{}) bool {
39+
cancelFunc := value.(context.CancelFunc)
40+
cancelFunc()
41+
return true
42+
})
4143
}()
4244

4345
writeChannel := make(chan WSResponse)
@@ -80,26 +82,28 @@ func (wsc *wsMinioClient) objectManager(session *models.Principal) {
8082
ctx, cancel := context.WithCancel(context.Background())
8183

8284
// We store the cancel func associated with this request
83-
cancelContexts[messageRequest.RequestID] = cancel
85+
cancelContexts.Store(messageRequest.RequestID, cancel)
8486

8587
const itemsPerBatch = 1000
8688
switch messageRequest.Mode {
8789
case "close":
8890
return
8991
case "cancel":
9092
// if we have that request id, cancel it
91-
if cancelFunc, ok := cancelContexts[messageRequest.RequestID]; ok {
92-
cancelFunc()
93-
delete(cancelContexts, messageRequest.RequestID)
93+
if cancelFunc, ok := cancelContexts.Load(messageRequest.RequestID); ok {
94+
cancelFunc.(context.CancelFunc)()
95+
cancelContexts.Delete(messageRequest.RequestID)
9496
}
9597
case "objects":
9698
// cancel all previous open objects requests for listing
97-
for rid, c := range cancelContexts {
99+
cancelContexts.Range(func(key, value interface{}) bool {
100+
rid := key.(int64)
98101
if rid < messageRequest.RequestID {
99-
// invoke cancel
100-
c()
102+
cancelFunc := value.(context.CancelFunc)
103+
cancelFunc()
101104
}
102-
}
105+
return true
106+
})
103107

104108
// start listing and writing to web socket
105109
go func() {
@@ -118,9 +122,10 @@ func (wsc *wsMinioClient) objectManager(session *models.Principal) {
118122
}
119123
var buffer []ObjectResponse
120124
for lsObj := range startObjectsListing(ctx, wsc.client, objectRqConfigs) {
121-
if cancelContexts[messageRequest.RequestID] == nil {
125+
if _, ok := cancelContexts.Load(messageRequest.RequestID); !ok {
122126
return
123127
}
128+
124129
if lsObj.Err != nil {
125130
sendWSResponse(WSResponse{
126131
RequestID: messageRequest.RequestID,
@@ -162,16 +167,18 @@ func (wsc *wsMinioClient) objectManager(session *models.Principal) {
162167
})
163168

164169
// remove the cancellation context
165-
delete(cancelContexts, messageRequest.RequestID)
170+
cancelContexts.Delete(messageRequest.RequestID)
166171
}()
167172
case "rewind":
168173
// cancel all previous open objects requests for listing
169-
for rid, c := range cancelContexts {
174+
cancelContexts.Range(func(key, value interface{}) bool {
175+
rid := key.(int64)
170176
if rid < messageRequest.RequestID {
171-
// invoke cancel
172-
c()
177+
cancelFunc := value.(context.CancelFunc)
178+
cancelFunc()
173179
}
174-
}
180+
return true
181+
})
175182

176183
// start listing and writing to web socket
177184
go func() {
@@ -253,7 +260,7 @@ func (wsc *wsMinioClient) objectManager(session *models.Principal) {
253260
})
254261

255262
// remove the cancellation context
256-
delete(cancelContexts, messageRequest.RequestID)
263+
cancelContexts.Delete(messageRequest.RequestID)
257264
}()
258265
}
259266
}

0 commit comments

Comments
 (0)