diff options
author | Alexey Efimov <xeno@prnwatch.com> | 2022-03-22 16:24:35 +0300 |
---|---|---|
committer | Alexey Efimov <xeno@prnwatch.com> | 2022-03-22 16:24:35 +0300 |
commit | 70e6116e491071d4db01c286c1697caad6a25b9a (patch) | |
tree | 97aeb85c083f8b5e23ef996276e78855bc3fafe1 | |
parent | bbeb9710de164ad05e586b05347a2eeaed1990e9 (diff) | |
download | ydb-70e6116e491071d4db01c286c1697caad6a25b9a.tar.gz |
make TabletOwners synchronization more safe KIKIMR-14545
ref:916aa66629b7d7a4f7430766720b3dee316a432f
-rw-r--r-- | ydb/core/mind/hive/CMakeLists.txt | 1 | ||||
-rw-r--r-- | ydb/core/mind/hive/hive_impl.cpp | 27 | ||||
-rw-r--r-- | ydb/core/mind/hive/hive_impl.h | 6 | ||||
-rw-r--r-- | ydb/core/mind/hive/hive_schema.h | 1 | ||||
-rw-r--r-- | ydb/core/mind/hive/tx__load_everything.cpp | 3 | ||||
-rw-r--r-- | ydb/core/mind/hive/tx__request_tablet_owners.cpp | 46 | ||||
-rw-r--r-- | ydb/core/mind/hive/tx__tablet_owners_reply.cpp | 3 | ||||
-rw-r--r-- | ydb/core/protos/counters_hive.proto | 1 |
8 files changed, 69 insertions, 19 deletions
diff --git a/ydb/core/mind/hive/CMakeLists.txt b/ydb/core/mind/hive/CMakeLists.txt index 4995dceb2a..d47111b5c9 100644 --- a/ydb/core/mind/hive/CMakeLists.txt +++ b/ydb/core/mind/hive/CMakeLists.txt @@ -62,6 +62,7 @@ target_sources(core-mind-hive PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/mind/hive/tx__register_node.cpp ${CMAKE_SOURCE_DIR}/ydb/core/mind/hive/tx__release_tablets.cpp ${CMAKE_SOURCE_DIR}/ydb/core/mind/hive/tx__release_tablets_reply.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/mind/hive/tx__request_tablet_owners.cpp ${CMAKE_SOURCE_DIR}/ydb/core/mind/hive/tx__request_tablet_seq.cpp ${CMAKE_SOURCE_DIR}/ydb/core/mind/hive/tx__response_tablet_seq.cpp ${CMAKE_SOURCE_DIR}/ydb/core/mind/hive/tx__restart_tablet.cpp diff --git a/ydb/core/mind/hive/hive_impl.cpp b/ydb/core/mind/hive/hive_impl.cpp index 93c0afcd25..bbe2f60200 100644 --- a/ydb/core/mind/hive/hive_impl.cpp +++ b/ydb/core/mind/hive/hive_impl.cpp @@ -452,12 +452,14 @@ void THive::Handle(TEvPrivate::TEvBootTablets::TPtr&) { } else { BLOG_D("SubDomain Hive is ready"); - // this code should be removed later - THolder<TEvHive::TEvRequestTabletOwners> request(new TEvHive::TEvRequestTabletOwners()); - request->Record.SetOwnerID(TabletID()); - BLOG_D("Requesting TabletOwners from the Root"); - SendToRootHivePipe(request.Release()); - // this code should be removed later + if (!TabletOwnersSynced) { + // this code should be removed later + THolder<TEvHive::TEvRequestTabletOwners> request(new TEvHive::TEvRequestTabletOwners()); + request->Record.SetOwnerID(TabletID()); + BLOG_D("Requesting TabletOwners from the Root"); + SendToRootHivePipe(request.Release()); + // this code should be removed later + } } if (!tabletsToReleaseFromParent.empty()) { THolder<TEvHive::TEvReleaseTablets> request(new TEvHive::TEvReleaseTablets()); @@ -2551,18 +2553,7 @@ void THive::Handle(TEvHive::TEvReleaseTabletsReply::TPtr& ev) { void THive::Handle(TEvHive::TEvRequestTabletOwners::TPtr& ev) { BLOG_D("Handle TEvHive::TEvRequestTabletOwners(" << ev->Get()->Record.ShortDebugString() << ")"); - auto ownerId = ev->Get()->Record.GetOwnerID(); - std::vector<TSequencer::TSequence> sequences; - Keeper.GetOwnedSequences(ownerId, sequences); - BLOG_D("TEvHive::TEvRequestTabletOwners() - replying with " << sequences.size() << " sequences"); - THolder<TEvHive::TEvTabletOwnersReply> reply(new TEvHive::TEvTabletOwnersReply()); - for (const auto& seq : sequences) { - auto* tabletOwners = reply->Record.AddTabletOwners(); - tabletOwners->SetOwnerID(ownerId); - tabletOwners->SetBegin(seq.Begin); - tabletOwners->SetEnd(seq.End); - } - Send(ev->Sender, reply.Release()); + Execute(CreateRequestTabletOwners(std::move(ev))); } void THive::Handle(TEvHive::TEvTabletOwnersReply::TPtr& ev) { diff --git a/ydb/core/mind/hive/hive_impl.h b/ydb/core/mind/hive/hive_impl.h index 2f0d6fd1b7..cc1b642cad 100644 --- a/ydb/core/mind/hive/hive_impl.h +++ b/ydb/core/mind/hive/hive_impl.h @@ -235,6 +235,7 @@ protected: friend class TTxSwitchDrainOn; friend class TTxSwitchDrainOff; friend class TTxTabletOwnersReply; + friend class TTxRequestTabletOwners; friend class TDeleteTabletActor; @@ -290,6 +291,7 @@ protected: ITransaction* CreateSwitchDrainOn(TNodeId nodeId, TDrainSettings settings, const TActorId& initiator); ITransaction* CreateSwitchDrainOff(TNodeId nodeId, TDrainSettings settings, NKikimrProto::EReplyStatus status, ui32 movements); ITransaction* CreateTabletOwnersReply(TEvHive::TEvTabletOwnersReply::TPtr event); + ITransaction* CreateRequestTabletOwners(TEvHive::TEvRequestTabletOwners::TPtr event); public: TDomainsView DomainsView; @@ -423,6 +425,10 @@ protected: std::unordered_map<TTabletTypes::EType, NKikimrHive::TDataCentersPreference> DefaultDataCentersPreference; std::unordered_set<TDataCenterId> RegisteredDataCenterIds; + // to be removed later + bool TabletOwnersSynced = false; + // to be removed later + void OnActivateExecutor(const TActorContext& ctx) override; void DefaultSignalTabletActive(const TActorContext& ctx) override; void OnDetach(const TActorContext&) override; diff --git a/ydb/core/mind/hive/hive_schema.h b/ydb/core/mind/hive/hive_schema.h index 6289499cc3..2b664b6fdc 100644 --- a/ydb/core/mind/hive/hive_schema.h +++ b/ydb/core/mind/hive/hive_schema.h @@ -36,6 +36,7 @@ struct TSchemeIds { ResourceChangeReactionPeriod, TabletKickCooldownPeriod, ResourceOvercommitment, + TabletOwnersSynced, }; }; diff --git a/ydb/core/mind/hive/tx__load_everything.cpp b/ydb/core/mind/hive/tx__load_everything.cpp index e4c1cf1f51..739304494f 100644 --- a/ydb/core/mind/hive/tx__load_everything.cpp +++ b/ydb/core/mind/hive/tx__load_everything.cpp @@ -164,6 +164,9 @@ public: case TSchemeIds::State::ResourceOvercommitment: Self->DatabaseConfig.SetResourceOvercommitment((double)stateRowset.GetValue<Schema::State::Value>() / 100); break; + case TSchemeIds::State::TabletOwnersSynced: + Self->TabletOwnersSynced = (bool)stateRowset.GetValue<Schema::State::Value>(); + break; } } stateRowset.Next(); diff --git a/ydb/core/mind/hive/tx__request_tablet_owners.cpp b/ydb/core/mind/hive/tx__request_tablet_owners.cpp new file mode 100644 index 0000000000..d07e45216a --- /dev/null +++ b/ydb/core/mind/hive/tx__request_tablet_owners.cpp @@ -0,0 +1,46 @@ +#include "hive_impl.h" +#include "hive_log.h" + +namespace NKikimr { +namespace NHive { + +class TTxRequestTabletOwners : public TTransactionBase<THive> { + THolder<TEvHive::TEvRequestTabletOwners::THandle> Request; + THolder<TEvHive::TEvTabletOwnersReply> Response; + +public: + TTxRequestTabletOwners(THolder<TEvHive::TEvRequestTabletOwners::THandle> event, THive *hive) + : TBase(hive) + , Request(std::move(event)) + , Response(new TEvHive::TEvTabletOwnersReply()) + {} + + TTxType GetTxType() const override { return NHive::TXTYPE_REQUEST_TABLET_OWNERS; } + + bool Execute(TTransactionContext&, const TActorContext&) override { + BLOG_D("THive::TTxRequestTabletOwners::Execute"); + auto ownerId = Request->Get()->Record.GetOwnerID(); + std::vector<TSequencer::TSequence> sequences; + Self->Keeper.GetOwnedSequences(ownerId, sequences); + BLOG_D("THive::TTxRequestTabletOwners - replying with " << sequences.size() << " sequences"); + for (const auto& seq : sequences) { + auto* tabletOwners = Response->Record.AddTabletOwners(); + tabletOwners->SetOwnerID(ownerId); + tabletOwners->SetBegin(seq.Begin); + tabletOwners->SetEnd(seq.End); + } + return true; + } + + void Complete(const TActorContext&) override { + BLOG_D("THive::TTxRequestTabletOwners::Complete"); + Self->Send(Request->Sender, Response.Release()); + } +}; + +ITransaction* THive::CreateRequestTabletOwners(TEvHive::TEvRequestTabletOwners::TPtr event) { + return new TTxRequestTabletOwners(THolder(std::move(event.Release())), this); +} + +} // NHive +} // NKikimr diff --git a/ydb/core/mind/hive/tx__tablet_owners_reply.cpp b/ydb/core/mind/hive/tx__tablet_owners_reply.cpp index b1e73dde71..9023e034a6 100644 --- a/ydb/core/mind/hive/tx__tablet_owners_reply.cpp +++ b/ydb/core/mind/hive/tx__tablet_owners_reply.cpp @@ -6,7 +6,6 @@ namespace NHive { class TTxTabletOwnersReply : public TTransactionBase<THive> { THolder<TEvHive::TEvTabletOwnersReply::THandle> Request; - TVector<TTabletId> TabletIds; public: TTxTabletOwnersReply(THolder<TEvHive::TEvTabletOwnersReply::THandle> event, THive *hive) @@ -29,6 +28,8 @@ public: db.Table<Schema::TabletOwners>().Key(seq.Begin, seq.End).Update<Schema::TabletOwners::OwnerId>(ownerId); } } + db.Table<Schema::State>().Key(TSchemeIds::State::TabletOwnersSynced).Update<Schema::State::Value>(true); + Self->TabletOwnersSynced = true; return true; } diff --git a/ydb/core/protos/counters_hive.proto b/ydb/core/protos/counters_hive.proto index 0d9a2c4d41..bc7322f46b 100644 --- a/ydb/core/protos/counters_hive.proto +++ b/ydb/core/protos/counters_hive.proto @@ -106,4 +106,5 @@ enum ETxTypes { TXTYPE_RESTART_TABLET = 56 [(TxTypeOpts) = {Name: "TxRestartTablet"}]; TXTYPE_MON_MOVE_TABLET = 57 [(TxTypeOpts) = {Name: "TxMonMoveTablet"}]; TXTYPE_TABLET_OWNERS_REPLY = 58 [(TxTypeOpts) = {Name: "TxTabletOwnersReply"}]; + TXTYPE_REQUEST_TABLET_OWNERS = 59 [(TxTypeOpts) = {Name: "TxRequestTabletOwners"}]; } |