Correct lock drop'ing in ChainMonitor::update_channel

e21a500668 cleaned up the error
handling in `ChainMonitor::update_channel` a bit, but accidentally
replaced the deliberate panic with a hang. This commit ensures we
properly drop the monitors read lock before taking a write lock.
This commit is contained in:
Matt Corallo 2023-12-02 17:54:18 +00:00
parent ab93d35da2
commit 18a18d8962

View file

@ -753,8 +753,7 @@ where C::Target: chain::Filter,
fn update_channel(&self, funding_txo: OutPoint, update: &ChannelMonitorUpdate) -> ChannelMonitorUpdateStatus {
// Update the monitor that watches the channel referred to by the given outpoint.
let monitors_lock = self.monitors.read().unwrap();
let monitors = monitors_lock.deref();
let monitors = self.monitors.read().unwrap();
match monitors.get(&funding_txo) {
None => {
log_error!(self.logger, "Failed to update channel monitor: no such monitor registered");
@ -797,6 +796,7 @@ where C::Target: chain::Filter,
ChannelMonitorUpdateStatus::UnrecoverableError => {
// Take the monitors lock for writing so that we poison it and any future
// operations going forward fail immediately.
core::mem::drop(pending_monitor_updates);
core::mem::drop(monitors);
let _poison = self.monitors.write().unwrap();
let err_str = "ChannelMonitor[Update] persistence failed unrecoverably. This indicates we cannot continue normal operation and must shut down.";