Skip to content

Commit

Permalink
webapi: Wait for unknown outputs to propagate.
Browse files Browse the repository at this point in the history
If broadcasting parent transaction of a ticket fails because it
references unknown outputs, there is a good chance that waiting a few
seconds will resolve the issue because the ancestor transactions will
propagate through the network and reach the mempool of the local dcrd
instance.
  • Loading branch information
jholdstock committed Nov 8, 2023
1 parent 9ee95f9 commit 34cd9d2
Showing 1 changed file with 31 additions and 4 deletions.
35 changes: 31 additions & 4 deletions internal/webapi/middleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,10 +275,37 @@ func (w *WebAPI) broadcastTicket(c *gin.Context) {
w.log.Debugf("%s: Broadcasting parent tx %s (ticketHash=%s)", funcName, parentHash, request.TicketHash)
err = dcrdClient.SendRawTransaction(request.ParentHex)
if err != nil {
w.log.Errorf("%s: dcrd.SendRawTransaction for parent tx failed (ticketHash=%s): %v",
funcName, request.TicketHash, err)
w.sendError(types.ErrCannotBroadcastTicket, c)
return
// Unknown output errors have special handling because they
// could be resolved by waiting for network propagation. Any
// other errors are returned to client immediately.
if !strings.Contains(err.Error(), rpc.ErrUnknownOutputs) {
w.log.Errorf("%s: dcrd.SendRawTransaction for parent tx failed (ticketHash=%s): %v",
funcName, request.TicketHash, err)
w.sendError(types.ErrCannotBroadcastTicket, c)
return
}

w.log.Debugf("%s: Parent tx references an unknown output, waiting for it in mempool (ticketHash=%s)",
funcName, request.TicketHash)

txBroadcast := func() bool {
// Wait for 1 second and try again, max 7 attempts.
for i := 0; i < 7; i++ {
time.Sleep(1 * time.Second)
err := dcrdClient.SendRawTransaction(request.ParentHex)
if err == nil {
return true
}
}
return false
}()

if !txBroadcast {
w.log.Errorf("%s: Failed to broadcast parent tx, waiting didn't help (ticketHash=%s)",
funcName, request.TicketHash)
w.sendError(types.ErrCannotBroadcastTicket, c)
return
}
}

} else {
Expand Down

0 comments on commit 34cd9d2

Please sign in to comment.