Skip to content

Commit eec1853

Browse files
committed
assets+loopdb: recover active deposits on startup
This commit adds deposit recovery to the deposit manager's startup process. All deposits that have not yet been spent by the server or swept by the client are recovered from the store.
1 parent a900aa9 commit eec1853

File tree

5 files changed

+174
-0
lines changed

5 files changed

+174
-0
lines changed

assets/deposit/manager.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,13 @@ func (m *Manager) Run(ctx context.Context, bestBlock uint32) error {
146146

147147
m.currentHeight = bestBlock
148148

149+
err := m.recoverDeposits(ctx)
150+
if err != nil {
151+
log.Errorf("Unable to recover deposits: %v", err)
152+
153+
return err
154+
}
155+
149156
blockChan, blockErrChan, err := m.chainNotifier.RegisterBlockEpochNtfn(
150157
ctxc,
151158
)
@@ -219,6 +226,48 @@ func (m *Manager) criticalError(err error) {
219226
}
220227
}
221228

229+
// recoverDeposits recovers all active deppsits when the deposit manager starts.
230+
func (m *Manager) recoverDeposits(ctx context.Context) error {
231+
// Fetch all active deposits from the store to kick-off the manager.
232+
activeDeposits, err := m.store.GetActiveDeposits(ctx)
233+
if err != nil {
234+
log.Errorf("Unable to fetch deposits from store: %v", err)
235+
236+
return err
237+
}
238+
239+
for i := range activeDeposits {
240+
d := &activeDeposits[i]
241+
log.Infof("Recovering deposit %v (state=%s)", d.ID, d.State)
242+
243+
m.deposits[d.ID] = d
244+
_, _, _, err = m.isDepositFunded(ctx, d)
245+
if err != nil {
246+
return err
247+
}
248+
249+
if d.State == StateInitiated {
250+
// If the deposit has just been initiated, then we need
251+
// to ensure that it is funded.
252+
err = m.fundDepositIfNeeded(ctx, d)
253+
if err != nil {
254+
log.Errorf("Unable to fund deposit %v: %v",
255+
d.ID, err)
256+
257+
return err
258+
}
259+
} else {
260+
// Cache proof info of the deposit in-memory.
261+
err = m.cacheProofInfo(ctx, d)
262+
if err != nil {
263+
return err
264+
}
265+
}
266+
}
267+
268+
return nil
269+
}
270+
222271
// handleBlockEpoch is called when a new block is added to the chain.
223272
func (m *Manager) handleBlockEpoch(ctx context.Context, height uint32) error {
224273
for _, d := range m.deposits {

assets/deposit/sql_store.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ type Querier interface {
3232

3333
SetAssetDepositSweepAddr(ctx context.Context,
3434
arg sqlc.SetAssetDepositSweepAddrParams) error
35+
36+
GetActiveAssetDeposits(ctx context.Context) (
37+
[]sqlc.GetActiveAssetDepositsRow, error)
3538
}
3639

3740
// DepositBaseDB is the interface that contains all the queries generated
@@ -271,3 +274,27 @@ func sqlcDepositToDeposit(sqlDeposit sqlc.GetAssetDepositsRow,
271274
DepositInfo: depositInfo,
272275
}, nil
273276
}
277+
278+
// GetActiveDeposits returns all active deposits from the database. Active
279+
// deposits are those that have not yet been spent or swept.
280+
func (s *SQLStore) GetActiveDeposits(ctx context.Context) ([]Deposit, error) {
281+
sqlDeposits, err := s.db.GetActiveAssetDeposits(ctx)
282+
if err != nil {
283+
return nil, err
284+
}
285+
286+
deposits := make([]Deposit, 0, len(sqlDeposits))
287+
for _, sqlDeposit := range sqlDeposits {
288+
deposit, err := sqlcDepositToDeposit(
289+
sqlc.GetAssetDepositsRow(sqlDeposit),
290+
&s.addressParams,
291+
)
292+
if err != nil {
293+
return nil, err
294+
}
295+
296+
deposits = append(deposits, deposit)
297+
}
298+
299+
return deposits, nil
300+
}

loopdb/sqlc/asset_deposits.sql.go

Lines changed: 82 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

loopdb/sqlc/querier.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

loopdb/sqlc/queries/asset_deposits.sql

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,18 @@ ORDER BY d.created_at ASC;
4444
UPDATE asset_deposits
4545
SET sweep_addr = $2
4646
WHERE deposit_id = $1;
47+
48+
-- name: GetActiveAssetDeposits :many
49+
SELECT d.*, u.update_state, u.update_timestamp
50+
FROM asset_deposits d
51+
JOIN asset_deposit_updates u
52+
ON u.deposit_id = d.deposit_id
53+
WHERE u.id = (
54+
SELECT id
55+
FROM asset_deposit_updates
56+
WHERE deposit_id = d.deposit_id
57+
ORDER BY update_timestamp DESC
58+
LIMIT 1
59+
)
60+
AND u.update_state IN (0, 1, 2, 3, 4, 5, 6);
61+

0 commit comments

Comments
 (0)