diff --git a/protocol/rpcconsumer/rpcconsumer_server.go b/protocol/rpcconsumer/rpcconsumer_server.go index c301e30764..9005ff0ac1 100644 --- a/protocol/rpcconsumer/rpcconsumer_server.go +++ b/protocol/rpcconsumer/rpcconsumer_server.go @@ -445,6 +445,21 @@ func (rpccs *RPCConsumerServer) ProcessRelaySend(ctx context.Context, protocolMe if rpccs.debugRelays { utils.LavaFormatDebug("Relay initiated with the following timeout schedule", utils.LogAttr("processingTimeout", processingTimeout), utils.LogAttr("newRelayTimeout", relayTimeout)) } + + apiName := protocolMessage.GetApi().Name + resetUsedOnce := true + setArchiveOnSpecialApi := func() { + if apiName == "tx" || apiName == "chunk" || apiName == "EXPERIMENTAL_tx_status" { + archiveExtensionArray := []string{"archive"} + protocolMessage.OverrideExtensions(archiveExtensionArray, rpccs.chainParser.ExtensionsParser()) + protocolMessage.RelayPrivateData().Extensions = archiveExtensionArray + if resetUsedOnce { + resetUsedOnce = false + relayProcessor.usedProviders = lavasession.NewUsedProviders(protocolMessage) + } + } + } + // create the processing timeout prior to entering the method so it wont reset every time processingCtx, processingCtxCancel := context.WithTimeout(ctx, processingTimeout) defer processingCtxCancel() @@ -456,6 +471,7 @@ func (rpccs *RPCConsumerServer) ProcessRelaySend(ctx context.Context, protocolMe if relayProcessor.HasRequiredNodeResults() { gotResults <- true } else { + setArchiveOnSpecialApi() gotResults <- false } } @@ -504,6 +520,7 @@ func (rpccs *RPCConsumerServer) ProcessRelaySend(ctx context.Context, protocolMe case <-startNewBatchTicker.C: // only trigger another batch for non BestResult relays or if we didn't pass the retry limit. if relayProcessor.ShouldRetry(numberOfRetriesLaunched) { + setArchiveOnSpecialApi() // limit the number of retries called from the new batch ticker flow. // if we pass the limit we just wait for the relays we sent to return. err := rpccs.sendRelayToProvider(processingCtx, protocolMessage, relayProcessor, nil)