Skip to content

Commit 64412a5

Browse files
committed
parallelize update reads
1 parent e48ad0a commit 64412a5

File tree

1 file changed

+22
-18
lines changed

1 file changed

+22
-18
lines changed

lightning/src/util/persist.rs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -991,28 +991,32 @@ where
991991
Some(res) => res,
992992
None => return Ok(None),
993993
};
994-
let mut current_update_id = monitor.get_latest_update_id();
994+
let current_update_id = monitor.get_latest_update_id();
995995
let updates: Result<Vec<_>, _> =
996996
list_res?.into_iter().map(|name| UpdateName::new(name)).collect();
997997
let mut updates = updates?;
998998
updates.sort_unstable();
999-
// TODO: Parallelize this loop
1000-
for update_name in updates {
1001-
if update_name.0 > current_update_id {
1002-
let update = self.read_monitor_update(monitor_key, &update_name).await?;
1003-
monitor
1004-
.update_monitor(&update, &self.broadcaster, &self.fee_estimator, &self.logger)
1005-
.map_err(|e| {
1006-
log_error!(
1007-
self.logger,
1008-
"Monitor update failed. monitor: {} update: {} reason: {:?}",
1009-
monitor_key,
1010-
update_name.as_str(),
1011-
e
1012-
);
1013-
io::Error::new(io::ErrorKind::Other, "Monitor update failed")
1014-
})?;
1015-
}
999+
let updates_to_load = updates.iter().filter(|update| update.0 > current_update_id);
1000+
let mut update_futures = Vec::with_capacity(updates_to_load.clone().count());
1001+
for update_name in updates_to_load {
1002+
update_futures.push(ResultFuture::Pending(Box::pin(async move {
1003+
(update_name, self.read_monitor_update(monitor_key, update_name).await)
1004+
})));
1005+
}
1006+
for (update_name, update_res) in MultiResultFuturePoller::new(update_futures).await {
1007+
let update = update_res?;
1008+
monitor
1009+
.update_monitor(&update, &self.broadcaster, &self.fee_estimator, &self.logger)
1010+
.map_err(|e| {
1011+
log_error!(
1012+
self.logger,
1013+
"Monitor update failed. monitor: {} update: {} reason: {:?}",
1014+
monitor_key,
1015+
update_name.as_str(),
1016+
e
1017+
);
1018+
io::Error::new(io::ErrorKind::Other, "Monitor update failed")
1019+
})?;
10161020
}
10171021
Ok(Some((block_hash, monitor)))
10181022
}

0 commit comments

Comments
 (0)