@@ -7,16 +7,14 @@ import (
7
7
"encoding/hex"
8
8
"errors"
9
9
"fmt"
10
+ "github.com/xssnick/raptorq"
11
+ "github.com/xssnick/tonutils-go/adnl"
12
+ "github.com/xssnick/tonutils-go/tl"
10
13
"math/bits"
11
14
"reflect"
12
15
"sync"
13
16
"sync/atomic"
14
17
"time"
15
- "unsafe"
16
-
17
- "github.com/xssnick/raptorq"
18
- "github.com/xssnick/tonutils-go/adnl"
19
- "github.com/xssnick/tonutils-go/tl"
20
18
)
21
19
22
20
type ADNL interface {
@@ -56,7 +54,7 @@ type activeTransfer struct {
56
54
data []byte
57
55
timeoutAt int64
58
56
59
- currentPart unsafe .Pointer //* activeTransferPart
57
+ currentPart atomic .Pointer [ activeTransferPart ]
60
58
rldp * RLDP
61
59
62
60
mx sync.Mutex
@@ -97,6 +95,8 @@ type RLDP struct {
97
95
lastNetworkProcessAt int64
98
96
lastNetworkPacketsRecv int64
99
97
lastNetworkBatchesNum int64
98
+
99
+ lastReport time.Time
100
100
}
101
101
102
102
type decoderStreamPart struct {
@@ -249,7 +249,6 @@ func (r *RLDP) handleMessage(msg *adnl.MessageCustom) error {
249
249
} else {
250
250
r .recvStreams [id ] = stream
251
251
}
252
- delete (r .expectedTransfers , id )
253
252
r .mx .Unlock ()
254
253
}
255
254
@@ -302,6 +301,11 @@ func (r *RLDP) handleMessage(msg *adnl.MessageCustom) error {
302
301
}
303
302
304
303
if stream .currentPart .decoder == nil {
304
+ fec , ok := part .FecType .(FECRaptorQ )
305
+ if ! ok {
306
+ return fmt .Errorf ("not supported fec type in part: %d" , part .Part )
307
+ }
308
+
305
309
if uint64 (fec .DataSize ) > stream .totalSize || fec .DataSize > uint32 (MaxFECDataSize ) ||
306
310
fec .SymbolSize == 0 || fec .SymbolsCount == 0 {
307
311
return fmt .Errorf ("invalid fec" )
@@ -312,6 +316,7 @@ func (r *RLDP) handleMessage(msg *adnl.MessageCustom) error {
312
316
return fmt .Errorf ("failed to init raptorq decoder: %w" , err )
313
317
}
314
318
stream .currentPart .decoder = dec
319
+ Logger ("[ID]" , hex .EncodeToString (part .TransferID ), "[RLDP] created decoder for part:" , part .Part , "data size:" , fec .DataSize , "symbol size:" , fec .SymbolSize , "symbols:" , fec .SymbolsCount )
315
320
}
316
321
317
322
canTryDecode , err := stream .currentPart .decoder .AddSymbol (part .Seqno , part .Data )
@@ -346,11 +351,7 @@ func (r *RLDP) handleMessage(msg *adnl.MessageCustom) error {
346
351
if isV2 {
347
352
complete = CompleteV2 (complete .(Complete ))
348
353
}
349
-
350
- err = r .adnl .SendCustomMessage (context .Background (), complete )
351
- if err != nil {
352
- return fmt .Errorf ("failed to send rldp complete message: %w" , err )
353
- }
354
+ _ = r .adnl .SendCustomMessage (context .Background (), complete )
354
355
355
356
if uint64 (len (stream .buf )) >= stream .totalSize {
356
357
stream .finishedAt = & tmd
@@ -396,6 +397,7 @@ func (r *RLDP) handleMessage(msg *adnl.MessageCustom) error {
396
397
req := r .activeRequests [qid ]
397
398
if req != nil {
398
399
delete (r .activeRequests , qid )
400
+ delete (r .expectedTransfers , id )
399
401
}
400
402
r .mx .Unlock ()
401
403
@@ -461,10 +463,8 @@ func (r *RLDP) handleMessage(msg *adnl.MessageCustom) error {
461
463
}
462
464
}
463
465
case Complete : // receiver has fully received transfer part, send new part or close our stream if done
464
- id := string (m .TransferID )
465
-
466
466
r .mx .RLock ()
467
- t := r .activeTransfers [id ]
467
+ t := r .activeTransfers [string ( m . TransferID ) ]
468
468
r .mx .RUnlock ()
469
469
470
470
if t != nil {
@@ -486,7 +486,7 @@ func (r *RLDP) handleMessage(msg *adnl.MessageCustom) error {
486
486
487
487
if ! more {
488
488
r .mx .Lock ()
489
- delete (r .activeTransfers , id )
489
+ delete (r .activeTransfers , string ( t . id ) )
490
490
r .mx .Unlock ()
491
491
492
492
break
@@ -574,7 +574,6 @@ func (r *RLDP) handleMessage(msg *adnl.MessageCustom) error {
574
574
}
575
575
576
576
func (r * RLDP ) recoverySender () {
577
- packets := make ([]tl.Serializable , 0 , 1024 )
578
577
transfersToProcess := make ([]* activeTransferPart , 0 , 128 )
579
578
timedOut := make ([]* activeTransfer , 0 , 32 )
580
579
timedOutReq := make ([]string , 0 , 32 )
@@ -588,11 +587,19 @@ func (r *RLDP) recoverySender() {
588
587
case <- closerCtx .Done ():
589
588
return
590
589
case <- ticker .C :
591
- packets = packets [:0 ]
592
- transfersToProcess = transfersToProcess [:0 ]
593
- timedOut = timedOut [:0 ]
594
- timedOutReq = timedOutReq [:0 ]
595
- timedOutExp = timedOutExp [:0 ]
590
+ if r .lastReport .Before (time .Now ().Add (- 10 * time .Second )) {
591
+ r .lastReport = time .Now ()
592
+ r .mx .RLock ()
593
+ Logger ("[RLDP] recovery sender stats" ,
594
+ "peer" , hex .EncodeToString (r .adnl .GetID ()),
595
+ "active transfers" , len (r .activeTransfers ),
596
+ "active requests" , len (r .activeRequests ),
597
+ "expected transfers" , len (r .expectedTransfers ),
598
+ "transfers to process" , len (transfersToProcess ),
599
+ "timed out" , len (timedOut ),
600
+ )
601
+ r .mx .RUnlock ()
602
+ }
596
603
597
604
ms := time .Now ().UnixMilli ()
598
605
@@ -694,6 +701,11 @@ func (r *RLDP) recoverySender() {
694
701
}
695
702
r .mx .Unlock ()
696
703
}
704
+
705
+ transfersToProcess = transfersToProcess [:0 ]
706
+ timedOut = timedOut [:0 ]
707
+ timedOutReq = timedOutReq [:0 ]
708
+ timedOutExp = timedOutExp [:0 ]
697
709
case <- r .activateRecoverySender :
698
710
ticker .Reset (1 * time .Millisecond )
699
711
}
@@ -703,7 +715,7 @@ func (r *RLDP) recoverySender() {
703
715
func (r * RLDP ) startTransfer (ctx context.Context , transferId , data []byte , recoverTimeoutAt int64 ) error {
704
716
at := & activeTransfer {
705
717
id : transferId ,
706
- timeoutAt : recoverTimeoutAt * int64 ( time . Millisecond ),
718
+ timeoutAt : recoverTimeoutAt * 1000 , // ms
707
719
data : data ,
708
720
rldp : r ,
709
721
}
@@ -734,7 +746,7 @@ func (r *RLDP) startTransfer(ctx context.Context, transferId, data []byte, recov
734
746
}
735
747
736
748
func (t * activeTransfer ) getCurrentPart () * activeTransferPart {
737
- return ( * activeTransferPart )( atomic . LoadPointer ( & t .currentPart ) )
749
+ return t .currentPart . Load ( )
738
750
}
739
751
740
752
func (t * activeTransfer ) prepareNextPart () (bool , error ) {
@@ -775,7 +787,7 @@ func (t *activeTransfer) prepareNextPart() (bool, error) {
775
787
transfer : t ,
776
788
}
777
789
778
- atomic . StorePointer ( & t .currentPart , unsafe . Pointer (& part ) )
790
+ t .currentPart . Store (& part )
779
791
return true , nil
780
792
}
781
793
@@ -925,19 +937,17 @@ func (r *RLDP) SendAnswer(ctx context.Context, maxAnswerSize uint64, timeoutAt u
925
937
return fmt .Errorf ("too big answer for that client, client wants no more than %d bytes" , maxAnswerSize )
926
938
}
927
939
928
- var transferId []byte
940
+ timeout , ok := ctx .Deadline ()
941
+ if ! ok {
942
+ timeout = time .Now ().Add (15 * time .Second )
943
+ }
944
+ tm := timeout .Unix ()
929
945
930
- if toTransferId != nil {
931
- // if we have transfer to respond, invert it and use id
932
- transferId = reverseTransferId (toTransferId )
933
- } else {
934
- transferId = make ([]byte , 32 )
935
- if _ , err = rand .Read (transferId ); err != nil {
936
- return err
937
- }
946
+ if int64 (timeoutAt ) < tm {
947
+ tm = int64 (timeoutAt )
938
948
}
939
949
940
- if err = r .startTransfer (ctx , transferId , data , int64 ( timeoutAt ) ); err != nil {
950
+ if err = r .startTransfer (ctx , reverseTransferId ( toTransferId ) , data , tm ); err != nil {
941
951
return fmt .Errorf ("failed to send partitioned answer: %w" , err )
942
952
}
943
953
0 commit comments