Erstellen eines Watchdogs für die Boost-IO_Context-WarteschlangeC++

Programme in C++. Entwicklerforum
Anonymous
 Erstellen eines Watchdogs für die Boost-IO_Context-Warteschlange

Post by Anonymous »

Ich möchte einen Watchdog einrichten, der prüft, ob die io_context-Worker Aufgaben innerhalb einer angemessenen Zeit aufnehmen können und nicht lange laufen oder Vorgänge blockieren.
Um dies zu erreichen, habe ich eine Prüfung implementiert, die überprüft, ob die io_context-Warteschlange ordnungsgemäß funktioniert, indem alle 30 Sekunden eine Aufgabe geplant wird. Diese Aufgabe setzt einfach ein Flag auf „true“, damit wir bestätigen können, dass die Warteschlange noch reagiert.

Code: Select all

using PeriodicTask = BasicScheduledTask;

std::shared_ptr
 io_context_alive_task_ = std::make_shared
(io_context_,
[this](const auto& ec) {
if (ec) {
print_error("Could not report io_context as alive: {}", ec.message());
return;
}
print_debug("Marking io_context as alive");
is_context_alive_ = true;
}, 30s));
Der Watchdog läuft in einem eigenen unabhängigen Thread außerhalb von io_context und prüft alle 2 Minuten, ob das Flag auf true gesetzt wurde.

Code: Select all

std::unique_ptr context_watchdog_ = std::make_unique([this] {
while (!io_context_.stopped()) {
io_context_alive_cv_.wait_for(lock, 2min, [this] { return io_context_.stopped(); });
if (!is_context_alive_) {
print_critical("io_context is not responding");
std::abort();
}
print_debug("io_context is ok, setting back to false");
is_context_alive_ = false;
}
print_debug("io_context stopped. stopping thread");
});
Mir ist aufgefallen, dass ich einige Fehlalarme erhalte, wenn das System aus dem Ruhezustand erwacht.
Dies geschieht, weil die 30-sekündige periodische Aufgabe, die den Kontext als aktiv markiert, nicht länger als 2 Minuten ausgeführt wird. Infolgedessen geht der Watchdog davon aus, dass der io_context nicht reagiert, und versucht, den Dienst abzubrechen.
Ich frage mich, ob der io_context_alive_cv_, der vom Typ std::condition_variable ist, im Ruhemodus tickt, während die Boost-basierte Zeit der Keep-Alive-Aufgabe in dieser Zeit inaktiv ist. Wenn ja, können Sie mir vielleicht einen Weg zur Lösung vorschlagen?
Vielen Dank

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post