keep exception format string in retries ctl

This commit is contained in:
Alexander Tokmakov 2023-12-29 15:21:46 +01:00
parent d58b76ce06
commit 72a0797b88
3 changed files with 12 additions and 41 deletions

View File

@ -154,14 +154,14 @@ BackupCoordinationStageSync::State BackupCoordinationStageSync::readCurrentState
/// If the "alive" node doesn't exist then we don't have connection to the corresponding host. /// If the "alive" node doesn't exist then we don't have connection to the corresponding host.
/// This node is ephemeral so probably it will be recreated soon. We use zookeeper retries to wait. /// This node is ephemeral so probably it will be recreated soon. We use zookeeper retries to wait.
/// In worst case when we won't manage to see the alive node for a long time we will just abort the backup. /// In worst case when we won't manage to see the alive node for a long time we will just abort the backup.
String message; const auto suffix = retries_ctl.isLastRetry() ? "" : ", will retry";
if (started) if (started)
message = fmt::format("Lost connection to host {}", host); retries_ctl.setUserError(Exception(ErrorCodes::FAILED_TO_SYNC_BACKUP_OR_RESTORE,
"Lost connection to host {}{}", host, suffix));
else else
message = fmt::format("No connection to host {} yet", host); retries_ctl.setUserError(Exception(ErrorCodes::FAILED_TO_SYNC_BACKUP_OR_RESTORE,
if (!retries_ctl.isLastRetry()) "No connection to host {} yet{}", host, suffix));
message += ", will retry";
retries_ctl.setUserError(ErrorCodes::FAILED_TO_SYNC_BACKUP_OR_RESTORE, message);
state.disconnected_host = host; state.disconnected_host = host;
return state; return state;
} }

View File

@ -776,7 +776,7 @@ std::pair<std::vector<String>, bool> ReplicatedMergeTreeSinkImpl<async_insert>::
if (!writing_existing_part) if (!writing_existing_part)
{ {
retries_ctl.setUserError( retries_ctl.setUserError(
ErrorCodes::TABLE_IS_READ_ONLY, "Table is in readonly mode: replica_path={}", storage.replica_path); Exception(ErrorCodes::TABLE_IS_READ_ONLY, "Table is in readonly mode: replica_path={}", storage.replica_path));
return CommitRetryContext::LOCK_AND_COMMIT; return CommitRetryContext::LOCK_AND_COMMIT;
} }
} }
@ -1075,10 +1075,10 @@ std::pair<std::vector<String>, bool> ReplicatedMergeTreeSinkImpl<async_insert>::
new_retry_controller.actionAfterLastFailedRetry([&] new_retry_controller.actionAfterLastFailedRetry([&]
{ {
/// We do not know whether or not data has been inserted in other replicas /// We do not know whether or not data has been inserted in other replicas
new_retry_controller.setUserError( new_retry_controller.setUserError(Exception(
ErrorCodes::UNKNOWN_STATUS_OF_INSERT, ErrorCodes::UNKNOWN_STATUS_OF_INSERT,
"Unknown quorum status. The data was inserted in the local replica but we could not verify quorum. Reason: {}", "Unknown quorum status. The data was inserted in the local replica but we could not verify quorum. Reason: {}",
new_retry_controller.getLastKeeperErrorMessage()); new_retry_controller.getLastKeeperErrorMessage()));
}); });
new_retry_controller.retryLoop([&]() new_retry_controller.retryLoop([&]()

View File

@ -112,7 +112,7 @@ public:
return false; return false;
} }
void setUserError(std::exception_ptr exception, int code, std::string message) void setUserError(std::exception_ptr exception, int code, const std::string & message)
{ {
if (logger) if (logger)
LOG_TRACE(logger, "ZooKeeperRetriesControl: {}: setUserError: error={} message={}", name, code, message); LOG_TRACE(logger, "ZooKeeperRetriesControl: {}: setUserError: error={} message={}", name, code, message);
@ -127,21 +127,9 @@ public:
keeper_error = KeeperError{}; keeper_error = KeeperError{};
} }
template <typename... Args> void setUserError(const Exception & exception)
void setUserError(std::exception_ptr exception, int code, fmt::format_string<Args...> fmt, Args &&... args)
{ {
setUserError(exception, code, fmt::format(fmt, std::forward<Args>(args)...)); setUserError(std::make_exception_ptr(exception), exception.code(), exception.message());
}
void setUserError(int code, std::string message)
{
setUserError(std::make_exception_ptr(Exception::createDeprecated(message, code)), code, message);
}
template <typename... Args>
void setUserError(int code, fmt::format_string<Args...> fmt, Args &&... args)
{
setUserError(code, fmt::format(fmt, std::forward<Args>(args)...));
} }
void setKeeperError(std::exception_ptr exception, Coordination::Error code, std::string message) void setKeeperError(std::exception_ptr exception, Coordination::Error code, std::string message)
@ -159,23 +147,6 @@ public:
user_error = UserError{}; user_error = UserError{};
} }
template <typename... Args>
void setKeeperError(std::exception_ptr exception, Coordination::Error code, fmt::format_string<Args...> fmt, Args &&... args)
{
setKeeperError(exception, code, fmt::format(fmt, std::forward<Args>(args)...));
}
void setKeeperError(Coordination::Error code, std::string message)
{
setKeeperError(std::make_exception_ptr(zkutil::KeeperException::createDeprecated(message, code)), code, message);
}
template <typename... Args>
void setKeeperError(Coordination::Error code, fmt::format_string<Args...> fmt, Args &&... args)
{
setKeeperError(code, fmt::format(fmt, std::forward<Args>(args)...));
}
void stopRetries() { stop_retries = true; } void stopRetries() { stop_retries = true; }
bool isLastRetry() const { return total_failures >= retries_info.max_retries; } bool isLastRetry() const { return total_failures >= retries_info.max_retries; }