Merge pull request #3752 from halseth/chainntfs-spendntfn-logs

[chainntnfs] add more logging for spend requests
This commit is contained in:
Olaoluwa Osuntokun 2019-12-04 19:16:53 -08:00 committed by GitHub
commit 9f3d327733
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 37 additions and 6 deletions

@ -262,6 +262,14 @@ out:
return return
} }
chainntnfs.Log.Infof("Historical "+
"spend dispatch finished"+
"for request %v (start=%v "+
"end=%v) with details: %v",
msg.SpendRequest,
msg.StartHeight, msg.EndHeight,
spendDetails)
// If the historical dispatch finished // If the historical dispatch finished
// without error, we will invoke // without error, we will invoke
// UpdateSpendDetails even if none were // UpdateSpendDetails even if none were

@ -241,6 +241,12 @@ type SpendDetail struct {
SpendingHeight int32 SpendingHeight int32
} }
// String returns a string representation of SpendDetail.
func (s *SpendDetail) String() string {
return fmt.Sprintf("%v[%d] spending %v at height=%v", s.SpenderTxHash,
s.SpenderInputIndex, s.SpentOutPoint, s.SpendingHeight)
}
// SpendEvent encapsulates a spentness notification. Its only field 'Spend' will // SpendEvent encapsulates a spentness notification. Its only field 'Spend' will
// be sent upon once the target output passed into RegisterSpendNtfn has been // be sent upon once the target output passed into RegisterSpendNtfn has been
// spent on the blockchain. // spent on the blockchain.

@ -328,9 +328,10 @@ func NewSpendRequest(op *wire.OutPoint, pkScript []byte) (SpendRequest, error) {
// String returns the string representation of the SpendRequest. // String returns the string representation of the SpendRequest.
func (r SpendRequest) String() string { func (r SpendRequest) String() string {
if r.OutPoint != ZeroOutPoint { if r.OutPoint != ZeroOutPoint {
return fmt.Sprintf("outpoint=%v", r.OutPoint) return fmt.Sprintf("outpoint=%v, script=%v", r.OutPoint,
r.PkScript)
} }
return fmt.Sprintf("script=%v", r.PkScript) return fmt.Sprintf("outpoint=<zero>, script=%v", r.PkScript)
} }
// SpendHintKey returns the key that will be used to index the spend request's // SpendHintKey returns the key that will be used to index the spend request's
@ -1083,8 +1084,8 @@ func (n *TxNotifier) RegisterSpend(outpoint *wire.OutPoint, pkScript []byte,
// notifications don't also attempt a historical dispatch. // notifications don't also attempt a historical dispatch.
spendSet.rescanStatus = rescanPending spendSet.rescanStatus = rescanPending
Log.Debugf("Dispatching historical spend rescan for %v", Log.Infof("Dispatching historical spend rescan for %v, start=%d, "+
ntfn.SpendRequest) "end=%d", ntfn.SpendRequest, startHeight, n.currentHeight)
return &SpendRegistration{ return &SpendRegistration{
Event: ntfn.Event, Event: ntfn.Event,
@ -1244,6 +1245,8 @@ func (n *TxNotifier) updateSpendDetails(spendRequest SpendRequest,
n.currentHeight, spendRequest, err) n.currentHeight, spendRequest, err)
} }
Log.Debugf("Updated spend hint to height=%v for unconfirmed "+
"spend request %v", n.currentHeight, spendRequest)
return nil return nil
} }
@ -1269,6 +1272,9 @@ func (n *TxNotifier) updateSpendDetails(spendRequest SpendRequest,
details.SpendingHeight, spendRequest, err) details.SpendingHeight, spendRequest, err)
} }
Log.Debugf("Updated spend hint to height=%v for confirmed spend "+
"request %v", details.SpendingHeight, spendRequest)
spendSet.details = details spendSet.details = details
for _, ntfn := range spendSet.ntfns { for _, ntfn := range spendSet.ntfns {
err := n.dispatchSpendDetails(ntfn, spendSet.details) err := n.dispatchSpendDetails(ntfn, spendSet.details)
@ -1287,11 +1293,15 @@ func (n *TxNotifier) dispatchSpendDetails(ntfn *SpendNtfn, details *SpendDetail)
// If there are no spend details to dispatch or if the notification has // If there are no spend details to dispatch or if the notification has
// already been dispatched, then we can skip dispatching to this client. // already been dispatched, then we can skip dispatching to this client.
if details == nil || ntfn.dispatched { if details == nil || ntfn.dispatched {
Log.Debugf("Skipping dispatch of spend details(%v) for "+
"request %v, dispatched=%v", details, ntfn.SpendRequest,
ntfn.dispatched)
return nil return nil
} }
Log.Infof("Dispatching confirmed spend notification for %v at height=%d", Log.Infof("Dispatching confirmed spend notification for %v at "+
ntfn.SpendRequest, n.currentHeight) "current height=%d: %v", ntfn.SpendRequest, n.currentHeight,
details)
select { select {
case ntfn.Event.Spend <- details: case ntfn.Event.Spend <- details:
@ -1344,6 +1354,8 @@ func (n *TxNotifier) ConnectTip(blockHash *chainhash.Hash, blockHeight uint32,
// First, we'll iterate over all the transactions found in this block to // First, we'll iterate over all the transactions found in this block to
// determine if it includes any relevant transactions to the TxNotifier. // determine if it includes any relevant transactions to the TxNotifier.
Log.Debugf("Filtering %d txns for %d spend requests at height %d",
len(txns), len(n.spendNotifications), blockHeight)
for _, tx := range txns { for _, tx := range txns {
n.filterTx( n.filterTx(
tx, blockHash, blockHeight, n.handleConfDetailsAtTip, tx, blockHash, blockHeight, n.handleConfDetailsAtTip,
@ -1385,6 +1397,8 @@ func (n *TxNotifier) ConnectTip(blockHash *chainhash.Hash, blockHeight uint32,
} }
} }
Log.Debugf("Deleting mature spend request %v at "+
"height=%d", spendRequest, blockHeight)
delete(n.spendNotifications, spendRequest) delete(n.spendNotifications, spendRequest)
} }
delete(n.spendsByHeight, matureBlockHeight) delete(n.spendsByHeight, matureBlockHeight)
@ -1586,6 +1600,9 @@ func (n *TxNotifier) handleSpendDetailsAtTip(spendRequest SpendRequest,
n.spendsByHeight[spendHeight] = opSet n.spendsByHeight[spendHeight] = opSet
} }
opSet[spendRequest] = struct{}{} opSet[spendRequest] = struct{}{}
Log.Debugf("Spend request %v spent at tip=%d", spendRequest,
spendHeight)
} }
// NotifyHeight dispatches confirmation and spend notifications to the clients // NotifyHeight dispatches confirmation and spend notifications to the clients