8
8
"errors"
9
9
"fmt"
10
10
"io"
11
- "net"
12
11
"runtime"
13
- "strconv"
14
12
"strings"
15
13
"sync"
16
14
"sync/atomic"
@@ -39,7 +37,6 @@ import (
39
37
"google.golang.org/grpc/codes"
40
38
"google.golang.org/grpc/metadata"
41
39
"google.golang.org/grpc/status"
42
- "google.golang.org/protobuf/proto"
43
40
44
41
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/grpcutil"
45
42
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/admission"
@@ -454,9 +451,8 @@ type inFlightData struct {
454
451
// consumeAndRespond() function.
455
452
refs atomic.Int32
456
453
457
- numAcquired int64 // how many bytes held in the semaphore
458
- numItems int // how many items
459
- uncompSize int64 // uncompressed data size
454
+ numItems int // how many items
455
+ uncompSize int64 // uncompressed data size == how many bytes held in the semaphore
460
456
}
461
457
462
458
func (id * inFlightData ) recvDone (ctx context.Context , recvErrPtr * error ) {
@@ -505,8 +501,8 @@ func (id *inFlightData) anyDone(ctx context.Context) {
505
501
506
502
id .span .End ()
507
503
508
- if id .numAcquired != 0 {
509
- if err := id .boundedQueue .Release (id .numAcquired ); err != nil {
504
+ if id .uncompSize != 0 {
505
+ if err := id .boundedQueue .Release (id .uncompSize ); err != nil {
510
506
id .telemetry .Logger .Error ("release error" , zap .Error (err ))
511
507
}
512
508
}
@@ -606,19 +602,6 @@ func (r *receiverStream) recvOne(streamCtx context.Context, serverStream anyStre
606
602
}
607
603
}
608
604
609
- var prevAcquiredBytes int64
610
- uncompSizeHeaderStr , uncompSizeHeaderFound := authHdrs ["otlp-pdata-size" ]
611
- if ! uncompSizeHeaderFound || len (uncompSizeHeaderStr ) == 0 {
612
- // This is a compressed size so make sure to acquire the difference when request is decompressed.
613
- prevAcquiredBytes = int64 (proto .Size (req ))
614
- } else {
615
- var parseErr error
616
- prevAcquiredBytes , parseErr = strconv .ParseInt (uncompSizeHeaderStr [0 ], 10 , 64 )
617
- if parseErr != nil {
618
- return status .Errorf (codes .Internal , "failed to convert string to request size: %v" , parseErr )
619
- }
620
- }
621
-
622
605
var callerCancel context.CancelFunc
623
606
if encodedTimeout , has := authHdrs ["grpc-timeout" ]; has && len (encodedTimeout ) == 1 {
624
607
if timeout , decodeErr := grpcutil .DecodeTimeout (encodedTimeout [0 ]); decodeErr != nil {
@@ -638,17 +621,6 @@ func (r *receiverStream) recvOne(streamCtx context.Context, serverStream anyStre
638
621
}
639
622
}
640
623
641
- // Use the bounded queue to memory limit based on incoming
642
- // uncompressed request size and waiters. Acquire will fail
643
- // immediately if there are too many waiters, or will
644
- // otherwise block until timeout or enough memory becomes
645
- // available.
646
- acquireErr := r .boundedQueue .Acquire (inflightCtx , prevAcquiredBytes )
647
- if acquireErr != nil {
648
- return status .Errorf (codes .ResourceExhausted , "otel-arrow bounded queue: %v" , acquireErr )
649
- }
650
- flight .numAcquired = prevAcquiredBytes
651
-
652
624
data , numItems , uncompSize , consumeErr := r .consumeBatch (ac , req )
653
625
654
626
if consumeErr != nil {
@@ -658,19 +630,21 @@ func (r *receiverStream) recvOne(streamCtx context.Context, serverStream anyStre
658
630
return status .Errorf (codes .Internal , "otel-arrow decode: %v" , consumeErr )
659
631
}
660
632
633
+ // Use the bounded queue to memory limit based on incoming
634
+ // uncompressed request size and waiters. Acquire will fail
635
+ // immediately if there are too many waiters, or will
636
+ // otherwise block until timeout or enough memory becomes
637
+ // available.
638
+ acquireErr := r .boundedQueue .Acquire (inflightCtx , uncompSize )
639
+ if acquireErr != nil {
640
+ return acquireErr
641
+ }
661
642
flight .uncompSize = uncompSize
662
643
flight .numItems = numItems
663
644
664
645
r .telemetryBuilder .OtelArrowReceiverInFlightBytes .Add (inflightCtx , uncompSize )
665
646
r .telemetryBuilder .OtelArrowReceiverInFlightItems .Add (inflightCtx , int64 (numItems ))
666
647
667
- numAcquired , secondAcquireErr := r .acquireAdditionalBytes (inflightCtx , prevAcquiredBytes , uncompSize , hrcv .connInfo .Addr , uncompSizeHeaderFound )
668
-
669
- flight .numAcquired = numAcquired
670
- if secondAcquireErr != nil {
671
- return status .Errorf (codes .ResourceExhausted , "otel-arrow bounded queue re-acquire: %v" , secondAcquireErr )
672
- }
673
-
674
648
// Recognize that the request is still in-flight via consumeAndRespond()
675
649
flight .refs .Add (1 )
676
650
@@ -901,47 +875,3 @@ func (r *Receiver) consumeData(ctx context.Context, data any, flight *inFlightDa
901
875
}
902
876
return retErr
903
877
}
904
-
905
- func (r * Receiver ) acquireAdditionalBytes (ctx context.Context , prevAcquired , uncompSize int64 , addr net.Addr , uncompSizeHeaderFound bool ) (int64 , error ) {
906
- diff := uncompSize - prevAcquired
907
-
908
- if diff == 0 {
909
- return uncompSize , nil
910
- }
911
-
912
- if uncompSizeHeaderFound {
913
- var clientAddr string
914
- if addr != nil {
915
- clientAddr = addr .String ()
916
- }
917
- // a mismatch between header set by exporter and the uncompSize just calculated.
918
- r .telemetry .Logger .Debug ("mismatch between uncompressed size in receiver and otlp-pdata-size header" ,
919
- zap .String ("client-address" , clientAddr ),
920
- zap .Int ("uncompsize" , int (uncompSize )),
921
- zap .Int ("otlp-pdata-size" , int (prevAcquired )),
922
- )
923
- } else if diff < 0 {
924
- // proto.Size() on compressed request was greater than pdata uncompressed size.
925
- r .telemetry .Logger .Debug ("uncompressed size is less than compressed size" ,
926
- zap .Int ("uncompressed" , int (uncompSize )),
927
- zap .Int ("compressed" , int (prevAcquired )),
928
- )
929
- }
930
-
931
- if diff < 0 {
932
- // If the difference is negative, release the overage.
933
- if err := r .boundedQueue .Release (- diff ); err != nil {
934
- return 0 , err
935
- }
936
- } else {
937
- // Release previously acquired bytes to prevent deadlock and
938
- // reacquire the uncompressed size we just calculated.
939
- if err := r .boundedQueue .Release (prevAcquired ); err != nil {
940
- return 0 , err
941
- }
942
- if err := r .boundedQueue .Acquire (ctx , uncompSize ); err != nil {
943
- return 0 , err
944
- }
945
- }
946
- return uncompSize , nil
947
- }
0 commit comments