This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-4.2
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 479fbc7823dad2d58206baa9538ad2519d787605
Author: Gavin Chou <[email protected]>
AuthorDate: Tue Sep 29 09:34:31 2026 +0800

    branch-4.1: [test](cloud) Make SyncExecutor delay test deterministic 
(#68145) (#68586)
    
    ### What problem does this PR solve?
    
    Issue Number: None
    
    Related PR: #68145
    
    Problem Summary:
    
    Backport #68145 to branch-4.1. Replace timing-based sleeps in
    UtilTest.delay with countdown events so the normal tasks have entered
    their callbacks before the cancellation task returns.
    
    The cherry-pick conflicted only in the include block because master
    contains unrelated AWS/S3 additions. The resolution keeps the branch-4.1
    file structure and brings over only the deterministic synchronization
    change.
    
    ### Release note
    
    None
    
    ### Check List (For Author)
    
    - Test: Unit Test
        - local_to_dev run cloud-ut --run --filter=util_test:UtilTest.delay
        - UtilTest.delay repeated 1000 times under ASAN
    - Behavior changed: No
    - Does this need documentation: No
---
 cloud/test/util_test.cpp | 85 +++++++++++++++++++++++++-----------------------
 1 file changed, 45 insertions(+), 40 deletions(-)

diff --git a/cloud/test/util_test.cpp b/cloud/test/util_test.cpp
index 435feb6e0c3..0b20ae08171 100644
--- a/cloud/test/util_test.cpp
+++ b/cloud/test/util_test.cpp
@@ -17,11 +17,11 @@
 
 #include "cpp/util.h"
 
-#include <chrono>
+#include <bthread/countdown_event.h>
+
 #include <stdexcept>
 #include <string>
 #include <string_view>
-#include <thread>
 #include <tuple>
 #include <vector>
 
@@ -138,44 +138,49 @@ TEST(UtilTest, stage_wrapper) {
     ASSERT_EQ(0, f());
 }
 
+template <typename T>
+void test_cancel_after_tasks_started(T normal_value, T cancel_value,
+                                     std::function<bool(const T&)> is_cancel) {
+    auto pool = std::make_shared<SimpleThreadPool>(3);
+    pool->start();
+
+    bthread::CountdownEvent normal_tasks_started(2);
+    bthread::CountdownEvent cancellation_observed(1);
+    SyncExecutor<T> sync_executor(pool, "cancel after tasks started", 
[&](const T& value) {
+        bool cancelled = is_cancel(value);
+        if (cancelled) {
+            cancellation_observed.signal();
+        }
+        return cancelled;
+    });
+
+    auto normal_task = [&, normal_value]() {
+        normal_tasks_started.signal();
+        cancellation_observed.wait();
+        return normal_value;
+    };
+    auto cancel_task = [&, cancel_value]() {
+        normal_tasks_started.wait();
+        return cancel_value;
+    };
+
+    sync_executor.add(normal_task);
+    sync_executor.add(normal_task);
+    sync_executor.add(cancel_task);
+
+    bool finished = true;
+    auto results = sync_executor.when_all(&finished);
+    ASSERT_FALSE(finished);
+    ASSERT_EQ(3, results.size());
+    EXPECT_EQ(normal_value, results[0]);
+    EXPECT_EQ(normal_value, results[1]);
+    EXPECT_EQ(cancel_value, results[2]);
+}
+
 TEST(UtilTest, delay) {
-    auto s3_producer_pool = 
std::make_shared<SimpleThreadPool>(config::recycle_pool_parallelism);
-    s3_producer_pool->start();
-    // test normal execute
-    {
-        SyncExecutor<int> sync_executor(s3_producer_pool, "normal test",
-                                        [](int k) { return k == -1; });
-        auto f1 = []() { return -1; };
-        auto f2 = []() {
-            std::this_thread::sleep_for(std::chrono::seconds(1));
-            return 1;
-        };
-        sync_executor.add(f2);
-        sync_executor.add(f2);
-        sync_executor.add(f1);
-        bool finished = true;
-        std::vector<int> res = sync_executor.when_all(&finished);
-        ASSERT_EQ(finished, false);
-        ASSERT_EQ(3, res.size());
-    }
-    // test normal execute
-    {
-        SyncExecutor<std::string_view> sync_executor(
-                s3_producer_pool, "normal test",
-                [](const std::string_view k) { return k.empty(); });
-        auto f1 = []() { return ""; };
-        auto f2 = []() {
-            std::this_thread::sleep_for(std::chrono::seconds(1));
-            return "fake";
-        };
-        sync_executor.add(f2);
-        sync_executor.add(f2);
-        sync_executor.add(f1);
-        bool finished = true;
-        auto res = sync_executor.when_all(&finished);
-        ASSERT_EQ(finished, false);
-        ASSERT_EQ(3, res.size());
-    }
+    test_cancel_after_tasks_started<int>(1, -1, [](const int& value) { return 
value == -1; });
+    test_cancel_after_tasks_started<std::string_view>(
+            "fake", "", [](const std::string_view value) { return 
value.empty(); });
 }
 
 TEST(UtilTest, normal) {
@@ -450,4 +455,4 @@ TEST(UtilTest, test_long_normalize_http_uri) {
     }
 
     EXPECT_EQ(doris::normalize_http_uri(longPath), expected);
-}
\ No newline at end of file
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to