From ea2520ee2add65218102be364253862eda44f885 Mon Sep 17 00:00:00 2001 From: dwasse Date: Fri, 5 Jul 2024 23:18:35 -0500 Subject: [PATCH] RFQ Quoter: generate quotes in parallel (#2847) --- services/rfq/relayer/quoter/quoter.go | 39 ++++++++++++++++++--------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/services/rfq/relayer/quoter/quoter.go b/services/rfq/relayer/quoter/quoter.go index b607e2c2c6..a9d6c32ffe 100644 --- a/services/rfq/relayer/quoter/quoter.go +++ b/services/rfq/relayer/quoter/quoter.go @@ -8,6 +8,7 @@ import ( "math/big" "strconv" "strings" + "sync" "sync/atomic" "github.com/synapsecns/sanguine/contrib/screener-api/client" @@ -324,26 +325,40 @@ func (m *Manager) generateQuotes(parentCtx context.Context, chainID int, address if err != nil { return nil, fmt.Errorf("error getting destination RFQ address: %w", err) } - destTokenID := fmt.Sprintf("%d-%s", chainID, address.Hex()) + + // generate quotes in parallel + g, gctx := errgroup.WithContext(ctx) + quoteMtx := &sync.Mutex{} quotes = []model.PutQuoteRequest{} - for keyTokenID, itemTokenIDs := range m.quotableTokens { + for k, itemTokenIDs := range m.quotableTokens { for _, tokenID := range itemTokenIDs { //nolint:nestif if tokenID == destTokenID { - quote, quoteErr := m.generateQuote(ctx, keyTokenID, chainID, address, balance, destRFQAddr) - if quoteErr != nil { - // continue generating quotes even if one fails - span.AddEvent("error generating quote", trace.WithAttributes( - attribute.String("key_token_id", keyTokenID), - attribute.String("error", quoteErr.Error()), - )) - continue - } - quotes = append(quotes, *quote) + keyTokenID := k + g.Go(func() error { + quote, quoteErr := m.generateQuote(gctx, keyTokenID, chainID, address, balance, destRFQAddr) + if quoteErr != nil { + // continue generating quotes even if one fails + span.AddEvent("error generating quote", trace.WithAttributes( + attribute.String("key_token_id", keyTokenID), + attribute.String("error", quoteErr.Error()), + )) + return nil + } + quoteMtx.Lock() + defer quoteMtx.Unlock() + quotes = append(quotes, *quote) + return nil + }) } } } + err = g.Wait() + if err != nil { + return nil, fmt.Errorf("error generating quotes: %w", err) + } + m.currentQuotes = quotes return quotes, nil }