From 69a49c7b3c6a9e5a3996ac81cd92f3a58a6a7da9 Mon Sep 17 00:00:00 2001 From: Julien Sagot Date: Tue, 16 Dec 2025 16:44:28 +0100 Subject: [PATCH 1/2] Lib_bees: add simple regression test for async_lwt --- manifest/product_octez.ml | 1 + src/lib_bees/test/dune | 3 +- src/lib_bees/test/test_bees_lwt_async.ml | 47 ++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/lib_bees/test/test_bees_lwt_async.ml diff --git a/manifest/product_octez.ml b/manifest/product_octez.ml index da4c45fc390e..7cce8cdc3280 100644 --- a/manifest/product_octez.ml +++ b/manifest/product_octez.ml @@ -2671,6 +2671,7 @@ let _octez_bees_tests = "test_bees_unit"; "test_bees_unit_eio"; "test_bees_task_worker"; + "test_bees_lwt_async"; ] ~path:"src/lib_bees/test" ~opam:"octez-libs" diff --git a/src/lib_bees/test/dune b/src/lib_bees/test/dune index 57594127eef1..2c0fef0d07c3 100644 --- a/src/lib_bees/test/dune +++ b/src/lib_bees/test/dune @@ -33,7 +33,8 @@ mocked_worker test_bees_unit test_bees_unit_eio - test_bees_task_worker)) + test_bees_task_worker + test_bees_lwt_async)) (executable (name main) diff --git a/src/lib_bees/test/test_bees_lwt_async.ml b/src/lib_bees/test/test_bees_lwt_async.ml new file mode 100644 index 000000000000..e099b5a46597 --- /dev/null +++ b/src/lib_bees/test/test_bees_lwt_async.ml @@ -0,0 +1,47 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* SPDX-FileCopyrightText: 2025 Nomadic Labs *) +(* *) +(*****************************************************************************) + +(** Testing + ------- + Component: Lib_bees async_lwt + Invocation: dune exec src/lib_bees/test/main.exe \ + -- --file test_bees_lwt_async.ml + Subject: Unit tests for [Lib_bees] async_lwt promise processing +*) + +let test_async_lwt_promise_processing () = + let open Result_syntax in + (* Test that async_lwt processes promises. + This test schedules multiple async Lwt tasks and verifies they all complete. *) + let results = ref 0 in + let num_tasks = 5 in + (* Schedule multiple Lwt tasks *) + for _ = 1 to num_tasks do + Tezos_bees.Hive.async_lwt (fun () -> + incr results ; + Lwt.return_unit) + done ; + (* Give the lwt scheduler time to process all tasks *) + let env = Tezos_base_unix.Event_loop.env_exn () in + Eio.Time.sleep env#clock 1. ; + if !results = num_tasks then return_unit + else + Alcotest.failf + "async_lwt task results mismatch: got %d, expected %d" + !results + num_tasks + +let tests_async_lwt = + ( "Async Lwt", + [ + Alcotezt_process.test_case + "Promise processing (eio handlers)" + `Quick + test_async_lwt_promise_processing; + ] ) + +let () = Alcotezt_process.run ~__FILE__ "Bees async_lwt" [tests_async_lwt] -- GitLab From df9b2f3ee3a395a96c51c99b29c9dbd0958d74dd Mon Sep 17 00:00:00 2001 From: Julien Sagot Date: Tue, 16 Dec 2025 16:20:59 +0100 Subject: [PATCH 2/2] Lib_bees: fix removed async_lwt worker initialization --- src/lib_bees/hive.ml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/lib_bees/hive.ml b/src/lib_bees/hive.ml index 22cd0c549958..636d565b49d8 100644 --- a/src/lib_bees/hive.ml +++ b/src/lib_bees/hive.ml @@ -45,6 +45,22 @@ let hive = let async_lwt = Eio.Stream.add hive.lwt_tasks_stream +(* Initialize the [lwt_scheduler_loop] by running it in its own domain in the + main Eio switch *) +let () = + let lwt_scheduler_loop () = + let rec loop () : [`Stop_daemon] = + let lwt_closure = Eio.Stream.take hive.lwt_tasks_stream in + (* The loop will run in the [Event_loop] main domain, so [Eio.run_lwt] is + fine. *) + Lwt_eio.run_lwt lwt_closure ; + loop () + in + loop () + in + Tezos_base_unix.Event_loop.on_main_run (fun _env switch -> + Eio.Fiber.fork_daemon ~sw:switch lwt_scheduler_loop) + exception Unknown_worker of string let launch_worker (type worker) ?switch (worker : worker) ~bee_name ~domains -- GitLab