If migration_manager::get_schema_for_write is called after migration_manager::drain, it throws abort_requested_exception. This exception is not present in replica::exception_variant, which means that RPC doesn't preserve information about its type. If it is thrown on the replica side, it is deserialized as std::runtime_error on the coordinator. Therefore, abstract_read_resolver::error logs information about this exception, even though we don't want it (aborts are triggered on shutdown and timeouts). To solve this issue, we add abort_requested_exception to replica::exception_variant and, in the next commits, refactor storage_proxy::handle_read so that abort_requested_exception thrown in migration_manager::get_schema_for_write is properly serialized. Thanks to this change, unchanged abstract_read_resolver::error correctly handles abort_requested_exception thrown on the replica side by not reporting it.
36 lines
611 B
C++
36 lines
611 B
C++
/*
|
|
* Copyright 2022-present ScyllaDB
|
|
*/
|
|
|
|
/*
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
namespace replica {
|
|
|
|
struct unknown_exception {};
|
|
|
|
struct no_exception {};
|
|
|
|
class rate_limit_exception {
|
|
};
|
|
|
|
class stale_topology_exception {
|
|
int64_t caller_version();
|
|
int64_t callee_fence_version();
|
|
};
|
|
|
|
class abort_requested_exception {
|
|
};
|
|
|
|
struct exception_variant {
|
|
std::variant<replica::unknown_exception,
|
|
replica::no_exception,
|
|
replica::rate_limit_exception,
|
|
replica::stale_topology_exception,
|
|
replica::abort_requested_exception
|
|
> reason;
|
|
};
|
|
|
|
}
|