aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralexvru <alexvru@ydb.tech>2023-04-06 18:10:15 +0300
committeralexvru <alexvru@ydb.tech>2023-04-06 18:10:15 +0300
commitf7bbd3abe6eb6755b81334b0cc24fe39130c8554 (patch)
treefe97145a3a77921ab444940cdef84a85baeab6b2
parentcf01db4c44585761db33d3f41fd3fe41a9acd70b (diff)
downloadydb-f7bbd3abe6eb6755b81334b0cc24fe39130c8554.tar.gz
Export replication time metric
-rw-r--r--ydb/core/mind/bscontroller/bsc.cpp3
-rw-r--r--ydb/core/mind/bscontroller/config_fit_groups.cpp2
-rw-r--r--ydb/core/mind/bscontroller/impl.h72
-rw-r--r--ydb/core/mind/bscontroller/load_everything.cpp3
-rw-r--r--ydb/core/mind/bscontroller/monitoring.cpp8
-rw-r--r--ydb/core/mind/bscontroller/register_node.cpp11
-rw-r--r--ydb/core/mind/bscontroller/scheme.h18
-rw-r--r--ydb/core/mind/bscontroller/self_heal.cpp21
-rw-r--r--ydb/core/mind/bscontroller/update_last_seen_ready.cpp25
-rw-r--r--ydb/core/mind/table_adapter.h4
-rw-r--r--ydb/core/protos/counters_bs_controller.proto46
-rw-r--r--ydb/tests/functional/scheme_tests/canondata/tablet_scheme_tests.TestTabletSchemes.test_tablet_schemes_flat_bs_controller_/flat_bs_controller.schema14
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,