routing/router: sets bestHeight before filtering chain

This commit alters the behavior of the router's logic on
 startup, ensuring that the chain view is filtered using
 the router's latest prune height. Before, the chain was
 filtered using the bestHeight variable, which was
 uninitialized, benignly forcing a rescan from genesis.
 In tracking down this, we realized that we should
 actually be using the prune height, as this is
 representative of the channel view loaded from disk.
 The best height/hash are now only used during
 startup to determine if we are out of sync.
This commit is contained in:
Conner Fromknecht 2017-11-10 16:55:31 -08:00
parent 010815e280
commit 153794adb0
No known key found for this signature in database
GPG Key ID: 39DE78FBE6ACB0EF

@ -273,6 +273,18 @@ func (r *ChannelRouter) Start() error {
r.newBlocks = r.cfg.ChainView.FilteredBlocks()
r.staleBlocks = r.cfg.ChainView.DisconnectedBlocks()
_, pruneHeight, err := r.cfg.Graph.PruneTip()
if err != nil {
switch {
// If the graph has never been pruned, or hasn't fully been
// created yet, then we don't treat this as an explicit error.
case err == channeldb.ErrGraphNeverPruned:
case err == channeldb.ErrGraphNotFound:
default:
return err
}
}
// Before we perform our manual block pruning, we'll construct and
// apply a fresh chain filter to the active FilteredChainView instance.
// We do this before, as otherwise we may miss on-chain events as the
@ -281,8 +293,9 @@ func (r *ChannelRouter) Start() error {
if err != nil && err != channeldb.ErrGraphNoEdgesFound {
return err
}
log.Infof("Filtering chain using %v channels active", len(channelView))
err = r.cfg.ChainView.UpdateFilter(channelView, r.bestHeight)
err = r.cfg.ChainView.UpdateFilter(channelView, pruneHeight)
if err != nil {
return err
}
@ -331,6 +344,7 @@ func (r *ChannelRouter) syncGraphWithChain() error {
return err
}
r.bestHeight = uint32(bestHeight)
pruneHash, pruneHeight, err := r.cfg.Graph.PruneTip()
if err != nil {
switch {