chainntnfs/btcdnotify: remove all mempool spend clients

This commit is contained in:
Johan T. Halseth 2018-07-17 09:13:06 +02:00
parent d7b2977e8c
commit 3808105dcd
No known key found for this signature in database
GPG Key ID: 15BAADA29DA20D26

@ -377,6 +377,14 @@ out:
// rescan spends. It might get removed entirely in the future. // rescan spends. It might get removed entirely in the future.
case item := <-b.txUpdates.ChanOut(): case item := <-b.txUpdates.ChanOut():
newSpend := item.(*txUpdate) newSpend := item.(*txUpdate)
// We only care about notifying on confirmed spends, so
// in case this is a mempool spend, we can continue,
// and wait for the spend to appear in chain.
if newSpend.details == nil {
continue
}
spendingTx := newSpend.tx spendingTx := newSpend.tx
// First, check if this transaction spends an output // First, check if this transaction spends an output
@ -397,56 +405,27 @@ out:
SpendingTx: spendingTx.MsgTx(), SpendingTx: spendingTx.MsgTx(),
SpenderInputIndex: uint32(i), SpenderInputIndex: uint32(i),
} }
// TODO(roasbeef): after change to
// loadfilter, only notify on block
// inclusion?
confirmedSpend := false
if newSpend.details != nil {
confirmedSpend = true
spendDetails.SpendingHeight = newSpend.details.Height spendDetails.SpendingHeight = newSpend.details.Height
} else {
spendDetails.SpendingHeight = currentHeight + 1
}
// Keep spendNotifications that are for _, ntfn := range clients {
// waiting for a confirmation around. chainntnfs.Log.Infof("Dispatching "+
// They will be notified when we find "confirmed spend "+
// the spend within a block. "notification for "+
rem := make(map[uint64]*spendNotification)
for c, ntfn := range clients {
// If this is a mempool spend,
// store the client to wait for
// a confirmed spend.
if !confirmedSpend {
rem[c] = ntfn
continue
}
confStr := "unconfirmed"
if confirmedSpend {
confStr = "confirmed"
}
chainntnfs.Log.Infof("Dispatching %s "+
"spend notification for "+
"outpoint=%v at height %v", "outpoint=%v at height %v",
confStr, ntfn.targetOutpoint, ntfn.targetOutpoint,
spendDetails.SpendingHeight) spendDetails.SpendingHeight)
ntfn.spendChan <- spendDetails ntfn.spendChan <- spendDetails
// Close spendChan to ensure that any calls to Cancel will not // Close spendChan to ensure
// block. This is safe to do since the channel is buffered, and the // that any calls to Cancel
// message can still be read by the receiver. // will not block. This is safe
// to do since the channel is
// buffered, and the message
// can still be read by the
// receiver.
close(ntfn.spendChan) close(ntfn.spendChan)
} }
delete(b.spendNotifications, prevOut) delete(b.spendNotifications, prevOut)
// If we had any clients left, add them
// back to the map.
if len(rem) > 0 {
b.spendNotifications[prevOut] = rem
}
} }
} }
@ -610,8 +589,6 @@ func (b *BtcdNotifier) handleBlockConnected(newBlock *filteredBlock) error {
continue continue
} }
// TODO(roasbeef): many integration tests expect spend to be
// notified within the mempool.
spendDetails := &chainntnfs.SpendDetail{ spendDetails := &chainntnfs.SpendDetail{
SpentOutPoint: &prevOut, SpentOutPoint: &prevOut,
SpenderTxHash: &txSha, SpenderTxHash: &txSha,