Skip to content

Commit 3b24398

Browse files
committed
fix(otel_processor): wait for runner process termination
1 parent 0fb4e6c commit 3b24398

File tree

3 files changed

+41
-6
lines changed

3 files changed

+41
-6
lines changed

apps/opentelemetry/src/otel_batch_processor.erl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,10 +367,15 @@ complete_exporting(Data) ->
367367
handed_off_table=undefined}}.
368368

369369
kill_runner(Data=#data{runner_pid=RunnerPid}) when RunnerPid =/= undefined ->
370+
Mon = erlang:monitor(process, RunnerPid),
370371
erlang:unlink(RunnerPid),
371372
erlang:exit(RunnerPid, kill),
372-
Data#data{runner_pid=undefined,
373-
handed_off_table=undefined}.
373+
%% Wait for the runner process termination to be sure that
374+
%% the export table is destroyed and can be safely recreated
375+
receive
376+
{'DOWN', Mon, process, RunnerPid, _} ->
377+
Data#data{runner_pid=undefined, handed_off_table=undefined}
378+
end.
374379

375380
new_export_table(Name) ->
376381
ets:new(Name, [public,

apps/opentelemetry/src/otel_simple_processor.erl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,15 @@ complete_exporting(Data=#data{current_from=From,
195195
[{reply, From, ok}]}.
196196

197197
kill_runner(Data=#data{runner_pid=RunnerPid}) when RunnerPid =/= undefined ->
198+
Mon = erlang:monitor(process, RunnerPid),
198199
erlang:unlink(RunnerPid),
199200
erlang:exit(RunnerPid, kill),
200-
Data#data{runner_pid=undefined,
201-
handed_off_table=undefined}.
201+
%% Wait for the runner process termination to be sure that
202+
%% the export table is destroyed and can be safely recreated
203+
receive
204+
{'DOWN', Mon, process, RunnerPid, _} ->
205+
Data#data{runner_pid=undefined, handed_off_table=undefined}
206+
end.
202207

203208
new_export_table(Name) ->
204209
ets:new(Name, [public,

apps/opentelemetry/test/otel_batch_processor_SUITE.erl

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010

1111
all() ->
1212
[exporting_timeout_test,
13-
check_table_size_test].
13+
check_table_size_test,
14+
exporting_runner_timeout_test].
1415

1516
%% verifies that after the runner has to be killed for taking too long
1617
%% that everything is still functional and the exporter does not crash
@@ -60,12 +61,36 @@ check_table_size_test(_Config) ->
6061
timer:sleep(CheckTableSizeMs * 10),
6162
true = otel_batch_processor:on_end(generate_span(), #{reg_name => RegName}).
6263

64+
exporting_runner_timeout_test(_Config) ->
65+
process_flag(trap_exit, true),
66+
67+
{ok, Pid, #{reg_name := RegName}} = otel_batch_processor:start_link(
68+
#{name => test_processor1,
69+
resource => otel_resource:create([]),
70+
exporter => ?MODULE,
71+
exporting_timeout_ms => 1,
72+
scheduled_delay_ms => 1}),
73+
74+
%% Insert a few spans to make sure runner process will be spawned and killed
75+
%% because it hangs for 10 minutes (see export/4 below)
76+
true = otel_batch_processor:on_end(generate_span(), #{reg_name => RegName}),
77+
true = otel_batch_processor:on_end(generate_span(), #{reg_name => RegName}),
78+
79+
receive
80+
{'EXIT', Pid, _} ->
81+
%% test is to ensure we don't hit this
82+
ct:fail(batch_processor_crash)
83+
after
84+
200 ->
85+
ok
86+
end.
87+
6388
%% exporter behaviour
6489

6590
init(_) ->
6691
{ok, []}.
6792

68-
export(_, _) ->
93+
export(_, _, _, _) ->
6994
timer:sleep(timer:minutes(10)).
7095

7196
shutdown(_) ->

0 commit comments

Comments
 (0)