Skip to content

Commit dcdaf0e

Browse files
Try other endpoints in relay (#619)
1 parent df86266 commit dcdaf0e

2 files changed

Lines changed: 47 additions & 16 deletions

File tree

api/open_audio_pool.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,26 @@ func (p *OpenAudioPool) Get() (*sdk.OpenAudioSDK, string) {
3232
i := rand.Intn(len(p.clients))
3333
return p.clients[i], p.endpoints[i]
3434
}
35+
36+
func (p *OpenAudioPool) GetAll() []struct {
37+
Client *sdk.OpenAudioSDK
38+
Endpoint string
39+
} {
40+
result := make([]struct {
41+
Client *sdk.OpenAudioSDK
42+
Endpoint string
43+
}, 0, len(p.clients))
44+
for i, client := range p.clients {
45+
result = append(result, struct {
46+
Client *sdk.OpenAudioSDK
47+
Endpoint string
48+
}{
49+
Client: client,
50+
Endpoint: p.endpoints[i],
51+
})
52+
}
53+
rand.Shuffle(len(result), func(i, j int) {
54+
result[i], result[j] = result[j], result[i]
55+
})
56+
return result
57+
}

api/relay.go

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -260,28 +260,36 @@ func (app *ApiServer) relay(c *fiber.Ctx) error {
260260
}
261261

262262
func (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

287295
func transactionToReceipt(tx *v1.Transaction, wallet string) map[string]interface{} {

0 commit comments

Comments
 (0)