From 84b841a9cfe5638c2fcc4c2fa6db86bb0cf6618e Mon Sep 17 00:00:00 2001 From: Wilmer Paulino Date: Mon, 2 Nov 2020 14:12:45 -0800 Subject: [PATCH] account: ensure only one outstanding account reservation exists The auctioneer only expects one outstanding account reservation to exist per trader LSAT, so we should enforce this on the trader's side as well. --- account/manager.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/account/manager.go b/account/manager.go index 01189ca..070b49b 100644 --- a/account/manager.go +++ b/account/manager.go @@ -140,6 +140,12 @@ type Manager struct { // Finalize message for. pendingBatchMtx sync.Mutex + // reservationMtx prevents a trader from attempting to have more than + // once active reservation at a time when creating new accounts. This is + // done to ensure an account picks up the correct reservation once its + // time to fund it. + reservationMtx sync.Mutex + wg sync.WaitGroup quit chan struct{} } @@ -260,6 +266,12 @@ func (m *Manager) QuoteAccount(ctx context.Context, value btcutil.Amount, func (m *Manager) InitAccount(ctx context.Context, value btcutil.Amount, expiry, bestHeight, confTarget uint32) (*Account, error) { + // We'll make sure to acquire the reservation lock throughout the + // account funding process to ensure we use the same reservation, as + // only one can be active per trader LSAT. + m.reservationMtx.Lock() + defer m.reservationMtx.Unlock() + // First, make sure we have a valid amount to create the account. We // need to ask the auctioneer for the maximum as it dynamically defines // that value.