diff options
author | chertus <azuikov@ydb.tech> | 2023-02-01 17:12:48 +0300 |
---|---|---|
committer | chertus <azuikov@ydb.tech> | 2023-02-01 17:12:48 +0300 |
commit | ecf351de6516286e9540d05907f2230f04d6eea3 (patch) | |
tree | 1dce4678fb87ad00b7cc424eba34abe24a060ac6 | |
parent | 03856e2c27d01cfcf4bec122adfa26463c0461d9 (diff) | |
download | ydb-ecf351de6516286e9540d05907f2230f04d6eea3.tar.gz |
do not block tablet activation by tiers metadata
-rw-r--r-- | ydb/core/tx/columnshard/columnshard.cpp | 7 | ||||
-rw-r--r-- | ydb/core/tx/columnshard/columnshard__export.cpp | 18 | ||||
-rw-r--r-- | ydb/core/tx/columnshard/columnshard__write_index.cpp | 20 | ||||
-rw-r--r-- | ydb/core/tx/columnshard/columnshard_impl.cpp | 16 | ||||
-rw-r--r-- | ydb/core/tx/columnshard/columnshard_impl.h | 5 | ||||
-rw-r--r-- | ydb/core/tx/tiering/common.h | 4 | ||||
-rw-r--r-- | ydb/core/tx/tiering/manager.cpp | 4 | ||||
-rw-r--r-- | ydb/core/tx/tiering/manager.h | 6 |
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); |