[FEAT MERGE] ELR & WeakRead feature enhancement

This commit is contained in:
obdev
2022-12-27 05:08:57 +00:00
committed by ob-robot
parent 9f3038df4f
commit 5aed6bd3d8
61 changed files with 1664 additions and 142 deletions

View File

@ -60,26 +60,40 @@ int ObRoutePolicy::strong_sort_replicas(ObIArray<CandidateReplica>& candi_replic
return ret;
}
int ObRoutePolicy::filter_replica(ObIArray<CandidateReplica>& candi_replicas, ObRoutePolicyCtx &ctx)
int ObRoutePolicy::filter_replica(const ObLSID &ls_id,
ObIArray<CandidateReplica>& candi_replicas,
ObRoutePolicyCtx &ctx)
{
int ret = OB_SUCCESS;
ObRoutePolicyType policy_type = get_calc_route_policy_type(ctx);
for (int64_t i = 0; OB_SUCC(ret) && i < candi_replicas.count(); ++i) {
CandidateReplica &cur_replica = candi_replicas.at(i);
if ((policy_type == ONLY_READONLY_ZONE && cur_replica.attr_.zone_type_ == ZONE_TYPE_READWRITE)
|| cur_replica.attr_.zone_status_ == ObZoneStatus::INACTIVE
|| cur_replica.attr_.server_status_ != ObServerStatus::OB_SERVER_ACTIVE
|| cur_replica.attr_.start_service_time_ == 0
|| cur_replica.attr_.server_stop_time_ != 0
|| (0 == cur_replica.get_property().get_memstore_percent()
&& is_follower(cur_replica.get_role()))) { // 作为Follower的D副不能选择
cur_replica.is_filter_ = true;
bool can_read = true;
if (OB_FAIL(ObSqlTransControl::check_ls_readable(ctx.tenant_id_,
ls_id,
cur_replica.get_server(),
ctx.max_read_stale_time_,
can_read))) {
LOG_WARN("fail to check ls readable", K(ctx), K(cur_replica), K(ret));
} else {
LOG_TRACE("check ls readable", K(ctx), K(ls_id), K(cur_replica.get_server()), K(can_read));
if ((policy_type == ONLY_READONLY_ZONE && cur_replica.attr_.zone_type_ == ZONE_TYPE_READWRITE)
|| cur_replica.attr_.zone_status_ == ObZoneStatus::INACTIVE
|| cur_replica.attr_.server_status_ != ObServerStatus::OB_SERVER_ACTIVE
|| cur_replica.attr_.start_service_time_ == 0
|| cur_replica.attr_.server_stop_time_ != 0
|| (0 == cur_replica.get_property().get_memstore_percent()
&& is_follower(cur_replica.get_role()))// 作为Follower的D副不能选择
|| !can_read) {
cur_replica.is_filter_ = true;
}
}
}
return ret;
}
int ObRoutePolicy::calculate_replica_priority(ObIArray<CandidateReplica>& candi_replicas,
int ObRoutePolicy::calculate_replica_priority(const ObLSID &ls_id,
ObIArray<CandidateReplica>& candi_replicas,
ObRoutePolicyCtx &ctx)
{
int ret = OB_SUCCESS;
@ -88,7 +102,7 @@ int ObRoutePolicy::calculate_replica_priority(ObIArray<CandidateReplica>& candi_
LOG_WARN("not init", K(ret));
} else if (candi_replicas.count() <= 1) {//do nothing
} else if (WEAK == ctx.consistency_level_) {
if (OB_FAIL(filter_replica(candi_replicas, ctx))) {
if (OB_FAIL(filter_replica(ls_id, candi_replicas, ctx))) {
LOG_WARN("fail to filter replicas", K(candi_replicas), K(ctx), K(ret));
} else if (OB_FAIL(weak_sort_replicas(candi_replicas, ctx))) {
LOG_WARN("fail to sort replicas", K(candi_replicas), K(ctx), K(ret));
@ -219,7 +233,7 @@ int ObRoutePolicy::select_replica_with_priority(const ObRoutePolicyCtx &route_po
bool same_priority = true;
ReplicaAttribute priority_attr;
for (int64_t i = 0; OB_SUCC(ret) && same_priority && i < replica_array.count(); ++i) {
if (replica_array.at(i).is_usable()) {
if (replica_array.at(i).is_usable()/*+满足max_read_stale_time事务延迟*/) {
if (has_found) {
if (priority_attr == replica_array.at(i).attr_) {
if (OB_FAIL(phy_part_loc_info.add_priority_replica_idx(i))) {