Files
scylladb/utils/disk-error-handler.cc
Calle Wilund e18a855abe extensions: Add exception types for IO extensions and handle in memtable write path
Fixes #19960

Write path for sstables/commitlog need to handle the fact that IO extensions can
generate errors, some of which should be considered retry-able, and some that should,
similar to system IO errors, cause the node to go into isolate mode.

One option would of course be for extensions to simply generate std::system_errors,
with system_category and appropriate codes. But this is probably a bad idea, since
it makes it more muddy at which level an error happened, as well as limits the
expressibility of the error.

This adds three distinct types (sharing base) distinguishing permission, availabilty
and configuration errors. These are treated akin to EACCESS, ENOENT and EINVAL in
disk error handler and memtable write loop.

Tests updated to use and verify behaviour.

Closes scylladb/scylladb#19961
2024-08-11 13:52:35 +03:00

42 lines
1.4 KiB
C++

/*
* Copyright 2016-present ScyllaDB
**/
/* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include "db/extensions.hh"
#include "utils/disk-error-handler.hh"
#include "utils/exceptions.hh"
thread_local disk_error_signal_type commit_error;
thread_local disk_error_signal_type general_disk_error;
thread_local io_error_handler commit_error_handler = default_io_error_handler(commit_error);
thread_local io_error_handler general_disk_error_handler = default_io_error_handler(general_disk_error);
thread_local io_error_handler sstable_write_error_handler = default_io_error_handler(sstable_write_error);
io_error_handler default_io_error_handler(disk_error_signal_type& signal) {
return [&signal] (std::exception_ptr eptr) {
try {
std::rethrow_exception(eptr);
} catch(std::system_error& e) {
if (should_stop_on_system_error(e)) {
signal();
throw storage_io_error(e);
}
} catch (db::extension_storage_resource_unavailable&) {
throw; // by same logic as found in should_stop_on_system_error - not avail -> no isolate.
} catch (db::extension_storage_exception& e) {
signal();
throw;
}
};
}
io_error_handler_gen default_io_error_handler_gen() {
return [] (disk_error_signal_type& signal) {
return default_io_error_handler(signal);
};
}