Merge pull request #663 from cfromknecht/utxn-height-hint
Fix UtxoNursery Commit Sweep Height-Hint
This commit is contained in:
commit
28f782b156
@ -9,6 +9,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
"github.com/boltdb/bolt"
|
||||||
|
"github.com/go-errors/errors"
|
||||||
"github.com/roasbeef/btcd/btcec"
|
"github.com/roasbeef/btcd/btcec"
|
||||||
"github.com/roasbeef/btcd/wire"
|
"github.com/roasbeef/btcd/wire"
|
||||||
)
|
)
|
||||||
@ -434,6 +435,42 @@ func (d *DB) FetchClosedChannels(pendingOnly bool) ([]*ChannelCloseSummary, erro
|
|||||||
return chanSummaries, nil
|
return chanSummaries, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ErrClosedChannelNotFound signals that a closed channel could not be found in
|
||||||
|
// the channeldb.
|
||||||
|
var ErrClosedChannelNotFound = errors.New("unable to find closed channel summary")
|
||||||
|
|
||||||
|
// FetchClosedChannel queries for a channel close summary using the channel
|
||||||
|
// point of the channel in question.
|
||||||
|
func (d *DB) FetchClosedChannel(chanID *wire.OutPoint) (*ChannelCloseSummary, error) {
|
||||||
|
var chanSummary *ChannelCloseSummary
|
||||||
|
if err := d.View(func(tx *bolt.Tx) error {
|
||||||
|
closeBucket := tx.Bucket(closedChannelBucket)
|
||||||
|
if closeBucket == nil {
|
||||||
|
return ErrClosedChannelNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
var b bytes.Buffer
|
||||||
|
var err error
|
||||||
|
if err = writeOutpoint(&b, chanID); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
summaryBytes := closeBucket.Get(b.Bytes())
|
||||||
|
if summaryBytes == nil {
|
||||||
|
return ErrClosedChannelNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
summaryReader := bytes.NewReader(summaryBytes)
|
||||||
|
chanSummary, err = deserializeCloseChannelSummary(summaryReader)
|
||||||
|
|
||||||
|
return err
|
||||||
|
}); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return chanSummary, nil
|
||||||
|
}
|
||||||
|
|
||||||
// MarkChanFullyClosed marks a channel as fully closed within the database. A
|
// MarkChanFullyClosed marks a channel as fully closed within the database. A
|
||||||
// channel should be marked as fully closed if the channel was initially
|
// channel should be marked as fully closed if the channel was initially
|
||||||
// cooperatively closed and it's reach a single confirmation, or after all the
|
// cooperatively closed and it's reach a single confirmation, or after all the
|
||||||
|
@ -302,7 +302,7 @@ func (u *utxoNursery) Start() error {
|
|||||||
// NOTE: The next two steps *may* spawn go routines, thus from this
|
// NOTE: The next two steps *may* spawn go routines, thus from this
|
||||||
// point forward, we must close the nursery's quit channel if we detect
|
// point forward, we must close the nursery's quit channel if we detect
|
||||||
// any failures during startup to ensure they terminate.
|
// any failures during startup to ensure they terminate.
|
||||||
if err := u.reloadPreschool(lastGraduatedHeight); err != nil {
|
if err := u.reloadPreschool(); err != nil {
|
||||||
newBlockChan.Cancel()
|
newBlockChan.Cancel()
|
||||||
close(u.quit)
|
close(u.quit)
|
||||||
return err
|
return err
|
||||||
@ -608,14 +608,39 @@ func (u *utxoNursery) NurseryReport(
|
|||||||
|
|
||||||
// reloadPreschool re-initializes the chain notifier with all of the outputs
|
// reloadPreschool re-initializes the chain notifier with all of the outputs
|
||||||
// that had been saved to the "preschool" database bucket prior to shutdown.
|
// that had been saved to the "preschool" database bucket prior to shutdown.
|
||||||
func (u *utxoNursery) reloadPreschool(heightHint uint32) error {
|
func (u *utxoNursery) reloadPreschool() error {
|
||||||
psclOutputs, err := u.cfg.Store.FetchPreschools()
|
psclOutputs, err := u.cfg.Store.FetchPreschools()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For each of the preschool outputs stored in the nursery store, load
|
||||||
|
// it's close summary from disk so that we can get an accurate height
|
||||||
|
// hint from which to start our range for spend notifications.
|
||||||
for i := range psclOutputs {
|
for i := range psclOutputs {
|
||||||
err := u.registerPreschoolConf(&psclOutputs[i], heightHint)
|
kid := &psclOutputs[i]
|
||||||
|
chanPoint := kid.OriginChanPoint()
|
||||||
|
|
||||||
|
// Load the close summary for this output's channel point.
|
||||||
|
closeSummary, err := u.cfg.DB.FetchClosedChannel(chanPoint)
|
||||||
|
if err == channeldb.ErrClosedChannelNotFound {
|
||||||
|
// This should never happen since the close summary
|
||||||
|
// should only be removed after the channel has been
|
||||||
|
// swept completely.
|
||||||
|
utxnLog.Warnf("Close summary not found for "+
|
||||||
|
"chan_point=%v, can't determine height hint"+
|
||||||
|
"to sweep commit txn", chanPoint)
|
||||||
|
continue
|
||||||
|
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use the close height from the channel summary as our height
|
||||||
|
// hint to drive our spend notifications, with our confirmation
|
||||||
|
// depth as a buffer for reorgs.
|
||||||
|
heightHint := closeSummary.CloseHeight - u.cfg.ConfDepth
|
||||||
|
err = u.registerPreschoolConf(kid, heightHint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user