[4.2][NetStandby] Standby restore status support new scenarios

This commit is contained in:
obdev 2023-06-15 07:12:25 +00:00 committed by ob-robot
parent 683dd0a0f6
commit eb611c26b2
6 changed files with 82 additions and 31 deletions

View File

@ -48,7 +48,7 @@ namespace logservice
{
using namespace oceanbase::share;
const char *type_str[static_cast<int>(RestoreSyncStatus::MAX_RESTORE_SYNC_STATUS)] = {
const char *restore_comment_str[static_cast<int>(RestoreSyncStatus::MAX_RESTORE_SYNC_STATUS)] = {
"Invalid restore status",
" ",
"There is a gap between the log source and standby",
@ -58,9 +58,26 @@ const char *type_str[static_cast<int>(RestoreSyncStatus::MAX_RESTORE_SYNC_STATUS
"Log source is unreachable, the log source access point may be unavailable",
"Fetch log time out",
"Restore suspend, the standby has synchronized to recovery until scn",
"Standby binary version is lower than primary data version, standby need upgrade",
"Primary tenant has been dropped",
"Unexpected exceptions",
};
const char *restore_status_str[static_cast<int>(RestoreSyncStatus::MAX_RESTORE_SYNC_STATUS)] = {
"INVALID RESTORE STATUS",
"NORMAL",
"SOURCE HAS A GAP",
"STANDBY LOG NOT MATCH",
"STANDBY LOG NOT MATCH",
"CHECK USER OR PASSWORD",
"CHECK NETWORK",
"FETCH LOG TIMEOUT",
"RESTORE SUSPEND",
"STANDBY NEED UPGRADE",
"PRIMARY TENANT DROPPED",
"NOT AVAILABLE",
};
ObLogRestoreHandler::ObLogRestoreHandler() :
parent_(NULL),
context_(),
@ -920,7 +937,7 @@ int ObLogRestoreHandler::get_ls_restore_status_info(RestoreStatusInfo &restore_s
restore_status_info.err_code_ = ret_code;
restore_status_info.sync_lsn_ = lsn.val_;
restore_status_info.sync_scn_ = scn;
if (OB_FAIL(restore_status_info.comment_.assign_fmt("%s", type_str[int(restore_status_info.sync_status_)]))) {
if (OB_FAIL(restore_status_info.comment_.assign_fmt("%s", restore_comment_str[int(restore_status_info.sync_status_)]))) {
CLOG_LOG(WARN, "fail to assign comment", K(sync_status));
} else {
CLOG_LOG(TRACE, "success to get error code and message", K(restore_status_info));
@ -964,6 +981,14 @@ int ObLogRestoreHandler::get_err_code_and_message_(int ret_code,
else if (OB_TIMEOUT == ret_code && ObLogRestoreErrorContext::ErrorType::FETCH_LOG == error_type) {
sync_status = RestoreSyncStatus::RESTORE_SYNC_FETCH_LOG_TIME_OUT;
}
// RESTORE_SYNC_STANDBY_NEED_UPGRADE
else if (OB_ERR_RESTORE_STANDBY_VERSION_LAG == ret_code && ObLogRestoreErrorContext::ErrorType::FETCH_LOG == error_type) {
sync_status = RestoreSyncStatus::RESTORE_SYNC_STANDBY_NEED_UPGRADE;
}
// RESTORE_SYNC_PRIMARY_IS_DROPPED
else if (OB_ERR_RESTORE_PRIMARY_TENANT_DROPPED == ret_code && ObLogRestoreErrorContext::ErrorType::FETCH_LOG == error_type) {
sync_status = RestoreSyncStatus::RESTORE_SYNC_PRIMARY_IS_DROPPED;
}
// RESTORE_SYNC_NOT_AVAILABLE
else if (OB_SUCCESS != ret_code) {
sync_status = RestoreSyncStatus::RESTORE_SYNC_NOT_AVAILABLE;
@ -992,6 +1017,22 @@ void RestoreStatusInfo::reset()
comment_.reset();
}
int RestoreStatusInfo::restore_sync_status_to_string(char *str_buf, const int64_t str_len)
{
int ret = OB_SUCCESS;
const int64_t MAX_RESTORE_STATUS_STR_LEN = 32;
if (OB_ISNULL(str_buf)
|| str_len < MAX_RESTORE_STATUS_STR_LEN
|| sync_status_ <= RestoreSyncStatus::INVALID_RESTORE_SYNC_STATUS
|| sync_status_ >= RestoreSyncStatus::MAX_RESTORE_SYNC_STATUS) {
ret = OB_INVALID_ARGUMENT;
CLOG_LOG(WARN, "invalid restore status", K(sync_status_));
} else if (databuff_printf(str_buf, str_len, "%s", restore_status_str[int(sync_status_)])) {
CLOG_LOG(WARN, "databuff printf restore status str failed", K(sync_status_));
}
return ret;
}
bool RestoreStatusInfo::is_valid() const
{
return ls_id_ != share::ObLSID::INVALID_LS_ID

View File

@ -85,36 +85,12 @@ enum class RestoreSyncStatus {
RESTORE_SYNC_CHECK_NETWORK = 6,
RESTORE_SYNC_FETCH_LOG_TIME_OUT = 7,
RESTORE_SYNC_SUSPEND = 8,
RESTORE_SYNC_NOT_AVAILABLE = 9,
RESTORE_SYNC_STANDBY_NEED_UPGRADE = 9,
RESTORE_SYNC_PRIMARY_IS_DROPPED = 10,
RESTORE_SYNC_NOT_AVAILABLE = 11,
MAX_RESTORE_SYNC_STATUS
};
inline int restore_sync_status_to_string(const RestoreSyncStatus status, char *str_buf_, const int64_t str_len)
{
int ret = OB_SUCCESS;
if (RestoreSyncStatus::RESTORE_SYNC_NORMAL == status) {
strncpy(str_buf_, "NORMAL", str_len);
} else if (RestoreSyncStatus::RESTORE_SYNC_SOURCE_HAS_A_GAP == status) {
strncpy(str_buf_, "SOURCE HAS A GAP", str_len);
} else if (RestoreSyncStatus::RESTORE_SYNC_SUBMIT_LOG_NOT_MATCH == status
|| RestoreSyncStatus::RESTORE_SYNC_FETCH_LOG_NOT_MATCH == status) {
strncpy(str_buf_, "STANDBY LOG NOT MATCH", str_len);
} else if (RestoreSyncStatus::RESTORE_SYNC_CHECK_USER_OR_PASSWORD == status) {
strncpy(str_buf_, "CHECK USER OR PASSWORD", str_len);
} else if (RestoreSyncStatus::RESTORE_SYNC_CHECK_NETWORK == status) {
strncpy(str_buf_, "CHECK NETWORK", str_len);
} else if (RestoreSyncStatus::RESTORE_SYNC_FETCH_LOG_TIME_OUT == status) {
strncpy(str_buf_, "FETCH LOG TIMEOUT", str_len);
} else if (RestoreSyncStatus::RESTORE_SYNC_SUSPEND == status) {
strncpy(str_buf_, "RESTORE SUSPEND", str_len);
} else if (RestoreSyncStatus::RESTORE_SYNC_NOT_AVAILABLE == status) {
strncpy(str_buf_, "NOT AVAILABLE", str_len);
} else {
ret = OB_INVALID_ARGUMENT;
}
return ret;
}
struct RestoreStatusInfo
{
public:
@ -122,6 +98,7 @@ public:
~RestoreStatusInfo() { reset(); }
bool is_valid() const;
void reset();
int restore_sync_status_to_string(char *str_buf, const int64_t str_len);
TO_STRING_KV(K_(ls_id), K_(sync_lsn), K_(sync_scn), K_(sync_status), K_(err_code), K_(comment));
public:

View File

@ -174,8 +174,7 @@ int ObVirtualLSLogRestoreStatus::insert_ls_restore_status_info_(logservice::Rest
break;
}
case OB_APP_MIN_COLUMN_ID + 6: {
if (OB_FAIL(restore_sync_status_to_string(restore_status_info.sync_status_, restore_status_str_,
sizeof(restore_status_str_)))) {
if (OB_FAIL(restore_status_info.restore_sync_status_to_string(restore_status_str_, sizeof(restore_status_str_)))) {
SERVER_LOG(WARN, "restore_sync_status to string failed", K(restore_status_info));
} else {
cur_row_.cells_[i].set_varchar(ObString::make_string(restore_status_str_));

View File

@ -21909,6 +21909,30 @@ static const _error _error_OB_NO_TABLET_NEED_BACKUP = {
.oracle_str_error = "ORA-00600: internal error code, arguments: -9095, No tablet need backup",
.oracle_str_user_error = "ORA-00600: internal error code, arguments: -9095, No tablet need backup"
};
static const _error _error_OB_ERR_RESTORE_STANDBY_VERSION_LAG = {
.error_name = "OB_ERR_RESTORE_STANDBY_VERSION_LAG",
.error_cause = "Internal Error",
.error_solution = "Contact OceanBase Support",
.mysql_errno = -1,
.sqlstate = "HY000",
.str_error = "standby binary version is lower than primary data version, standby need upgrade",
.str_user_error = "standby binary version is lower than primary data version, standby need upgrade",
.oracle_errno = 600,
.oracle_str_error = "ORA-00600: internal error code, arguments: -9096, standby binary version is lower than primary data version, standby need upgrade",
.oracle_str_user_error = "ORA-00600: internal error code, arguments: -9096, standby binary version is lower than primary data version, standby need upgrade"
};
static const _error _error_OB_ERR_RESTORE_PRIMARY_TENANT_DROPPED = {
.error_name = "OB_ERR_RESTORE_PRIMARY_TENANT_DROPPED",
.error_cause = "Internal Error",
.error_solution = "Contact OceanBase Support",
.mysql_errno = -1,
.sqlstate = "HY000",
.str_error = "primary tenant has been dropped",
.str_user_error = "primary tenant has been dropped",
.oracle_errno = 600,
.oracle_str_error = "ORA-00600: internal error code, arguments: -9097, primary tenant has been dropped",
.oracle_str_user_error = "ORA-00600: internal error code, arguments: -9097, primary tenant has been dropped"
};
static const _error _error_OB_NO_SUCH_FILE_OR_DIRECTORY = {
.error_name = "OB_NO_SUCH_FILE_OR_DIRECTORY",
.error_cause = "Internal Error",
@ -26860,6 +26884,8 @@ struct ObStrErrorInit
_errors[-OB_RESTORE_LOG_TO_END] = &_error_OB_RESTORE_LOG_TO_END;
_errors[-OB_LS_RESTORE_FAILED] = &_error_OB_LS_RESTORE_FAILED;
_errors[-OB_NO_TABLET_NEED_BACKUP] = &_error_OB_NO_TABLET_NEED_BACKUP;
_errors[-OB_ERR_RESTORE_STANDBY_VERSION_LAG] = &_error_OB_ERR_RESTORE_STANDBY_VERSION_LAG;
_errors[-OB_ERR_RESTORE_PRIMARY_TENANT_DROPPED] = &_error_OB_ERR_RESTORE_PRIMARY_TENANT_DROPPED;
_errors[-OB_NO_SUCH_FILE_OR_DIRECTORY] = &_error_OB_NO_SUCH_FILE_OR_DIRECTORY;
_errors[-OB_FILE_OR_DIRECTORY_EXIST] = &_error_OB_FILE_OR_DIRECTORY_EXIST;
_errors[-OB_FILE_OR_DIRECTORY_PERMISSION_DENIED] = &_error_OB_FILE_OR_DIRECTORY_PERMISSION_DENIED;

View File

@ -2011,6 +2011,8 @@ DEFINE_ERROR(OB_ALREADY_IN_NOARCHIVE_MODE, -9092, -1, "HY000", "Already in NOARC
DEFINE_ERROR(OB_RESTORE_LOG_TO_END, -9093, -1, "HY000", "Restore log to end");
DEFINE_ERROR(OB_LS_RESTORE_FAILED, -9094, -1, "HY000", "Restore log stream failed");
DEFINE_ERROR(OB_NO_TABLET_NEED_BACKUP, -9095, -1, "HY000", "No tablet need backup");
DEFINE_ERROR(OB_ERR_RESTORE_STANDBY_VERSION_LAG, -9096, -1, "HY000", "standby binary version is lower than primary data version, standby need upgrade");
DEFINE_ERROR(OB_ERR_RESTORE_PRIMARY_TENANT_DROPPED, -9097, -1, "HY000", "primary tenant has been dropped");
// end of backup and restore error codes 9001 ~ 9099
////////////////////////////////////////////////////////////////

View File

@ -1491,6 +1491,8 @@ constexpr int OB_ALREADY_IN_NOARCHIVE_MODE = -9092;
constexpr int OB_RESTORE_LOG_TO_END = -9093;
constexpr int OB_LS_RESTORE_FAILED = -9094;
constexpr int OB_NO_TABLET_NEED_BACKUP = -9095;
constexpr int OB_ERR_RESTORE_STANDBY_VERSION_LAG = -9096;
constexpr int OB_ERR_RESTORE_PRIMARY_TENANT_DROPPED = -9097;
constexpr int OB_NO_SUCH_FILE_OR_DIRECTORY = -9100;
constexpr int OB_FILE_OR_DIRECTORY_EXIST = -9101;
constexpr int OB_FILE_OR_DIRECTORY_PERMISSION_DENIED = -9102;
@ -3576,6 +3578,8 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219;
#define OB_RESTORE_LOG_TO_END__USER_ERROR_MSG "Restore log to end"
#define OB_LS_RESTORE_FAILED__USER_ERROR_MSG "Restore log stream failed"
#define OB_NO_TABLET_NEED_BACKUP__USER_ERROR_MSG "No tablet need backup"
#define OB_ERR_RESTORE_STANDBY_VERSION_LAG__USER_ERROR_MSG "standby binary version is lower than primary data version, standby need upgrade"
#define OB_ERR_RESTORE_PRIMARY_TENANT_DROPPED__USER_ERROR_MSG "primary tenant has been dropped"
#define OB_NO_SUCH_FILE_OR_DIRECTORY__USER_ERROR_MSG "no such file or directory"
#define OB_FILE_OR_DIRECTORY_EXIST__USER_ERROR_MSG "file or directory already exist"
#define OB_FILE_OR_DIRECTORY_PERMISSION_DENIED__USER_ERROR_MSG "file or directory permission denied"
@ -5663,6 +5667,8 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219;
#define OB_RESTORE_LOG_TO_END__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -9093, Restore log to end"
#define OB_LS_RESTORE_FAILED__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -9094, Restore log stream failed"
#define OB_NO_TABLET_NEED_BACKUP__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -9095, No tablet need backup"
#define OB_ERR_RESTORE_STANDBY_VERSION_LAG__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -9096, standby binary version is lower than primary data version, standby need upgrade"
#define OB_ERR_RESTORE_PRIMARY_TENANT_DROPPED__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -9097, primary tenant has been dropped"
#define OB_NO_SUCH_FILE_OR_DIRECTORY__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -9100, no such file or directory"
#define OB_FILE_OR_DIRECTORY_EXIST__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -9101, file or directory already exist"
#define OB_FILE_OR_DIRECTORY_PERMISSION_DENIED__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -9102, file or directory permission denied"