Skip to content
Snippets Groups Projects

[io/Stats] For AlarmFutures (TIMEOUT) expect them to return ETIME

Merged Florian Schmaus requested to merge flow/emper:fix-alarmfuture-stats into master
Files
2
+ 60
1
// SPDX-License-Identifier: LGPL-3.0-or-later
// Copyright © 2020-2021 Florian Fischer, Florian Schmaus
// Copyright © 2020-2022 Florian Fischer, Florian Schmaus
#include "io/Stats.hpp"
#include <cerrno>
#include <cstdlib>
#include <initializer_list> // for initializer_list
#include <iomanip> // for operator<<, setfill, setw
#include <string> // for operator<<, to_string
#include <utility> // for pair
#include "Debug.hpp"
#include "Future.hpp"
#include "io/IoContext.hpp"
#include "io/Operation.hpp" // for Operation, operator<<, Operation::RECV
#include "lib/math.hpp"
@@ -119,6 +123,61 @@ auto operator<<(std::ostream& os, const Stats& s) -> std::ostream& {
return os;
}
void Stats::record_completion(Operation op, int32_t res, ssize_t partial_completion, size_t exp) {
auto& operation_map = io_uring_completions[op];
// Persistent Error
if (res < 0) {
if (partial_completion > 0) {
ATOMIC_INC_RELAXED(operation_map[IncrementalError]);
} else {
ATOMIC_INC_RELAXED(operation_map[ErrorCompletion]);
}
return;
}
// Make sure exp which is passed as future.len is only > 0 for Futures with a buffer
switch (op) {
case Operation::SEND:
case Operation::RECV:
case Operation::READ:
case Operation::WRITE:
case Operation::WRITEV:
break;
case Operation::TIMEOUT:
exp = ETIME;
break;
default:
exp = 0;
break;
}
// Full completion
if (!exp || (uint32_t)res == exp) {
ATOMIC_INC_RELAXED(operation_map[FullCompletion]);
return;
}
// we expect partial completion
if (partial_completion != PartialCompletableFuture::DISABLE_PARTIAL_COMPLETION) {
if ((size_t)(res + partial_completion) < exp) {
ATOMIC_INC_RELAXED(operation_map[PartialResubmission]);
} else {
ATOMIC_INC_RELAXED(operation_map[IncrementalCompletion]);
}
return;
}
if ((uint32_t)res < exp) {
ATOMIC_INC_RELAXED(operation_map[PartialCompletion]);
return;
}
LOGW("Unexpected completion case in IoStats");
LOGW(op << ", " << res << ", " << partial_completion << ", " << exp);
abort();
}
void Stats::printStats(IoContext* globalIoContext, const std::vector<IoContext*>& workerIoContexts,
std::ostream& out) {
if (globalIoContext) {
Loading