peer: resend channel reestablishes without starting chan streams
This prevents the DLP protocol from breaking as a result of the refactor, since the closing or closed channels won't be included in the peer's active map.
This commit is contained in:
parent
ced113452d
commit
a280a4987c
48
peer.go
48
peer.go
@ -907,33 +907,7 @@ func newChanMsgStream(p *peer, cid lnwire.ChannelID) *msgStream {
|
|||||||
// active goroutine dedicated to this channel.
|
// active goroutine dedicated to this channel.
|
||||||
if chanLink == nil {
|
if chanLink == nil {
|
||||||
link, err := p.server.htlcSwitch.GetLink(cid)
|
link, err := p.server.htlcSwitch.GetLink(cid)
|
||||||
switch {
|
|
||||||
|
|
||||||
// If we failed to find the link in question,
|
|
||||||
// and the message received was a channel sync
|
|
||||||
// message, then this might be a peer trying to
|
|
||||||
// resync closed channel. In this case we'll
|
|
||||||
// try to resend our last channel sync message,
|
|
||||||
// such that the peer can recover funds from
|
|
||||||
// the closed channel.
|
|
||||||
case err != nil && isChanSyncMsg:
|
|
||||||
peerLog.Debugf("Unable to find "+
|
|
||||||
"link(%v) to handle channel "+
|
|
||||||
"sync, attempting to resend "+
|
|
||||||
"last ChanSync message", cid)
|
|
||||||
|
|
||||||
err := p.resendChanSyncMsg(cid)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// TODO(halseth): send error to
|
|
||||||
// peer?
|
|
||||||
peerLog.Errorf(
|
|
||||||
"resend failed: %v",
|
|
||||||
err,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
|
|
||||||
case err != nil:
|
|
||||||
peerLog.Errorf("recv'd update for "+
|
peerLog.Errorf("recv'd update for "+
|
||||||
"unknown channel %v from %v: "+
|
"unknown channel %v from %v: "+
|
||||||
"%v", cid, p, err)
|
"%v", cid, p, err)
|
||||||
@ -1089,8 +1063,23 @@ out:
|
|||||||
isLinkUpdate = p.handleError(msg)
|
isLinkUpdate = p.handleError(msg)
|
||||||
|
|
||||||
case *lnwire.ChannelReestablish:
|
case *lnwire.ChannelReestablish:
|
||||||
isLinkUpdate = true
|
|
||||||
targetChan = msg.ChanID
|
targetChan = msg.ChanID
|
||||||
|
isLinkUpdate = p.isActiveChannel(targetChan)
|
||||||
|
|
||||||
|
// If we failed to find the link in question, and the
|
||||||
|
// message received was a channel sync message, then
|
||||||
|
// this might be a peer trying to resync closed channel.
|
||||||
|
// In this case we'll try to resend our last channel
|
||||||
|
// sync message, such that the peer can recover funds
|
||||||
|
// from the closed channel.
|
||||||
|
if !isLinkUpdate {
|
||||||
|
err := p.resendChanSyncMsg(targetChan)
|
||||||
|
if err != nil {
|
||||||
|
// TODO(halseth): send error to peer?
|
||||||
|
peerLog.Errorf("resend failed: %v",
|
||||||
|
err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
case LinkUpdater:
|
case LinkUpdater:
|
||||||
targetChan = msg.TargetChanID()
|
targetChan = msg.TargetChanID()
|
||||||
@ -2411,6 +2400,11 @@ func (p *peer) resendChanSyncMsg(cid lnwire.ChannelID) error {
|
|||||||
cid)
|
cid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !c.RemotePub.IsEqual(p.IdentityKey()) {
|
||||||
|
return fmt.Errorf("ignoring channel reestablish from "+
|
||||||
|
"peer=%x", p.IdentityKey())
|
||||||
|
}
|
||||||
|
|
||||||
peerLog.Debugf("Re-sending channel sync message for channel %v to "+
|
peerLog.Debugf("Re-sending channel sync message for channel %v to "+
|
||||||
"peer %v", cid, p)
|
"peer %v", cid, p)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user