1
1
use std:: {
2
2
sync:: { mpsc:: Sender , Arc } ,
3
- thread:: JoinHandle ,
3
+ thread:: { sleep, JoinHandle } ,
4
+ time:: Duration ,
4
5
} ;
5
6
6
7
use chainhook_sdk:: { types:: BitcoinBlockData , utils:: Context } ;
8
+ use crossbeam_channel:: TryRecvError ;
7
9
8
10
use crate :: {
9
11
config:: Config ,
10
- core:: { new_traversals_lazy_cache, protocol:: sequencing:: process_blocks} ,
12
+ core:: {
13
+ new_traversals_lazy_cache,
14
+ pipeline:: { PostProcessorCommand , PostProcessorController , PostProcessorEvent } ,
15
+ protocol:: sequencing:: process_blocks,
16
+ } ,
11
17
db:: {
12
18
insert_entry_in_blocks, open_readwrite_hord_db_conn, open_readwrite_hord_db_conn_rocks_db,
13
- InscriptionHeigthHint , LazyBlock ,
19
+ InscriptionHeigthHint ,
14
20
} ,
15
21
} ;
16
22
17
- pub fn start_ordinals_number_processor (
23
+ pub fn start_inscription_indexing_processor (
18
24
config : & Config ,
19
25
ctx : & Context ,
20
26
post_processor : Option < Sender < BitcoinBlockData > > ,
21
- ) -> (
22
- crossbeam_channel:: Sender < Vec < ( BitcoinBlockData , LazyBlock ) > > ,
23
- JoinHandle < ( ) > ,
24
- ) {
25
- let ( tx, rx) = crossbeam_channel:: bounded :: < Vec < ( BitcoinBlockData , LazyBlock ) > > ( 1 ) ;
27
+ ) -> PostProcessorController {
28
+ let ( commands_tx, commands_rx) = crossbeam_channel:: bounded :: < PostProcessorCommand > ( 2 ) ;
29
+ let ( events_tx, events_rx) = crossbeam_channel:: unbounded :: < PostProcessorEvent > ( ) ;
26
30
27
31
let config = config. clone ( ) ;
28
32
let ctx = ctx. clone ( ) ;
@@ -41,16 +45,39 @@ pub fn start_ordinals_number_processor(
41
45
open_readwrite_hord_db_conn_rocks_db ( & config. expected_cache_path ( ) , & ctx) . unwrap ( ) ;
42
46
43
47
let mut inscription_height_hint = InscriptionHeigthHint :: new ( ) ;
48
+ let mut empty_cycles = 0 ;
49
+
50
+ loop {
51
+ let blocks_to_process = match commands_rx. try_recv ( ) {
52
+ Ok ( PostProcessorCommand :: ProcessBlocks ( blocks) ) => blocks,
53
+ Ok ( PostProcessorCommand :: Terminate ) => break ,
54
+ Err ( e) => match e {
55
+ TryRecvError :: Empty => {
56
+ empty_cycles += 1 ;
57
+
58
+ if empty_cycles == 30 {
59
+ let _ = events_tx. send ( PostProcessorEvent :: EmptyQueue ) ;
60
+ }
61
+ sleep ( Duration :: from_secs ( 1 ) ) ;
62
+ if empty_cycles > 120 {
63
+ break ;
64
+ }
65
+ continue ;
66
+ }
67
+ _ => {
68
+ break ;
69
+ }
70
+ } ,
71
+ } ;
44
72
45
- while let Ok ( raw_blocks) = rx. recv ( ) {
46
73
info ! (
47
74
ctx. expect_logger( ) ,
48
75
"Processing {} blocks" ,
49
- raw_blocks . len( )
76
+ blocks_to_process . len( )
50
77
) ;
51
78
52
79
let mut blocks = vec ! [ ] ;
53
- for ( block, compacted_block) in raw_blocks . into_iter ( ) {
80
+ for ( block, compacted_block) in blocks_to_process . into_iter ( ) {
54
81
insert_entry_in_blocks (
55
82
block. block_identifier . index as u32 ,
56
83
& compacted_block,
@@ -118,5 +145,9 @@ pub fn start_ordinals_number_processor(
118
145
} )
119
146
. expect ( "unable to spawn thread" ) ;
120
147
121
- ( tx, handle)
148
+ PostProcessorController {
149
+ commands_tx,
150
+ events_rx,
151
+ thread_handle : handle,
152
+ }
122
153
}
0 commit comments