Skip to content

Commit a38abe2

Browse files
jholdstockjrick
authored andcommitted
multi: Always iterate over all VSP tickets.
ForUnspentUnexpiredTickets now collects all errors which occur and returns them at once, rather than returning on first error.
1 parent 35c6ac0 commit a38abe2

File tree

3 files changed

+30
-19
lines changed

3 files changed

+30
-19
lines changed

internal/rpc/jsonrpc/methods.go

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4674,34 +4674,29 @@ func (s *Server) updateVSPVoteChoices(ctx context.Context, w *wallet.Wallet, tic
46744674
err = vspClient.SetVoteChoice(ctx, ticketHash, choices, tspendPolicy, treasuryPolicy)
46754675
return err
46764676
}
4677-
var firstErr error
4677+
46784678
err := w.ForUnspentUnexpiredTickets(ctx, func(hash *chainhash.Hash) error {
46794679
vspHost, err := w.VSPHostForTicket(ctx, hash)
4680-
if err != nil && firstErr == nil {
4680+
if err != nil {
46814681
if errors.Is(err, errors.NotExist) {
46824682
// Ticket is not registered with a VSP, nothing more to do here.
46834683
return nil
46844684
}
4685-
firstErr = err
4686-
return nil
4685+
return err
46874686
}
46884687
vspClient, err := loader.LookupVSP(vspHost)
4689-
if err != nil && firstErr == nil {
4690-
firstErr = err
4691-
return nil
4688+
if err != nil {
4689+
return err
46924690
}
46934691
// Never return errors here, so all tickets are tried.
46944692
// The first error will be returned to the user.
46954693
err = vspClient.SetVoteChoice(ctx, hash, choices, tspendPolicy, treasuryPolicy)
4696-
if err != nil && firstErr == nil {
4697-
firstErr = err
4694+
if err != nil {
4695+
return err
46984696
}
46994697
return nil
47004698
})
4701-
if err != nil {
4702-
return err
4703-
}
4704-
return firstErr
4699+
return err
47054700
}
47064701

47074702
// signMessage signs the given message with the private key for the given

internal/rpc/rpcserver/server.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4311,22 +4311,25 @@ func (s *walletServer) SetVspdVoteChoices(ctx context.Context, req *pb.SetVspdVo
43114311
}
43124312

43134313
err = s.wallet.ForUnspentUnexpiredTickets(ctx, func(hash *chainhash.Hash) error {
4314-
// Skip errors here, but should we log at least?
43154314
choices, _, err := s.wallet.AgendaChoices(ctx, hash)
43164315
if err != nil {
4317-
return nil
4316+
return err
43184317
}
43194318
ticketHost, err := s.wallet.VSPHostForTicket(ctx, hash)
43204319
if err != nil {
43214320
return err
43224321
}
43234322
if ticketHost == vspHost {
4324-
_ = vspClient.SetVoteChoice(ctx, hash, choices, tSpendChoices, treasuryChoices)
4323+
err = vspClient.SetVoteChoice(ctx, hash, choices, tSpendChoices, treasuryChoices)
4324+
if err != nil {
4325+
return err
4326+
}
43254327
}
43264328
return nil
43274329
})
43284330
if err != nil {
4329-
return nil, status.Errorf(codes.Unknown, "ForUnspentUnexpiredTickets failed. Error: %v", err)
4331+
return nil, status.Errorf(codes.Unknown, "ForUnspentUnexpiredTickets failed. Error: %v",
4332+
err)
43304333
}
43314334

43324335
return &pb.SetVspdVoteChoicesResponse{}, nil

wallet/wallet.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5882,6 +5882,9 @@ func (w *Wallet) ForUnspentUnexpiredTickets(ctx context.Context,
58825882

58835883
params := w.ChainParams()
58845884

5885+
// Quietly collect any errors returned by f to ensure f is called on every
5886+
// ticket. All errors are returned to the caller at the end.
5887+
var errs []error
58855888
iter := func(ticketSummaries []*TicketSummary, _ *wire.BlockHeader) (bool, error) {
58865889
for _, ticketSummary := range ticketSummaries {
58875890
switch ticketSummary.Status {
@@ -5895,6 +5898,7 @@ func (w *Wallet) ForUnspentUnexpiredTickets(ctx context.Context,
58955898
ticketHash := *ticketSummary.Ticket.Hash
58965899
err := f(&ticketHash)
58975900
if err != nil {
5901+
errs = append(errs, err)
58985902
continue
58995903
}
59005904
}
@@ -5908,7 +5912,13 @@ func (w *Wallet) ForUnspentUnexpiredTickets(ctx context.Context,
59085912
int32(params.TicketExpiry+uint32(params.TicketMaturity)-requiredConfs)
59095913
startBlock := NewBlockIdentifierFromHeight(startBlockNum)
59105914
endBlock := NewBlockIdentifierFromHeight(blockHeight)
5911-
return w.GetTickets(ctx, iter, startBlock, endBlock)
5915+
5916+
err := w.GetTickets(ctx, iter, startBlock, endBlock)
5917+
if err != nil {
5918+
errs = append(errs, err)
5919+
}
5920+
5921+
return errors.Join(errs...)
59125922
}
59135923

59145924
// UnprocessedTickets returns the hash of every live/immature ticket in the
@@ -5940,6 +5950,9 @@ func (w *Wallet) UnprocessedTickets(ctx context.Context) ([]*chainhash.Hash, err
59405950
unmanagedTickets = append(unmanagedTickets, hash)
59415951
return nil
59425952
})
5953+
if err != nil {
5954+
return nil, err
5955+
}
59435956

5944-
return unmanagedTickets, err
5957+
return unmanagedTickets, nil
59455958
}

0 commit comments

Comments
 (0)