Skip to content

Commit c1b2b78

Browse files
authored
Merge pull request #602 from permaweb/fix/parallel_requests
Fix parallel requests
2 parents 967396a + 9af8ef0 commit c1b2b78

File tree

2 files changed

+71
-3
lines changed

2 files changed

+71
-3
lines changed

src/hb_http.erl

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,3 +1254,58 @@ index_request_test() ->
12541254
#{}
12551255
),
12561256
?assertEqual(<<"i like dogs!">>, hb_ao:get(<<"body">>, Res, #{})).
1257+
1258+
%% Test parallel requests
1259+
parallel_request_test() ->
1260+
Routes = [
1261+
#{
1262+
% Routes for GraphQL requests to use a remote GraphQL API.
1263+
<<"template">> => <<"/graphql">>,
1264+
<<"parallel">> => true,
1265+
<<"nodes">> =>
1266+
[
1267+
#{
1268+
<<"prefix">> => <<"https://ao-search-gateway.goldsky.com">>,
1269+
<<"opts">> => #{ http_client => httpc, protocol => http2 }
1270+
},
1271+
#{
1272+
<<"prefix">> => <<"https://arweave-search.goldsky.com">>,
1273+
<<"opts">> => #{ http_client => httpc, protocol => http2 }
1274+
},
1275+
#{
1276+
<<"prefix">> => <<"https://arweave.net">>,
1277+
<<"opts">> => #{ http_client => gun, protocol => http2 }
1278+
}
1279+
]
1280+
},
1281+
#{
1282+
% Routes for raw data requests to use a remote gateway.
1283+
<<"template">> => <<"/raw">>,
1284+
<<"node">> =>
1285+
#{
1286+
<<"prefix">> => <<"https://arweave.net">>,
1287+
<<"opts">> => #{ http_client => gun, protocol => http2 }
1288+
}
1289+
}
1290+
],
1291+
Store = [
1292+
hb_test_utils:test_store(),
1293+
#{
1294+
<<"store-module">> => hb_store_gateway,
1295+
%% Routes need to be defined in the store, otherwise the code
1296+
%% will fetch the hb_opts:default_message which doesn't have
1297+
%% parallel property.
1298+
<<"routes">> => Routes
1299+
}
1300+
],
1301+
hb_store:reset(Store),
1302+
Opts = #{ store => Store },
1303+
Node = hb_http_server:start_node(Opts),
1304+
?assertMatch(
1305+
{ok, #{<<"data">> := <<"1984">>}},
1306+
hb_http:get(
1307+
Node,
1308+
#{<<"path">> => <<"/BOogk_XAI3bvNWnxNxwxmvOfglZt17o4MOVAdPNZ_ew">>},
1309+
Opts
1310+
)
1311+
).

src/hb_http_multi.erl

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,21 +230,34 @@ admissible_response(Response, Msg, Opts) ->
230230
?event(debug_multi,
231231
{executing_admissible_message, {message, Base}, {req, Req}}
232232
),
233-
case hb_ao:resolve(Base, Req, Opts) of
233+
try hb_ao:resolve(Base, Req, Opts) of
234234
{ok, Res} when is_atom(Res) or is_binary(Res) ->
235235
?event(debug_multi, {admissible_result, {result, Res}}),
236236
hb_util:atom(Res) == true;
237237
{error, Reason} ->
238238
?event(debug_multi, {admissible_error, {reason, Reason}}),
239239
false
240+
catch
241+
Class:Reason:Stacktrace ->
242+
?event(error,
243+
{admissible_response,
244+
{class, Class},
245+
{reason, Reason},
246+
{stacktrace, Stacktrace}
247+
}
248+
),
249+
false
240250
end.
241251

242252
%% @doc Collect the necessary number of responses, and stop workers if
243253
%% configured to do so.
254+
parallel_responses(Res, [], Ref, _Awaiting, _StopAfter, _Admissible, _Statuses, _Opts) ->
255+
empty_inbox(Ref),
256+
Res;
244257
parallel_responses(Res, Procs, Ref, 0, false, _Admissible, _Statuses, _Opts) ->
245258
lists:foreach(fun(P) -> P ! no_reply end, Procs),
246259
empty_inbox(Ref),
247-
{ok, Res};
260+
Res;
248261
parallel_responses(Res, Procs, Ref, 0, true, _Admissible, _Statuses, _Opts) ->
249262
lists:foreach(fun(P) -> exit(P, kill) end, Procs),
250263
empty_inbox(Ref),
@@ -255,7 +268,7 @@ parallel_responses(Res, Procs, Ref, Awaiting, StopAfter, Admissible, Statuses, O
255268
case is_admissible(Status, NewRes, Admissible, Statuses, Opts) of
256269
true ->
257270
parallel_responses(
258-
[NewRes | Res],
271+
[{Status, NewRes} | Res],
259272
lists:delete(Pid, Procs),
260273
Ref,
261274
Awaiting - 1,

0 commit comments

Comments
 (0)