Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 925ba0ab authored by Steven Moreland's avatar Steven Moreland
Browse files

binderRpcTest: fix OnewayStressTest flake

On slow devices, the decref from asynchronous calls wouldn't be
processed in time. So, making multiple simultaneous twoway calls to make
sure we wait for every server thread to finish processing everything.

This could still flake if a device delayed for >500ms, but for this
amount of time performance can be considered part of a correctness.
If there are further issues, we can add additional APIs which let us
control how calls are scheduled so we can make sure to process a two-way
transaction on every thread.

Fixes: 200173589
Test: binderRpcTest OnewayStressTest on repeat
Change-Id: I719499a14530f2108644a814c5df2d1718893793
parent ccb2d05f
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -1036,6 +1036,14 @@ TEST_P(BinderRpc, ThreadingStressTest) {
    for (auto& t : threads) t.join();
}

static void saturateThreadPool(size_t threadCount, const sp<IBinderRpcTest>& iface) {
    std::vector<std::thread> threads;
    for (size_t i = 0; i < threadCount; i++) {
        threads.push_back(std::thread([&] { EXPECT_OK(iface->sleepMs(500)); }));
    }
    for (auto& t : threads) t.join();
}

TEST_P(BinderRpc, OnewayStressTest) {
    constexpr size_t kNumClientThreads = 10;
    constexpr size_t kNumServerThreads = 10;
@@ -1049,13 +1057,12 @@ TEST_P(BinderRpc, OnewayStressTest) {
            for (size_t j = 0; j < kNumCalls; j++) {
                EXPECT_OK(proc.rootIface->sendString("a"));
            }

            // check threads are not stuck
            EXPECT_OK(proc.rootIface->sleepMs(250));
        }));
    }

    for (auto& t : threads) t.join();

    saturateThreadPool(kNumServerThreads, proc.rootIface);
}

TEST_P(BinderRpc, OnewayCallDoesNotWait) {
@@ -1098,13 +1105,7 @@ TEST_P(BinderRpc, OnewayCallQueueing) {

    EXPECT_GT(epochMsAfter, epochMsBefore + kSleepMs * kNumSleeps);

    // pending oneway transactions hold ref, make sure we read data on all
    // sockets
    std::vector<std::thread> threads;
    for (size_t i = 0; i < 1 + kNumExtraServerThreads; i++) {
        threads.push_back(std::thread([&] { EXPECT_OK(proc.rootIface->sleepMs(250)); }));
    }
    for (auto& t : threads) t.join();
    saturateThreadPool(1 + kNumExtraServerThreads, proc.rootIface);
}

TEST_P(BinderRpc, OnewayCallExhaustion) {