diff --git a/tools/load_tester.cpp b/tools/load_tester.cpp index 87d50fd..19747be 100644 --- a/tools/load_tester.cpp +++ b/tools/load_tester.cpp @@ -130,7 +130,6 @@ constexpr int kNetworkThreads = std::min(8, kConcurrency); constexpr int kEventBatchSize = 32; constexpr int kConnectionBufSize = 1024; -constexpr uint32_t kMandatoryEpollFlags = EPOLLONESHOT; sem_t connectionLimit; @@ -232,20 +231,14 @@ struct Connection { assert(w != 0); request = request.substr(w, request.size() - w); if (request.empty()) { - if (requestsSent == 0) { - sentFirstRequest = now(); - } ++requestsSent; if (requestsSent == kRequestsPerConnection) { return true; } - initRequest(); } } } - double sentFirstRequest; - const int fd; const int64_t id; @@ -282,6 +275,7 @@ private: int on_message_complete() { responseId = 0; ++responsesReceived; + initRequest(); return 0; } @@ -373,9 +367,10 @@ int main() { // Transfer back to epoll instance. This thread or another thread // will wake when fd is ready - events[i].events = EPOLLIN | kMandatoryEpollFlags; if (!conn->request.empty() && !conn->error) { - events[i].events |= EPOLLOUT; + events[i].events = EPOLLOUT | EPOLLONESHOT; + } else { + events[i].events = EPOLLIN | EPOLLONESHOT; } conn->tsan_release(); events[i].data.ptr = conn.release(); @@ -408,7 +403,7 @@ int main() { fd, connectionId.fetch_add(1, std::memory_order_relaxed)); // Post to epoll instance struct epoll_event event{}; - event.events = EPOLLOUT | kMandatoryEpollFlags; + event.events = EPOLLOUT | EPOLLONESHOT; conn->tsan_release(); event.data.ptr = conn.release(); e = epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &event); @@ -420,16 +415,6 @@ int main() { }); } - auto now = []() { - struct timespec t; - int e = clock_gettime(CLOCK_MONOTONIC_RAW, &t); - if (e == -1) { - perror("clock_gettime"); - abort(); - } - return double(t.tv_nsec) * 1e-9 + double(t.tv_sec); - }; - for (double prevTime = now(), prevConnections = connectionId.load(std::memory_order_relaxed); ;) {