diff options
author | Alexander Rutkovsky <alexvru@ydb.tech> | 2025-05-23 18:45:40 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-23 15:45:40 +0000 |
commit | 97a5825cf0c3d1a04fa64c87201c4bebfd7da9c9 (patch) | |
tree | 9afab7e52fa7987381f7885d5a0bd620e47e9ba3 | |
parent | 6bb5b4805dd1cdec68e896d52540e0af95dd1fbc (diff) | |
download | ydb-97a5825cf0c3d1a04fa64c87201c4bebfd7da9c9.tar.gz |
Refactor bridge mode info returned in TEvNodeWardenStorageConfig (#18744)
-rw-r--r-- | ydb/core/base/bridge.h | 28 | ||||
-rw-r--r-- | ydb/core/blobstorage/base/blobstorage_events.cpp | 5 | ||||
-rw-r--r-- | ydb/core/blobstorage/base/blobstorage_events.h | 6 | ||||
-rw-r--r-- | ydb/core/blobstorage/nodewarden/distconf.cpp | 52 | ||||
-rw-r--r-- | ydb/core/blobstorage/nodewarden/distconf.h | 3 | ||||
-rw-r--r-- | ydb/core/blobstorage/nodewarden/node_warden_impl.h | 3 | ||||
-rw-r--r-- | ydb/core/blobstorage/nodewarden/node_warden_resource.cpp | 9 | ||||
-rw-r--r-- | ydb/core/blobstorage/ut_blobstorage/lib/node_warden_mock_bsc.cpp | 2 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/ut_bscontroller/main.cpp | 2 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/ut_selfheal/node_warden_mock.h | 2 |
10 files changed, 82 insertions, 30 deletions
diff --git a/ydb/core/base/bridge.h b/ydb/core/base/bridge.h new file mode 100644 index 00000000000..2694bb45b64 --- /dev/null +++ b/ydb/core/base/bridge.h @@ -0,0 +1,28 @@ +#pragma once + +#include "defs.h" +#include "blobstorage_common.h" + +#include <ydb/core/protos/bridge.pb.h> + +namespace NKikimr { + + struct TBridgeInfo { + struct TPile { + TBridgePileId BridgePileId; // essentially an index into TBridgeInfo::Piles array + std::vector<ui32> StaticNodeIds; // a sorted set of static node ids belonging to this very pile + NKikimrBridge::TClusterState::EPileState State = {}; // state of this pile + bool IsPrimary = false; // is this pile selected as primary + bool IsBeingPromoted = false; // is this pile being promoted right now (and not the primary, but in sync with one) + }; + + THashMap<ui32, const TPile*> StaticNodeIdToPile; // node to pile map for static nodes + std::vector<TPile> Piles; // a vector of piles + const TPile *SelfNodePile = nullptr; // a reference to pile this node belongs to + const TPile *PrimaryPile = nullptr; // a reference to the primary pile + const TPile *BeingPromotedPile = nullptr; // a reference to the pile being promoted, or nullptr if none are promoted + + using TPtr = std::shared_ptr<const TBridgeInfo>; + }; + +} // NKikimr diff --git a/ydb/core/blobstorage/base/blobstorage_events.cpp b/ydb/core/blobstorage/base/blobstorage_events.cpp index 49c0ee82de8..a1144a07390 100644 --- a/ydb/core/blobstorage/base/blobstorage_events.cpp +++ b/ydb/core/blobstorage/base/blobstorage_events.cpp @@ -5,14 +5,13 @@ namespace NKikimr { TEvNodeWardenStorageConfig::TEvNodeWardenStorageConfig(const NKikimrBlobStorage::TStorageConfig& config, const NKikimrBlobStorage::TStorageConfig *proposedConfig, bool selfManagementEnabled, - bool isPrimary, bool isBeingPromoted) + TBridgeInfo::TPtr bridgeInfo) : Config(std::make_unique<NKikimrBlobStorage::TStorageConfig>(config)) , ProposedConfig(proposedConfig ? std::make_unique<NKikimrBlobStorage::TStorageConfig>(*proposedConfig) : nullptr) , SelfManagementEnabled(selfManagementEnabled) - , IsPrimary(isPrimary) - , IsBeingPromoted(isBeingPromoted) + , BridgeInfo(std::move(bridgeInfo)) {} TEvNodeWardenStorageConfig::~TEvNodeWardenStorageConfig() diff --git a/ydb/core/blobstorage/base/blobstorage_events.h b/ydb/core/blobstorage/base/blobstorage_events.h index d6ddbf0e1c7..8883feebf38 100644 --- a/ydb/core/blobstorage/base/blobstorage_events.h +++ b/ydb/core/blobstorage/base/blobstorage_events.h @@ -3,6 +3,7 @@ #include "blobstorage_vdiskid.h" #include <ydb/core/base/blobstorage.h> +#include <ydb/core/base/bridge.h> #include <ydb/core/blobstorage/groupinfo/blobstorage_groupinfo.h> #include <ydb/core/blobstorage/pdisk/blobstorage_pdisk_config.h> #include <ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h> @@ -583,12 +584,11 @@ namespace NKikimr { std::unique_ptr<NKikimrBlobStorage::TStorageConfig> Config; std::unique_ptr<NKikimrBlobStorage::TStorageConfig> ProposedConfig; bool SelfManagementEnabled; - bool IsPrimary; // if bridge mode is enabled - bool IsBeingPromoted; // if bridge mode is enabled + TBridgeInfo::TPtr BridgeInfo; TEvNodeWardenStorageConfig(const NKikimrBlobStorage::TStorageConfig& config, const NKikimrBlobStorage::TStorageConfig *proposedConfig, bool selfManagementEnabled, - bool isPrimary, bool isBeingPromoted); + TBridgeInfo::TPtr bridgeInfo); ~TEvNodeWardenStorageConfig(); }; diff --git a/ydb/core/blobstorage/nodewarden/distconf.cpp b/ydb/core/blobstorage/nodewarden/distconf.cpp index a3fce1f7e20..c24bf5e9ae9 100644 --- a/ydb/core/blobstorage/nodewarden/distconf.cpp +++ b/ydb/core/blobstorage/nodewarden/distconf.cpp @@ -102,21 +102,51 @@ namespace NKikimr::NStorage { config.GetSelfManagementConfig().GetEnabled() && config.GetGeneration(); - if (config.HasClusterState()) { + if (config.HasClusterState() && Cfg->BridgeConfig) { const auto& state = config.GetClusterState(); - bool found = false; + + // prepare empty structure + auto bridgeInfo = std::make_shared<TBridgeInfo>(); + bridgeInfo->Piles.resize(Cfg->BridgeConfig->PilesSize()); + for (const auto& node : config.GetAllNodes()) { - if (node.GetNodeId() == SelfNode.NodeId() && node.HasBridgePileId()) { - IsPrimary = node.GetBridgePileId() == state.GetPrimaryPile(); - IsBeingPromoted = !IsPrimary && node.GetBridgePileId() == state.GetPromotedPile(); - found = true; - break; + if (node.HasBridgePileId()) { + const ui32 nodeId = node.GetNodeId(); + const ui32 pileId = node.GetBridgePileId(); + Y_ABORT_UNLESS(pileId < bridgeInfo->Piles.size()); + auto& pile = bridgeInfo->Piles[pileId]; + pile.StaticNodeIds.push_back(node.GetNodeId()); + bridgeInfo->StaticNodeIdToPile[nodeId] = &pile; + if (nodeId == SelfNode.NodeId()) { + bridgeInfo->SelfNodePile = &pile; + } } } - if (!found) { - // TODO(alexvru): think about better handling of node removal - IsPrimary = IsBeingPromoted = false; + + Y_ABORT_UNLESS(state.PerPileStateSize() == Cfg->BridgeConfig->PilesSize()); + for (size_t i = 0; i < state.PerPileStateSize(); ++i) { + auto& pile = bridgeInfo->Piles[i]; + pile.BridgePileId = TBridgePileId::FromValue(i); + pile.State = state.GetPerPileState(i); + std::ranges::sort(pile.StaticNodeIds); } + + const ui32 primary = state.GetPrimaryPile(); + Y_ABORT_UNLESS(primary < Cfg->BridgeConfig->PilesSize()); + bridgeInfo->Piles[primary].IsPrimary = true; + bridgeInfo->PrimaryPile = &bridgeInfo->Piles[primary]; + + if (const ui32 promoted = state.GetPromotedPile(); promoted != primary) { + Y_ABORT_UNLESS(promoted < Cfg->BridgeConfig->PilesSize()); + auto& pile = bridgeInfo->Piles[promoted]; + Y_ABORT_UNLESS(pile.State == NKikimrBridge::TClusterState::SYNCHRONIZED); + pile.IsBeingPromoted = true; + bridgeInfo->BeingPromotedPile = &pile; + } + + BridgeInfo = std::move(bridgeInfo); + } else { + Y_ABORT_UNLESS(!BridgeInfo); } StorageConfig.emplace(config); @@ -327,7 +357,7 @@ namespace NKikimr::NStorage { ? &ProposedStorageConfig.value() : nullptr; auto ev = std::make_unique<TEvNodeWardenStorageConfig>(*config, proposedConfig, SelfManagementEnabled, - IsPrimary, IsBeingPromoted); + BridgeInfo); Send(wardenId, ev.release(), 0, cookie); } diff --git a/ydb/core/blobstorage/nodewarden/distconf.h b/ydb/core/blobstorage/nodewarden/distconf.h index 7a317a01554..e6e8b4b754b 100644 --- a/ydb/core/blobstorage/nodewarden/distconf.h +++ b/ydb/core/blobstorage/nodewarden/distconf.h @@ -175,8 +175,7 @@ namespace NKikimr::NStorage { const bool IsSelfStatic = false; TIntrusivePtr<TNodeWardenConfig> Cfg; bool SelfManagementEnabled = false; - bool IsPrimary = false; - bool IsBeingPromoted = false; + TBridgeInfo::TPtr BridgeInfo; // currently active storage config std::optional<NKikimrBlobStorage::TStorageConfig> StorageConfig; diff --git a/ydb/core/blobstorage/nodewarden/node_warden_impl.h b/ydb/core/blobstorage/nodewarden/node_warden_impl.h index e4816e7bb63..2539937f553 100644 --- a/ydb/core/blobstorage/nodewarden/node_warden_impl.h +++ b/ydb/core/blobstorage/nodewarden/node_warden_impl.h @@ -639,8 +639,7 @@ namespace NKikimr::NStorage { NKikimrBlobStorage::TStorageConfig StorageConfig; bool SelfManagementEnabled = false; - bool IsPrimary = false; - bool IsBeingPromoted = false; + TBridgeInfo::TPtr BridgeInfo; THashSet<TActorId> StorageConfigSubscribers; void Handle(TEvNodeWardenQueryStorageConfig::TPtr ev); diff --git a/ydb/core/blobstorage/nodewarden/node_warden_resource.cpp b/ydb/core/blobstorage/nodewarden/node_warden_resource.cpp index 96a7be0d32c..f3d2636f867 100644 --- a/ydb/core/blobstorage/nodewarden/node_warden_resource.cpp +++ b/ydb/core/blobstorage/nodewarden/node_warden_resource.cpp @@ -77,8 +77,7 @@ void TNodeWarden::ApplyServiceSet(const NKikimrBlobStorage::TNodeWardenServiceSe } void TNodeWarden::Handle(TEvNodeWardenQueryStorageConfig::TPtr ev) { - Send(ev->Sender, new TEvNodeWardenStorageConfig(StorageConfig, nullptr, SelfManagementEnabled, IsPrimary, - IsBeingPromoted)); + Send(ev->Sender, new TEvNodeWardenStorageConfig(StorageConfig, nullptr, SelfManagementEnabled, BridgeInfo)); if (ev->Get()->Subscribe) { StorageConfigSubscribers.insert(ev->Sender); } @@ -88,8 +87,7 @@ void TNodeWarden::Handle(TEvNodeWardenStorageConfig::TPtr ev) { auto *msg = ev->Get(); msg->Config->Swap(&StorageConfig); SelfManagementEnabled = msg->SelfManagementEnabled; - IsPrimary = msg->IsPrimary; - IsBeingPromoted = msg->IsBeingPromoted; + BridgeInfo = std::move(msg->BridgeInfo); if (StorageConfig.HasBlobStorageConfig()) { if (const auto& bsConfig = StorageConfig.GetBlobStorageConfig(); bsConfig.HasServiceSet()) { @@ -115,8 +113,7 @@ void TNodeWarden::Handle(TEvNodeWardenStorageConfig::TPtr ev) { } for (const TActorId& subscriber : StorageConfigSubscribers) { - Send(subscriber, new TEvNodeWardenStorageConfig(StorageConfig, nullptr, SelfManagementEnabled, - IsPrimary, IsBeingPromoted)); + Send(subscriber, new TEvNodeWardenStorageConfig(StorageConfig, nullptr, SelfManagementEnabled, BridgeInfo)); } if (StorageConfig.HasConfigComposite()) { diff --git a/ydb/core/blobstorage/ut_blobstorage/lib/node_warden_mock_bsc.cpp b/ydb/core/blobstorage/ut_blobstorage/lib/node_warden_mock_bsc.cpp index 3fcf0854a21..fac9cc3c782 100644 --- a/ydb/core/blobstorage/ut_blobstorage/lib/node_warden_mock_bsc.cpp +++ b/ydb/core/blobstorage/ut_blobstorage/lib/node_warden_mock_bsc.cpp @@ -226,7 +226,7 @@ void TNodeWardenMockActor::Handle(TEvBlobStorage::TEvControllerNodeServiceSetUpd } void TNodeWardenMockActor::Handle(TEvNodeWardenQueryStorageConfig::TPtr ev) { - Send(ev->Sender, new TEvNodeWardenStorageConfig(NKikimrBlobStorage::TStorageConfig(), nullptr, false, false, false)); + Send(ev->Sender, new TEvNodeWardenStorageConfig(NKikimrBlobStorage::TStorageConfig(), nullptr, false, nullptr)); } void TNodeWardenMockActor::HandleUnsubscribe(STATEFN_SIG) { diff --git a/ydb/core/mind/bscontroller/ut_bscontroller/main.cpp b/ydb/core/mind/bscontroller/ut_bscontroller/main.cpp index 3daa37d7dc2..1c76d926086 100644 --- a/ydb/core/mind/bscontroller/ut_bscontroller/main.cpp +++ b/ydb/core/mind/bscontroller/ut_bscontroller/main.cpp @@ -243,7 +243,7 @@ struct TEnvironmentSetup { {} void Handle(TEvNodeWardenQueryStorageConfig::TPtr ev) { - Send(ev->Sender, new TEvNodeWardenStorageConfig(NKikimrBlobStorage::TStorageConfig(), nullptr, false, false, false)); + Send(ev->Sender, new TEvNodeWardenStorageConfig(NKikimrBlobStorage::TStorageConfig(), nullptr, false, nullptr)); } STATEFN(StateFunc) { diff --git a/ydb/core/mind/bscontroller/ut_selfheal/node_warden_mock.h b/ydb/core/mind/bscontroller/ut_selfheal/node_warden_mock.h index 16e9e78be3b..966849f54b8 100644 --- a/ydb/core/mind/bscontroller/ut_selfheal/node_warden_mock.h +++ b/ydb/core/mind/bscontroller/ut_selfheal/node_warden_mock.h @@ -180,7 +180,7 @@ public: } void Handle(TEvNodeWardenQueryStorageConfig::TPtr ev) { - Send(ev->Sender, new TEvNodeWardenStorageConfig(NKikimrBlobStorage::TStorageConfig(), nullptr, false, false, false)); + Send(ev->Sender, new TEvNodeWardenStorageConfig(NKikimrBlobStorage::TStorageConfig(), nullptr, false, nullptr)); } STRICT_STFUNC(StateFunc, { |