Query logs via LogQuery in watch loop (#177)
Some checks failed
abi-consistent-check / build-and-compare (push) Has been cancelled
code-coverage / unittest-cov (push) Has been cancelled
rust / check (push) Has been cancelled
rust / test (push) Has been cancelled
rust / lints (push) Has been cancelled
functional-test / test (push) Has been cancelled

* queyr logs via LogQuery in wath loop

* fix lints error
This commit is contained in:
Joel Liu 2024-09-02 18:49:18 +08:00 committed by GitHub
parent e7a562fa61
commit e20be63026
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 15 additions and 10 deletions

View File

@ -290,6 +290,7 @@ impl LogEntryFetcher {
let contract = ZgsFlow::new(self.contract_address, self.provider.clone()); let contract = ZgsFlow::new(self.contract_address, self.provider.clone());
let provider = self.provider.clone(); let provider = self.provider.clone();
let confirmation_delay = self.confirmation_delay; let confirmation_delay = self.confirmation_delay;
let log_page_size = self.log_page_size;
executor.spawn( executor.spawn(
async move { async move {
debug!("start_watch starts, start={}", start_block_number); debug!("start_watch starts, start={}", start_block_number);
@ -305,6 +306,7 @@ impl LogEntryFetcher {
confirmation_delay, confirmation_delay,
&contract, &contract,
&block_hash_cache, &block_hash_cache,
log_page_size,
) )
.await .await
{ {
@ -340,6 +342,7 @@ impl LogEntryFetcher {
confirmation_delay: u64, confirmation_delay: u64,
contract: &ZgsFlow<Provider<RetryClient<Http>>>, contract: &ZgsFlow<Provider<RetryClient<Http>>>,
block_hash_cache: &Arc<RwLock<BTreeMap<u64, Option<BlockHashAndSubmissionIndex>>>>, block_hash_cache: &Arc<RwLock<BTreeMap<u64, Option<BlockHashAndSubmissionIndex>>>>,
log_page_size: u64,
) -> Result<Option<(u64, H256, Option<Option<u64>>)>> { ) -> Result<Option<(u64, H256, Option<Option<u64>>)>> {
let latest_block_number = provider.get_block_number().await?.as_u64(); let latest_block_number = provider.get_block_number().await?.as_u64();
debug!( debug!(
@ -408,8 +411,11 @@ impl LogEntryFetcher {
.to_block(to_block_number) .to_block(to_block_number)
.address(contract.address().into()) .address(contract.address().into())
.filter; .filter;
let mut stream = LogQuery::new(provider, &filter, Duration::from_millis(10))
.with_page_size(log_page_size);
let mut block_logs: BTreeMap<u64, Vec<Log>> = BTreeMap::new(); let mut block_logs: BTreeMap<u64, Vec<Log>> = BTreeMap::new();
for log in provider.get_logs(&filter).await? { while let Some(maybe_log) = stream.next().await {
let log = maybe_log?;
let block_number = log let block_number = log
.block_number .block_number
.ok_or_else(|| anyhow!("block number missing"))? .ok_or_else(|| anyhow!("block number missing"))?
@ -496,20 +502,20 @@ impl LogEntryFetcher {
} else { } else {
None None
}; };
for log in log_events.into_iter() {
if let Err(e) = watch_tx.send(log) {
warn!("send LogFetchProgress::Transaction failed: {:?}", e);
return Ok(progress);
}
}
if let Some(p) = &new_progress { if let Some(p) = &new_progress {
if let Err(e) = watch_tx.send(LogFetchProgress::SyncedBlock(*p)) { if let Err(e) = watch_tx.send(LogFetchProgress::SyncedBlock(*p)) {
warn!("send LogFetchProgress failed: {:?}", e); warn!("send LogFetchProgress::SyncedBlock failed: {:?}", e);
return Ok(progress); return Ok(progress);
} else { } else {
block_hash_cache.write().await.insert(p.0, None); block_hash_cache.write().await.insert(p.0, None);
} }
} }
for log in log_events.into_iter() {
if let Err(e) = watch_tx.send(log) {
warn!("send log failed: {:?}", e);
return Ok(progress);
}
}
progress = new_progress; progress = new_progress;
} }
} }

View File

@ -339,8 +339,7 @@ impl LogSyncManager {
LogFetchProgress::Transaction(tx) => { LogFetchProgress::Transaction(tx) => {
if !self.put_tx(tx.clone()).await { if !self.put_tx(tx.clone()).await {
// Unexpected error. // Unexpected error.
error!("log sync write error"); bail!("log sync write error");
break;
} }
if let Err(e) = self.event_send.send(LogSyncEvent::TxSynced { tx }) { if let Err(e) = self.event_send.send(LogSyncEvent::TxSynced { tx }) {
// TODO: Do we need to wait until all receivers are initialized? // TODO: Do we need to wait until all receivers are initialized?