Skip to content

Commit cb9b63a

Browse files
committed
Fix quorum calculation logic
1 parent 83f6d8a commit cb9b63a

File tree

3 files changed

+19
-9
lines changed

3 files changed

+19
-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: 17 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,27 @@ 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 for sure 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+
auto q = HasStorageQuorum(config, successful, bridgePileNameMap, singleBridgePileId, nwConfig,
336+
allowUnformatted, out, name);
337+
if (!q) {
338+
q.emplace(HasDiskQuorum(config, successful, bridgePileNameMap, singleBridgePileId, out, name));
339+
}
340+
return *q;
341+
};
342+
bool q = getQuorum(config, "new", true);
343+
if (q && mindPrev && config.HasPrevConfig()) {
344+
q = getQuorum(config.GetPrevConfig(), "prev", false);
345+
}
346+
return q;
337347
}
338348

339349
} // 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)