@@ -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
0 commit comments