diff options
author | Loïc Hoguin <[email protected]> | 2024-01-18 14:46:37 +0100 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2024-01-18 14:46:37 +0100 |
commit | 395618eb84cada02875670aec6c3e8f9d923b1f8 (patch) | |
tree | ad5754754190e1c8149c16609a33be6621b7a0f5 | |
parent | 14b96873cf3a9afedeb11f087c5d49f2139665a4 (diff) | |
download | ct_helper-395618eb84cada02875670aec6c3e8f9d923b1f8.tar.gz ct_helper-395618eb84cada02875670aec6c3e8f9d923b1f8.tar.bz2 ct_helper-395618eb84cada02875670aec6c3e8f9d923b1f8.zip |
Sometimes the function would find two pids instead of one,
likely due to timing issues related to reusing port numbers.
In these cases we retry up to 5 times with a short timeout
in between.
-rw-r--r-- | src/ct_helper.erl | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/ct_helper.erl b/src/ct_helper.erl index 5659f47..3723095 100644 --- a/src/ct_helper.erl +++ b/src/ct_helper.erl @@ -129,14 +129,26 @@ get_parent_pid(Pid) -> get_remote_pid_tcp(Socket) when is_port(Socket) -> get_remote_pid_tcp(inet:sockname(Socket)); get_remote_pid_tcp(SockName) -> + get_remote_pid_tcp(SockName, 5). + +get_remote_pid_tcp(SockName, 0) -> + AllPorts = [{P, erlang:port_info(P), (catch inet:peername(P))} || P <- erlang:ports()], + error({missing_or_duplicate_ports, SockName, AllPorts}); +get_remote_pid_tcp(SockName, Attempts) -> AllPorts = [{P, erlang:port_info(P)} || P <- erlang:ports()], - [Pid] = [ + Result = [ proplists:get_value(connected, I) || {P, I} <- AllPorts, I =/= undefined, proplists:get_value(name, I) =:= "tcp_inet", inet:peername(P) =:= SockName], - Pid. + case Result of + [Pid] -> + Pid; + _ -> + timer:sleep(10), + get_remote_pid_tcp(SockName, Attempts - 1) + end. %% @doc Find the pid of the remote end of a TLS socket. %% |