Skip to content

Commit c2354fc

Browse files
author
Ludo Galabru
committed
fix: threading model
1 parent 7169177 commit c2354fc

File tree

2 files changed

+42
-22
lines changed
  • components/chainhook-event-observer/src/indexer

2 files changed

+42
-22
lines changed

components/chainhook-event-observer/src/indexer/bitcoin/mod.rs

+36-18
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
mod blocks_pool;
22

3+
use std::thread::JoinHandle;
34
use std::time::Duration;
45

56
use crate::chainhooks::types::{
@@ -106,29 +107,46 @@ pub async fn retrieve_full_block(
106107
Ok((block_height, block))
107108
}
108109

109-
pub async fn standardize_bitcoin_block(
110+
pub fn standardize_bitcoin_block(
110111
indexer_config: &IndexerConfig,
111112
block_height: u64,
112113
block: Block,
113114
bitcoin_context: &mut BitcoinChainContext,
114115
ctx: &Context,
115116
) -> Result<BitcoinBlockData, String> {
116117
let mut transactions = vec![];
117-
118118
ctx.try_log(|logger| slog::info!(logger, "Updating ordinal index",));
119-
match OrdinalIndexUpdater::update(&mut bitcoin_context.ordinal_index).await {
120-
Ok(_) => {
121-
ctx.try_log(|logger| {
122-
slog::info!(
123-
logger,
124-
"Ordinal index updated (block count: {:?})",
125-
bitcoin_context.ordinal_index.block_count()
126-
)
127-
});
128-
}
129-
Err(e) => {
130-
ctx.try_log(|logger| slog::error!(logger, "{}", e.to_string()));
119+
120+
let ordinal_index = bitcoin_context.ordinal_index.take();
121+
let ctx_ = ctx.clone();
122+
let handle: JoinHandle<Result<_, String>> =
123+
hiro_system_kit::thread_named("Ordinal index update")
124+
.spawn(move || {
125+
if let Some(ref ordinal_index) = ordinal_index {
126+
match hiro_system_kit::nestable_block_on(OrdinalIndexUpdater::update(
127+
&ordinal_index,
128+
)) {
129+
Ok(_) => {
130+
ctx_.try_log(|logger| {
131+
slog::info!(logger, "Ordinal index successfully updated",)
132+
});
133+
}
134+
Err(e) => {
135+
ctx_.try_log(|logger| {
136+
slog::error!(logger, "Error updating ordinal index",)
137+
});
138+
}
139+
};
140+
}
141+
Ok(ordinal_index)
142+
})
143+
.expect("unable to detach thread");
144+
145+
match handle.join() {
146+
Ok(Ok(ordinal_index)) => {
147+
bitcoin_context.ordinal_index = ordinal_index;
131148
}
149+
_ => {}
132150
}
133151

134152
let expected_magic_bytes = get_stacks_canonical_magic_bytes(&indexer_config.bitcoin_network);
@@ -153,10 +171,10 @@ pub async fn standardize_bitcoin_block(
153171
}
154172

155173
let mut ordinal_operations = vec![];
156-
if let Some(op) =
157-
try_parse_ordinal_operation(&tx, block_height, &bitcoin_context.ordinal_index, ctx)
158-
{
159-
ordinal_operations.push(op);
174+
if let Some(ref ordinal_index) = bitcoin_context.ordinal_index {
175+
if let Some(op) = try_parse_ordinal_operation(&tx, block_height, &ordinal_index, ctx) {
176+
ordinal_operations.push(op);
177+
}
160178
}
161179

162180
let mut inputs = vec![];

components/chainhook-event-observer/src/indexer/mod.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@ impl StacksChainContext {
3636
}
3737

3838
pub struct BitcoinChainContext {
39-
ordinal_index: OrdinalIndex,
39+
ordinal_index: Option<OrdinalIndex>,
4040
}
4141

4242
impl BitcoinChainContext {
4343
pub fn new(ordinal_index: OrdinalIndex) -> BitcoinChainContext {
44-
BitcoinChainContext { ordinal_index }
44+
BitcoinChainContext {
45+
ordinal_index: Some(ordinal_index),
46+
}
4547
}
4648
}
4749

@@ -85,13 +87,13 @@ impl Indexer {
8587
block: Block,
8688
ctx: &Context,
8789
) -> Result<Option<BitcoinChainEvent>, String> {
88-
let block = hiro_system_kit::nestable_block_on(bitcoin::standardize_bitcoin_block(
90+
let block = bitcoin::standardize_bitcoin_block(
8991
&self.config,
9092
block_height,
9193
block,
9294
&mut self.bitcoin_context,
9395
ctx,
94-
))?;
96+
)?;
9597
let event = self.bitcoin_blocks_pool.process_block(block, ctx);
9698
event
9799
}

0 commit comments

Comments
 (0)