Skip to content
Snippets Groups Projects
Commit 990eadc2 authored by Florian Schmaus's avatar Florian Schmaus
Browse files

Merge branch 'future_misc' into 'master'

Debug changes for our Future

See merge request !134
parents 2eb33cf3 a1075bba
No related branches found
No related tags found
1 merge request!134Debug changes for our Future
Pipeline #59390 passed
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <sys/socket.h> // for socklen_t #include <sys/socket.h> // for socklen_t
#include <sys/types.h> // for ssize_t #include <sys/types.h> // for ssize_t
#include <cassert>
#include <cstddef> // for size_t #include <cstddef> // for size_t
#include <cstdint> // for int32_t, uint8_t #include <cstdint> // for int32_t, uint8_t
#include <cstdlib> // for abort #include <cstdlib> // for abort
...@@ -93,6 +94,7 @@ class Future : public Logger<LogSubsystem::IO> { ...@@ -93,6 +94,7 @@ class Future : public Logger<LogSubsystem::IO> {
virtual void prepareSqe(io_uring_sqe* sqe) = 0; virtual void prepareSqe(io_uring_sqe* sqe) = 0;
void setCompletion(int32_t res) { void setCompletion(int32_t res) {
assert(!state.completed);
LOGD("Complete " << this); LOGD("Complete " << this);
returnValue = res; returnValue = res;
state.completed = true; state.completed = true;
......
// SPDX-License-Identifier: LGPL-3.0-or-later // SPDX-License-Identifier: LGPL-3.0-or-later
// Copyright © 2020-2021 Florian Fischer // Copyright © 2020-2021 Florian Fischer
#include <fcntl.h>
#include <sys/eventfd.h> // for eventfd #include <sys/eventfd.h> // for eventfd
#include <sys/types.h> // for ssize_t #include <sys/types.h> // for ssize_t
#include <array>
#include <cassert> // for assert #include <cassert> // for assert
#include <cerrno> // for EBADF, ECANCELED #include <cerrno> // for EBADF, ECANCELED
#include <cstdint> // for uint64_t, int32_t #include <cstdint> // for uint64_t, int32_t
#include <cstdlib> // for exit, EXIT_SUCCESS #include <cstdlib> // for exit, EXIT_SUCCESS
#include "Common.hpp" // for DIE_MSG_ERRNO, DIE_MSG #include "Common.hpp" // for DIE_MSG_ERRNO, DIE_MSG
#include "io.hpp"
#include "io/Future.hpp" // for ReadFuture, CloseFuture, WriteFuture #include "io/Future.hpp" // for ReadFuture, CloseFuture, WriteFuture
using emper::io::CloseFuture; using emper::io::CloseFuture;
...@@ -41,12 +44,45 @@ static void successChain() { ...@@ -41,12 +44,45 @@ static void successChain() {
} }
} }
static void failureChain() { static void successLoop() {
// NOLINTNEXTLINE(modernize-avoid-c-arrays) int efd = eventfd(0, 0);
char buf[32]; if (efd == -1) {
ReadFuture invalidReadFuture(42, &buf, sizeof(buf), 0); DIE_MSG_ERRNO("eventfd failed");
}
const unsigned ITERATIONS = 10000;
for (unsigned i = 0; i < ITERATIONS; ++i) {
uint64_t write_buf = 42;
WriteFuture writeFuture(efd, &write_buf, sizeof(write_buf), 0);
ReadFuture readFuture(0, &buf, sizeof(buf), 0); uint64_t read_buf;
ReadFuture readFuture(efd, &read_buf, sizeof(read_buf), 0);
readFuture.setDependency(writeFuture);
ssize_t res = readFuture.submitAndWait();
if (res == -1) {
DIE_MSG_ERRNO("linked requests chain failed");
}
if (read_buf != 42) {
DIE_MSG("dependent read value differs from written value");
}
}
CloseFuture closeFuture(efd);
ssize_t res = closeFuture.submitAndWait();
if (res == -1) {
DIE_MSG_ERRNO("linked requests chain failed");
}
}
static void failureChainInvCor() {
std::array<char, 32> buf;
ReadFuture invalidReadFuture(-1, buf.data(), buf.size(), 0);
ReadFuture readFuture(0, buf.data(), buf.size(), 0);
readFuture.setDependency(invalidReadFuture); readFuture.setDependency(invalidReadFuture);
int32_t res = readFuture.submitAndWait(); int32_t res = readFuture.submitAndWait();
...@@ -56,9 +92,46 @@ static void failureChain() { ...@@ -56,9 +92,46 @@ static void failureChain() {
assert(res == -EBADF); assert(res == -EBADF);
} }
static void failureChainCorInvCor() {
std::array<char, 32> buf;
int fd = emper::io::openAndWait("/dev/null", O_WRONLY);
// int fd = open("/dev/null", O_WRONLY, 0);
assert(fd != -1);
WriteFuture correctFuture1(fd, buf.data(), buf.size(), 0);
ReadFuture invalidFuture(-1, buf.data(), buf.size(), 0);
invalidFuture.setDependency(correctFuture1);
WriteFuture correctFuture2(fd, buf.data(), buf.size(), 0);
correctFuture2.setDependency(invalidFuture);
int32_t res = correctFuture2.submitAndWait();
assert(res == -ECANCELED);
res = invalidFuture.wait();
assert(res == -EBADF);
res = correctFuture1.wait();
assert(res == (int32_t)buf.size());
emper::io::close(fd);
}
void emperTest() { void emperTest() {
// This leaves the io_uring in a weird state because the successChain() afterwards
// fails because the write future is already completed with -ECANCELED but
// there is successful cqe in the CQ for this future
failureChainCorInvCor();
successChain(); successChain();
failureChain(); successLoop();
failureChainInvCor();
// failureChainInvCor left the io_uring in a weird state because
// the io_uring_submit of the openAndWait() never returns.
// failureChainCorInvCor();
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment