@@ -35,9 +35,11 @@ func (wsc *wsMinioClient) objectManager(session *models.Principal) {
35
35
defer func () {
36
36
// We close socket at the end of requests
37
37
wsc .conn .close ()
38
- cancelContexts .Range (func (_ , value interface {}) bool {
38
+ cancelContexts .Range (func (key , value interface {}) bool {
39
39
cancelFunc := value .(context.CancelFunc )
40
40
cancelFunc ()
41
+
42
+ cancelContexts .Delete (key )
41
43
return true
42
44
})
43
45
}()
@@ -55,6 +57,7 @@ func (wsc *wsMinioClient) objectManager(session *models.Principal) {
55
57
// Read goroutine
56
58
go func () {
57
59
defer close (writeChannel )
60
+
58
61
for {
59
62
select {
60
63
case <- done :
@@ -72,10 +75,9 @@ func (wsc *wsMinioClient) objectManager(session *models.Principal) {
72
75
// We get request data & review information
73
76
var messageRequest ObjectsRequest
74
77
75
- err := json .Unmarshal (message , & messageRequest )
76
- if err != nil {
77
- LogInfo ("Error on message request unmarshal" )
78
- return
78
+ if err := json .Unmarshal (message , & messageRequest ); err != nil {
79
+ LogInfo ("Error on message request unmarshal" , err )
80
+ continue
79
81
}
80
82
81
83
// new message, new context
@@ -84,184 +86,177 @@ func (wsc *wsMinioClient) objectManager(session *models.Principal) {
84
86
// We store the cancel func associated with this request
85
87
cancelContexts .Store (messageRequest .RequestID , cancel )
86
88
87
- const itemsPerBatch = 1000
88
89
switch messageRequest .Mode {
89
- case "close" :
90
- return
91
- case "cancel" :
92
- // if we have that request id, cancel it
93
- if cancelFunc , ok := cancelContexts .Load (messageRequest .RequestID ); ok {
94
- cancelFunc .(context.CancelFunc )()
95
- cancelContexts .Delete (messageRequest .RequestID )
96
- }
97
- case "objects" :
90
+ case "objects" , "rewind" :
98
91
// cancel all previous open objects requests for listing
99
92
cancelContexts .Range (func (key , value interface {}) bool {
100
93
rid := key .(int64 )
101
94
if rid < messageRequest .RequestID {
102
95
cancelFunc := value .(context.CancelFunc )
103
96
cancelFunc ()
97
+
98
+ cancelContexts .Delete (key )
104
99
}
105
100
return true
106
101
})
102
+ }
107
103
104
+ const itemsPerBatch = 1000
105
+ switch messageRequest .Mode {
106
+ case "close" :
107
+ return
108
+ case "cancel" :
109
+ // if we have that request id, cancel it
110
+ if cancelFunc , ok := cancelContexts .Load (messageRequest .RequestID ); ok {
111
+ cancelFunc .(context.CancelFunc )()
112
+ cancelContexts .Delete (messageRequest .RequestID )
113
+ }
114
+ case "objects" :
108
115
// start listing and writing to web socket
109
- go func () {
110
- objectRqConfigs , err := getObjectsOptionsFromReq (messageRequest )
111
- if err != nil {
112
- LogInfo (fmt .Sprintf ("Error during Objects OptionsParse %s" , err .Error ()))
116
+ objectRqConfigs , err := getObjectsOptionsFromReq (messageRequest )
117
+ if err != nil {
118
+ LogInfo (fmt .Sprintf ("Error during Objects OptionsParse %s" , err .Error ()))
119
+
120
+ sendWSResponse (WSResponse {
121
+ RequestID : messageRequest .RequestID ,
122
+ Error : ErrorWithContext (ctx , err ),
123
+ Prefix : messageRequest .Prefix ,
124
+ BucketName : messageRequest .BucketName ,
125
+ })
126
+
127
+ return
128
+ }
113
129
130
+ var buffer []ObjectResponse
131
+ for lsObj := range startObjectsListing (ctx , wsc .client , objectRqConfigs ) {
132
+ if lsObj .Err != nil {
114
133
sendWSResponse (WSResponse {
115
134
RequestID : messageRequest .RequestID ,
116
- Error : ErrorWithContext (ctx , err ),
135
+ Error : ErrorWithContext (ctx , lsObj . Err ),
117
136
Prefix : messageRequest .Prefix ,
118
137
BucketName : messageRequest .BucketName ,
119
138
})
120
139
121
- return
140
+ continue
122
141
}
123
- var buffer []ObjectResponse
124
- for lsObj := range startObjectsListing (ctx , wsc .client , objectRqConfigs ) {
125
- if _ , ok := cancelContexts .Load (messageRequest .RequestID ); ! ok {
126
- return
127
- }
128
-
129
- if lsObj .Err != nil {
130
- sendWSResponse (WSResponse {
131
- RequestID : messageRequest .RequestID ,
132
- Error : ErrorWithContext (ctx , lsObj .Err ),
133
- Prefix : messageRequest .Prefix ,
134
- BucketName : messageRequest .BucketName ,
135
- })
136
-
137
- continue
138
- }
139
- objItem := ObjectResponse {
140
- Name : lsObj .Key ,
141
- Size : lsObj .Size ,
142
- LastModified : lsObj .LastModified .Format (time .RFC3339 ),
143
- VersionID : lsObj .VersionID ,
144
- IsLatest : lsObj .IsLatest ,
145
- DeleteMarker : lsObj .IsDeleteMarker ,
146
- }
147
- buffer = append (buffer , objItem )
148
-
149
- if len (buffer ) >= itemsPerBatch {
150
- sendWSResponse (WSResponse {
151
- RequestID : messageRequest .RequestID ,
152
- Data : buffer ,
153
- })
154
- buffer = nil
155
- }
142
+ objItem := ObjectResponse {
143
+ Name : lsObj .Key ,
144
+ Size : lsObj .Size ,
145
+ LastModified : lsObj .LastModified .Format (time .RFC3339 ),
146
+ VersionID : lsObj .VersionID ,
147
+ IsLatest : lsObj .IsLatest ,
148
+ DeleteMarker : lsObj .IsDeleteMarker ,
156
149
}
157
- if len (buffer ) > 0 {
150
+ buffer = append (buffer , objItem )
151
+
152
+ if len (buffer ) >= itemsPerBatch {
158
153
sendWSResponse (WSResponse {
159
154
RequestID : messageRequest .RequestID ,
160
155
Data : buffer ,
161
156
})
157
+ buffer = nil
162
158
}
163
-
159
+ }
160
+ if len (buffer ) > 0 {
164
161
sendWSResponse (WSResponse {
165
- RequestID : messageRequest .RequestID ,
166
- RequestEnd : true ,
162
+ RequestID : messageRequest .RequestID ,
163
+ Data : buffer ,
167
164
})
165
+ }
168
166
169
- // remove the cancellation context
170
- cancelContexts .Delete (messageRequest .RequestID )
171
- }()
172
- case "rewind" :
173
- // cancel all previous open objects requests for listing
174
- cancelContexts .Range (func (key , value interface {}) bool {
175
- rid := key .(int64 )
176
- if rid < messageRequest .RequestID {
177
- cancelFunc := value .(context.CancelFunc )
178
- cancelFunc ()
179
- }
180
- return true
167
+ sendWSResponse (WSResponse {
168
+ RequestID : messageRequest .RequestID ,
169
+ RequestEnd : true ,
181
170
})
182
171
172
+ // if we have that request id, cancel it
173
+ if cancelFunc , ok := cancelContexts .Load (messageRequest .RequestID ); ok {
174
+ cancelFunc .(context.CancelFunc )()
175
+ cancelContexts .Delete (messageRequest .RequestID )
176
+ }
177
+ case "rewind" :
183
178
// start listing and writing to web socket
184
- go func () {
185
- objectRqConfigs , err := getObjectsOptionsFromReq (messageRequest )
186
- if err != nil {
187
- LogInfo (fmt .Sprintf ("Error during Objects OptionsParse %s" , err .Error ()))
188
- sendWSResponse (WSResponse {
189
- RequestID : messageRequest .RequestID ,
190
- Error : ErrorWithContext (ctx , err ),
191
- Prefix : messageRequest .Prefix ,
192
- BucketName : messageRequest .BucketName ,
193
- })
179
+ objectRqConfigs , err := getObjectsOptionsFromReq (messageRequest )
180
+ if err != nil {
181
+ LogInfo (fmt .Sprintf ("Error during Objects OptionsParse %s" , err .Error ()))
182
+ sendWSResponse (WSResponse {
183
+ RequestID : messageRequest .RequestID ,
184
+ Error : ErrorWithContext (ctx , err ),
185
+ Prefix : messageRequest .Prefix ,
186
+ BucketName : messageRequest .BucketName ,
187
+ })
194
188
195
- return
196
- }
189
+ return
190
+ }
191
+
192
+ clientIP := wsc .conn .remoteAddress ()
193
+
194
+ s3Client , err := newS3BucketClient (session , objectRqConfigs .BucketName , objectRqConfigs .Prefix , clientIP )
195
+ if err != nil {
196
+ sendWSResponse (WSResponse {
197
+ RequestID : messageRequest .RequestID ,
198
+ Error : ErrorWithContext (ctx , err ),
199
+ Prefix : messageRequest .Prefix ,
200
+ BucketName : messageRequest .BucketName ,
201
+ })
202
+
203
+ return
204
+ }
205
+
206
+ mcS3C := mcClient {client : s3Client }
197
207
198
- clientIP := wsc . conn . remoteAddress ()
208
+ var buffer [] ObjectResponse
199
209
200
- s3Client , err := newS3BucketClient ( session , objectRqConfigs . BucketName , objectRqConfigs . Prefix , clientIP )
201
- if err != nil {
210
+ for lsObj := range startRewindListing ( ctx , mcS3C , objectRqConfigs ) {
211
+ if lsObj . Err != nil {
202
212
sendWSResponse (WSResponse {
203
213
RequestID : messageRequest .RequestID ,
204
- Error : ErrorWithContext (ctx , err ),
214
+ Error : ErrorWithContext (ctx , lsObj . Err . ToGoError () ),
205
215
Prefix : messageRequest .Prefix ,
206
216
BucketName : messageRequest .BucketName ,
207
217
})
208
218
209
- cancel ()
210
- return
219
+ continue
211
220
}
212
221
213
- mcS3C := mcClient {client : s3Client }
214
-
215
- var buffer []ObjectResponse
216
-
217
- for lsObj := range startRewindListing (ctx , mcS3C , objectRqConfigs ) {
218
- if lsObj .Err != nil {
219
- sendWSResponse (WSResponse {
220
- RequestID : messageRequest .RequestID ,
221
- Error : ErrorWithContext (ctx , lsObj .Err .ToGoError ()),
222
- Prefix : messageRequest .Prefix ,
223
- BucketName : messageRequest .BucketName ,
224
- })
225
-
226
- continue
227
- }
228
-
229
- name := strings .Replace (lsObj .URL .Path , fmt .Sprintf ("/%s/" , objectRqConfigs .BucketName ), "" , 1 )
230
-
231
- objItem := ObjectResponse {
232
- Name : name ,
233
- Size : lsObj .Size ,
234
- LastModified : lsObj .Time .Format (time .RFC3339 ),
235
- VersionID : lsObj .VersionID ,
236
- IsLatest : lsObj .IsLatest ,
237
- DeleteMarker : lsObj .IsDeleteMarker ,
238
- }
239
- buffer = append (buffer , objItem )
240
-
241
- if len (buffer ) >= itemsPerBatch {
242
- sendWSResponse (WSResponse {
243
- RequestID : messageRequest .RequestID ,
244
- Data : buffer ,
245
- })
246
- buffer = nil
247
- }
222
+ name := strings .Replace (lsObj .URL .Path , fmt .Sprintf ("/%s/" , objectRqConfigs .BucketName ), "" , 1 )
248
223
224
+ objItem := ObjectResponse {
225
+ Name : name ,
226
+ Size : lsObj .Size ,
227
+ LastModified : lsObj .Time .Format (time .RFC3339 ),
228
+ VersionID : lsObj .VersionID ,
229
+ IsLatest : lsObj .IsLatest ,
230
+ DeleteMarker : lsObj .IsDeleteMarker ,
249
231
}
250
- if len (buffer ) > 0 {
232
+ buffer = append (buffer , objItem )
233
+
234
+ if len (buffer ) >= itemsPerBatch {
251
235
sendWSResponse (WSResponse {
252
236
RequestID : messageRequest .RequestID ,
253
237
Data : buffer ,
254
238
})
239
+ buffer = nil
255
240
}
256
241
242
+ }
243
+ if len (buffer ) > 0 {
257
244
sendWSResponse (WSResponse {
258
- RequestID : messageRequest .RequestID ,
259
- RequestEnd : true ,
245
+ RequestID : messageRequest .RequestID ,
246
+ Data : buffer ,
260
247
})
248
+ }
249
+
250
+ sendWSResponse (WSResponse {
251
+ RequestID : messageRequest .RequestID ,
252
+ RequestEnd : true ,
253
+ })
261
254
262
- // remove the cancellation context
255
+ // if we have that request id, cancel it
256
+ if cancelFunc , ok := cancelContexts .Load (messageRequest .RequestID ); ok {
257
+ cancelFunc .(context.CancelFunc )()
263
258
cancelContexts .Delete (messageRequest .RequestID )
264
- }()
259
+ }
265
260
}
266
261
}
267
262
}
0 commit comments