Skip to content

Commit 76e4b1e

Browse files
authored
Do not lock already locked node KIKIMR-20904 (#1401)
1 parent f09d564 commit 76e4b1e

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

ydb/core/cms/cms_ut.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,26 @@ Y_UNIT_TEST_SUITE(TCmsTest) {
459459
"vdisk-3-1-0-1-0", "vdisk-3-1-0-5-0"));
460460
}
461461

462+
Y_UNIT_TEST(RequestReplaceManyDevicesOnOneNode)
463+
{
464+
TCmsTestEnv env(16, 3);
465+
NKikimrCms::TCmsConfig config;
466+
config.MutableClusterLimits()->SetDisabledNodesLimit(3);
467+
config.MutableClusterLimits()->SetDisabledNodesRatioLimit(0);
468+
env.SetCmsConfig(config);
469+
470+
auto rec1 = env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
471+
MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0),
472+
60000000, env.PDiskName(0, 0),
473+
env.PDiskName(0, 1), env.PDiskName(0, 2)));
474+
UNIT_ASSERT_VALUES_EQUAL(rec1.PermissionsSize(), 1);
475+
476+
auto rec2 = env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW,
477+
MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(9),
478+
60000000));
479+
UNIT_ASSERT_VALUES_EQUAL(rec2.PermissionsSize(), 1);
480+
}
481+
462482
Y_UNIT_TEST(RequestReplaceBrokenDevices)
463483
{
464484
TCmsTestEnv env(8);

ydb/core/cms/node_checkers.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ void TNodesCounterBase::UpdateNode(ui32 nodeId, NKikimrCms::EState state) {
3838
--DownNodesCount;
3939
}
4040

41-
if (NodeToState[nodeId] == NODE_STATE_LOCKED ||
42-
NodeToState[nodeId] == NODE_STATE_RESTART) {
41+
if (IsNodeLocked(nodeId)) {
4342
--LockedNodesCount;
4443
}
4544

@@ -55,8 +54,15 @@ void TNodesCounterBase::UpdateNode(ui32 nodeId, NKikimrCms::EState state) {
5554
}
5655
}
5756

58-
void TNodesCounterBase::LockNode(ui32 nodeId) {
57+
bool TNodesCounterBase::IsNodeLocked(ui32 nodeId) const {
5958
Y_ABORT_UNLESS(NodeToState.contains(nodeId));
59+
return NodeToState.at(nodeId) == NODE_STATE_RESTART || NodeToState.at(nodeId) == NODE_STATE_LOCKED;
60+
}
61+
62+
void TNodesCounterBase::LockNode(ui32 nodeId) {
63+
if (IsNodeLocked(nodeId)) {
64+
return;
65+
}
6066

6167
++LockedNodesCount;
6268
if (NodeToState[nodeId] == NODE_STATE_DOWN) {
@@ -68,7 +74,9 @@ void TNodesCounterBase::LockNode(ui32 nodeId) {
6874
}
6975

7076
void TNodesCounterBase::UnlockNode(ui32 nodeId) {
71-
Y_ABORT_UNLESS(NodeToState.contains(nodeId));
77+
if (!IsNodeLocked(nodeId)) {
78+
return;
79+
}
7280

7381
--LockedNodesCount;
7482
if (NodeToState[nodeId] == NODE_STATE_RESTART) {

ydb/core/cms/node_checkers.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class INodesChecker {
3434
virtual void AddNode(ui32 nodeId) = 0;
3535
virtual void UpdateNode(ui32 nodeId, NKikimrCms::EState) = 0;
3636

37+
virtual bool IsNodeLocked(ui32 nodeId) const = 0;
3738
virtual void LockNode(ui32 nodeId) = 0;
3839
virtual void UnlockNode(ui32 nodeId) = 0;
3940

@@ -59,6 +60,7 @@ class TNodesCounterBase : public INodesChecker {
5960
void AddNode(ui32 nodeId) override;
6061
void UpdateNode(ui32 nodeId, NKikimrCms::EState) override;
6162

63+
bool IsNodeLocked(ui32 nodeId) const override;
6264
void LockNode(ui32 nodeId) override;
6365
void UnlockNode(ui32 nodeId) override;
6466

0 commit comments

Comments
 (0)