Ping - any opinions on that? If not, is anyone still interested in
benchmarks/tsung at all?

On 5/25/25 2:58 PM, Volker Schlecht wrote:
benchmarks/tsung currently suffers from a number of compilation
and runtime errors when compiling/running on OTP versions > 25

All that is needed to fix that, has been documented in a number
of issues, and pull requests, but it appears that there isn't a
lot of drive left in the project (and possibly its user base)
anymore.

I've applied the already proposed changes and filled the gaps
with a few patches of my own, and the result passes tests (save
one test, which has always been failing on OpenBSD).

While at first glance it appears the some of the patches disable
SSL verification, those are just reinstating the behavior that
tsung always had: Erlang changed the default behavior for SSL
connections from not-verifying to verifying, and tsung leans on the
old default.

Not nice, but also nothing new ... changing it without breaking
existing setups is beyond the length I want to invest in this
port :-)

With these changes, we could move tsung to use MODERL_DEFAULT_VERSION
and get rid of erlang/25 and erlang/26 eventually.

Thoughts? Opinions?
Index: Makefile
===================================================================
RCS file: /cvs/ports/benchmarks/tsung/Makefile,v
retrieving revision 1.24
diff -u -p -r1.24 Makefile
--- Makefile	21 Dec 2024 11:37:34 -0000	1.24
+++ Makefile	25 May 2025 12:35:27 -0000
@@ -3,8 +3,8 @@ COMMENT=	multi-protocol distributed load
 V=		1.8.0
 GH_ACCOUNT=	processone
 GH_PROJECT=	tsung
-GH_TAGNAME=	v${V}
-REVISION=	2
+GH_COMMIT=	4b4e1e86f33d4a17641a60b26c0d1cab1f1953b0
+DISTNAME=	${GH_PROJECT}-${V}.20241119
 
 CATEGORIES=	benchmarks net
 
@@ -13,7 +13,6 @@ PERMIT_PACKAGE=	Yes
 
 MODULES=		lang/erlang \
 			lang/python
-MODERL_VERSION=		25
 MODPY_BUILDDEP= 	No
 
 RUN_DEPENDS=		graphics/py-matplotlib \
