Skip to content

Commit ab843ef

Browse files
authored
Retry on wrong hypersync instance response (#388)
* Retry on wrong hypersync instance response * Log info instead of warn
1 parent 4133be6 commit ab843ef

File tree

3 files changed

+33
-13
lines changed

3 files changed

+33
-13
lines changed

codegenerator/cli/templates/static/codegen/src/Time.res

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
let resolvePromiseAfterDelay = (~delayMilliseconds) => Utils.delay(delayMilliseconds)
22

33
let rec retryAsyncWithExponentialBackOff = async (
4-
~backOffMillis=1000,
5-
~multiplicative=2,
4+
~backOffMillis=100,
5+
~multiplicative=4,
66
~retryCount=0,
77
~maxRetries=5,
88
~logger: option<Pino.t>=None,

codegenerator/cli/templates/static/codegen/src/eventFetching/hyperfuel/HyperFuel.res

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ module LogsQuery = {
9090
{
9191
fromBlock,
9292
toBlockExclusive: ?switch toBlockInclusive {
93-
| Some(toBlockInclusive) => Some(toBlockInclusive + 1)
94-
| None => None
93+
| Some(toBlockInclusive) => Some(toBlockInclusive + 1)
94+
| None => None
9595
},
9696
receipts: recieptsSelection,
9797
fieldSelection: {
@@ -109,7 +109,7 @@ module LogsQuery = {
109109
Amount,
110110
ToAddress,
111111
AssetId,
112-
To
112+
To,
113113
],
114114
block: [Id, Height, Time],
115115
},
@@ -201,7 +201,16 @@ module LogsQuery = {
201201
~params={"type": "hypersync query", "fromBlock": fromBlock, "serverUrl": serverUrl},
202202
)
203203

204-
let executeQuery = () => hyperFuelClient->HyperFuelClient.getSelectedData(query)
204+
let executeQuery = async () => {
205+
let res = await hyperFuelClient->HyperFuelClient.getSelectedData(query)
206+
if res.nextBlock <= fromBlock {
207+
// Might happen when /height response was from another instance of HyperSync
208+
Js.Exn.raiseError(
209+
"Received page response from another instance of HyperFuel. Should work after a retry.",
210+
)
211+
}
212+
res
213+
}
205214

206215
let res = await executeQuery->Time.retryAsyncWithExponentialBackOff(~logger=Some(logger))
207216

@@ -261,10 +270,11 @@ module BlockData = {
261270
// If the block is not found, retry the query. This can occur since replicas of hypersync might not hack caught up yet
262271
if res.nextBlock <= blockNumber {
263272
let logger = Logging.createChild(~params={"url": serverUrl})
264-
logger->Logging.childWarn(
265-
`Block #${blockNumber->Int.toString} not found in hypersync. HyperSync runs multiple instances of hypersync and it is possible that they drift independently slightly from the head. Retrying query in 100ms.`,
273+
let delayMilliseconds = 100
274+
logger->Logging.childInfo(
275+
`Block #${blockNumber->Int.toString} not found in HyperFuel. HyperFuel has multiple instances and it's possible that they drift independently slightly from the head. Indexing should continue correctly after retrying the query in ${delayMilliseconds->Int.toString}ms.`,
266276
)
267-
await Time.resolvePromiseAfterDelay(~delayMilliseconds=100)
277+
await Time.resolvePromiseAfterDelay(~delayMilliseconds)
268278
await queryBlockData(~serverUrl, ~blockNumber, ~logger)
269279
} else {
270280
res->convertResponse

codegenerator/cli/templates/static/codegen/src/eventFetching/hypersync/HyperSync.res

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,16 @@ module LogsQuery = {
181181
~fieldSelection,
182182
)
183183

184-
let executeQuery = () => client.getEvents(~query)
184+
let executeQuery = async () => {
185+
let res = await client.getEvents(~query)
186+
if res.nextBlock <= fromBlock {
187+
// Might happen when /height response was from another instance of HyperSync
188+
Js.Exn.raiseError(
189+
"Received page response from another instance of HyperSync. Should work after a retry.",
190+
)
191+
}
192+
res
193+
}
185194

186195
let res = await executeQuery->Time.retryAsyncWithExponentialBackOff(~logger=Some(logger))
187196

@@ -305,10 +314,11 @@ module BlockData = {
305314
switch maybeSuccessfulRes {
306315
| None => {
307316
let logger = Logging.createChild(~params={"url": serverUrl})
308-
logger->Logging.childWarn(
309-
`Block #${blockNumber->Int.toString} not found in hypersync. HyperSync runs multiple instances of hypersync and it is possible that they drift independently slightly from the head. Retrying query in 100ms.`,
317+
let delayMilliseconds = 100
318+
logger->Logging.childInfo(
319+
`Block #${blockNumber->Int.toString} not found in HyperSync. HyperSync has multiple instances and it's possible that they drift independently slightly from the head. Indexing should continue correctly after retrying the query in ${delayMilliseconds->Int.toString}ms.`,
310320
)
311-
await Time.resolvePromiseAfterDelay(~delayMilliseconds=100)
321+
await Time.resolvePromiseAfterDelay(~delayMilliseconds)
312322
await queryBlockData(~serverUrl, ~blockNumber, ~logger)
313323
}
314324
| Some(res) => res->convertResponse->Result.map(res => res->Array.get(0))

0 commit comments

Comments
 (0)