Skip to content

Commit c1eb495

Browse files
authored
Add disable evict vdisks option to config (#9812)
1 parent c0ce5ac commit c1eb495

File tree

5 files changed

+87
-2
lines changed

5 files changed

+87
-2
lines changed

ydb/core/cms/cms.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,12 @@ bool TCms::CheckEvictVDisks(const TAction &action, TErrorInfo &error) const {
505505
return false;
506506
}
507507

508+
if (State->Config.SentinelConfig.EvictVDisksStatus.Empty()) {
509+
error.Code = TStatus::ERROR;
510+
error.Reason = "Evict vdisks is disabled in Sentinel (self heal)";
511+
return false;
512+
}
513+
508514
switch (action.GetType()) {
509515
case TAction::RESTART_SERVICES:
510516
case TAction::SHUTDOWN_HOST:

ydb/core/cms/cms_ut.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -1853,6 +1853,46 @@ Y_UNIT_TEST_SUITE(TCmsTest) {
18531853
env.CheckDonePermission("user", permission2.GetPermissions(0).GetId());
18541854
}
18551855

1856+
Y_UNIT_TEST(DisabledEvictVDisks)
1857+
{
1858+
auto opts = TTestEnvOpts(8).WithSentinel();
1859+
TCmsTestEnv env(opts);
1860+
env.SetLogPriority(NKikimrServices::CMS, NLog::PRI_DEBUG);
1861+
1862+
// Make transition faster for tests purposes
1863+
auto cmsConfig = env.GetCmsConfig();
1864+
cmsConfig.MutableSentinelConfig()->SetDefaultStateLimit(1);
1865+
env.SetCmsConfig(cmsConfig);
1866+
1867+
// Evict VDisks
1868+
auto request = env.CheckPermissionRequest(
1869+
MakePermissionRequest(TRequestOptions("user").WithEvictVDisks(),
1870+
MakeAction(TAction::RESTART_SERVICES, env.GetNodeId(0), 600000000, "storage")
1871+
),
1872+
TStatus::DISALLOW_TEMP // ok, waiting for move VDisks
1873+
);
1874+
1875+
// Check that FAULTY BSC request is sent
1876+
env.CheckBSCUpdateRequests({ env.GetNodeId(0) }, NKikimrBlobStorage::FAULTY);
1877+
1878+
// Disable VDisks eviction
1879+
cmsConfig.MutableSentinelConfig()->SetEvictVDisksStatus(NKikimrCms::TCmsConfig::TSentinelConfig::DISABLED);
1880+
env.SetCmsConfig(cmsConfig);
1881+
1882+
// Check that ACTIVE BSC request is sent
1883+
env.CheckBSCUpdateRequests({ env.GetNodeId(0) }, NKikimrBlobStorage::ACTIVE);
1884+
1885+
// Check that CMS returns ERROR when VDisks eviction is disabled
1886+
env.CheckRequest("user", request.GetRequestId(), false, TStatus::ERROR, 0);
1887+
1888+
// Enable VDisks eviction again
1889+
cmsConfig.MutableSentinelConfig()->SetEvictVDisksStatus(NKikimrCms::TCmsConfig::TSentinelConfig::FAULTY);
1890+
env.SetCmsConfig(cmsConfig);
1891+
1892+
// Check that FAULTY BSC request is sent again
1893+
env.CheckBSCUpdateRequests({ env.GetNodeId(0) }, NKikimrBlobStorage::FAULTY);
1894+
}
1895+
18561896
Y_UNIT_TEST(EmergencyDuringRollingRestart)
18571897
{
18581898
TCmsTestEnv env(8);

ydb/core/cms/config.h

+32
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
#pragma once
22

33
#include "pdisk_state.h"
4+
#include "pdisk_status.h"
45

56
#include <ydb/core/protos/cms.pb.h>
67

78
#include <util/datetime/base.h>
89
#include <util/generic/hash.h>
910
#include <util/generic/map.h>
11+
#include <util/generic/maybe.h>
1012

1113
namespace NKikimr::NCms {
1214

@@ -30,6 +32,8 @@ struct TCmsSentinelConfig {
3032
ui32 RoomRatio;
3133
ui32 RackRatio;
3234

35+
TMaybeFail<EPDiskStatus> EvictVDisksStatus;
36+
3337
void Serialize(NKikimrCms::TCmsConfig::TSentinelConfig &config) const {
3438
config.SetEnable(Enable);
3539
config.SetDryRun(DryRun);
@@ -45,6 +49,7 @@ struct TCmsSentinelConfig {
4549
config.SetRackRatio(RackRatio);
4650

4751
SaveStateLimits(config);
52+
SaveEvictVDisksStatus(config);
4853
}
4954

5055
void Deserialize(const NKikimrCms::TCmsConfig::TSentinelConfig &config) {
@@ -63,6 +68,8 @@ struct TCmsSentinelConfig {
6368

6469
auto newStateLimits = LoadStateLimits(config);
6570
StateLimits.swap(newStateLimits);
71+
72+
EvictVDisksStatus = LoadEvictVDisksStatus(config);
6673
}
6774

6875
void SaveStateLimits(NKikimrCms::TCmsConfig::TSentinelConfig &config) const {
@@ -129,6 +136,31 @@ struct TCmsSentinelConfig {
129136

130137
return stateLimits;
131138
}
139+
140+
static TMaybeFail<EPDiskStatus> LoadEvictVDisksStatus(const NKikimrCms::TCmsConfig::TSentinelConfig &config) {
141+
using EEvictVDisksStatus = NKikimrCms::TCmsConfig::TSentinelConfig;
142+
switch (config.GetEvictVDisksStatus()) {
143+
case EEvictVDisksStatus::UNKNOWN:
144+
case EEvictVDisksStatus::FAULTY:
145+
return EPDiskStatus::FAULTY;
146+
case EEvictVDisksStatus::DISABLED:
147+
return Nothing();
148+
}
149+
return EPDiskStatus::FAULTY;
150+
}
151+
152+
void SaveEvictVDisksStatus(NKikimrCms::TCmsConfig::TSentinelConfig &config) const {
153+
using EEvictVDisksStatus = NKikimrCms::TCmsConfig::TSentinelConfig;
154+
155+
if (EvictVDisksStatus.Empty()) {
156+
config.SetEvictVDisksStatus(EEvictVDisksStatus::DISABLED);
157+
return;
158+
}
159+
160+
if (*EvictVDisksStatus == EPDiskStatus::FAULTY) {
161+
config.SetEvictVDisksStatus(EEvictVDisksStatus::FAULTY);
162+
}
163+
}
132164
};
133165

134166
struct TCmsLogConfig {

ydb/core/cms/sentinel.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -895,8 +895,8 @@ class TSentinel: public TActorBootstrapped<TSentinel> {
895895
continue;
896896
}
897897

898-
if (it->second.HasFaultyMarker()) {
899-
info.SetForcedStatus(EPDiskStatus::FAULTY);
898+
if (it->second.HasFaultyMarker() && Config.EvictVDisksStatus.Defined()) {
899+
info.SetForcedStatus(*Config.EvictVDisksStatus);
900900
} else {
901901
info.ResetForcedStatus();
902902
}

ydb/core/protos/cms.proto

+7
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,12 @@ message TCmsConfig {
414414
optional uint32 Limit = 2;
415415
}
416416

417+
enum EEvictVDisksStatus {
418+
UNKNOWN = 0;
419+
DISABLED = 1;
420+
FAULTY = 2;
421+
}
422+
417423
optional bool Enable = 1 [default = true];
418424
// Updater's config
419425
optional uint64 UpdateConfigInterval = 2 [default = 3600000000];
@@ -433,6 +439,7 @@ message TCmsConfig {
433439

434440
optional bool DryRun = 13;
435441
repeated TStateLimit StateLimits = 14;
442+
optional EEvictVDisksStatus EvictVDisksStatus = 15;
436443
}
437444

438445
message TLogConfig {

0 commit comments

Comments
 (0)