aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchertus <azuikov@ydb.tech>2023-02-01 17:12:48 +0300
committerchertus <azuikov@ydb.tech>2023-02-01 17:12:48 +0300
commitecf351de6516286e9540d05907f2230f04d6eea3 (patch)
tree1dce4678fb87ad00b7cc424eba34abe24a060ac6
parent03856e2c27d01cfcf4bec122adfa26463c0461d9 (diff)
downloadydb-ecf351de6516286e9540d05907f2230f04d6eea3.tar.gz
do not block tablet activation by tiers metadata
-rw-r--r--ydb/core/tx/columnshard/columnshard.cpp7
-rw-r--r--ydb/core/tx/columnshard/columnshard__export.cpp18
-rw-r--r--ydb/core/tx/columnshard/columnshard__write_index.cpp20
-rw-r--r--ydb/core/tx/columnshard/columnshard_impl.cpp16
-rw-r--r--ydb/core/tx/columnshard/columnshard_impl.h5
-rw-r--r--ydb/core/tx/tiering/common.h4
-rw-r--r--ydb/core/tx/tiering/manager.cpp4
-rw-r--r--ydb/core/tx/tiering/manager.h6
8 files changed, 35 insertions, 45 deletions
diff --git a/ydb/core/tx/columnshard/columnshard.cpp b/ydb/core/tx/columnshard/columnshard.cpp
index 733552b3419..444164d5739 100644
--- a/ydb/core/tx/columnshard/columnshard.cpp
+++ b/ydb/core/tx/columnshard/columnshard.cpp
@@ -29,15 +29,10 @@ void TColumnShard::SwitchToWork(const TActorContext& ctx) {
IndexingActor = ctx.Register(CreateIndexingActor(TabletID(), ctx.SelfID));
CompactionActor = ctx.Register(CreateCompactionActor(TabletID(), ctx.SelfID));
EvictionActor = ctx.Register(CreateEvictionActor(TabletID(), ctx.SelfID));
- ui32 tieringsCount = 0;
for (auto&& i : Tables) {
ActivateTiering(i.first, i.second.TieringUsage);
- tieringsCount += (i.second.TieringUsage ? 1 : 0);
- }
- TieringWaiting = tieringsCount;
- if (!TieringWaiting) {
- SignalTabletActive(ctx);
}
+ SignalTabletActive(ctx);
}
void TColumnShard::OnActivateExecutor(const TActorContext& ctx) {
diff --git a/ydb/core/tx/columnshard/columnshard__export.cpp b/ydb/core/tx/columnshard/columnshard__export.cpp
index 2caf42183a8..9c52b288a43 100644
--- a/ydb/core/tx/columnshard/columnshard__export.cpp
+++ b/ydb/core/tx/columnshard/columnshard__export.cpp
@@ -99,26 +99,23 @@ void TTxExportFinish::Complete(const TActorContext& ctx) {
auto& msg = *Ev->Get();
Y_VERIFY(!msg.TierName.empty());
- Self->ActiveEviction = false;
if (!BlobsToForget.empty()) {
Self->ForgetBlobs(ctx, msg.TierName, std::move(BlobsToForget));
}
+
+ Y_VERIFY(Self->ActiveEvictions, "Unexpected active evictions count at tablet %lu", Self->TabletID());
+ --Self->ActiveEvictions;
}
void TColumnShard::Handle(TEvPrivate::TEvExport::TPtr& ev, const TActorContext& ctx) {
auto status = ev->Get()->Status;
- Y_VERIFY(!ActiveTtl, "TTL already in progress at tablet %lu", TabletID());
- Y_VERIFY(!ActiveEviction || status != NKikimrProto::UNKNOWN, "Eviction in progress at tablet %lu", TabletID());
+ Y_VERIFY(ActiveEvictions, "Unexpected active evictions count at tablet %lu", TabletID());
ui64 exportNo = ev->Get()->ExportNo;
auto& tierName = ev->Get()->TierName;
- if (status == NKikimrProto::ERROR) {
- LOG_S_WARN("Export (fail): " << exportNo << " tier '" << tierName << "' error: "
- << ev->Get()->SerializeErrorsToString() << "' at tablet " << TabletID());
- ActiveEviction = false;
- } else if (status == NKikimrProto::UNKNOWN) {
+ if (status == NKikimrProto::UNKNOWN) {
LOG_S_DEBUG("Export (write): " << exportNo << " tier '" << tierName << "' at tablet " << TabletID());
auto& tierBlobs = ev->Get()->Blobs;
Y_VERIFY(tierBlobs.size());
@@ -126,10 +123,13 @@ void TColumnShard::Handle(TEvPrivate::TEvExport::TPtr& ev, const TActorContext&
} else if (status == NKikimrProto::OK) {
LOG_S_DEBUG("Export (apply): " << exportNo << " tier '" << tierName << "' at tablet " << TabletID());
Execute(new TTxExportFinish(this, ev), ctx);
+ } else if (status == NKikimrProto::ERROR) {
+ LOG_S_WARN("Export (fail): " << exportNo << " tier '" << tierName << "' error: "
+ << ev->Get()->SerializeErrorsToString() << "' at tablet " << TabletID());
+ --ActiveEvictions;
} else {
Y_VERIFY(false);
}
- ActiveEviction = true;
}
}
diff --git a/ydb/core/tx/columnshard/columnshard__write_index.cpp b/ydb/core/tx/columnshard/columnshard__write_index.cpp
index 109507625b7..84dfc8cf81f 100644
--- a/ydb/core/tx/columnshard/columnshard__write_index.cpp
+++ b/ydb/core/tx/columnshard/columnshard__write_index.cpp
@@ -33,7 +33,6 @@ private:
};
TEvPrivate::TEvWriteIndex::TPtr Ev;
- THashMap<TUnifiedBlobId, NOlap::TPortionEvictionFeatures> BlobsToExport;
THashMap<TString, TPathIdBlobs> ExportTierBlobs;
THashMap<TString, std::vector<NOlap::TEvictedBlob>> TierBlobsToForget;
ui64 ExportNo = 0;
@@ -49,6 +48,7 @@ bool TTxWriteIndex::Execute(TTransactionContext& txc, const TActorContext& ctx)
ui64 blobsWritten = 0;
ui64 bytesWritten = 0;
+ THashMap<TUnifiedBlobId, NOlap::TPortionEvictionFeatures> blobsToExport;
auto changes = Ev->Get()->IndexChanges;
Y_VERIFY(changes);
@@ -141,8 +141,8 @@ bool TTxWriteIndex::Execute(TTransactionContext& txc, const TActorContext& ctx)
if (tManager.NeedExport()) {
for (auto& rec : portionInfo.Records) {
auto& blobId = rec.BlobRange.BlobId;
- if (!BlobsToExport.count(blobId)) {
- BlobsToExport.emplace(blobId, evictionFeatures);
+ if (!blobsToExport.count(blobId)) {
+ blobsToExport.emplace(blobId, evictionFeatures);
NKikimrTxColumnShard::TEvictMetadata meta;
meta.SetTierName(tierName);
@@ -195,7 +195,7 @@ bool TTxWriteIndex::Execute(TTransactionContext& txc, const TActorContext& ctx)
Self->IncCounter(COUNTER_BYTES_ERASED, blobId.BlobSize());
}
for (const auto& blobId : blobsToEvict) {
- if (BlobsToExport.count(blobId)) {
+ if (blobsToExport.count(blobId)) {
// DS to S3 eviction. Keep source blob in DS till EEvictState::EXTERN state.
continue;
}
@@ -223,16 +223,16 @@ bool TTxWriteIndex::Execute(TTransactionContext& txc, const TActorContext& ctx)
<< ") cannot write index blobs at tablet " << Self->TabletID());
}
- if (BlobsToExport.size()) {
- size_t numBlobs = BlobsToExport.size();
- for (auto& [blobId, evFeatures] : BlobsToExport) {
+ if (blobsToExport.size()) {
+ size_t numBlobs = blobsToExport.size();
+ for (auto& [blobId, evFeatures] : blobsToExport) {
auto it = ExportTierBlobs.find(evFeatures.TargetTierName);
if (it == ExportTierBlobs.end()) {
it = ExportTierBlobs.emplace(evFeatures.TargetTierName, TPathIdBlobs(evFeatures.PathId)).first;
}
it->second.Blobs.emplace(blobId);
}
- BlobsToExport.clear();
+ blobsToExport.clear();
ExportNo = Self->LastExportNo + 1;
Self->LastExportNo += ExportTierBlobs.size();
@@ -274,6 +274,10 @@ bool TTxWriteIndex::Execute(TTransactionContext& txc, const TActorContext& ctx)
} else if (changes->IsTtl()) {
Self->ActiveTtl = false;
+ // Do not start new TTL till we evict current PortionsToEvict. We could evict them twice otherwise
+ Y_VERIFY(!Self->ActiveEvictions, "Unexpected active evictions count at tablet %lu", Self->TabletID());
+ Self->ActiveEvictions = ExportTierBlobs.size();
+
Self->IncCounter(ok ? COUNTER_TTL_SUCCESS : COUNTER_TTL_FAIL);
Self->IncCounter(COUNTER_EVICTION_BLOBS_WRITTEN, blobsWritten);
Self->IncCounter(COUNTER_EVICTION_BYTES_WRITTEN, bytesWritten);
diff --git a/ydb/core/tx/columnshard/columnshard_impl.cpp b/ydb/core/tx/columnshard/columnshard_impl.cpp
index 21ae0d0ed73..f5a70716e53 100644
--- a/ydb/core/tx/columnshard/columnshard_impl.cpp
+++ b/ydb/core/tx/columnshard/columnshard_impl.cpp
@@ -869,6 +869,10 @@ std::unique_ptr<TEvPrivate::TEvEviction> TColumnShard::SetupTtl(const THashMap<u
LOG_S_DEBUG("TTL already in progress at tablet " << TabletID());
return {};
}
+ if (ActiveEvictions) {
+ LOG_S_DEBUG("Do not start TTL while eviction is in progress at tablet " << TabletID());
+ return {};
+ }
if (!PrimaryIndex) {
LOG_S_NOTICE("TTL not started. No index for TTL at tablet " << TabletID());
return {};
@@ -1082,18 +1086,10 @@ TActorId TColumnShard::GetS3ActorForTier(const TString& tierId) const {
return Tiers->GetStorageActorId(tierId);
}
-void TColumnShard::Handle(NTiers::TEvTiersManagerReadyForUsage::TPtr& /*ev*/) {
- Y_VERIFY(Tiers);
- Y_VERIFY(Tiers->IsReadyForUsage());
- if (TieringWaiting) {
- TieringWaiting = false;
- SignalTabletActive(TActivationContext::AsActorContext());
- }
-}
-
void TColumnShard::Handle(NMetadata::NProvider::TEvRefreshSubscriberData::TPtr& ev) {
Y_VERIFY(Tiers);
- ALS_INFO(NKikimrServices::TX_COLUMNSHARD) << "test handle NMetadata::NProvider::TEvRefreshSubscriberData" << ev->Get()->GetSnapshot()->SerializeToString();
+ ALS_INFO(NKikimrServices::TX_COLUMNSHARD) << "test handle NMetadata::NProvider::TEvRefreshSubscriberData"
+ << ev->Get()->GetSnapshot()->SerializeToString();
Tiers->TakeConfigs(ev->Get()->GetSnapshot(), nullptr);
}
diff --git a/ydb/core/tx/columnshard/columnshard_impl.h b/ydb/core/tx/columnshard/columnshard_impl.h
index 53317909e84..cdf4b7346ae 100644
--- a/ydb/core/tx/columnshard/columnshard_impl.h
+++ b/ydb/core/tx/columnshard/columnshard_impl.h
@@ -126,7 +126,6 @@ class TColumnShard
void Handle(TEvPrivate::TEvForget::TPtr& ev, const TActorContext& ctx);
void Handle(TEvBlobStorage::TEvCollectGarbageResult::TPtr& ev, const TActorContext& ctx);
void Handle(NMetadata::NProvider::TEvRefreshSubscriberData::TPtr& ev);
- void Handle(NTiers::TEvTiersManagerReadyForUsage::TPtr& ev);
ITransaction* CreateTxInitSchema();
@@ -229,7 +228,6 @@ protected:
HFunc(TEvPrivate::TEvScanStats, Handle);
HFunc(TEvPrivate::TEvReadFinished, Handle);
HFunc(TEvPrivate::TEvPeriodicWakeup, Handle);
- hFunc(NTiers::TEvTiersManagerReadyForUsage, Handle);
default:
if (!HandleDefaultEvents(ev, ctx)) {
LOG_S_WARN("TColumnShard.StateWork at " << TabletID()
@@ -360,7 +358,6 @@ private:
TActorId EvictionActor;
TActorId StatsReportPipe;
- bool TieringWaiting = false;
std::shared_ptr<TTiersManager> Tiers;
std::unique_ptr<TTabletCountersBase> TabletCountersPtr;
TTabletCountersBase* TabletCounters;
@@ -389,7 +386,7 @@ private:
bool ActiveIndexingOrCompaction = false;
bool ActiveCleanup = false;
bool ActiveTtl = false;
- bool ActiveEviction = false;
+ ui32 ActiveEvictions = 0;
std::unique_ptr<TBlobManager> BlobManager;
TInFlightReadsTracker InFlightReadsTracker;
TSettings Settings;
diff --git a/ydb/core/tx/tiering/common.h b/ydb/core/tx/tiering/common.h
index 83a5a3139ed..a00601a7346 100644
--- a/ydb/core/tx/tiering/common.h
+++ b/ydb/core/tx/tiering/common.h
@@ -16,9 +16,5 @@ enum EEvents {
EvEnd
};
-class TEvTiersManagerReadyForUsage: public TEventLocal<TEvTiersManagerReadyForUsage, EvTiersManagerReadyForUsage> {
-
-};
-
static_assert(EEvents::EvEnd < EventSpaceEnd(TKikimrEvents::ES_TIERING), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_TIERING)");
}
diff --git a/ydb/core/tx/tiering/manager.cpp b/ydb/core/tx/tiering/manager.cpp
index 78ed9e33b05..360f9974930 100644
--- a/ydb/core/tx/tiering/manager.cpp
+++ b/ydb/core/tx/tiering/manager.cpp
@@ -162,8 +162,6 @@ void TTiersManager::TakeConfigs(NMetadata::NFetcher::ISnapshot::TPtr snapshotExt
auto& manager = Managers.emplace(i.second.GetTierName(), std::move(localManager)).first->second;
manager.Start(Secrets);
}
- ReadyForUsageFlag = true;
- TActivationContext::AsActorContext().Send(TabletActorId, new NTiers::TEvTiersManagerReadyForUsage);
}
TActorId TTiersManager::GetStorageActorId(const TString& tierId) {
@@ -216,7 +214,7 @@ NMetadata::NFetcher::ISnapshotsFetcher::TPtr TTiersManager::GetExternalDataManip
THashMap<ui64, NKikimr::NOlap::TTiering> TTiersManager::GetTiering() const {
THashMap<ui64, NKikimr::NOlap::TTiering> result;
- if (!Snapshot) {
+ if (!IsReady()) {
return result;
}
auto snapshotPtr = std::dynamic_pointer_cast<NTiers::TConfigsSnapshot>(Snapshot);
diff --git a/ydb/core/tx/tiering/manager.h b/ydb/core/tx/tiering/manager.h
index 1ddf79da156..258058fe279 100644
--- a/ydb/core/tx/tiering/manager.h
+++ b/ydb/core/tx/tiering/manager.h
@@ -41,7 +41,6 @@ private:
TActor* Actor = nullptr;
std::unordered_map<ui64, TString> PathIdTiering;
YDB_READONLY_DEF(TManagers, Managers);
- YDB_READONLY_FLAG(ReadyForUsage, false);
std::shared_ptr<NMetadata::NSecret::TSnapshot> Secrets;
NMetadata::NFetcher::ISnapshot::TPtr Snapshot;
@@ -62,6 +61,11 @@ public:
void DisablePathId(const ui64 pathId) {
PathIdTiering.erase(pathId);
}
+
+ bool IsReady() const {
+ return !!Snapshot;
+ }
+
TTiersManager& Start(std::shared_ptr<TTiersManager> ownerPtr);
TTiersManager& Stop();
TActorId GetStorageActorId(const TString& tierId);