Files
oceanbase/src/clog/ob_log_define.cpp
2021-09-02 15:26:40 +08:00

153 lines
6.1 KiB
C++

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#include "ob_log_define.h"
#include "lib/utility/serialization.h"
#include "observer/omt/ob_tenant_config_mgr.h"
#include "lib/compress/ob_compressor_pool.h"
namespace oceanbase {
using namespace common;
namespace clog {
DEFINE_SERIALIZE(ObLogCursorExt)
{
int ret = OB_SUCCESS;
int64_t new_pos = pos;
if (NULL == buf || buf_len <= 0) {
ret = OB_INVALID_ARGUMENT;
CLOG_LOG(ERROR, "invalid arguments", K(ret), KP(buf), K(buf_len));
} else if (OB_SUCCESS != serialization::encode_i32(buf, buf_len, new_pos, file_id_) ||
OB_SUCCESS != serialization::encode_i32(buf, buf_len, new_pos, offset_) ||
OB_SUCCESS != serialization::encode_i32(buf, buf_len, new_pos, size_) ||
OB_SUCCESS != serialization::encode_i32(buf, buf_len, new_pos, padding_flag_) ||
OB_SUCCESS != serialization::encode_i64(buf, buf_len, new_pos, acc_cksm_) ||
OB_SUCCESS != serialization::encode_i64(buf, buf_len, new_pos, submit_timestamp_)) {
ret = OB_SERIALIZE_ERROR;
CLOG_LOG(ERROR, "serialize failed", K(ret), KP(buf), K(buf_len), K(pos), K(new_pos));
} else {
pos = new_pos;
}
return ret;
}
DEFINE_DESERIALIZE(ObLogCursorExt)
{
int ret = OB_SUCCESS;
int64_t new_pos = pos;
int32_t tmp_file_id = 0;
if (NULL == buf || data_len <= 0) {
ret = OB_INVALID_ARGUMENT;
CLOG_LOG(ERROR, "invalid arguments", K(ret), KP(buf), K(data_len));
} else if (OB_SUCCESS != serialization::decode_i32(buf, data_len, new_pos, &tmp_file_id) ||
OB_SUCCESS != serialization::decode_i32(buf, data_len, new_pos, &offset_) ||
OB_SUCCESS != serialization::decode_i32(buf, data_len, new_pos, &size_) ||
OB_SUCCESS != serialization::decode_i32(buf, data_len, new_pos, &padding_flag_) ||
OB_SUCCESS != serialization::decode_i64(buf, data_len, new_pos, &acc_cksm_) ||
OB_SUCCESS != serialization::decode_i64(buf, data_len, new_pos, &submit_timestamp_)) {
ret = OB_SERIALIZE_ERROR;
CLOG_LOG(ERROR, "deserialize failed", K(ret), KP(buf), K(data_len), K(pos), K(new_pos));
} else {
pos = new_pos;
file_id_ = static_cast<file_id_t>(tmp_file_id);
}
return ret;
}
DEFINE_GET_SERIALIZE_SIZE(ObLogCursorExt)
{
int64_t size = 0;
size += serialization::encoded_length_i32(file_id_);
size += serialization::encoded_length_i32(offset_);
size += serialization::encoded_length_i32(size_);
size += serialization::encoded_length_i32(padding_flag_);
size += serialization::encoded_length_i64(acc_cksm_);
size += serialization::encoded_length_i64(submit_timestamp_);
return size;
}
void ObPGLogArchiveStatus::reset()
{
status_ = share::ObLogArchiveStatus::INVALID;
round_start_ts_ = OB_INVALID_TIMESTAMP;
round_start_log_id_ = OB_INVALID_ID;
round_snapshot_version_ = OB_INVALID_TIMESTAMP;
round_log_submit_ts_ = OB_INVALID_TIMESTAMP;
round_clog_epoch_id_ = OB_INVALID_TIMESTAMP;
round_accum_checksum_ = 0;
archive_incarnation_ = 0;
log_archive_round_ = 0;
last_archived_log_id_ = OB_INVALID_ID;
last_archived_checkpoint_ts_ = OB_INVALID_TIMESTAMP;
last_archived_log_submit_ts_ = OB_INVALID_TIMESTAMP;
clog_epoch_id_ = OB_INVALID_TIMESTAMP;
accum_checksum_ = 0;
cur_piece_id_ = share::OB_BACKUP_INVALID_PIECE_ID;
}
bool ObPGLogArchiveStatus::is_valid_for_clog_info()
{
return (share::ObLogArchiveStatus::INVALID != status_ && archive_incarnation_ > 0 && log_archive_round_ > 0 &&
OB_INVALID_ID != round_start_log_id_ && 0 != round_start_log_id_ &&
OB_INVALID_TIMESTAMP != round_snapshot_version_ && OB_INVALID_TIMESTAMP != round_log_submit_ts_ &&
0 <= round_clog_epoch_id_ && OB_INVALID_ID != last_archived_log_id_ &&
OB_INVALID_TIMESTAMP != last_archived_log_submit_ts_ &&
OB_INVALID_TIMESTAMP != last_archived_checkpoint_ts_ && clog_epoch_id_ >= 0 && 0 <= cur_piece_id_ &&
(share::OB_BACKUP_INVALID_PIECE_ID != cur_piece_id_));
}
bool ObPGLogArchiveStatus::is_round_start_info_valid()
{
return (share::ObLogArchiveStatus::INVALID != status_ && OB_INVALID_TIMESTAMP != round_start_ts_ &&
OB_INVALID_ID != round_start_log_id_ && 0 != round_start_log_id_ &&
OB_INVALID_TIMESTAMP != round_snapshot_version_ && OB_INVALID_TIMESTAMP != round_log_submit_ts_ &&
0 <= round_clog_epoch_id_);
}
bool ObPGLogArchiveStatus::operator<(const ObPGLogArchiveStatus& other)
{
bool b_ret = false;
if (archive_incarnation_ < other.archive_incarnation_) {
b_ret = true;
} else if (archive_incarnation_ > other.archive_incarnation_) {
b_ret = false;
} else if (log_archive_round_ < other.log_archive_round_) {
b_ret = true;
} else if (log_archive_round_ > other.log_archive_round_) {
b_ret = false;
} else if (is_stopped()) {
b_ret = false;
} else if (other.is_stopped()) {
b_ret = true;
} else if (is_interrupted()) {
b_ret = false;
} else if (other.is_interrupted()) {
b_ret = true;
// TODO: not consider log_submit_ts temporarily
} else if (last_archived_log_id_ < other.last_archived_log_id_ ||
last_archived_checkpoint_ts_ < other.last_archived_checkpoint_ts_) {
b_ret = true;
} else {
b_ret = false;
}
return b_ret;
}
OB_SERIALIZE_MEMBER(ObPGLogArchiveStatus, status_, round_start_ts_, round_start_log_id_, round_snapshot_version_,
round_log_submit_ts_, round_clog_epoch_id_, round_accum_checksum_, archive_incarnation_, log_archive_round_,
last_archived_log_id_, last_archived_checkpoint_ts_, last_archived_log_submit_ts_, clog_epoch_id_, accum_checksum_,
cur_piece_id_);
} // namespace clog
} // namespace oceanbase