diff options
author | alexvru <alexvru@ydb.tech> | 2023-04-06 18:10:15 +0300 |
---|---|---|
committer | alexvru <alexvru@ydb.tech> | 2023-04-06 18:10:15 +0300 |
commit | f7bbd3abe6eb6755b81334b0cc24fe39130c8554 (patch) | |
tree | fe97145a3a77921ab444940cdef84a85baeab6b2 | |
parent | cf01db4c44585761db33d3f41fd3fe41a9acd70b (diff) | |
download | ydb-f7bbd3abe6eb6755b81334b0cc24fe39130c8554.tar.gz |
Export replication time metric
-rw-r--r-- | ydb/core/mind/bscontroller/bsc.cpp | 3 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/config_fit_groups.cpp | 2 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/impl.h | 72 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/load_everything.cpp | 3 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/monitoring.cpp | 8 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/register_node.cpp | 11 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/scheme.h | 18 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/self_heal.cpp | 21 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/update_last_seen_ready.cpp | 25 | ||||
-rw-r--r-- | ydb/core/mind/table_adapter.h | 4 | ||||
-rw-r--r-- | ydb/core/protos/counters_bs_controller.proto | 46 | ||||
-rw-r--r-- | ydb/tests/functional/scheme_tests/canondata/tablet_scheme_tests.TestTabletSchemes.test_tablet_schemes_flat_bs_controller_/flat_bs_controller.schema | 14 |
12 files changed, 190 insertions, 37 deletions
diff --git a/ydb/core/mind/bscontroller/bsc.cpp b/ydb/core/mind/bscontroller/bsc.cpp index 57606e361eb..ac81e4c86e8 100644 --- a/ydb/core/mind/bscontroller/bsc.cpp +++ b/ydb/core/mind/bscontroller/bsc.cpp @@ -28,7 +28,7 @@ TBlobStorageController::TVSlotInfo::TVSlotInfo(TVSlotId vSlotId, TPDiskInfo *pdi Table::GroupGeneration::Type groupPrevGeneration, Table::GroupGeneration::Type groupGeneration, Table::Category::Type kind, Table::RingIdx::Type ringIdx, Table::FailDomainIdx::Type failDomainIdx, Table::VDiskIdx::Type vDiskIdx, Table::Mood::Type mood, TGroupInfo *group, - TVSlotReadyTimestampQ *vslotReadyTimestampQ, TInstant lastSeenReady) + TVSlotReadyTimestampQ *vslotReadyTimestampQ, TInstant lastSeenReady, TDuration replicationTime) : VSlotId(vSlotId) , PDisk(pdisk) , GroupId(groupId) @@ -40,6 +40,7 @@ TBlobStorageController::TVSlotInfo::TVSlotInfo(TVSlotId vSlotId, TPDiskInfo *pdi , VDiskIdx(vDiskIdx) , Mood(mood) , LastSeenReady(lastSeenReady) + , ReplicationTime(replicationTime) , VSlotReadyTimestampQ(*vslotReadyTimestampQ) { Y_VERIFY(pdisk); diff --git a/ydb/core/mind/bscontroller/config_fit_groups.cpp b/ydb/core/mind/bscontroller/config_fit_groups.cpp index 5799c9e203c..53c34106aec 100644 --- a/ydb/core/mind/bscontroller/config_fit_groups.cpp +++ b/ydb/core/mind/bscontroller/config_fit_groups.cpp @@ -584,7 +584,7 @@ namespace NKikimr { TVSlotInfo *vslotInfo = State.VSlots.ConstructInplaceNewEntry(vslotId, vslotId, pdiskInfo, groupInfo->ID, 0, groupInfo->Generation, StoragePool.VDiskKind, failRealmIdx, failDomainIdx, vdiskIdx, TMood::Normal, groupInfo, &VSlotReadyTimestampQ, - TInstant::Zero()); + TInstant::Zero(), TDuration::Zero()); // mark as uncommitted State.UncommittedVSlots.insert(vslotId); diff --git a/ydb/core/mind/bscontroller/impl.h b/ydb/core/mind/bscontroller/impl.h index 8c6da178940..b0b40240eaf 100644 --- a/ydb/core/mind/bscontroller/impl.h +++ b/ydb/core/mind/bscontroller/impl.h @@ -99,6 +99,8 @@ public: TIndirectReferable<TGroupInfo>::TPtr Group; // group to which this VSlot belongs (or nullptr if it doesn't belong to any) THashSet<TVSlotId> Donors; // a set of alive donors for this disk (which are not being deleted) TInstant LastSeenReady; + TInstant LastGotReplicating; + TDuration ReplicationTime; // volatile state mutable NKikimrBlobStorage::TVDiskMetrics Metrics; @@ -127,8 +129,22 @@ public: bool IsReady = false; public: - void SetStatus(NKikimrBlobStorage::EVDiskStatus status, TMonotonic now) { + void SetStatus(NKikimrBlobStorage::EVDiskStatus status, TMonotonic now, TInstant instant) { if (status != Status) { + if (status == NKikimrBlobStorage::EVDiskStatus::REPLICATING) { // became "replicating" + LastGotReplicating = instant; + } else if (Status == NKikimrBlobStorage::EVDiskStatus::REPLICATING) { // was "replicating" + Y_VERIFY_DEBUG(LastGotReplicating != TInstant::Zero()); + ReplicationTime += instant - LastGotReplicating; + LastGotReplicating = {}; + } + if (status == NKikimrBlobStorage::EVDiskStatus::READY) { + ReplicationTime = TDuration::Zero(); + } + if (IsReady) { + LastSeenReady = instant; + } + Status = status; IsReady = false; if (status == NKikimrBlobStorage::EVDiskStatus::READY) { @@ -176,7 +192,9 @@ public: Table::VDiskIdx, Table::GroupPrevGeneration, Table::Mood, - Table::LastSeenReady + Table::LastSeenReady, + Table::LastGotReplicating, + Table::ReplicationTime > adapter( &TVSlotInfo::Kind, &TVSlotInfo::GroupId, @@ -186,7 +204,9 @@ public: &TVSlotInfo::VDiskIdx, &TVSlotInfo::GroupPrevGeneration, &TVSlotInfo::Mood, - &TVSlotInfo::LastSeenReady + &TVSlotInfo::LastSeenReady, + &TVSlotInfo::LastGotReplicating, + &TVSlotInfo::ReplicationTime ); callback(&adapter); } @@ -196,7 +216,8 @@ public: TVSlotInfo(TVSlotId vSlotId, TPDiskInfo *pdisk, TGroupId groupId, Table::GroupGeneration::Type groupPrevGeneration, Table::GroupGeneration::Type groupGeneration, Table::Category::Type kind, Table::RingIdx::Type ringIdx, Table::FailDomainIdx::Type failDomainIdx, Table::VDiskIdx::Type vDiskIdx, Table::Mood::Type mood, - TGroupInfo *group, TVSlotReadyTimestampQ *vslotReadyTimestampQ, TInstant lastSeenReady); // implemented in bsc.cpp + TGroupInfo *group, TVSlotReadyTimestampQ *vslotReadyTimestampQ, TInstant lastSeenReady, + TDuration replicationTime); // implemented in bsc.cpp // is the slot being deleted (marked as deleted) bool IsBeingDeleted() const { @@ -1801,7 +1822,24 @@ private: ITransaction* CreateTxMigrate(); ITransaction* CreateTxLoadEverything(); ITransaction* CreateTxUpdateSeenOperational(TVector<TGroupId> groups); - ITransaction* CreateTxUpdateLastSeenReady(std::vector<std::pair<TVSlotId, TInstant>> lastSeenReadyQ); + + struct TVDiskAvailabilityTiming { + TVSlotId VSlotId; + TInstant LastSeenReady; + TInstant LastGotReplicating; + TDuration ReplicationTime; + + TVDiskAvailabilityTiming() = default; + TVDiskAvailabilityTiming(const TVDiskAvailabilityTiming&) = default; + + TVDiskAvailabilityTiming(const TVSlotInfo& vslot) + : VSlotId(vslot.VSlotId) + , LastSeenReady(vslot.LastSeenReady) + , LastGotReplicating(vslot.LastGotReplicating) + , ReplicationTime(vslot.ReplicationTime) + {} + }; + ITransaction* CreateTxUpdateLastSeenReady(std::vector<TVDiskAvailabilityTiming> timingQ); void Handle(TEvPrivate::TEvDropDonor::TPtr ev); @@ -2042,7 +2080,7 @@ public: bool VSlotReadyUpdateScheduled = false; void VSlotReadyUpdate() { - std::vector<std::pair<TVSlotId, TInstant>> lastSeenReadyQ; + std::vector<TVDiskAvailabilityTiming> timingQ; Y_VERIFY(VSlotReadyUpdateScheduled); VSlotReadyUpdateScheduled = false; @@ -2056,7 +2094,7 @@ public: if (const TGroupInfo *group = it->second->Group) { groups.insert(const_cast<TGroupInfo*>(group)); it->second->LastSeenReady = TInstant::Zero(); - lastSeenReadyQ.emplace_back(it->second->VSlotId, it->second->LastSeenReady); + timingQ.emplace_back(*it->second); NotReadyVSlotIds.erase(it->second->VSlotId); } ScrubState.UpdateVDiskState(&*it->second); @@ -2065,8 +2103,8 @@ public: group->CalculateGroupStatus(); } ScheduleVSlotReadyUpdate(); - if (!lastSeenReadyQ.empty()) { - Execute(CreateTxUpdateLastSeenReady(std::move(lastSeenReadyQ))); + if (!timingQ.empty()) { + Execute(CreateTxUpdateLastSeenReady(std::move(timingQ))); } } @@ -2079,12 +2117,28 @@ public: void VSlotNotReadyHistogramUpdate() { const TInstant now = TActivationContext::Now(); auto& histo = TabletCounters->Percentile()[NBlobStorageController::COUNTER_NUM_NOT_READY_VDISKS]; + auto& histoReplROT = TabletCounters->Percentile()[NBlobStorageController::COUNTER_NUM_REPLICATING_VDISKS_ROT]; + auto& histoReplOther = TabletCounters->Percentile()[NBlobStorageController::COUNTER_NUM_REPLICATING_VDISKS_OTHER]; histo.Clear(); + histoReplROT.Clear(); + histoReplOther.Clear(); for (const TVSlotId vslotId : NotReadyVSlotIds) { if (const TVSlotInfo *slot = FindVSlot(vslotId)) { Y_VERIFY(slot->LastSeenReady != TInstant::Zero()); const TDuration passed = now - slot->LastSeenReady; histo.IncrementFor(passed.Seconds()); + + TDuration timeBeingReplicating = slot->ReplicationTime; + if (slot->Status == NKikimrBlobStorage::EVDiskStatus::REPLICATING) { + timeBeingReplicating += now - slot->LastGotReplicating; + } + + if (timeBeingReplicating != TDuration::Zero()) { + auto& hist = slot->PDisk->Kind.Type() == NPDisk::DEVICE_TYPE_ROT + ? histoReplROT + : histoReplOther; + hist.IncrementFor(timeBeingReplicating.Seconds()); + } } else { Y_VERIFY_DEBUG(false); } diff --git a/ydb/core/mind/bscontroller/load_everything.cpp b/ydb/core/mind/bscontroller/load_everything.cpp index 5bcbb01d4a9..d1a90a80c88 100644 --- a/ydb/core/mind/bscontroller/load_everything.cpp +++ b/ydb/core/mind/bscontroller/load_everything.cpp @@ -362,7 +362,8 @@ public: auto& x = Self->AddVSlot(vslotId, pdisk, groupId, slot.GetValueOrDefault<T::GroupPrevGeneration>(), slot.GetValue<T::GroupGeneration>(), slot.GetValue<T::Category>(), slot.GetValue<T::RingIdx>(), slot.GetValue<T::FailDomainIdx>(), slot.GetValue<T::VDiskIdx>(), slot.GetValueOrDefault<T::Mood>(), - Self->FindGroup(groupId), &Self->VSlotReadyTimestampQ, slot.GetValue<T::LastSeenReady>()); + Self->FindGroup(groupId), &Self->VSlotReadyTimestampQ, slot.GetValue<T::LastSeenReady>(), + slot.GetValue<T::ReplicationTime>()); if (x.LastSeenReady != TInstant::Zero()) { Self->NotReadyVSlotIds.insert(x.VSlotId); } diff --git a/ydb/core/mind/bscontroller/monitoring.cpp b/ydb/core/mind/bscontroller/monitoring.cpp index 6c84c199297..f67d0a9f6a0 100644 --- a/ydb/core/mind/bscontroller/monitoring.cpp +++ b/ydb/core/mind/bscontroller/monitoring.cpp @@ -1252,6 +1252,7 @@ void TBlobStorageController::RenderVSlotTable(IOutputStream& out, std::function< TABLEH() { out << "Status"; } TABLEH() { out << "IsReady"; } TABLEH() { out << "LastSeenReady"; } + TABLEH() { out << "ReplicationTime"; } TABLEH() { out << "Donors"; } TABLEH() { out << "Data Size"; } @@ -1291,6 +1292,13 @@ void TBlobStorageController::RenderVSlotRow(IOutputStream& out, const TVSlotInfo } } TABLED() { + TDuration time = vslot.ReplicationTime; + if (vslot.Status == NKikimrBlobStorage::EVDiskStatus::REPLICATING) { + time += TActivationContext::Now() - vslot.LastGotReplicating; + } + out << time; + } + TABLED() { if (vslot.Mood == TMood::Donor) { const auto *x = FindAcceptor(vslot); out << "<strong>donor for <a href='#" << x->GetVDiskId() << "'>" << x->VSlotId << "</a></strong>"; diff --git a/ydb/core/mind/bscontroller/register_node.cpp b/ydb/core/mind/bscontroller/register_node.cpp index 3b7662094e7..1620238affa 100644 --- a/ydb/core/mind/bscontroller/register_node.cpp +++ b/ydb/core/mind/bscontroller/register_node.cpp @@ -508,7 +508,7 @@ void TBlobStorageController::OnWardenDisconnected(TNodeId nodeId) { const TInstant now = TActivationContext::Now(); const TMonotonic mono = TActivationContext::Monotonic(); - std::vector<std::pair<TVSlotId, TInstant>> lastSeenReadyQ; + std::vector<TVDiskAvailabilityTiming> timingQ; for (auto it = PDisks.lower_bound(TPDiskId::MinForNode(nodeId)); it != PDisks.end() && it->first.NodeId == nodeId; ++it) { it->second->UpdateOperational(false); SysViewChangedPDisks.insert(it->first); @@ -518,11 +518,10 @@ void TBlobStorageController::OnWardenDisconnected(TNodeId nodeId) { for (auto it = VSlots.lower_bound(startingId); it != VSlots.end() && it->first.NodeId == nodeId; ++it) { if (const TGroupInfo *group = it->second->Group) { if (it->second->IsReady) { - it->second->LastSeenReady = now; - lastSeenReadyQ.emplace_back(it->second->VSlotId, now); NotReadyVSlotIds.insert(it->second->VSlotId); } - it->second->SetStatus(NKikimrBlobStorage::EVDiskStatus::ERROR, mono); + it->second->SetStatus(NKikimrBlobStorage::EVDiskStatus::ERROR, mono, now); + timingQ.emplace_back(*it->second); sh->VDiskStatusUpdate.emplace_back(it->second->GetVDiskId(), it->second->Status); ScrubState.UpdateVDiskState(&*it->second); } @@ -535,8 +534,8 @@ void TBlobStorageController::OnWardenDisconnected(TNodeId nodeId) { } ScrubState.OnNodeDisconnected(nodeId); EraseKnownDrivesOnDisconnected(&node); - if (!lastSeenReadyQ.empty()) { - Execute(CreateTxUpdateLastSeenReady(std::move(lastSeenReadyQ))); + if (!timingQ.empty()) { + Execute(CreateTxUpdateLastSeenReady(std::move(timingQ))); } for (TGroupId groupId : std::exchange(node.GroupsRequested, {})) { GroupToNode.erase(std::make_tuple(groupId, nodeId)); diff --git a/ydb/core/mind/bscontroller/scheme.h b/ydb/core/mind/bscontroller/scheme.h index e97b0df955f..f6d0957a2be 100644 --- a/ydb/core/mind/bscontroller/scheme.h +++ b/ydb/core/mind/bscontroller/scheme.h @@ -121,9 +121,25 @@ struct Schema : NIceDb::Schema { struct GroupPrevGeneration : Column<10, Group::Generation::ColumnType> { static constexpr ui32 Default = 0; }; struct Mood : Column<11, NScheme::NTypeIds::Uint32> { static constexpr ui32 Default = 0; }; struct LastSeenReady : Column<12, NScheme::NTypeIds::Uint64> { using Type = TInstant; static constexpr Type Default = TInstant::Zero(); }; + struct LastGotReplicating : Column<13, NScheme::NTypeIds::Uint64> { using Type = TInstant; static constexpr Type Default = TInstant::Zero(); }; + struct ReplicationTime : Column<14, NScheme::NTypeIds::Uint64> { using Type = TDuration; static constexpr Type Default = TDuration::Zero(); }; using TKey = TableKey<NodeID, PDiskID, VSlotID>; // order is important - using TColumns = TableColumns<NodeID, PDiskID, VSlotID, Category, GroupID, GroupGeneration, RingIdx, FailDomainIdx, VDiskIdx, GroupPrevGeneration, Mood, LastSeenReady>; + using TColumns = TableColumns< + NodeID, + PDiskID, + VSlotID, + Category, + GroupID, + GroupGeneration, + RingIdx, + FailDomainIdx, + VDiskIdx, + GroupPrevGeneration, + Mood, + LastSeenReady, + LastGotReplicating, + ReplicationTime>; }; struct VDiskMetrics : Table<6> { diff --git a/ydb/core/mind/bscontroller/self_heal.cpp b/ydb/core/mind/bscontroller/self_heal.cpp index 1c619c19979..c5bf347b290 100644 --- a/ydb/core/mind/bscontroller/self_heal.cpp +++ b/ydb/core/mind/bscontroller/self_heal.cpp @@ -786,7 +786,7 @@ namespace NKikimr::NBsController { THashSet<TGroupInfo*> groups; const TInstant now = TActivationContext::Now(); const TMonotonic mono = TActivationContext::Monotonic(); - std::vector<std::pair<TVSlotId, TInstant>> lastSeenReadyQ; + std::vector<TVDiskAvailabilityTiming> timingQ; std::unique_ptr<TEvPrivate::TEvDropDonor> dropDonorEv; @@ -799,14 +799,15 @@ namespace NKikimr::NBsController { const bool was = slot->IsOperational(); if (const TGroupInfo *group = slot->Group) { const bool wasReady = slot->IsReady; - slot->SetStatus(m.GetStatus(), mono); - if (slot->IsReady != wasReady) { - ScrubState.UpdateVDiskState(slot); - if (wasReady) { - slot->LastSeenReady = now; - lastSeenReadyQ.emplace_back(slot->VSlotId, now); - NotReadyVSlotIds.insert(slot->VSlotId); + if (slot->Status != m.GetStatus()) { + slot->SetStatus(m.GetStatus(), mono, now); + if (slot->IsReady != wasReady) { + ScrubState.UpdateVDiskState(slot); + if (wasReady) { + NotReadyVSlotIds.insert(slot->VSlotId); + } } + timingQ.emplace_back(*slot); } ev->VDiskStatusUpdate.emplace_back(vdiskId, m.GetStatus()); if (!was && slot->IsOperational() && !group->SeenOperational) { @@ -850,8 +851,8 @@ namespace NKikimr::NBsController { Execute(CreateTxUpdateSeenOperational(std::move(groupIds))); } - if (!lastSeenReadyQ.empty()) { - Execute(CreateTxUpdateLastSeenReady(std::move(lastSeenReadyQ))); + if (!timingQ.empty()) { + Execute(CreateTxUpdateLastSeenReady(std::move(timingQ))); } ScheduleVSlotReadyUpdate(); diff --git a/ydb/core/mind/bscontroller/update_last_seen_ready.cpp b/ydb/core/mind/bscontroller/update_last_seen_ready.cpp index daf18702d84..c50298142a5 100644 --- a/ydb/core/mind/bscontroller/update_last_seen_ready.cpp +++ b/ydb/core/mind/bscontroller/update_last_seen_ready.cpp @@ -4,20 +4,31 @@ namespace NKikimr { namespace NBsController { class TBlobStorageController::TTxUpdateLastSeenReady : public TTransactionBase<TBlobStorageController> { - std::vector<std::pair<TVSlotId, TInstant>> LastSeenReadyQ; + std::vector<TVDiskAvailabilityTiming> TimingQ; public: - TTxUpdateLastSeenReady(std::vector<std::pair<TVSlotId, TInstant>> lastSeenReadyQ, TBlobStorageController *controller) + TTxUpdateLastSeenReady(std::vector<TVDiskAvailabilityTiming> timingQ, TBlobStorageController *controller) : TBase(controller) - , LastSeenReadyQ(std::move(lastSeenReadyQ)) + , TimingQ(std::move(timingQ)) {} TTxType GetTxType() const override { return NBlobStorageController::TXTYPE_UPDATE_LAST_SEEN_READY; } bool Execute(TTransactionContext &txc, const TActorContext&) override { NIceDb::TNiceDb db(txc.DB); - for (const auto& [vslotId, lastSeenReady] : LastSeenReadyQ) { - db.Table<Schema::VSlot>().Key(vslotId.GetKey()).Update<Schema::VSlot::LastSeenReady>(lastSeenReady); + for (const auto& item : TimingQ) { + auto row = db.Table<Schema::VSlot>().Key(item.VSlotId.GetKey()); + +#define UPDATE_CELL(CELL) \ + if (item.CELL != Schema::VSlot::CELL::Default) { \ + row.Update<Schema::VSlot::CELL>(item.CELL); \ + } else { \ + row.UpdateToNull<Schema::VSlot::CELL>(); \ + } + + UPDATE_CELL(LastSeenReady); + UPDATE_CELL(LastGotReplicating); + UPDATE_CELL(ReplicationTime); } return true; } @@ -25,8 +36,8 @@ public: void Complete(const TActorContext&) override {} }; -ITransaction* TBlobStorageController::CreateTxUpdateLastSeenReady(std::vector<std::pair<TVSlotId, TInstant>> lastSeenReadyQ) { - return new TTxUpdateLastSeenReady(std::move(lastSeenReadyQ), this); +ITransaction* TBlobStorageController::CreateTxUpdateLastSeenReady(std::vector<TVDiskAvailabilityTiming> timingQ) { + return new TTxUpdateLastSeenReady(std::move(timingQ), this); } } diff --git a/ydb/core/mind/table_adapter.h b/ydb/core/mind/table_adapter.h index c782dc32f47..e2c27e98d24 100644 --- a/ydb/core/mind/table_adapter.h +++ b/ydb/core/mind/table_adapter.h @@ -117,6 +117,10 @@ namespace NKikimr { to.ConstructInPlace(from.GetValue()); } + inline void Cast(const TDuration& from, TMaybe<ui64>& to) { + to.ConstructInPlace(from.GetValue()); + } + template<typename TRow, typename TColumn> struct TCell { typename TColumn::Type TRow::*CellPtr = nullptr; diff --git a/ydb/core/protos/counters_bs_controller.proto b/ydb/core/protos/counters_bs_controller.proto index 048e6f67075..77e2dfb8c37 100644 --- a/ydb/core/protos/counters_bs_controller.proto +++ b/ydb/core/protos/counters_bs_controller.proto @@ -193,6 +193,52 @@ enum EPercentileCounters { Ranges { Value: 18000 Name: "18000" } Ranges { Value: 21600 Name: "21600" } }]; + + COUNTER_NUM_REPLICATING_VDISKS_ROT = 4 [(CounterOpts) = { + Name: "NumReplicatingVDisks/ROT" + Integral: true + Ranges { Value: 0 Name: "0" } + Ranges { Value: 600 Name: "600" } + Ranges { Value: 1200 Name: "1200" } + Ranges { Value: 1800 Name: "1800" } + Ranges { Value: 2400 Name: "2400" } + Ranges { Value: 3000 Name: "3000" } + Ranges { Value: 3600 Name: "3600" } + Ranges { Value: 5400 Name: "5400" } + Ranges { Value: 7200 Name: "7200" } + Ranges { Value: 9000 Name: "9000" } + Ranges { Value: 10800 Name: "10800" } + Ranges { Value: 14400 Name: "14400" } + Ranges { Value: 18000 Name: "18000" } + Ranges { Value: 21600 Name: "21600" } + Ranges { Value: 43200 Name: "43200" } + Ranges { Value: 86400 Name: "86400" } + Ranges { Value: 172800 Name: "172800" } + Ranges { Value: 259200 Name: "259200" } + }]; + + COUNTER_NUM_REPLICATING_VDISKS_OTHER = 5 [(CounterOpts) = { + Name: "NumReplicatingVDisks/Other" + Integral: true + Ranges { Value: 0 Name: "0" } + Ranges { Value: 600 Name: "600" } + Ranges { Value: 1200 Name: "1200" } + Ranges { Value: 1800 Name: "1800" } + Ranges { Value: 2400 Name: "2400" } + Ranges { Value: 3000 Name: "3000" } + Ranges { Value: 3600 Name: "3600" } + Ranges { Value: 5400 Name: "5400" } + Ranges { Value: 7200 Name: "7200" } + Ranges { Value: 9000 Name: "9000" } + Ranges { Value: 10800 Name: "10800" } + Ranges { Value: 14400 Name: "14400" } + Ranges { Value: 18000 Name: "18000" } + Ranges { Value: 21600 Name: "21600" } + Ranges { Value: 43200 Name: "43200" } + Ranges { Value: 86400 Name: "86400" } + Ranges { Value: 172800 Name: "172800" } + Ranges { Value: 259200 Name: "259200" } + }]; } enum ETxTypes { diff --git a/ydb/tests/functional/scheme_tests/canondata/tablet_scheme_tests.TestTabletSchemes.test_tablet_schemes_flat_bs_controller_/flat_bs_controller.schema b/ydb/tests/functional/scheme_tests/canondata/tablet_scheme_tests.TestTabletSchemes.test_tablet_schemes_flat_bs_controller_/flat_bs_controller.schema index 00cd34dd26a..b568ce80448 100644 --- a/ydb/tests/functional/scheme_tests/canondata/tablet_scheme_tests.TestTabletSchemes.test_tablet_schemes_flat_bs_controller_/flat_bs_controller.schema +++ b/ydb/tests/functional/scheme_tests/canondata/tablet_scheme_tests.TestTabletSchemes.test_tablet_schemes_flat_bs_controller_/flat_bs_controller.schema @@ -724,6 +724,16 @@ "ColumnId": 12, "ColumnName": "LastSeenReady", "ColumnType": "Uint64" + }, + { + "ColumnId": 13, + "ColumnName": "LastGotReplicating", + "ColumnType": "Uint64" + }, + { + "ColumnId": 14, + "ColumnName": "ReplicationTime", + "ColumnType": "Uint64" } ], "ColumnsDropped": [], @@ -741,7 +751,9 @@ 9, 10, 11, - 12 + 12, + 13, + 14 ], "RoomID": 0, "Codec": 0, |