D
Size: a a a
D
ИК
M
spawn_local
called from outside of a task::LocalSet
'M
D
D
C
thread 'main' panicked at '`spawn_local
called from outside of a task::LocalSet`'
main
функцияmatch command {
"init" => startup::init_indexer(home_dir).expect("Couldn't init indexer"),
"run" => startup::run_indexer(home_dir).expect("Couldn't run indexer"),
_ => panic!("You have to pass `init` or `run` arg"),
}
#[tracing::instrument(
name = "Run indexer",
skip(home_dir),
fields(id = %Uuid::new_v4())
)]
pub fn run_indexer(home_dir: PathBuf) -> crate::Result<()> {
let mut config = get_config::<RunSettings>().expect("Couldn't run indexer");
tracing::info!("Config was loaded");
config.indexer.home_dir = home_dir;
let sys = System::new();
let indexer = Indexer::new(config.indexer);
tracing::info!("Indexer was created and configured");
sys.block_on(async move {
let stream = indexer.streamer();
actix::spawn(async {
if let Err(e) = listen_blocks(stream).await {
tracing::error!("`listen_blocks` is terminated with error: {:#}", e)
}
});
});
sys.run()?;
Ok(())
}
IB
MB
MB
System
должен создавать локалсет (точнее даже набор локалсетов, привяханных к разным тредам), в котором потом другие компоненты актикса будут спавнить таскиC
insert_nft_events(events: Vec<Event>, db: &PgPool) -> Result<()> {
let mut tx = db.begin().
await?;
for event
in events {
let query =
match event {
Event::
Sale(sale) => {
sqlx::query!(
r#"
INSERT INTO sales (id, prev_owner, curr_owner, token_id, price, date)
VALUES ($1, $2, $3, $4, $5, $6)
"#,
Uuid::new_v4(),
sale.prev_owner,
sale.curr_owner,
sale.token_id,
sale.price,
Utc::now()
)
}
};
query.execute(&
mut tx).
await.map_err(|e| {
tracing::error!("Failed to execute query: {:?}", e);
e
})
?;
}
tx.commit().
await?;
Ok(())
}
K
DF
PgPool
в автокомите по дефолту?M
d
d