From edfcbd153633ca9c093b7a00895732939bcb9350 Mon Sep 17 00:00:00 2001 From: William Yang Date: Mon, 4 Sep 2023 18:18:38 +0200 Subject: [PATCH 1/6] upgrade: bump msquic to 2.2.2 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c381d312..9d495b85 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ default: build-nif .PHONY: build-nif build-nif: - ./build.sh 'v2.1.8' + ./build.sh 'v2.2.2' compile: $(REBAR) compile From ea39c25eb5f4e2272c930b09766594cf90ad0a39 Mon Sep 17 00:00:00 2001 From: William Yang Date: Mon, 4 Sep 2023 21:35:28 +0200 Subject: [PATCH 2/6] feat: more cmake opts for msquic 2.2 --- CMakeLists.txt | 17 ++++++++++++++--- test/quicer_snb_SUITE.erl | 8 ++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e9c5d4c0..ecf343d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,12 +21,23 @@ else() set(CMAKE_BUILD_TYPE "RelWithDebInfo") endif() +if (DEFINED ENV{QUICER_USE_OPENSSL3}) + message(STATUS "Use openssl3") + set(QUIC_TLS "openssl3") +endif() + if (DEFINED ENV{QUIC_ENABLE_LOGGING}) set(QUIC_ENABLE_LOGGING $ENV{QUIC_ENABLE_LOGGING}) + set(QUIC_LOGGING_TYPE lttng) else() set(QUIC_ENABLE_LOGGING "OFF") endif() +if (DEFINED ENV{QUIC_LOGGING_TYPE}) + set(QUIC_ENABLE_LOGGING "ON") + set(QUIC_LOGGING_TYPE $ENV{QUIC_LOGGING_TYPE}) +endif() + if (DEFINED ENV{QUICER_USE_LTTNG} AND DEFINED ENV{QUICER_USE_SNK}) message(FATAL_ERROR "QUICER_USE_LTTNG and QUICER_USE_SNK cannot be defined at same time") endif() @@ -91,8 +102,8 @@ add_subdirectory(msquic) add_library(quicer_static STATIC ${SOURCES}) target_include_directories(quicer_static PRIVATE ${Erlang_OTP_ROOT_DIR}/usr/include/ msquic/src/inc/) if (CMAKE_SYSTEM_NAME MATCHES Linux) - # note, the value of ${ATOMIC} will be set by msquic - target_link_libraries(quicer_static PRIVATE core platform inc warnings logging ${ATOMIC} "-Wl,--no-gc-sections") + # note, the value of ${ATOMIC} and %{NUMA} will be set by msquic + target_link_libraries(quicer_static PRIVATE core platform inc warnings logging ${ATOMIC} ${NUMA} "-Wl,--no-gc-sections") elseif (CMAKE_SYSTEM_NAME MATCHES Darwin) target_link_libraries(quicer_static PRIVATE core platform inc warnings "-Wl,-undefined,dynamic_lookup -Wl,-dead_strip") endif() @@ -125,7 +136,7 @@ set_target_properties(quicer_nif LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/priv/ ) -if (QUIC_ENABLE_LOGGING) +if (QUIC_ENABLE_LOGGING AND QUIC_LOGGING_TYPE STREQUAL "lttng") set_target_properties(msquic.lttng PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/priv) set_target_properties(msquic.lttng PROPERTIES LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/priv) endif() diff --git a/test/quicer_snb_SUITE.erl b/test/quicer_snb_SUITE.erl index bbd60bfd..44d10c42 100644 --- a/test/quicer_snb_SUITE.erl +++ b/test/quicer_snb_SUITE.erl @@ -1701,16 +1701,20 @@ tc_conn_stop_notify_acceptor(Config) -> ct:pal("Listener Options: ~p", [Options]), ?check_trace(#{timetrap => 10000}, begin - {ok, Listener} = quicer:listen(Port, ListenerOpts), {SPid, Ref} = spawn_monitor(fun() -> + {ok, Listener} = quicer:listen(Port, ListenerOpts), {ok, Conn} = quicer:accept(Listener, []), Acceptors = lists:map(fun(_) -> spawn(quicer, accept_stream, [Conn, []]) end, lists:seq(1, 100)), {ok, Conn} = quicer:handshake(Conn), - {error, closed} = quicer:accept_stream(Conn, []), + case quicer:accept_stream(Conn, []) of + {error, closed} -> ok; + {ok, _Stream} -> ok + end, exit({normal, Acceptors}) end), + timer:sleep(1000), {ok, Conn} = quicer:connect("localhost", Port, default_conn_opts(), infinity), quicer:shutdown_connection(Conn), From fc3c5ce4eb19f4f2d79eeb20f1b18796b9a75069 Mon Sep 17 00:00:00 2001 From: William Yang Date: Tue, 5 Sep 2023 09:49:35 +0200 Subject: [PATCH 3/6] ci: add openssl version variants --- .github/workflows/main.yml | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3e075e0f..ac8d3f5e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -68,14 +68,17 @@ jobs: otp: - 24.3.4 - 25.3.2 + openssl: + - openssl3 + - openssl rebar3: - 3.20.0 build_type: - RelWithDebInfo - Debug logging: - - true - - false + - ON + - OFF arch: - x86_64 steps: @@ -88,15 +91,19 @@ jobs: otp-version: ${{ matrix.otp }} rebar3-version: ${{ matrix.rebar3 }} - name: release build with debug log off + env: + CMAKE_BUILD_TYPE: ${{ matrix.build_type }} + QUIC_TLS: ${{ matrix.openssl }} + QUIC_ENABLE_LOGGING: ${{ matrix.logging }} run: | echo "github ref: ${{ github.event.ref }}" echo "github ref: ${{ github.ref }}" sudo sysctl -w kernel.core_pattern=core ulimit -c unlimited - export CMAKE_BUILD_TYPE=${{ matrix.build_type }} - - if ${{ matrix.logging }}"" == "true" ; then - export QUIC_ENABLE_LOGGING=ON + export CMAKE_BUILD_TYPE + export QUIC_TLS + export QUIC_ENABLE_LOGGING + if "${QUIC_ENABLE_LOGGING}" == "ON" ; then sudo apt-add-repository ppa:lttng/stable-2.13 sudo apt-get update From f7ee0a739049c09fb1274619f613b3855b7f79dc Mon Sep 17 00:00:00 2001 From: William Yang Date: Tue, 5 Sep 2023 10:21:46 +0200 Subject: [PATCH 4/6] ci: hardcode logging type lttng for now --- .github/workflows/main.yml | 4 ++-- CMakeLists.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ac8d3f5e..e2c86c32 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -103,8 +103,8 @@ jobs: export CMAKE_BUILD_TYPE export QUIC_TLS export QUIC_ENABLE_LOGGING - if "${QUIC_ENABLE_LOGGING}" == "ON" ; then - + if [ "${QUIC_ENABLE_LOGGING}" == "ON" ] ; then + export QUIC_LOGGING_TYPE=lttng sudo apt-add-repository ppa:lttng/stable-2.13 sudo apt-get update sudo apt-get install -y lttng-tools babeltrace liblttng-ust-dev lttng-modules-dkms- diff --git a/CMakeLists.txt b/CMakeLists.txt index ecf343d9..5e534ba0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,7 +136,7 @@ set_target_properties(quicer_nif LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/priv/ ) -if (QUIC_ENABLE_LOGGING AND QUIC_LOGGING_TYPE STREQUAL "lttng") +if (QUIC_ENABLE_LOGGING STREQUAL "ON" AND QUIC_LOGGING_TYPE STREQUAL "lttng") set_target_properties(msquic.lttng PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/priv) set_target_properties(msquic.lttng PROPERTIES LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/priv) endif() From 59f685d3f4703d32f18cb9fed8d2a32305b67e6a Mon Sep 17 00:00:00 2001 From: William Yang Date: Mon, 4 Sep 2023 22:15:07 +0200 Subject: [PATCH 5/6] test: fix tests due to timings --- test/quicer_listener_SUITE.erl | 12 ++++++------ test/quicer_snb_SUITE.erl | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/test/quicer_listener_SUITE.erl b/test/quicer_listener_SUITE.erl index c4ef6695..716974e4 100644 --- a/test/quicer_listener_SUITE.erl +++ b/test/quicer_listener_SUITE.erl @@ -199,7 +199,7 @@ tc_open_listener(Config) -> {ok, {_, Port}} = quicer:sockname(L), {error, eaddrinuse} = gen_udp:open(Port), ok = quicer:close_listener(L), - {ok, P} = gen_udp:open(Port), + {ok, P} = snabbkaffe:retry(100, 10, fun()-> gen_udp:open(Port) end), ok = gen_udp:close(P), ok. @@ -254,9 +254,9 @@ tc_open_listener_bind(Config) -> ListenOn = "127.0.0.1:4567", {ok, L} = quicer:listen(ListenOn, default_listen_opts(Config)), {ok, {_, _}} = quicer:sockname(L), - {error,eaddrinuse} = gen_udp:open(4567), + {error, eaddrinuse} = gen_udp:open(4567), ok = quicer:close_listener(L), - {ok, P} = gen_udp:open(4567), + {ok, P} = snabbkaffe:retry(100, 10, fun() -> gen_udp:open(4567) end), ok = gen_udp:close(P), ok. @@ -264,9 +264,9 @@ tc_open_listener_bind_v6(Config) -> ListenOn = "[::1]:4567", {ok, L} = quicer:listen(ListenOn, default_listen_opts(Config)), {ok, {_, _}} = quicer:sockname(L), - {error,eaddrinuse} = gen_udp:open(4567, [{ip, {0, 0, 0, 0, 0, 0, 0, 1}}]), + {error, eaddrinuse} = gen_udp:open(4567, [{ip, {0, 0, 0, 0, 0, 0, 0, 1}}]), ok = quicer:close_listener(L), - {ok, P} = gen_udp:open(4567, [{ip, {0, 0, 0, 0, 0, 0, 0, 1}}]), + {ok, P} = snabbkaffe:retry(100, 10, fun() -> gen_udp:open(4567, [{ip, {0, 0, 0, 0, 0, 0, 0, 1}}]) end), ok = gen_udp:close(P), ok. @@ -325,7 +325,7 @@ tc_stop_start_listener(Config) -> LConf = default_listen_opts(Config), {ok, L} = quicer:listen(Port, LConf), ok = quicer:stop_listener(L), - ok = quicer:start_listener(L, Port, LConf), + ok = snabbkaffe:retry(100, 10, fun() -> quicer:start_listener(L, Port, LConf) end), ok = quicer:close_listener(L). tc_stop_close_listener(Config) -> diff --git a/test/quicer_snb_SUITE.erl b/test/quicer_snb_SUITE.erl index 44d10c42..a7fd46a4 100644 --- a/test/quicer_snb_SUITE.erl +++ b/test/quicer_snb_SUITE.erl @@ -1714,7 +1714,6 @@ tc_conn_stop_notify_acceptor(Config) -> end, exit({normal, Acceptors}) end), - timer:sleep(1000), {ok, Conn} = quicer:connect("localhost", Port, default_conn_opts(), infinity), quicer:shutdown_connection(Conn), From b9c7ffe8f48b2a9584c343be65302c91a16c3923 Mon Sep 17 00:00:00 2001 From: William Yang Date: Tue, 5 Sep 2023 15:08:43 +0200 Subject: [PATCH 6/6] test: add a start listener sync MsQuic 2.2 looks slow to start listener due to avoid shared binding --- test/quicer_listener_SUITE.erl | 24 ++++++++++++++---------- test/quicer_snb_SUITE.erl | 3 +++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/test/quicer_listener_SUITE.erl b/test/quicer_listener_SUITE.erl index 716974e4..ce4f3e5d 100644 --- a/test/quicer_listener_SUITE.erl +++ b/test/quicer_listener_SUITE.erl @@ -199,7 +199,7 @@ tc_open_listener(Config) -> {ok, {_, Port}} = quicer:sockname(L), {error, eaddrinuse} = gen_udp:open(Port), ok = quicer:close_listener(L), - {ok, P} = snabbkaffe:retry(100, 10, fun()-> gen_udp:open(Port) end), + {ok, P} = snabbkaffe:retry(100, 10, fun()-> {ok, _} = gen_udp:open(Port) end), ok = gen_udp:close(P), ok. @@ -224,7 +224,7 @@ tc_open_listener_with_new_reg(Config) -> %% Then Listener is created successfully and port is occupied {error, eaddrinuse} = gen_udp:open(Port), ok = quicer:close_listener(L), - {ok, P} = gen_udp:open(Port), + {ok, P} = snabbkaffe:retry(100, 10, fun()-> {ok, _} = gen_udp:open(Port) end), ok = gen_udp:close(P), ok = quicer:shutdown_registration(Reg), ok. @@ -251,22 +251,24 @@ tc_open_listener_with_wrong_cert_password(Config) -> , quicer:listen(Port, default_listen_opts(PasswordCerts ++ Config))). tc_open_listener_bind(Config) -> - ListenOn = "127.0.0.1:4567", + Port = select_port(), + ListenOn = "127.0.0.1"++":"++integer_to_list(Port), {ok, L} = quicer:listen(ListenOn, default_listen_opts(Config)), {ok, {_, _}} = quicer:sockname(L), - {error, eaddrinuse} = gen_udp:open(4567), + {error, eaddrinuse} = gen_udp:open(Port), ok = quicer:close_listener(L), - {ok, P} = snabbkaffe:retry(100, 10, fun() -> gen_udp:open(4567) end), + {ok, P} = snabbkaffe:retry(100, 10, fun() -> {ok, _} = gen_udp:open(Port) end), ok = gen_udp:close(P), ok. tc_open_listener_bind_v6(Config) -> - ListenOn = "[::1]:4567", + Port = select_port(), + ListenOn = "[::1]"++":"++integer_to_list(Port), {ok, L} = quicer:listen(ListenOn, default_listen_opts(Config)), {ok, {_, _}} = quicer:sockname(L), - {error, eaddrinuse} = gen_udp:open(4567, [{ip, {0, 0, 0, 0, 0, 0, 0, 1}}]), + {error, eaddrinuse} = gen_udp:open(Port, [{ip, {0, 0, 0, 0, 0, 0, 0, 1}}]), ok = quicer:close_listener(L), - {ok, P} = snabbkaffe:retry(100, 10, fun() -> gen_udp:open(4567, [{ip, {0, 0, 0, 0, 0, 0, 0, 1}}]) end), + {ok, P} = snabbkaffe:retry(100, 10, fun() -> {ok, _} = gen_udp:open(Port, [{ip, {0, 0, 0, 0, 0, 0, 0, 1}}]) end), ok = gen_udp:close(P), ok. @@ -325,7 +327,7 @@ tc_stop_start_listener(Config) -> LConf = default_listen_opts(Config), {ok, L} = quicer:listen(Port, LConf), ok = quicer:stop_listener(L), - ok = snabbkaffe:retry(100, 10, fun() -> quicer:start_listener(L, Port, LConf) end), + ok = snabbkaffe:retry(100, 10, fun() -> ok = quicer:start_listener(L, Port, LConf) end), ok = quicer:close_listener(L). tc_stop_close_listener(Config) -> @@ -465,7 +467,9 @@ tc_listener_stopped_when_owner_die(Config) -> ok = quicer:close_listener(L1). select_port() -> - select_free_port(quic). + Port = select_free_port(quic), + timer:sleep(100), + Port. %%%_* Emacs ==================================================================== %%% Local Variables: diff --git a/test/quicer_snb_SUITE.erl b/test/quicer_snb_SUITE.erl index a7fd46a4..f6e3fcea 100644 --- a/test/quicer_snb_SUITE.erl +++ b/test/quicer_snb_SUITE.erl @@ -1701,8 +1701,10 @@ tc_conn_stop_notify_acceptor(Config) -> ct:pal("Listener Options: ~p", [Options]), ?check_trace(#{timetrap => 10000}, begin + Parent = self(), {SPid, Ref} = spawn_monitor(fun() -> {ok, Listener} = quicer:listen(Port, ListenerOpts), + Parent ! {self(), ready}, {ok, Conn} = quicer:accept(Listener, []), Acceptors = lists:map(fun(_) -> spawn(quicer, accept_stream, [Conn, []]) @@ -1714,6 +1716,7 @@ tc_conn_stop_notify_acceptor(Config) -> end, exit({normal, Acceptors}) end), + receive {SPid, ready} -> ok end, {ok, Conn} = quicer:connect("localhost", Port, default_conn_opts(), infinity), quicer:shutdown_connection(Conn),