From 8df5aa7b0c44bda94ff080ce7be75bbf21e8c212 Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Thu, 9 Jun 2016 09:40:46 +0300 Subject: [PATCH] utils/exceptions: Whitelist EEXIST and ENOENT in should_stop_on_system_error() There are various call-sites that explicitly check for EEXIST and ENOENT: $ git grep "std::error_code(E" database.cc: if (e.code() != std::error_code(EEXIST, std::system_category())) { database.cc: if (e.code() != std::error_code(ENOENT, std::system_category())) { database.cc: if (e.code() != std::error_code(ENOENT, std::system_category())) { database.cc: if (e.code() != std::error_code(ENOENT, std::system_category())) { sstables/sstables.cc: if (e.code() == std::error_code(ENOENT, std::system_category())) { sstables/sstables.cc: if (e.code() == std::error_code(ENOENT, std::system_category())) { Commit 961e80a ("Be more conservative when deciding when to shut down due to disk errors") turned these errors into a storage_io_exception that is not expected by the callers, which causes 'nodetool snapshot' functionality to break, for example. Whitelist the two error codes to revert back to the old behavior of io_check(). Message-Id: <1465454446-17954-1-git-send-email-penberg@scylladb.com> --- utils/exceptions.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/utils/exceptions.cc b/utils/exceptions.cc index 99af919ceb..1ef6acb0cb 100644 --- a/utils/exceptions.cc +++ b/utils/exceptions.cc @@ -51,7 +51,15 @@ bool is_system_error_errno(int err_no) } bool should_stop_on_system_error(const std::system_error& e) { - // We may whitelist transient errors in the future, but for now, - // be conservative. + if (e.code().category() == std::system_category()) { + // Whitelist of errors that don't require us to stop the server: + switch (e.code().value()) { + case EEXIST: + case ENOENT: + return false; + default: + break; + } + } return true; }