mirror of
https://github.com/lightninglabs/loop.git
synced 2026-08-13 12:33:03 +02:00
loopd: abandon loop-ins
This commit is contained in:
parent
0fbf253391
commit
5e91c446b8
6 changed files with 161 additions and 3 deletions
38
client.go
38
client.go
|
|
@ -17,6 +17,7 @@ import (
|
|||
"github.com/lightninglabs/loop/loopdb"
|
||||
"github.com/lightninglabs/loop/swap"
|
||||
"github.com/lightninglabs/loop/sweep"
|
||||
"github.com/lightningnetwork/lnd/lntypes"
|
||||
"github.com/lightningnetwork/lnd/routing/route"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
|
@ -68,6 +69,11 @@ type Client struct {
|
|||
started uint32 // To be used atomically.
|
||||
errChan chan error
|
||||
|
||||
// abandonChans allows for accessing a swap's abandon channel by
|
||||
// providing its swap hash. This map is used to look up the abandon
|
||||
// channel of a swap if the client requests to abandon it.
|
||||
abandonChans map[lntypes.Hash]chan struct{}
|
||||
|
||||
lndServices *lndclient.LndServices
|
||||
sweeper *sweep.Sweeper
|
||||
executor *executor
|
||||
|
|
@ -179,6 +185,7 @@ func NewClient(dbDir string, loopDB loopdb.SwapStore,
|
|||
sweeper: sweeper,
|
||||
executor: executor,
|
||||
resumeReady: make(chan struct{}),
|
||||
abandonChans: make(map[lntypes.Hash]chan struct{}),
|
||||
}
|
||||
|
||||
cleanup := func() {
|
||||
|
|
@ -317,10 +324,10 @@ func (s *Client) Run(ctx context.Context, statusChan chan<- SwapInfo) error {
|
|||
}()
|
||||
|
||||
// Main event loop.
|
||||
err = s.executor.run(mainCtx, statusChan)
|
||||
err = s.executor.run(mainCtx, statusChan, s.abandonChans)
|
||||
|
||||
// Consider canceled as happy flow.
|
||||
if err == context.Canceled {
|
||||
if errors.Is(err, context.Canceled) {
|
||||
err = nil
|
||||
}
|
||||
|
||||
|
|
@ -578,6 +585,10 @@ func (s *Client) LoopIn(globalCtx context.Context,
|
|||
}
|
||||
swap := initResult.swap
|
||||
|
||||
s.executor.Lock()
|
||||
s.abandonChans[swap.hash] = swap.abandonChan
|
||||
s.executor.Unlock()
|
||||
|
||||
// Post swap to the main loop.
|
||||
s.executor.initiateSwap(globalCtx, swap)
|
||||
|
||||
|
|
@ -753,3 +764,26 @@ func (s *Client) Probe(ctx context.Context, req *ProbeRequest) error {
|
|||
req.RouteHints,
|
||||
)
|
||||
}
|
||||
|
||||
// AbandonSwap sends a signal on the abandon channel of the swap identified by
|
||||
// the passed swap hash. This will cause the swap to abandon itself.
|
||||
func (s *Client) AbandonSwap(ctx context.Context,
|
||||
req *AbandonSwapRequest) error {
|
||||
|
||||
if req == nil {
|
||||
return errors.New("no request provided")
|
||||
}
|
||||
|
||||
s.executor.Lock()
|
||||
defer s.executor.Unlock()
|
||||
|
||||
select {
|
||||
case s.abandonChans[req.SwapHash] <- struct{}{}:
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
default:
|
||||
// This is to avoid writing to a full channel.
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue