aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Efimov <xeno@prnwatch.com>2022-03-22 16:24:35 +0300
committerAlexey Efimov <xeno@prnwatch.com>2022-03-22 16:24:35 +0300
commit70e6116e491071d4db01c286c1697caad6a25b9a (patch)
tree97aeb85c083f8b5e23ef996276e78855bc3fafe1
parentbbeb9710de164ad05e586b05347a2eeaed1990e9 (diff)
downloadydb-70e6116e491071d4db01c286c1697caad6a25b9a.tar.gz
make TabletOwners synchronization more safe KIKIMR-14545
ref:916aa66629b7d7a4f7430766720b3dee316a432f
-rw-r--r--ydb/core/mind/hive/CMakeLists.txt1
-rw-r--r--ydb/core/mind/hive/hive_impl.cpp27
-rw-r--r--ydb/core/mind/hive/hive_impl.h6
-rw-r--r--ydb/core/mind/hive/hive_schema.h1
-rw-r--r--ydb/core/mind/hive/tx__load_everything.cpp3
-rw-r--r--ydb/core/mind/hive/tx__request_tablet_owners.cpp46
-rw-r--r--ydb/core/mind/hive/tx__tablet_owners_reply.cpp3
-rw-r--r--ydb/core/protos/counters_hive.proto1
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"}];
}