@@ -28,7 +28,6 @@ import (
28
28
"github.com/vdaas/vald/internal/net/grpc/errdetails"
29
29
"github.com/vdaas/vald/internal/net/grpc/status"
30
30
"github.com/vdaas/vald/internal/observability/trace"
31
- "github.com/vdaas/vald/internal/slices"
32
31
)
33
32
34
33
func (s * server ) Exists (ctx context.Context , uid * payload.Object_ID ) (res * payload.Object_ID , err error ) {
@@ -211,8 +210,9 @@ func (s *server) StreamListObject(_ *payload.Object_List_Request, stream vald.Ob
211
210
212
211
var (
213
212
mu sync.Mutex
214
- emu sync.Mutex
213
+ emu sync.RWMutex
215
214
errs = make ([]error , 0 , s .ngt .Len ())
215
+ emap = make (map [string ]struct {})
216
216
)
217
217
s .ngt .ListObjectFunc (ctx , func (uuid string , _ uint32 , _ int64 ) bool {
218
218
vec , ts , err := s .ngt .GetObject (uuid )
@@ -241,27 +241,34 @@ func (s *server) StreamListObject(_ *payload.Object_List_Request, stream vald.Ob
241
241
mu .Unlock ()
242
242
243
243
if err != nil {
244
- emu .Lock ()
245
- errs = append (errs , err )
246
- emu .Unlock ()
244
+ emu .RLock ()
245
+ _ , ok := emap [err .Error ()]
246
+ emu .RUnlock ()
247
+ if ! ok {
248
+ emu .Lock ()
249
+ errs = append (errs , err )
250
+ emap [err .Error ()] = struct {}{}
251
+ emu .Unlock ()
252
+ }
247
253
}
248
254
249
255
// always return true to continue streaming and let the context cancel the Range when stream closes.
250
256
return true
251
257
})
252
258
253
259
if len (errs ) != 0 {
254
- slices .RemoveDuplicates (errs , func (left , right error ) bool {
255
- return left .Error () < right .Error ()
256
- })
257
- err = errors .Join (errs ... )
258
- st , msg , err := status .ParseError (err , codes .Internal , "failed to parse StreamListObject final gRPC error response" )
259
- if span != nil {
260
- span .RecordError (err )
261
- span .SetAttributes (trace .FromGRPCStatus (st .Code (), msg )... )
262
- span .SetStatus (trace .StatusError , msg )
260
+ // Register all the gRPC codes to the span. Doing this because ParseError cannot parse joined error.
261
+ for _ , e := range errs {
262
+ st , msg , err := status .ParseError (e , codes .Internal , "failed to parse StreamListObject final gRPC error response" )
263
+ if span != nil {
264
+ span .RecordError (err )
265
+ span .SetAttributes (trace .FromGRPCStatus (st .Code (), msg )... )
266
+ span .SetStatus (trace .StatusError , msg )
267
+ }
263
268
}
264
- return err
269
+
270
+ // now join all the errors to return
271
+ return errors .Join (errs ... )
265
272
}
266
273
return nil
267
274
}
0 commit comments