diff options
author | Ilia Shakhov <pixcc@ydb.tech> | 2024-01-30 13:48:20 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-30 13:48:20 +0300 |
commit | 76e4b1e39f5ffecd1cd9d59733c3f6c1eade93c0 (patch) | |
tree | 805521933fbca3fab85f9e9a8f365dd4b9a3363b | |
parent | f09d5645979d1737861332457c8b64340ce793e7 (diff) | |
download | ydb-76e4b1e39f5ffecd1cd9d59733c3f6c1eade93c0.tar.gz |
Do not lock already locked node KIKIMR-20904 (#1401)
-rw-r--r-- | ydb/core/cms/cms_ut.cpp | 20 | ||||
-rw-r--r-- | ydb/core/cms/node_checkers.cpp | 16 | ||||
-rw-r--r-- | ydb/core/cms/node_checkers.h | 2 |
3 files changed, 34 insertions, 4 deletions
diff --git a/ydb/core/cms/cms_ut.cpp b/ydb/core/cms/cms_ut.cpp index 66eb8210a1..03dde0cba7 100644 --- a/ydb/core/cms/cms_ut.cpp +++ b/ydb/core/cms/cms_ut.cpp @@ -459,6 +459,26 @@ Y_UNIT_TEST_SUITE(TCmsTest) { "vdisk-3-1-0-1-0", "vdisk-3-1-0-5-0")); } + Y_UNIT_TEST(RequestReplaceManyDevicesOnOneNode) + { + TCmsTestEnv env(16, 3); + NKikimrCms::TCmsConfig config; + config.MutableClusterLimits()->SetDisabledNodesLimit(3); + config.MutableClusterLimits()->SetDisabledNodesRatioLimit(0); + env.SetCmsConfig(config); + + auto rec1 = env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW, + MakeAction(TAction::REPLACE_DEVICES, env.GetNodeId(0), + 60000000, env.PDiskName(0, 0), + env.PDiskName(0, 1), env.PDiskName(0, 2))); + UNIT_ASSERT_VALUES_EQUAL(rec1.PermissionsSize(), 1); + + auto rec2 = env.CheckPermissionRequest("user", false, false, false, true, TStatus::ALLOW, + MakeAction(TAction::SHUTDOWN_HOST, env.GetNodeId(9), + 60000000)); + UNIT_ASSERT_VALUES_EQUAL(rec2.PermissionsSize(), 1); + } + Y_UNIT_TEST(RequestReplaceBrokenDevices) { TCmsTestEnv env(8); diff --git a/ydb/core/cms/node_checkers.cpp b/ydb/core/cms/node_checkers.cpp index 04ebf35fd7..75c9b3c91b 100644 --- a/ydb/core/cms/node_checkers.cpp +++ b/ydb/core/cms/node_checkers.cpp @@ -38,8 +38,7 @@ void TNodesCounterBase::UpdateNode(ui32 nodeId, NKikimrCms::EState state) { --DownNodesCount; } - if (NodeToState[nodeId] == NODE_STATE_LOCKED || - NodeToState[nodeId] == NODE_STATE_RESTART) { + if (IsNodeLocked(nodeId)) { --LockedNodesCount; } @@ -55,8 +54,15 @@ void TNodesCounterBase::UpdateNode(ui32 nodeId, NKikimrCms::EState state) { } } -void TNodesCounterBase::LockNode(ui32 nodeId) { +bool TNodesCounterBase::IsNodeLocked(ui32 nodeId) const { Y_ABORT_UNLESS(NodeToState.contains(nodeId)); + return NodeToState.at(nodeId) == NODE_STATE_RESTART || NodeToState.at(nodeId) == NODE_STATE_LOCKED; +} + +void TNodesCounterBase::LockNode(ui32 nodeId) { + if (IsNodeLocked(nodeId)) { + return; + } ++LockedNodesCount; if (NodeToState[nodeId] == NODE_STATE_DOWN) { @@ -68,7 +74,9 @@ void TNodesCounterBase::LockNode(ui32 nodeId) { } void TNodesCounterBase::UnlockNode(ui32 nodeId) { - Y_ABORT_UNLESS(NodeToState.contains(nodeId)); + if (!IsNodeLocked(nodeId)) { + return; + } --LockedNodesCount; if (NodeToState[nodeId] == NODE_STATE_RESTART) { diff --git a/ydb/core/cms/node_checkers.h b/ydb/core/cms/node_checkers.h index b964e3b87e..16ffccbfb2 100644 --- a/ydb/core/cms/node_checkers.h +++ b/ydb/core/cms/node_checkers.h @@ -34,6 +34,7 @@ public: virtual void AddNode(ui32 nodeId) = 0; virtual void UpdateNode(ui32 nodeId, NKikimrCms::EState) = 0; + virtual bool IsNodeLocked(ui32 nodeId) const = 0; virtual void LockNode(ui32 nodeId) = 0; virtual void UnlockNode(ui32 nodeId) = 0; @@ -59,6 +60,7 @@ public: void AddNode(ui32 nodeId) override; void UpdateNode(ui32 nodeId, NKikimrCms::EState) override; + bool IsNodeLocked(ui32 nodeId) const override; void LockNode(ui32 nodeId) override; void UnlockNode(ui32 nodeId) override; |