[Election] optimize election accept response message size
This commit is contained in:
@ -246,7 +246,7 @@ int ElectionProposer::register_renew_lease_task_()
|
||||
} else if (role_ != ObRole::LEADER) {
|
||||
LOG_RENEW_LEASE(ERROR, "unexpected role status");
|
||||
} else if (OB_UNLIKELY(leader_revoke_if_lease_expired_(RoleChangeReason::LeaseExpiredToRevoke))) {
|
||||
LOG_RENEW_LEASE(ERROR, "leader lease expired, leader revoked");
|
||||
LOG_RENEW_LEASE(WARN, "leader lease expired, leader revoked");
|
||||
} else if (prepare_success_ballot_ != ballot_number_) {// 需要进行leader prepare推大用于续约的ballot number
|
||||
LOG_RENEW_LEASE(INFO, "prepare_success_ballot_ not same as ballot_number_, maybe in Leader Prepare phase, gie up renew lease this time");
|
||||
} else {
|
||||
|
||||
@ -22,6 +22,7 @@
|
||||
#include "logservice/palf/election/algorithm/election_proposer.h"
|
||||
#include "logservice/palf/election/utils/election_args_checker.h"
|
||||
#include "logservice/palf/election/utils/election_common_define.h"
|
||||
#include "observer/ob_server.h"
|
||||
|
||||
namespace oceanbase
|
||||
{
|
||||
@ -33,6 +34,18 @@ namespace election
|
||||
using namespace common;
|
||||
using namespace share;
|
||||
|
||||
void CompatHelper::set_msg_flag_not_less_than_4_2(const ElectionMsgBase &msg) {
|
||||
ElectionMsgBase &cast_msg = const_cast<ElectionMsgBase &>(msg);
|
||||
cast_msg.msg_type_ |= BIT_MASK_NOT_LESS_THAN_4_2;
|
||||
}
|
||||
|
||||
bool CompatHelper::fetch_msg_flag_not_less_than_4_2(const ElectionMsgBase &msg) {
|
||||
ElectionMsgBase &cast_msg = const_cast<ElectionMsgBase &>(msg);
|
||||
bool ret = (cast_msg.msg_type_ & BIT_MASK_NOT_LESS_THAN_4_2);
|
||||
cast_msg.msg_type_ &= ~BIT_MASK_NOT_LESS_THAN_4_2;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// this is important debug info when meet Lease Expired ERROR! which is a high frequecy error in election
|
||||
void print_debug_ts_if_reach_warn_threshold(const ElectionMsgBase &msg, const int64_t warn_threshold)
|
||||
{
|
||||
@ -227,7 +240,9 @@ const Lease &ElectionPrepareResponseMsgMiddle::get_lease() const { return lease_
|
||||
ElectionAcceptRequestMsgMiddle::ElectionAcceptRequestMsgMiddle() :
|
||||
ElectionMsgBase(),
|
||||
lease_start_ts_on_proposer_(0),
|
||||
lease_interval_(0) {}
|
||||
lease_interval_(0),
|
||||
membership_version_(),
|
||||
flag_not_less_than_4_2_(false) {}
|
||||
|
||||
ElectionMsgDebugTs ElectionPrepareResponseMsgMiddle::get_request_debug_ts() const { return request_debug_ts_; }
|
||||
|
||||
@ -245,13 +260,16 @@ ElectionMsgBase(id,
|
||||
ElectionMsgType::ACCEPT_REQUEST),
|
||||
lease_start_ts_on_proposer_(lease_start_ts_on_proposer),
|
||||
lease_interval_(lease_interval),
|
||||
membership_version_(membership_version) {}
|
||||
membership_version_(membership_version),
|
||||
flag_not_less_than_4_2_(!observer::ObServer::get_instance().is_arbitration_mode() && GET_MIN_CLUSTER_VERSION() >= CLUSTER_VERSION_4_2_0_0) {}
|
||||
|
||||
int64_t ElectionAcceptRequestMsgMiddle::get_lease_start_ts_on_proposer() const
|
||||
{
|
||||
return lease_start_ts_on_proposer_;
|
||||
}
|
||||
|
||||
LogConfigVersion ElectionAcceptRequestMsgMiddle::get_membership_version() const { return membership_version_; }
|
||||
|
||||
int64_t ElectionAcceptRequestMsgMiddle::get_lease_interval() const { return lease_interval_; }
|
||||
|
||||
ElectionAcceptResponseMsgMiddle::ElectionAcceptResponseMsgMiddle() :
|
||||
@ -260,12 +278,12 @@ lease_started_ts_on_proposer_(0),
|
||||
lease_interval_(0),
|
||||
accepted_(false),
|
||||
is_buffer_valid_(false),
|
||||
inner_priority_seed_(static_cast<uint64_t>(PRIORITY_SEED_BIT::DEFAULT_SEED))
|
||||
{
|
||||
memset(priority_buffer_, 0, PRIORITY_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
LogConfigVersion ElectionAcceptRequestMsgMiddle::get_membership_version() const { return membership_version_; }
|
||||
inner_priority_seed_(static_cast<uint64_t>(PRIORITY_SEED_BIT::DEFAULT_SEED)),
|
||||
responsed_membership_version_(),
|
||||
membership_version_(),
|
||||
request_debug_ts_(),
|
||||
fixed_buffer_(priority_buffer_),
|
||||
flag_not_less_than_4_2_(false) {}
|
||||
|
||||
ElectionAcceptResponseMsgMiddle::
|
||||
ElectionAcceptResponseMsgMiddle(const ObAddr &self_addr,
|
||||
@ -283,10 +301,11 @@ accepted_(false),
|
||||
is_buffer_valid_(false),
|
||||
inner_priority_seed_(inner_priority_seed),
|
||||
responsed_membership_version_(request.get_membership_version()),
|
||||
membership_version_(membership_version)
|
||||
{
|
||||
membership_version_(membership_version),
|
||||
request_debug_ts_(),
|
||||
fixed_buffer_(priority_buffer_),
|
||||
flag_not_less_than_4_2_(request.not_less_than_4_2()) {
|
||||
set_receiver(request.get_sender());
|
||||
memset(priority_buffer_, 0, PRIORITY_BUFFER_SIZE);
|
||||
request_debug_ts_ = request.get_debug_ts();
|
||||
}
|
||||
|
||||
@ -298,11 +317,12 @@ int ElectionAcceptResponseMsgMiddle::set_accepted(const int64_t ballot_number,
|
||||
accepted_ = true;
|
||||
int64_t pos = 0;
|
||||
if (OB_NOT_NULL(priority)) {
|
||||
if (CLICK_FAIL(priority->serialize((char*)priority_buffer_, PRIORITY_BUFFER_SIZE, pos))) {
|
||||
if (CLICK_FAIL(priority->serialize((char*)fixed_buffer_.priority_buffer_, PRIORITY_BUFFER_SIZE, pos))) {
|
||||
ELECT_LOG(ERROR, "fail to serialize priority");
|
||||
} else {
|
||||
is_buffer_valid_ = true;
|
||||
}
|
||||
fixed_buffer_.buffer_used_size_ = pos;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@ -355,6 +375,54 @@ LogConfigVersion ElectionChangeLeaderMsgMiddle::get_membership_version() const {
|
||||
|
||||
int64_t ElectionChangeLeaderMsgMiddle::get_old_ballot_number() const { return switch_source_leader_ballot_; }
|
||||
|
||||
|
||||
#define OLD_SERIALIZE_MEMBER_LIST lease_started_ts_on_proposer_, lease_interval_, reserved_flag_,\
|
||||
accepted_, is_buffer_valid_, responsed_membership_version_, membership_version_,\
|
||||
request_debug_ts_, priority_buffer_, inner_priority_seed_
|
||||
#define NEW_SERIALIZE_MEMBER_LIST lease_started_ts_on_proposer_, lease_interval_,\
|
||||
accepted_, is_buffer_valid_, responsed_membership_version_, membership_version_,\
|
||||
request_debug_ts_, fixed_buffer_, inner_priority_seed_
|
||||
OB_UNIS_SERIALIZE(ElectionAcceptResponseMsgMiddle);
|
||||
OB_UNIS_DESERIALIZE(ElectionAcceptResponseMsgMiddle);
|
||||
OB_UNIS_SERIALIZE_SIZE(ElectionAcceptResponseMsgMiddle);
|
||||
int ElectionAcceptResponseMsgMiddle::serialize_(char* buf, const int64_t buf_len, int64_t& pos) const {
|
||||
int ret = ElectionMsgBase::serialize(buf, buf_len, pos);
|
||||
if (OB_SUCC(ret)) {
|
||||
if (flag_not_less_than_4_2_) {
|
||||
LST_DO_CODE(OB_UNIS_ENCODE, NEW_SERIALIZE_MEMBER_LIST);
|
||||
} else {
|
||||
LST_DO_CODE(OB_UNIS_ENCODE, OLD_SERIALIZE_MEMBER_LIST);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int ElectionAcceptResponseMsgMiddle::deserialize_(const char* buf, const int64_t data_len, int64_t& pos) {
|
||||
int ret = ElectionMsgBase::deserialize(buf, data_len, pos);
|
||||
flag_not_less_than_4_2_ = CompatHelper::fetch_msg_flag_not_less_than_4_2(*this);
|
||||
if (OB_SUCC(ret)) {
|
||||
if (flag_not_less_than_4_2_) {
|
||||
LST_DO_CODE(OB_UNIS_DECODE, NEW_SERIALIZE_MEMBER_LIST);
|
||||
} else {
|
||||
LST_DO_CODE(OB_UNIS_DECODE, OLD_SERIALIZE_MEMBER_LIST);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int64_t ElectionAcceptResponseMsgMiddle::get_serialize_size_(void) const {
|
||||
if (flag_not_less_than_4_2_) {
|
||||
CompatHelper::set_msg_flag_not_less_than_4_2(*this);
|
||||
}
|
||||
int64_t len = ElectionMsgBase::get_serialize_size();
|
||||
if (flag_not_less_than_4_2_) {
|
||||
LST_DO_CODE(OB_UNIS_ADD_LEN, NEW_SERIALIZE_MEMBER_LIST);
|
||||
} else {
|
||||
LST_DO_CODE(OB_UNIS_ADD_LEN, OLD_SERIALIZE_MEMBER_LIST);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
#undef NEW_SERIALIZE_MEMBER_LIST
|
||||
#undef OLD_SERIALIZE_MEMBER_LIST
|
||||
|
||||
}// namespace election
|
||||
}// namespace palf
|
||||
}// namesapce oceanbase
|
||||
|
||||
@ -16,10 +16,13 @@
|
||||
#include "common/ob_clock_generator.h"
|
||||
#include "lib/net/ob_addr.h"
|
||||
#include "lib/ob_define.h"
|
||||
#include "lib/ob_errno.h"
|
||||
#include "lib/oblog/ob_log_module.h"
|
||||
#include "lib/oblog/ob_log_time_fmt.h"
|
||||
#include "lib/utility/ob_macro_utils.h"
|
||||
#include "lib/utility/ob_unify_serialize.h"
|
||||
#include "lib/utility/serialization.h"
|
||||
#include "logservice/palf/election/utils/election_common_define.h"
|
||||
#include "logservice/palf/election/utils/election_utils.h"
|
||||
#include "logservice/palf/election/interface/election_priority.h"
|
||||
#include "logservice/palf/election/interface/election.h"
|
||||
@ -31,6 +34,12 @@ namespace palf
|
||||
namespace election
|
||||
{
|
||||
|
||||
struct CompatHelper {
|
||||
static constexpr int64_t BIT_MASK_NOT_LESS_THAN_4_2 = (1LL << 63);// this bit is used for mark message needed seralized in lazy-mode, and for compat reason
|
||||
static void set_msg_flag_not_less_than_4_2(const ElectionMsgBase &msg);
|
||||
static bool fetch_msg_flag_not_less_than_4_2(const ElectionMsgBase &msg);
|
||||
};
|
||||
|
||||
struct ElectionMsgDebugTs
|
||||
{
|
||||
OB_UNIS_VERSION(1);
|
||||
@ -59,6 +68,7 @@ void print_debug_ts_if_reach_warn_threshold(const ElectionMsgBase &msg, const in
|
||||
|
||||
class ElectionMsgBase
|
||||
{
|
||||
friend class CompatHelper;
|
||||
OB_UNIS_VERSION(1);
|
||||
public:
|
||||
ElectionMsgBase();// default constructor is required by deserialization, but not actually worked
|
||||
@ -221,13 +231,15 @@ public:
|
||||
int64_t get_lease_start_ts_on_proposer() const;
|
||||
int64_t get_lease_interval() const;
|
||||
LogConfigVersion get_membership_version() const;
|
||||
bool not_less_than_4_2() const { return flag_not_less_than_4_2_; }
|
||||
#define BASE "BASE", *(static_cast<const ElectionMsgBase*>(this))
|
||||
TO_STRING_KV(BASE, K_(lease_start_ts_on_proposer), K_(lease_interval), K_(membership_version));
|
||||
#undef BASE
|
||||
private:
|
||||
protected:
|
||||
int64_t lease_start_ts_on_proposer_;
|
||||
int64_t lease_interval_;
|
||||
LogConfigVersion membership_version_;
|
||||
bool flag_not_less_than_4_2_;
|
||||
};
|
||||
OB_SERIALIZE_MEMBER_TEMP(inline, (ElectionAcceptRequestMsgMiddle, ElectionMsgBase),
|
||||
lease_start_ts_on_proposer_, lease_interval_, membership_version_);
|
||||
@ -251,6 +263,7 @@ public:
|
||||
if (OB_FAIL(ElectionAcceptRequestMsgMiddle::deserialize(buf, data_len, pos))) {
|
||||
ELECT_LOG(WARN, "deserialize failed", KR(ret));
|
||||
}
|
||||
flag_not_less_than_4_2_ = CompatHelper::fetch_msg_flag_not_less_than_4_2(*this);
|
||||
debug_ts_.dest_deserialize_ts_ = ObClockGenerator::getRealClock();
|
||||
print_debug_ts_if_reach_warn_threshold(*this, MSG_DELAY_WARN_THRESHOLD);
|
||||
return ret;
|
||||
@ -260,10 +273,57 @@ public:
|
||||
const_cast<int64_t&>(debug_ts_.src_serialize_ts_) = ObClockGenerator::getRealClock();
|
||||
print_debug_ts_if_reach_warn_threshold(*this, MSG_DELAY_WARN_THRESHOLD);
|
||||
}
|
||||
if (flag_not_less_than_4_2_) {
|
||||
CompatHelper::set_msg_flag_not_less_than_4_2(*this);
|
||||
}
|
||||
return ElectionAcceptRequestMsgMiddle::get_serialize_size();
|
||||
}
|
||||
};
|
||||
|
||||
struct ElectionPriorityAdaptivedSerializationBuffer
|
||||
{
|
||||
ElectionPriorityAdaptivedSerializationBuffer(unsigned char *buf)
|
||||
: priority_buffer_(buf), buffer_used_size_(0) { memset(priority_buffer_, 0, PRIORITY_BUFFER_SIZE); }
|
||||
int serialize(char *buf, const int64_t buf_len, int64_t &pos) const {// serialize all buffer
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_FAIL(serialization::encode(buf, buf_len, pos, buffer_used_size_))) {
|
||||
ELECT_LOG(ERROR, "fail to serialize buffer size", K(pos), KR(ret), K_(buffer_used_size));
|
||||
} else {
|
||||
for (int64_t idx = 0; idx < buffer_used_size_ && OB_SUCC(ret); ++idx) {
|
||||
if (OB_FAIL(serialization::encode(buf, buf_len, pos, priority_buffer_[idx]))) {
|
||||
ELECT_LOG(ERROR, "fail to serialize buffer", K(idx), K(pos), KR(ret), K_(buffer_used_size));
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int deserialize(const char *buf, const int64_t buf_len, int64_t &pos) {
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_FAIL(serialization::decode(buf, buf_len, pos, buffer_used_size_))) {
|
||||
ELECT_LOG(ERROR, "fail to serialize buffer size", K(pos), KR(ret), K_(buffer_used_size));
|
||||
} else if (buffer_used_size_ > PRIORITY_BUFFER_SIZE) {
|
||||
ret = OB_SIZE_OVERFLOW;
|
||||
ELECT_LOG(ERROR, "too big deserialized buffer size", K(pos), KR(ret), K_(buffer_used_size));
|
||||
} else {
|
||||
for (int64_t idx = 0; idx < buffer_used_size_ && OB_SUCC(ret); ++idx) {
|
||||
if (OB_FAIL(serialization::decode(buf, buf_len, pos, priority_buffer_[idx]))) {
|
||||
ELECT_LOG(ERROR, "fail to serialize buffer", K(idx), K(pos), KR(ret), K_(buffer_used_size));
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int64_t get_serialize_size() const {
|
||||
int64_t size = 0;
|
||||
size += serialization::encoded_length(buffer_used_size_);
|
||||
for (int64_t idx =0; idx < buffer_used_size_; ++idx) {
|
||||
size += serialization::encoded_length(priority_buffer_[idx]);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
unsigned char *priority_buffer_;
|
||||
int64_t buffer_used_size_;
|
||||
};
|
||||
class ElectionAcceptResponseMsgMiddle : public ElectionMsgBase
|
||||
{
|
||||
OB_UNIS_VERSION(1);
|
||||
@ -286,14 +346,14 @@ public:
|
||||
ElectionMsgDebugTs get_request_debug_ts() const;
|
||||
#define BASE "BASE", *(static_cast<const ElectionMsgBase*>(this))
|
||||
TO_STRING_KV(BASE, K_(lease_started_ts_on_proposer), K_(lease_interval),
|
||||
KTIMERANGE_(process_request_ts, MINUTE, USECOND), K_(accepted),
|
||||
K_(reserved_flag), K_(accepted), K_(flag_not_less_than_4_2),
|
||||
K_(is_buffer_valid), K_(responsed_membership_version), K_(inner_priority_seed),
|
||||
K_(membership_version), K_(request_debug_ts));
|
||||
#undef BASE
|
||||
protected:
|
||||
int64_t lease_started_ts_on_proposer_;
|
||||
int64_t lease_interval_;
|
||||
int64_t process_request_ts_;
|
||||
int64_t reserved_flag_;
|
||||
bool accepted_;
|
||||
bool is_buffer_valid_;
|
||||
uint64_t inner_priority_seed_;
|
||||
@ -301,11 +361,9 @@ protected:
|
||||
LogConfigVersion membership_version_;
|
||||
ElectionMsgDebugTs request_debug_ts_;
|
||||
unsigned char priority_buffer_[PRIORITY_BUFFER_SIZE];
|
||||
ElectionPriorityAdaptivedSerializationBuffer fixed_buffer_;
|
||||
bool flag_not_less_than_4_2_;
|
||||
};
|
||||
OB_SERIALIZE_MEMBER_TEMP(inline, (ElectionAcceptResponseMsgMiddle, ElectionMsgBase),
|
||||
lease_started_ts_on_proposer_, lease_interval_, process_request_ts_,
|
||||
accepted_, is_buffer_valid_, responsed_membership_version_, membership_version_,
|
||||
request_debug_ts_, priority_buffer_, inner_priority_seed_);
|
||||
|
||||
// design wrapper class to record serialize/deserialize time, for debugging
|
||||
class ElectionAcceptResponseMsg : public ElectionAcceptResponseMsgMiddle
|
||||
|
||||
Reference in New Issue
Block a user