@@ -30,7 +30,7 @@ import (
30
30
"github.com/CortexFoundation/robot/backend"
31
31
"github.com/CortexFoundation/torrentfs/params"
32
32
"github.com/CortexFoundation/torrentfs/types"
33
- lru "github.com/hashicorp/golang-lru"
33
+ lru "github.com/hashicorp/golang-lru/v2 "
34
34
"github.com/ucwong/golang-kv"
35
35
"math"
36
36
"math/big"
@@ -74,10 +74,11 @@ type Monitor struct {
74
74
wg sync.WaitGroup
75
75
rpcWg sync.WaitGroup
76
76
77
- //taskCh chan *types.Block
77
+ taskCh chan * types.Block
78
+ errCh chan error
78
79
//newTaskHook func(*types.Block)
79
- blockCache * lru.Cache
80
- sizeCache * lru.Cache
80
+ blockCache * lru.Cache [ uint64 , string ]
81
+ sizeCache * lru.Cache [ string , uint64 ]
81
82
ckp * params.TrustedCheckpoint
82
83
start mclock.AbsTime
83
84
@@ -124,10 +125,12 @@ func New(flag *params.Config, cache, compress, listen bool, callback chan any) (
124
125
srvCh : make (chan int ),
125
126
//exitSyncCh: make(chan any),
126
127
scope : uint64 (math .Min (float64 (runtime .NumCPU ()), float64 (8 ))),
127
- //taskCh: make(chan *types.Block, batch),
128
+ //taskCh: make(chan *types.Block, batch),
129
+ //taskCh: make(chan *types.Block, 1),
128
130
//start: mclock.Now(),
129
131
}
130
-
132
+ m .errCh = make (chan error , m .scope )
133
+ m .taskCh = make (chan * types.Block , m .scope )
131
134
// TODO https://github.com/ucwong/golang-kv
132
135
if fs_ , err := backend .NewChainDB (flag ); err != nil {
133
136
log .Error ("file storage failed" , "err" , err )
@@ -140,8 +143,8 @@ func New(flag *params.Config, cache, compress, listen bool, callback chan any) (
140
143
m .startNumber .Store (0 )
141
144
142
145
m .terminated .Store (false )
143
- m .blockCache , _ = lru .New (delay )
144
- m .sizeCache , _ = lru .New (batch )
146
+ m .blockCache , _ = lru.New [ uint64 , string ] (delay )
147
+ m .sizeCache , _ = lru.New [ string , uint64 ] (batch )
145
148
m .listen = listen
146
149
m .callback = callback
147
150
@@ -173,10 +176,6 @@ func New(flag *params.Config, cache, compress, listen bool, callback chan any) (
173
176
return m , nil
174
177
}
175
178
176
- //func (m *Monitor) DB() *backend.ChainDB {
177
- // return m.fs
178
- //}
179
-
180
179
func (m * Monitor ) CurrentNumber () uint64 {
181
180
return m .currentNumber .Load ()
182
181
}
@@ -288,27 +287,29 @@ func (m *Monitor) indexInit() error {
288
287
return nil
289
288
}
290
289
291
- /*func (m *Monitor) taskLoop() {
290
+ func (m * Monitor ) taskLoop () {
291
+ log .Info ("Task channel started" )
292
292
defer m .wg .Done ()
293
293
for {
294
294
select {
295
295
case task := <- m .taskCh :
296
- if m.newTaskHook != nil {
297
- m.newTaskHook(task)
298
- }
296
+ // if m.newTaskHook != nil {
297
+ // m.newTaskHook(task)
298
+ // }
299
299
300
- if err := m.solve(task); err != nil {
301
- log.Warn("Block solved failed, try again", "err", err, "num", task.Number)
302
- }
300
+ /*if err := m.solve(task); err != nil {
301
+ m.errCh <- err
302
+ log.Warn("Block solved failed, try again", "err", err, "num", task.Number, "last", m.lastNumber.Load())
303
+ } else {
304
+ m.errCh <- nil
305
+ }*/
306
+ m .errCh <- m .solve (task )
303
307
case <- m .exitCh :
304
- if cap(m.taskCh) > 0 {
305
- continue
306
- }
307
308
log .Info ("Monitor task channel closed" )
308
309
return
309
310
}
310
311
}
311
- }*/
312
+ }
312
313
313
314
// SetConnection method builds connection to remote or local communicator.
314
315
func (m * Monitor ) buildConnection (ipcpath string , rpcuri string ) (* rpc.Client , error ) {
@@ -379,8 +380,8 @@ func (m *Monitor) rpcBatchBlockByNumber(from, to uint64) (result []*types.Block,
379
380
}
380
381
381
382
func (m * Monitor ) getRemainingSize (address string ) (uint64 , error ) {
382
- if size , suc := m .sizeCache .Get (address ); suc && size .( uint64 ) == 0 {
383
- return size .( uint64 ) , nil
383
+ if size , suc := m .sizeCache .Get (address ); suc && size == 0 {
384
+ return size , nil
384
385
}
385
386
var remainingSize hexutil.Uint64
386
387
rpcUploadMeter .Mark (1 )
@@ -520,13 +521,6 @@ func (m *Monitor) parseBlockTorrentInfo(b *types.Block) (bool, error) {
520
521
521
522
func (m * Monitor ) exit () {
522
523
m .closeOnce .Do (func () {
523
- /*if m.exitSyncCh != nil {
524
- close(m.exitSyncCh)
525
- m.exitSyncCh = nil
526
- } else {
527
- log.Warn("Listener sync has already been stopped")
528
- }*/
529
-
530
524
if m .exitCh != nil {
531
525
close (m .exitCh )
532
526
m .wg .Wait ()
@@ -540,7 +534,6 @@ func (m *Monitor) exit() {
540
534
func (m * Monitor ) Stop () error {
541
535
m .lock .Lock ()
542
536
defer m .lock .Unlock ()
543
- //m.closeOnce.Do(func() {
544
537
if m .terminated .Swap (true ) {
545
538
return nil
546
539
}
@@ -567,7 +560,6 @@ func (m *Monitor) Stop() error {
567
560
}
568
561
log .Info ("Fs listener synchronizing closed" )
569
562
return nil
570
- //})
571
563
}
572
564
573
565
// Start ... start ListenOn on the rpc port of a blockchain full node
@@ -622,8 +614,8 @@ func (m *Monitor) run() error {
622
614
//if err := m.loadHistory(); err != nil {
623
615
// return err
624
616
//}
625
- // m.wg.Add(1)
626
- // go m.taskLoop()
617
+ m .wg .Add (1 )
618
+ go m .taskLoop ()
627
619
//m.wg.Add(1)
628
620
//go m.listenLatestBlock()
629
621
m .wg .Add (1 )
@@ -685,7 +677,6 @@ func (m *Monitor) syncLatestBlock() {
685
677
continue
686
678
}
687
679
m .fs .Flush ()
688
- //go m.exit()
689
680
elapsed := time .Duration (mclock .Now ()) - time .Duration (m .start )
690
681
log .Debug ("Finish sync, listener will be paused" , "current" , m .currentNumber .Load (), "elapsed" , common .PrettyDuration (elapsed ), "progress" , progress , "end" , end , "last" , m .lastNumber .Load ())
691
682
//return
@@ -789,8 +780,8 @@ func (m *Monitor) syncLastBlock() uint64 {
789
780
maxNumber = i - 1
790
781
break
791
782
}
792
- if maxNumber > minNumber && ( i - minNumber ) % 128 == 0 {
793
- log .Debug ("Running" , "min" , minNumber , "max" , maxNumber , "cur" , currentNumber , "last" , m .lastNumber .Load (), "batch" , batch , "i" , i , "srv" , m .srv .Load (), "size" , maxNumber - minNumber , "progress" , float64 (i - minNumber )/ float64 (maxNumber - minNumber ))
783
+ if maxNumber > minNumber && i % 2048 == 0 {
784
+ log .Info ("Running" , "min" , minNumber , "max" , maxNumber , "cur" , currentNumber , "last" , m .lastNumber .Load (), "batch" , batch , "i" , i , "srv" , m .srv .Load (), "size" , maxNumber - minNumber , "progress" , float64 (i )/ float64 (currentNumber ))
794
785
}
795
786
if m .ckp != nil && m .skip (i ) {
796
787
//m.lastNumber = i - 1
@@ -808,25 +799,24 @@ func (m *Monitor) syncLastBlock() uint64 {
808
799
809
800
// batch blocks operation according service category
810
801
for _ , rpcBlock := range blocks {
811
- if err := m .solve (rpcBlock ); err != nil {
812
- log .Error ("solve err" , "err" , err )
802
+ m .taskCh <- rpcBlock
803
+ }
804
+
805
+ for n := 0 ; n < len (blocks ); n ++ {
806
+ select {
807
+ case err := <- m .errCh :
808
+ if err != nil {
809
+ m .lastNumber .Store (i - 1 )
810
+ log .Error ("solve err" , "err" , err , "last" , m .lastNumber .Load (), "i" , i , "scope" , m .scope , "min" , minNumber , "max" , maxNumber , "cur" , currentNumber )
811
+ return 0
812
+ }
813
+ case <- m .exitCh :
813
814
m .lastNumber .Store (i - 1 )
815
+ log .Info ("Task checker quit" )
814
816
return 0
815
817
}
816
- i ++
817
- /*if len(m.taskCh) < cap(m.taskCh) {
818
- m.taskCh <- rpcBlock
819
- i++
820
- } else {
821
- m.lastNumber = i - 1
822
- if maxNumber-minNumber > delay/2 {
823
- elapsed := time.Duration(mclock.Now()) - time.Duration(start)
824
- elapsedA := time.Duration(mclock.Now()) - time.Duration(m.start)
825
- log.Warn("Chain segment frozen", "from", minNumber, "to", i, "range", uint64(i-minNumber), "current", uint64(m.currentNumber), "progress", float64(i)/float64(m.currentNumber), "last", m.lastNumber, "elapsed", common.PrettyDuration(elapsed), "bps", float64(i-minNumber)*1000*1000*1000/float64(elapsed), "bps_a", float64(maxNumber)*1000*1000*1000/float64(elapsedA), "cap", len(m.taskCh))
826
- }
827
- return 0
828
- }*/
829
818
}
819
+ i += uint64 (len (blocks ))
830
820
} else {
831
821
rpcBlock , rpcErr := m .rpcBlockByNumber (i )
832
822
if rpcErr != nil {
@@ -840,24 +830,10 @@ func (m *Monitor) syncLastBlock() uint64 {
840
830
return 0
841
831
}
842
832
i ++
843
- /*if len(m.taskCh) < cap(m.taskCh) {
844
- m.taskCh <- rpcBlock
845
- i++
846
- } else {
847
- m.lastNumber = i - 1
848
- if maxNumber-minNumber > delay/2 {
849
- elapsed := time.Duration(mclock.Now()) - time.Duration(start)
850
- elapsedA := time.Duration(mclock.Now()) - time.Duration(m.start)
851
- log.Warn("Chain segment frozen", "from", minNumber, "to", i, "range", uint64(i-minNumber), "current", uint64(m.currentNumber), "progress", float64(i)/float64(m.currentNumber), "last", m.lastNumber, "elapsed", common.PrettyDuration(elapsed), "bps", float64(i-minNumber)*1000*1000*1000/float64(elapsed), "bps_a", float64(maxNumber)*1000*1000*1000/float64(elapsedA), "cap", len(m.taskCh))
852
- }
853
- return 0
854
- }*/
855
833
}
856
834
}
857
835
log .Debug ("Last number changed" , "min" , minNumber , "max" , maxNumber , "cur" , currentNumber , "last" , m .lastNumber .Load (), "batch" , batch )
858
836
m .lastNumber .Store (maxNumber )
859
- //m.storeLastNumber(maxNumber)
860
- //if maxNumber-minNumber > batch-1 {
861
837
if maxNumber - minNumber > delay {
862
838
elapsedA := time .Duration (mclock .Now ()) - time .Duration (m .start )
863
839
log .Debug ("Chain segment frozen" , "from" , minNumber , "to" , maxNumber , "range" , uint64 (maxNumber - minNumber ), "current" , uint64 (m .CurrentNumber ()), "progress" , float64 (maxNumber )/ float64 (m .CurrentNumber ()), "last" , m .lastNumber .Load (), "bps" , float64 (maxNumber )* 1000 * 1000 * 1000 / float64 (elapsedA ), "elapsed" , common .PrettyDuration (elapsedA ))
@@ -951,7 +927,9 @@ func (m *Monitor) forExchangeService(block *types.Block) error {
951
927
}
952
928
953
929
func (m * Monitor ) forRecordService (block * types.Block ) error {
954
- log .Debug ("Block record" , "num" , block .Number , "hash" , block .Hash , "txs" , len (block .Txs ), "last" , m .lastNumber .Load ())
930
+ if block .Number % 4096 == 0 {
931
+ log .Info ("Block record" , "num" , block .Number , "hash" , block .Hash , "txs" , len (block .Txs ), "last" , m .lastNumber .Load ())
932
+ }
955
933
if len (block .Txs ) > 0 {
956
934
for _ , t := range block .Txs {
957
935
x := new (big.Float ).Quo (new (big.Float ).SetInt (t .Amount ), new (big.Float ).SetInt (big .NewInt (params1 .Cortex )))
0 commit comments