@@ -21,6 +21,7 @@ import (
21
21
"encoding/json"
22
22
"fmt"
23
23
"strings"
24
+ "sync"
24
25
"time"
25
26
26
27
"github.com/minio/console/models"
@@ -29,15 +30,16 @@ import (
29
30
30
31
func (wsc * wsMinioClient ) objectManager (session * models.Principal ) {
31
32
// Storage of Cancel Contexts for this connection
32
- cancelContexts := make ( map [ int64 ]context. CancelFunc )
33
+ var cancelContexts sync. Map
33
34
// Initial goroutine
34
35
defer func () {
35
36
// We close socket at the end of requests
36
37
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
+ })
41
43
}()
42
44
43
45
writeChannel := make (chan WSResponse )
@@ -80,26 +82,28 @@ func (wsc *wsMinioClient) objectManager(session *models.Principal) {
80
82
ctx , cancel := context .WithCancel (context .Background ())
81
83
82
84
// We store the cancel func associated with this request
83
- cancelContexts [ messageRequest .RequestID ] = cancel
85
+ cancelContexts . Store ( messageRequest .RequestID , cancel )
84
86
85
87
const itemsPerBatch = 1000
86
88
switch messageRequest .Mode {
87
89
case "close" :
88
90
return
89
91
case "cancel" :
90
92
// 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 )
94
96
}
95
97
case "objects" :
96
98
// 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 )
98
101
if rid < messageRequest .RequestID {
99
- // invoke cancel
100
- c ()
102
+ cancelFunc := value .(context. CancelFunc )
103
+ cancelFunc ()
101
104
}
102
- }
105
+ return true
106
+ })
103
107
104
108
// start listing and writing to web socket
105
109
go func () {
@@ -118,9 +122,10 @@ func (wsc *wsMinioClient) objectManager(session *models.Principal) {
118
122
}
119
123
var buffer []ObjectResponse
120
124
for lsObj := range startObjectsListing (ctx , wsc .client , objectRqConfigs ) {
121
- if cancelContexts [ messageRequest .RequestID ] == nil {
125
+ if _ , ok := cancelContexts . Load ( messageRequest .RequestID ); ! ok {
122
126
return
123
127
}
128
+
124
129
if lsObj .Err != nil {
125
130
sendWSResponse (WSResponse {
126
131
RequestID : messageRequest .RequestID ,
@@ -162,16 +167,18 @@ func (wsc *wsMinioClient) objectManager(session *models.Principal) {
162
167
})
163
168
164
169
// remove the cancellation context
165
- delete ( cancelContexts , messageRequest .RequestID )
170
+ cancelContexts . Delete ( messageRequest .RequestID )
166
171
}()
167
172
case "rewind" :
168
173
// 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 )
170
176
if rid < messageRequest .RequestID {
171
- // invoke cancel
172
- c ()
177
+ cancelFunc := value .(context. CancelFunc )
178
+ cancelFunc ()
173
179
}
174
- }
180
+ return true
181
+ })
175
182
176
183
// start listing and writing to web socket
177
184
go func () {
@@ -253,7 +260,7 @@ func (wsc *wsMinioClient) objectManager(session *models.Principal) {
253
260
})
254
261
255
262
// remove the cancellation context
256
- delete ( cancelContexts , messageRequest .RequestID )
263
+ cancelContexts . Delete ( messageRequest .RequestID )
257
264
}()
258
265
}
259
266
}
0 commit comments