@@ -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
3031func (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 (key , 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