Merge pull request #1618 from cfromknecht/resolver-subscribe-order
contractcourt/contract_resolvers: fix subscribe preimage race
This commit is contained in:
commit
b8c3987fd7
@ -8,12 +8,12 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
|
||||||
|
"github.com/btcsuite/btcd/txscript"
|
||||||
|
"github.com/btcsuite/btcd/wire"
|
||||||
"github.com/davecgh/go-spew/spew"
|
"github.com/davecgh/go-spew/spew"
|
||||||
"github.com/lightningnetwork/lnd/chainntnfs"
|
"github.com/lightningnetwork/lnd/chainntnfs"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet"
|
"github.com/lightningnetwork/lnd/lnwallet"
|
||||||
"github.com/lightningnetwork/lnd/lnwire"
|
"github.com/lightningnetwork/lnd/lnwire"
|
||||||
"github.com/btcsuite/btcd/txscript"
|
|
||||||
"github.com/btcsuite/btcd/wire"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -1012,20 +1012,13 @@ func (h *htlcIncomingContestResolver) Resolve() (ContractResolver, error) {
|
|||||||
copy(h.htlcResolution.Preimage[:], preimage[:])
|
copy(h.htlcResolution.Preimage[:], preimage[:])
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the HTLC hasn't yet expired, then we'll query to see if we
|
|
||||||
// already know the preimage.
|
|
||||||
preimage, ok := h.PreimageDB.LookupPreimage(h.payHash[:])
|
|
||||||
if ok {
|
|
||||||
// If we do, then this means we can claim the HTLC! However,
|
|
||||||
// we don't know how to ourselves, so we'll return our inner
|
|
||||||
// resolver which has the knowledge to do so.
|
|
||||||
applyPreimage(preimage[:])
|
|
||||||
return &h.htlcSuccessResolver, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the HTLC hasn't expired yet, then we may still be able to claim
|
// If the HTLC hasn't expired yet, then we may still be able to claim
|
||||||
// it if we learn of the pre-image, so we'll wait and see if it pops
|
// it if we learn of the pre-image, so we'll subscribe to the preimage
|
||||||
// up, or the HTLC times out.
|
// database to see if it turns up, or the HTLC times out.
|
||||||
|
//
|
||||||
|
// NOTE: This is done BEFORE opportunistically querying the db, to
|
||||||
|
// ensure the preimage can't be delivered between querying and
|
||||||
|
// registering for the preimage subscription.
|
||||||
preimageSubscription := h.PreimageDB.SubscribeUpdates()
|
preimageSubscription := h.PreimageDB.SubscribeUpdates()
|
||||||
blockEpochs, err := h.Notifier.RegisterBlockEpochNtfn()
|
blockEpochs, err := h.Notifier.RegisterBlockEpochNtfn()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1035,6 +1028,18 @@ func (h *htlcIncomingContestResolver) Resolve() (ContractResolver, error) {
|
|||||||
preimageSubscription.CancelSubscription()
|
preimageSubscription.CancelSubscription()
|
||||||
blockEpochs.Cancel()
|
blockEpochs.Cancel()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// With the epochs and preimage subscriptions initialized, we'll query
|
||||||
|
// to see if we already know the preimage.
|
||||||
|
preimage, ok := h.PreimageDB.LookupPreimage(h.payHash[:])
|
||||||
|
if ok {
|
||||||
|
// If we do, then this means we can claim the HTLC! However,
|
||||||
|
// we don't know how to ourselves, so we'll return our inner
|
||||||
|
// resolver which has the knowledge to do so.
|
||||||
|
applyPreimage(preimage[:])
|
||||||
|
return &h.htlcSuccessResolver, nil
|
||||||
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
|
||||||
select {
|
select {
|
||||||
|
Loading…
Reference in New Issue
Block a user