aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Rutkovsky <alexvru@ydb.tech>2025-05-23 18:45:40 +0300
committerGitHub <noreply@github.com>2025-05-23 15:45:40 +0000
commit97a5825cf0c3d1a04fa64c87201c4bebfd7da9c9 (patch)
tree9afab7e52fa7987381f7885d5a0bd620e47e9ba3
parent6bb5b4805dd1cdec68e896d52540e0af95dd1fbc (diff)
downloadydb-97a5825cf0c3d1a04fa64c87201c4bebfd7da9c9.tar.gz
Refactor bridge mode info returned in TEvNodeWardenStorageConfig (#18744)
-rw-r--r--ydb/core/base/bridge.h28
-rw-r--r--ydb/core/blobstorage/base/blobstorage_events.cpp5
-rw-r--r--ydb/core/blobstorage/base/blobstorage_events.h6
-rw-r--r--ydb/core/blobstorage/nodewarden/distconf.cpp52
-rw-r--r--ydb/core/blobstorage/nodewarden/distconf.h3
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden_impl.h3
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden_resource.cpp9
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/lib/node_warden_mock_bsc.cpp2
-rw-r--r--ydb/core/mind/bscontroller/ut_bscontroller/main.cpp2
-rw-r--r--ydb/core/mind/bscontroller/ut_selfheal/node_warden_mock.h2
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, {