From: Matt Corallo Date: Fri, 8 Oct 2021 20:40:34 +0000 (+0000) Subject: Handle Persister returning TemporaryFailure for new channels X-Git-Tag: v0.0.102~4^2~2 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=1b6a7c1314a3840f57af4457977a5c98a864edd1;p=rust-lightning Handle Persister returning TemporaryFailure for new channels Previously, if a Persister returned a TemporaryFailure error when we tried to persist a new channel, the ChainMonitor wouldn't track the new ChannelMonitor at all, generating a PermanentFailure later when the updating is restored. This fixes that by correctly storing the ChannelMonitor on TemporaryFailures, allowing later update restoration to happen normally. This is (indirectly) tested in the next commit where we use Persister to return all monitor-update errors. --- diff --git a/lightning/src/chain/chainmonitor.rs b/lightning/src/chain/chainmonitor.rs index 2de55400..f1ce0f79 100644 --- a/lightning/src/chain/chainmonitor.rs +++ b/lightning/src/chain/chainmonitor.rs @@ -372,9 +372,12 @@ where C::Target: chain::Filter, return Err(ChannelMonitorUpdateErr::PermanentFailure)}, hash_map::Entry::Vacant(e) => e, }; - if let Err(e) = self.persister.persist_new_channel(funding_outpoint, &monitor) { - log_error!(self.logger, "Failed to persist new channel data"); - return Err(e); + let persist_res = self.persister.persist_new_channel(funding_outpoint, &monitor); + if persist_res.is_err() { + log_error!(self.logger, "Failed to persist new channel data: {:?}", persist_res); + } + if persist_res == Err(ChannelMonitorUpdateErr::PermanentFailure) { + return persist_res; } { let funding_txo = monitor.get_funding_txo(); @@ -385,7 +388,7 @@ where C::Target: chain::Filter, } } entry.insert(MonitorHolder { monitor }); - Ok(()) + persist_res } /// Note that we persist the given `ChannelMonitor` update while holding the