Add leader replica only when all replicas are in blacklist

This commit is contained in:
pe-99y
2023-11-13 08:09:12 +00:00
committed by ob-robot
parent 1bdb13ec4a
commit 3ee313de9c

View File

@ -68,8 +68,12 @@ int ObOptTabletLoc::assign_with_only_readable_replica(const ObObjectID &partitio
first_level_part_id_ = first_level_part_id; first_level_part_id_ = first_level_part_id;
tablet_id_ = tablet_id; tablet_id_ = tablet_id;
ls_id_ = ls_location.get_ls_id(); ls_id_ = ls_location.get_ls_id();
int64_t leader_replica_idx = OB_INVALID_INDEX;
for (int64_t i = 0; OB_SUCC(ret) && i < ls_location.get_replica_locations().count(); ++i) { for (int64_t i = 0; OB_SUCC(ret) && i < ls_location.get_replica_locations().count(); ++i) {
const ObLSReplicaLocation &replica_loc = ls_location.get_replica_locations().at(i); const ObLSReplicaLocation &replica_loc = ls_location.get_replica_locations().at(i);
if (replica_loc.is_strong_leader()) {
leader_replica_idx = i;
}
if (ObReplicaTypeCheck::is_readable_replica(replica_loc.get_replica_type())) { if (ObReplicaTypeCheck::is_readable_replica(replica_loc.get_replica_type())) {
transaction::ObBLKey bl_key; transaction::ObBLKey bl_key;
bool in_black_list = false; bool in_black_list = false;
@ -77,7 +81,7 @@ int ObOptTabletLoc::assign_with_only_readable_replica(const ObObjectID &partitio
LOG_WARN("init black list key failed", K(ret)); LOG_WARN("init black list key failed", K(ret));
} else if (OB_FAIL(ObBLService::get_instance().check_in_black_list(bl_key, in_black_list))) { } else if (OB_FAIL(ObBLService::get_instance().check_in_black_list(bl_key, in_black_list))) {
LOG_WARN("check in black list failed", K(ret)); LOG_WARN("check in black list failed", K(ret));
} else if (!in_black_list || replica_loc.is_strong_leader()) { } else if (!in_black_list) {
if (OB_FAIL(replica_locations_.push_back(replica_loc))) { if (OB_FAIL(replica_locations_.push_back(replica_loc))) {
LOG_WARN("Failed to push back replica locations", LOG_WARN("Failed to push back replica locations",
K(ret), K(i), K(replica_loc), K(replica_locations_)); K(ret), K(i), K(replica_loc), K(replica_locations_));
@ -87,6 +91,17 @@ int ObOptTabletLoc::assign_with_only_readable_replica(const ObObjectID &partitio
} }
} }
} }
// all replicas are in blacklist, add leader replica forcibly.
if (OB_SUCC(ret) && 0 == replica_locations_.count()) {
if (OB_INVALID_INDEX == leader_replica_idx) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected invalid index", K(ret));
} else if (OB_FAIL(replica_locations_.push_back(ls_location.get_replica_locations().at(leader_replica_idx)))) {
LOG_WARN("failed to push back leader replica", K(ret));
}
}
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {
if (OB_UNLIKELY(0 == replica_locations_.count())) { if (OB_UNLIKELY(0 == replica_locations_.count())) {
ret = OB_NO_READABLE_REPLICA; ret = OB_NO_READABLE_REPLICA;