Index: distinfo
===================================================================
RCS file: /cvs/ports/benchmarks/tsung/distinfo,v
retrieving revision 1.4
diff -u -p -r1.4 distinfo
--- distinfo	10 Apr 2023 16:42:34 -0000	1.4
+++ distinfo	25 May 2025 12:35:27 -0000
@@ -1,2 +1,2 @@
-SHA256 (tsung-1.8.0.tar.gz) = bFXfSLgvGF39YK5yceCbvCXGyLxWi7i/wM2wVtd8OJk=
-SIZE (tsung-1.8.0.tar.gz) = 972168
+SHA256 (tsung-1.8.0.20241119-4b4e1e86.tar.gz) = RsutGDTECwG8E/7XgL6Q8I2E+pGS8cW9IXW22sAsX50=
+SIZE (tsung-1.8.0.20241119-4b4e1e86.tar.gz) = 973993
Index: patches/patch-src_lib_websocket_erl
===================================================================
RCS file: patches/patch-src_lib_websocket_erl
diff -N patches/patch-src_lib_websocket_erl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_lib_websocket_erl	25 May 2025 12:35:27 -0000
@@ -0,0 +1,13 @@
+Doesn't run, and seeding isn't needed here anyway
+
+Index: src/lib/websocket.erl
+--- src/lib/websocket.erl.orig
++++ src/lib/websocket.erl
+@@ -131,7 +131,6 @@ decode(Data) ->
+ %%% Internal functions
+ %%%===================================================================
+ gen_accept_key() ->
+-    rand:seed(erlang:now()),
+     Key = crypto:strong_rand_bytes(16),
+     KeyStr = base64:encode_to_string(Key),
+     Accept = binary:list_to_bin(KeyStr ++ "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"),
Index: patches/patch-src_test_ts_test_config_erl
===================================================================
RCS file: patches/patch-src_test_ts_test_config_erl
diff -N patches/patch-src_test_ts_test_config_erl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_test_ts_test_config_erl	25 May 2025 12:35:27 -0000
@@ -0,0 +1,12 @@
+Index: src/test/ts_test_config.erl
+--- src/test/ts_test_config.erl.orig
++++ src/test/ts_test_config.erl
+@@ -122,7 +122,7 @@ config_thinktime2_test() ->
+     receive
+         {timeout,Ref2,end_thinktime} -> ok
+     end,
+-    rand:seed(), % reinit seed for others tests
++    rand:seed(default), % reinit seed for others tests
+     ?assertMatch({random,1000}, Req).
+ 
+ read_config_tag_noexclusion_test() ->
Index: patches/patch-src_tsung_recorder_ts_proxy_http_erl
===================================================================
RCS file: patches/patch-src_tsung_recorder_ts_proxy_http_erl
diff -N patches/patch-src_tsung_recorder_ts_proxy_http_erl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_tsung_recorder_ts_proxy_http_erl	25 May 2025 12:35:27 -0000
@@ -0,0 +1,12 @@
+Index: src/tsung_recorder/ts_proxy_http.erl
+--- src/tsung_recorder/ts_proxy_http.erl.orig
++++ src/tsung_recorder/ts_proxy_http.erl
+@@ -260,7 +260,7 @@ connect(Scheme, Host, Port)->
+     case Scheme of
+         https ->
+             {ok, _} = ssl:connect(Host,Port,
+-                                 [{active, once}]);
++                                 [{active, once}] ++ [{verify, verify_none}]);
+         _  ->
+             {ok, _} = gen_tcp:connect(Host,Port,
+                                       [{active, once},
Index: patches/patch-src_tsung_ts_bosh_erl
===================================================================
RCS file: patches/patch-src_tsung_ts_bosh_erl
diff -N patches/patch-src_tsung_ts_bosh_erl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_tsung_ts_bosh_erl	25 May 2025 12:35:27 -0000
@@ -0,0 +1,12 @@
+Index: src/tsung/ts_bosh.erl
+--- src/tsung/ts_bosh.erl.orig
++++ src/tsung/ts_bosh.erl
+@@ -563,7 +563,7 @@ socket_connect(ssl, Host, Port, Options, Timeout) ->
+ %    {ok, S} = gen_tcp:connect(Host, Port, [{active, false}|ForConnection], Timeout),
+ %    ssl:connect(S, ForSSL, Timeout).
+ %   ?LOGF("Connect ~p", [ForSSL], ?ERR),
+-     ssl:connect(Host, Port, [{ssl_imp, new}|Options], Timeout).
++     ssl:connect(Host, Port, [{ssl_imp, new}|Options] ++ [{verify, verify_none}], Timeout).
+ 
+ 
+ socket_send(tcp, Socket, Data) ->
Index: patches/patch-src_tsung_ts_digest_erl
===================================================================
RCS file: patches/patch-src_tsung_ts_digest_erl
diff -N patches/patch-src_tsung_ts_digest_erl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_tsung_ts_digest_erl	25 May 2025 12:35:27 -0000
@@ -0,0 +1,19 @@
+Index: src/tsung/ts_digest.erl
+--- src/tsung/ts_digest.erl.orig
++++ src/tsung/ts_digest.erl
+@@ -72,13 +72,13 @@ shahex(Clear) ->
+ %%%----------------------------------------------------------------------
+ tohex(A)->
+     Fun = fun(X)->
+-                  ts_utils:to_lower(padhex(httpd_util:integer_to_hexlist(X)))
++                  ts_utils:to_lower(padhex(erlang:integer_to_list(X,16)))
+           end,
+     lists:flatten( lists:map(Fun, A) ).
+ 
+ %%%----------------------------------------------------------------------
+ %%% Func: padhex/1
+-%%% Purpose: needed because httpd_util:integer_to_hexlist returns hex
++%%% Purpose: needed because httpd_util:integer_to_list(X,16) returns hex
+ %%%    values <10 as only 1 character, ie. "0F" is simply returned as
+ %%%    "F". For our digest, we need these leading zeros to be present.
+ %%% ----------------------------------------------------------------------
Index: patches/patch-src_tsung_ts_http_common_erl
===================================================================
RCS file: patches/patch-src_tsung_ts_http_common_erl
diff -N patches/patch-src_tsung_ts_http_common_erl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_tsung_ts_http_common_erl	25 May 2025 12:35:27 -0000
@@ -0,0 +1,12 @@
+Index: src/tsung/ts_http_common.erl
+--- src/tsung/ts_http_common.erl.orig
++++ src/tsung/ts_http_common.erl
+@@ -405,7 +405,7 @@ parse_chunked(Body, State)->
+ %%----------------------------------------------------------------------
+ read_chunk(<<>>, State, Int, Acc) ->
+     ?LOGF("No data in chunk [Int=~p, Acc=~p] ~n", [Int,Acc],?INFO),
+-    AccInt = list_to_binary(httpd_util:integer_to_hexlist(Int)),
++    AccInt = list_to_binary(erlang:integer_to_list(Int, 16)),
+     { State#state_rcv{acc = AccInt, ack_done = false }, [] }; % read more data
+ %% this code has been inspired by inets/http_lib.erl
+ %% Extensions not implemented
Index: patches/patch-src_tsung_ts_http_erl
===================================================================
RCS file: patches/patch-src_tsung_ts_http_erl
diff -N patches/patch-src_tsung_ts_http_erl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_tsung_ts_http_erl	25 May 2025 12:35:27 -0000
@@ -0,0 +1,12 @@
+Index: src/tsung/ts_http.erl
+--- src/tsung/ts_http.erl.orig
++++ src/tsung/ts_http.erl
+@@ -315,7 +315,7 @@ decode_chunk_size(<<Head:2/binary, Data/binary >>, Hea
+     ?Debug("decode chunk: crlf, no digit"),
+     decode_chunk_size(Data, Headers, Body, <<>>);
+ decode_chunk_size(<<Head:2/binary, Data/binary >>, Headers, Body,Digits) when Head ==  << "\r\n" >> ->
+-    case httpd_util:hexlist_to_integer(binary_to_list(Digits)) of
++    case erlang:list_to_integer(binary_to_list(Digits), 16) of
+         0 ->
+             decode_chunk_size(Data, Headers, Body ,<<>>);
+         Size ->
Index: patches/patch-src_tsung_ts_server_websocket_ssl_erl
===================================================================
RCS file: patches/patch-src_tsung_ts_server_websocket_ssl_erl
diff -N patches/patch-src_tsung_ts_server_websocket_ssl_erl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_tsung_ts_server_websocket_ssl_erl	25 May 2025 12:35:27 -0000
@@ -0,0 +1,12 @@
+Index: src/tsung/ts_server_websocket_ssl.erl
+--- src/tsung/ts_server_websocket_ssl.erl.orig
++++ src/tsung/ts_server_websocket_ssl.erl
+@@ -60,7 +60,7 @@ connect(Host, Port, Opts, Timeout) ->
+     Protocol = WSConfig#ws_config.subprotos,
+     Origin = WSConfig#ws_config.origin,
+ 
+-    case ssl:connect(Host, Port, opts_to_tcp_opts(TcpOpts),Timeout) of
++    case ssl:connect(Host, Port, opts_to_tcp_opts(TcpOpts) ++ [{verify, verify_none}],Timeout) of
+         {ok, Socket} ->
+             Pid = spawn_link(
+                     fun() ->
Index: patches/patch-src_tsung_ts_ssl6_erl
===================================================================
RCS file: patches/patch-src_tsung_ts_ssl6_erl
diff -N patches/patch-src_tsung_ts_ssl6_erl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_tsung_ts_ssl6_erl	25 May 2025 12:35:27 -0000
@@ -0,0 +1,16 @@
+Index: src/tsung/ts_ssl6.erl
+--- src/tsung/ts_ssl6.erl.orig
++++ src/tsung/ts_ssl6.erl
+@@ -42,10 +42,10 @@ connect(Host, Port, Opts) when is_list(Host) ->
+     connect(Host, Port, Opts, infinity);
+ 
+ connect(Socket, Opts, ConnectTimeout) ->
+-    ssl:connect(Socket, Opts, ConnectTimeout).
++    ssl:connect(Socket, Opts ++ [{verify, verify_none}], ConnectTimeout).
+ 
+ connect(Host, Port, Opts, ConnectTimeout) ->
+-    ssl:connect(Host, Port, Opts, ConnectTimeout).
++    ssl:connect(Host, Port, Opts ++ [{verify, verify_none}], ConnectTimeout).
+ 
+ connect(Socket, Opts) ->
+     connect(Socket, Opts, infinity).
Index: patches/patch-src_tsung_ts_ssl_erl
===================================================================
RCS file: patches/patch-src_tsung_ts_ssl_erl
diff -N patches/patch-src_tsung_ts_ssl_erl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_tsung_ts_ssl_erl	25 May 2025 12:35:27 -0000
@@ -0,0 +1,16 @@
+Index: src/tsung/ts_ssl.erl
+--- src/tsung/ts_ssl.erl.orig
++++ src/tsung/ts_ssl.erl
+@@ -37,10 +37,10 @@ connect(Host, Port, Opts) when is_list(Host) ->
+     connect(Host, Port, opts_to_tcp_opts(Opts), infinity);
+ 
+ connect(Socket, Opts, ConnectTimeout) ->
+-    ssl:connect(Socket, opts_to_tcp_opts(Opts), ConnectTimeout).
++    ssl:connect(Socket, opts_to_tcp_opts(Opts) ++ [{verify, verify_none}], ConnectTimeout).
+ 
+ connect(Host, Port, Opts, ConnectTimeout) ->
+-    ssl:connect(Host, Port, opts_to_tcp_opts(Opts), ConnectTimeout).
++    ssl:connect(Host, Port, opts_to_tcp_opts(Opts) ++ [{verify, verify_none}], ConnectTimeout).
+ 
+ connect(Socket, Opts) ->
+     connect(Socket, Opts, infinity).
Index: patches/patch-src_tsung_ts_utils_erl
===================================================================
RCS file: patches/patch-src_tsung_ts_utils_erl
diff -N patches/patch-src_tsung_ts_utils_erl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_tsung_ts_utils_erl	25 May 2025 12:35:27 -0000
@@ -0,0 +1,24 @@
+Index: src/tsung/ts_utils.erl
+--- src/tsung/ts_utils.erl.orig
++++ src/tsung/ts_utils.erl
+@@ -162,7 +162,7 @@ init_seed(A) when is_integer(A)->
+     %% node to set a reproductible but different seed for each launcher.
+     Id=get_node_id(),
+     ?DebugF("Seeding with ~p on node ~p~n",[Id,node()]),
+-    rand:seed(1000*Id,-1000*A*Id,1000*A*A);
++    rand:seed(default, {1000*Id,-1000*A*Id,1000*A*A});
+ init_seed({A,B}) when is_integer(A) and is_integer(B)->
+     Id=get_node_id(),
+     ?DebugF("Seeding with ~p ~p ~p on node ~p~n",[A,B,Id,node()]),
+@@ -171,9 +171,9 @@ init_seed({A,B}) when is_integer(A) and is_integer(B)-
+     %% initial pseudo random values will be quite closed to each
+     %% other. Trying to avoid this by using a multiplier big enough
+     %% (because the algorithm use mod 30XXX , see random.erl).
+-    rand:seed(4000*A*B*Id,-4000*B*A*Id,4000*Id*Id*A);
++    rand:seed(default, {4000*A*B*Id,-4000*B*A*Id,4000*Id*Id*A});
+ init_seed({A,B,C}) ->
+-    rand:seed(A,B,C).
++    rand:seed(default, {A,B,C}).
+ 
+ get_node_id() ->
+     case string:tokens(atom_to_list(node()),"@") of

Reply via email to