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
42 lines
1.4 KiB
C++
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);
|
|
};
|
|
}
|