Skip to content

Commit 7afe21c

Browse files
committed
Fix quorum calculation logic
1 parent fc69c51 commit 7afe21c

File tree

3 files changed

+15
-9
lines changed

3 files changed

+15
-9
lines changed

ydb/core/blobstorage/nodewarden/distconf_invoke_common.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ namespace NKikimr::NStorage {
239239
void TInvokeRequestHandlerActor::StartProposition(NKikimrBlobStorage::TStorageConfig *config, bool acceptLocalQuorum,
240240
bool requireScepter, bool mindPrev, const NKikimrBlobStorage::TStorageConfig *propositionBase,
241241
bool fromBootstrap) {
242-
if (!Self->HasConnectedNodeQuorum(*config, acceptLocalQuorum)) {
242+
if (!Self->HasConnectedNodeQuorum(mindPrev && config->HasPrevConfig() ? config->GetPrevConfig() : *config, acceptLocalQuorum)) {
243243
throw TExError() << "No quorum to start propose/commit configuration";
244244
} else if (requireScepter && !Self->Scepter) {
245245
throw TExError() << "No scepter";

ydb/core/blobstorage/nodewarden/distconf_quorum.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ namespace NKikimr::NStorage {
187187
return true;
188188
}
189189

190-
bool HasStorageQuorum(const NKikimrBlobStorage::TStorageConfig& config, std::span<TSuccessfulDisk> successful,
190+
std::optional<bool> HasStorageQuorum(const NKikimrBlobStorage::TStorageConfig& config, std::span<TSuccessfulDisk> successful,
191191
const THashMap<TString, TBridgePileId>& /*bridgePileNameMap*/, TBridgePileId singleBridgePileId,
192192
const TNodeWardenConfig& nwConfig, bool allowUnformatted, IOutputStream *out, const char *name) {
193193
auto makeError = [&](TString error) -> bool {
@@ -323,17 +323,23 @@ namespace NKikimr::NStorage {
323323
}
324324
}
325325

326-
return true; // all group meet their quorums
326+
return groups.empty()
327+
? std::nullopt // we don't know about quorum -- no static groups defined
328+
: std::make_optional(true); // all groups meet their quorums
327329
}
328330

329331
bool HasConfigQuorum(const NKikimrBlobStorage::TStorageConfig& config, std::span<TSuccessfulDisk> successful,
330332
const THashMap<TString, TBridgePileId>& bridgePileNameMap, TBridgePileId singleBridgePileId,
331333
const TNodeWardenConfig& nwConfig, bool mindPrev, TStringStream *out) {
332-
return HasDiskQuorum(config, successful, bridgePileNameMap, singleBridgePileId, out, "new") &&
333-
HasStorageQuorum(config, successful, bridgePileNameMap, singleBridgePileId, nwConfig, true, out, "new") &&
334-
(!mindPrev || !config.HasPrevConfig() ||
335-
HasDiskQuorum(config.GetPrevConfig(), successful, bridgePileNameMap, singleBridgePileId, out, "prev") &&
336-
HasStorageQuorum(config.GetPrevConfig(), successful, bridgePileNameMap, singleBridgePileId, nwConfig, false, out, "prev"));
334+
auto getQuorum = [&](auto& config, const char *name, bool allowUnformatted) {
335+
// config quorum goes first -- if we have (or don't have one) -- we return it; if we don't know (because
336+
// we have no static groups) -- then we use disk-wise quorum (more than 1/2 nodes with more than 1/2 disks)
337+
auto q = HasStorageQuorum(config, successful, bridgePileNameMap, singleBridgePileId, nwConfig,
338+
allowUnformatted, out, name);
339+
return q ? *q : HasDiskQuorum(config, successful, bridgePileNameMap, singleBridgePileId, out, name);
340+
};
341+
return getQuorum(config, "new", true) && (!mindPrev || !config.HasPrevConfig() ||
342+
getQuorum(config.GetPrevConfig(), "prev", false));
337343
}
338344

339345
} // NKikimr::NStorage

ydb/core/blobstorage/nodewarden/distconf_quorum.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace NKikimr::NStorage {
1717
const THashMap<TString, TBridgePileId>& bridgePileNameMap, TBridgePileId singleBridgePileId, IOutputStream *out,
1818
const char *name);
1919

20-
bool HasStorageQuorum(const NKikimrBlobStorage::TStorageConfig& config, std::span<TSuccessfulDisk> successful,
20+
std::optional<bool> HasStorageQuorum(const NKikimrBlobStorage::TStorageConfig& config, std::span<TSuccessfulDisk> successful,
2121
const THashMap<TString, TBridgePileId>& bridgePileNameMap, TBridgePileId singleBridgePileId,
2222
const TNodeWardenConfig& nwConfig, bool allowUnformatted, IOutputStream *out, const char *name);
2323

0 commit comments

Comments
 (0)