diff --git a/contrib/client-c b/contrib/client-c index 407aea90a26..beb13864492 160000 --- a/contrib/client-c +++ b/contrib/client-c @@ -1 +1 @@ -Subproject commit 407aea90a26f4a03a63f0b620c801e5685fa4858 +Subproject commit beb138644928fbc4260ba5a374db96afa9aae2c9 diff --git a/contrib/kvproto b/contrib/kvproto index a5af800ca2e..d677e6fd224 160000 --- a/contrib/kvproto +++ b/contrib/kvproto @@ -1 +1 @@ -Subproject commit a5af800ca2efb06e3c1dad87294fa6fd21712c0c +Subproject commit d677e6fd224a9c59ff6b3e29426fc8818ebebfbd diff --git a/dbms/src/Storages/Transaction/ApplySnapshot.cpp b/dbms/src/Storages/Transaction/ApplySnapshot.cpp index b9415ccfe7d..754d29d8d78 100644 --- a/dbms/src/Storages/Transaction/ApplySnapshot.cpp +++ b/dbms/src/Storages/Transaction/ApplySnapshot.cpp @@ -132,8 +132,6 @@ static const metapb::Peer & findPeer(const metapb::Region & region, UInt64 peer_ { if (peer.id() == peer_id) { - if (!peer.is_learner()) - throw Exception(std::string(__PRETTY_FUNCTION__) + ": peer is not learner, should not happen", ErrorCodes::LOGICAL_ERROR); return peer; } } diff --git a/dbms/src/Storages/Transaction/Region.cpp b/dbms/src/Storages/Transaction/Region.cpp index 94c5c5a946e..3067e8f0022 100644 --- a/dbms/src/Storages/Transaction/Region.cpp +++ b/dbms/src/Storages/Transaction/Region.cpp @@ -112,11 +112,13 @@ RegionPtr Region::splitInto(RegionMeta && meta) void RegionRaftCommandDelegate::execChangePeer( const raft_cmdpb::AdminRequest & request, const raft_cmdpb::AdminResponse & response, const UInt64 index, const UInt64 term) { - const auto & change_peer_request = request.change_peer(); - - LOG_INFO(log, toString(false) << " execute change peer type: " << eraftpb::ConfChangeType_Name(change_peer_request.change_type())); - + LOG_INFO(log, + toString(false) << " execute change peer cmd {" + << (request.has_change_peer_v2() ? request.change_peer_v2().ShortDebugString() + : request.change_peer().ShortDebugString()) + << "}"); meta.makeRaftCommandDelegate().execChangePeer(request, response, index, term); + LOG_INFO(log, "After execute change peer cmd, current region info: "; getDebugString(oss_internal_rare)); } static const metapb::Peer & findPeer(const metapb::Region & region, UInt64 store_id) @@ -500,8 +502,6 @@ void Region::assignRegion(Region && new_region) meta.notifyAll(); } -bool Region::isPeerRemoved() const { return meta.isPeerRemoved(); } - void Region::compareAndCompleteSnapshot(HandleMap & handle_map, const Timestamp safe_point) { std::unique_lock lock(mutex); diff --git a/dbms/src/Storages/Transaction/Region.h b/dbms/src/Storages/Transaction/Region.h index 161ef1411bc..3ff431e2d90 100644 --- a/dbms/src/Storages/Transaction/Region.h +++ b/dbms/src/Storages/Transaction/Region.h @@ -112,7 +112,6 @@ class Region : public std::enable_shared_from_this bool isPendingRemove() const; void setPendingRemove(); - bool isPeerRemoved() const; raft_serverpb::PeerState peerState() const; bool isMerging() const; diff --git a/dbms/src/Storages/Transaction/RegionMeta.cpp b/dbms/src/Storages/Transaction/RegionMeta.cpp index 963f0bad762..cc435ca7b93 100644 --- a/dbms/src/Storages/Transaction/RegionMeta.cpp +++ b/dbms/src/Storages/Transaction/RegionMeta.cpp @@ -196,36 +196,14 @@ void RegionMeta::assignRegionMeta(RegionMeta && rhs) } void MetaRaftCommandDelegate::execChangePeer( - const raft_cmdpb::AdminRequest & request, const raft_cmdpb::AdminResponse & response, UInt64 index, UInt64 term) + const raft_cmdpb::AdminRequest &, const raft_cmdpb::AdminResponse & response, UInt64 index, UInt64 term) { std::lock_guard lock(mutex); - const auto & change_peer_request = request.change_peer(); const auto & new_region = response.change_peer().region(); - bool pending_remove = false; - switch (change_peer_request.change_type()) - { - case eraftpb::ConfChangeType::AddNode: - case eraftpb::ConfChangeType::AddLearnerNode: - { - // change the peers of region, add conf_ver. - doSetRegion(new_region); - break; - } - case eraftpb::ConfChangeType::RemoveNode: - { - if (peer.id() == change_peer_request.peer().id()) - pending_remove = true; - - doSetRegion(new_region); - break; - } - default: - throw Exception(std::string(__PRETTY_FUNCTION__) + ": unsupported cmd", ErrorCodes::LOGICAL_ERROR); - } - - if (pending_remove) + doSetRegion(new_region); + if (doCheckPeerRemoved()) region_state.setState(raft_serverpb::PeerState::Tombstone); else region_state.setState(raft_serverpb::PeerState::Normal); @@ -274,8 +252,8 @@ RegionMergeResult MetaRaftCommandDelegate::checkBeforeCommitMerge( static void CheckRegionForMergeCmd(const raft_cmdpb::AdminResponse & response, const RegionState & region_state) { if (response.has_split() && !(response.split().left() == region_state.getRegion())) - throw Exception(std::string(__PRETTY_FUNCTION__) + ": current region:\n" + region_state.getRegion().DebugString() + "\nexpect:\n" - + response.split().left().DebugString() + "\nshould not happen", + throw Exception(std::string(__PRETTY_FUNCTION__) + ": current region:\n" + region_state.getRegion().ShortDebugString() + + "\nexpect:\n" + response.split().left().ShortDebugString() + "\nshould not happen", ErrorCodes::LOGICAL_ERROR); } @@ -344,12 +322,10 @@ void MetaRaftCommandDelegate::execPrepareMerge( CheckRegionForMergeCmd(response, region_state); } -bool RegionMeta::isPeerRemoved() const +bool RegionMeta::doCheckPeerRemoved() const { - std::lock_guard lock(mutex); - - if (region_state.getState() == raft_serverpb::PeerState::Tombstone) - return true; + if (region_state.getRegion().peers().empty()) + throw Exception(std::string(__PRETTY_FUNCTION__) + ": got empty peers, should not happen", ErrorCodes::LOGICAL_ERROR); for (const auto & region_peer : region_state.getRegion().peers()) { diff --git a/dbms/src/Storages/Transaction/RegionMeta.h b/dbms/src/Storages/Transaction/RegionMeta.h index 78f4a805002..9a7c4093e75 100644 --- a/dbms/src/Storages/Transaction/RegionMeta.h +++ b/dbms/src/Storages/Transaction/RegionMeta.h @@ -65,8 +65,6 @@ class RegionMeta TerminateWaitIndex waitIndex(UInt64 index, const std::atomic_bool & terminated) const; bool checkIndex(UInt64 index) const; - bool isPeerRemoved() const; - std::tuple dumpVersionRange() const; MetaRaftCommandDelegate & makeRaftCommandDelegate(); @@ -80,6 +78,7 @@ class RegionMeta void doSetRegion(const metapb::Region & region); void doSetApplied(UInt64 index, UInt64 term); bool doCheckIndex(UInt64 index) const; + bool doCheckPeerRemoved() const; private: metapb::Peer peer; diff --git a/dbms/src/Storages/Transaction/SerializationHelper.cpp b/dbms/src/Storages/Transaction/SerializationHelper.cpp index 480ede38b8b..c26b9a17dd9 100644 --- a/dbms/src/Storages/Transaction/SerializationHelper.cpp +++ b/dbms/src/Storages/Transaction/SerializationHelper.cpp @@ -7,7 +7,7 @@ size_t writeBinary2(const metapb::Peer & peer, WriteBuffer & buf) { writeIntBinary((UInt64)peer.id(), buf); writeIntBinary((UInt64)peer.store_id(), buf); - writeBinary(peer.is_learner(), buf); + writeIntBinary((UInt8)peer.role(), buf); return sizeof(UInt64) + sizeof(UInt64) + sizeof(bool); } @@ -16,7 +16,7 @@ metapb::Peer readPeer(ReadBuffer & buf) metapb::Peer peer; peer.set_id(readBinary2(buf)); peer.set_store_id(readBinary2(buf)); - peer.set_is_learner(readBinary2(buf)); + peer.set_role(static_cast(readBinary2(buf))); return peer; } @@ -125,7 +125,7 @@ raft_serverpb::RaftApplyState readApplyState(ReadBuffer & buf) bool operator==(const metapb::Peer & peer1, const metapb::Peer & peer2) { - return peer1.id() == peer2.id() && peer1.store_id() == peer2.store_id() && peer1.is_learner() == peer2.is_learner(); + return peer1.id() == peer2.id() && peer1.store_id() == peer2.store_id() && peer1.role() == peer2.role(); } bool operator==(const metapb::Region & region1, const metapb::Region & region2) diff --git a/dbms/src/Storages/Transaction/tests/region_helper.h b/dbms/src/Storages/Transaction/tests/region_helper.h index 0a2bff244d1..098fbdcf954 100644 --- a/dbms/src/Storages/Transaction/tests/region_helper.h +++ b/dbms/src/Storages/Transaction/tests/region_helper.h @@ -33,11 +33,10 @@ using namespace DB; } while (0) -inline metapb::Peer createPeer(UInt64 id, bool is_learner) +inline metapb::Peer createPeer(UInt64 id, bool) { metapb::Peer peer; peer.set_id(id); - peer.set_is_learner(is_learner); return peer; } diff --git a/dbms/src/Storages/Transaction/tests/region_persister.cpp b/dbms/src/Storages/Transaction/tests/region_persister.cpp index 26b7028c41a..72450101488 100644 --- a/dbms/src/Storages/Transaction/tests/region_persister.cpp +++ b/dbms/src/Storages/Transaction/tests/region_persister.cpp @@ -1,6 +1,7 @@ #include #include #include + #include #include "region_helper.h" @@ -89,7 +90,6 @@ int main(int, char **) raft_serverpb::RaftApplyState apply_state; peer.set_id(6666); - peer.set_is_learner(true); peer.set_store_id(6667); {