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.
return Err(ChannelMonitorUpdateErr::PermanentFailure)},
hash_map::Entry::Vacant(e) => e,
};
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();
}
{
let funding_txo = monitor.get_funding_txo();
}
}
entry.insert(MonitorHolder { monitor });
}
}
entry.insert(MonitorHolder { monitor });
}
/// Note that we persist the given `ChannelMonitor` update while holding the
}
/// Note that we persist the given `ChannelMonitor` update while holding the