@@ -260,28 +260,36 @@ func (app *ApiServer) relay(c *fiber.Ctx) error {
260260}
261261
262262func (app * ApiServer ) handleRelay (ctx context.Context , logger * zap.Logger , decodedTx * v1.ManageEntityLegacy ) (* v1.Transaction , error ) {
263- // submit tx to core via randomly selected OpenAudio endpoint
264- client , endpoint := app .openAudioPool .Get ()
265- if client == nil {
263+ allClients := app .openAudioPool .GetAll ()
264+ if len (allClients ) == 0 {
266265 logger .Error ("no OpenAudio clients configured" )
267266 return nil , fmt .Errorf ("no OpenAudio clients configured" )
268267 }
269- logger = logger .With (zap .String ("openaudio_endpoint" , endpoint ))
270- res , err := client .Core .SendTransaction (ctx , connect .NewRequest (& v1.SendTransactionRequest {
271- Transaction : & v1.SignedTransaction {
272- Transaction : & v1.SignedTransaction_ManageEntity {
273- ManageEntity : decodedTx ,
268+
269+ var lastErr error
270+ for i , clientInfo := range allClients {
271+ endpointLogger := logger .With (zap .String ("openaudio_endpoint" , clientInfo .Endpoint ), zap .Int ("attempt" , i + 1 ))
272+ res , err := clientInfo .Client .Core .SendTransaction (ctx , connect .NewRequest (& v1.SendTransactionRequest {
273+ Transaction : & v1.SignedTransaction {
274+ Transaction : & v1.SignedTransaction_ManageEntity {
275+ ManageEntity : decodedTx ,
276+ },
274277 },
275- },
276- }))
277- if err != nil {
278- logger .Error ("error sending transaction" , zap .Error (err ))
279- return nil , err
278+ }))
279+
280+ if err != nil {
281+ lastErr = err
282+ endpointLogger .Warn ("transaction failed, trying next" , zap .Error (err ))
283+ continue
284+ }
285+
286+ msg := res .Msg .Transaction
287+ endpointLogger .Info ("transaction confirmed" , zap .String ("hash" , msg .GetHash ()))
288+ return msg , nil
280289 }
281290
282- msg := res .Msg .Transaction
283- logger .Info ("transaction confirmed" , zap .String ("hash" , msg .GetHash ()))
284- return msg , nil
291+ logger .Error ("all OpenAudio endpoints failed" , zap .Error (lastErr ))
292+ return nil , fmt .Errorf ("all endpoints failed, last error: %w" , lastErr )
285293}
286294
287295func transactionToReceipt (tx * v1.Transaction , wallet string ) map [string ]interface {} {
0 commit comments