Skip to content

Commit 9585d7b

Browse files
jepett0CyberROFL
andauthored
Bridge mode in Scheme Board: ignore disconnected ring groups in populator (#19884)
Co-authored-by: Ilnaz Nizametdinov <i.nizametdinov@gmail.com>
1 parent a59ab09 commit 9585d7b

File tree

5 files changed

+341
-39
lines changed

5 files changed

+341
-39
lines changed

ydb/core/testlib/basics/helpers.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ namespace NFake {
4040

4141
void SetupStateStorage(TTestActorRuntime& runtime, ui32 nodeIndex,
4242
bool replicasOnFirstNode = false);
43-
void SetupCustomStateStorage(TTestActorRuntime &runtime, ui32 NToSelect, ui32 nrings, ui32 ringSize);
43+
void SetupCustomStateStorage(TTestActorRuntime &runtime, ui32 NToSelect, ui32 nrings, ui32 ringSize);
4444
void SetupBSNodeWarden(TTestActorRuntime& runtime, ui32 nodeIndex, TIntrusivePtr<TNodeWardenConfig> nodeWardenConfig);
4545
void SetupTabletResolver(TTestActorRuntime& runtime, ui32 nodeIndex);
4646
void SetupTabletPipePerNodeCaches(TTestActorRuntime& runtime, ui32 nodeIndex, bool forceFollowers = false);
@@ -76,4 +76,6 @@ namespace NFake {
7676
{}
7777
};
7878

79+
TActorId MakeBoardReplicaID(ui32 node, ui32 replicaIndex);
80+
7981
}

ydb/core/testlib/basics/services.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ namespace NPDisk {
192192
}
193193

194194
static TIntrusivePtr<TStateStorageInfo> GenerateStateStorageInfo(const TVector<TActorId> &replicas, ui32 NToSelect, ui32 nrings, ui32 ringSize)
195-
{
195+
{
196196
Y_ABORT_UNLESS(replicas.size() >= nrings * ringSize);
197197
Y_ABORT_UNLESS(NToSelect <= nrings);
198198

@@ -201,7 +201,7 @@ namespace NPDisk {
201201
auto& group = info->RingGroups.back();
202202
group.NToSelect = NToSelect;
203203
group.Rings.resize(nrings);
204-
204+
205205
ui32 inode = 0;
206206
for (size_t i = 0; i < nrings; ++i) {
207207
for (size_t j = 0; j < ringSize; ++j) {
@@ -212,10 +212,7 @@ namespace NPDisk {
212212
return info;
213213
}
214214

215-
static TActorId MakeBoardReplicaID(
216-
const ui32 node,
217-
const ui32 replicaIndex
218-
) {
215+
TActorId MakeBoardReplicaID(ui32 node, ui32 replicaIndex) {
219216
char x[12] = { 's', 's', 'b' };
220217
x[3] = (char)1;
221218
memcpy(x + 5, &replicaIndex, sizeof(ui32));
@@ -224,10 +221,10 @@ namespace NPDisk {
224221

225222
void SetupCustomStateStorage(
226223
TTestActorRuntime &runtime,
227-
ui32 NToSelect,
228-
ui32 nrings,
224+
ui32 NToSelect,
225+
ui32 nrings,
229226
ui32 ringSize)
230-
{
227+
{
231228
TVector<TActorId> ssreplicas;
232229
for (size_t i = 0; i < nrings * ringSize; ++i) {
233230
ssreplicas.push_back(MakeStateStorageReplicaID(runtime.GetNodeId(i), i));
@@ -249,7 +246,7 @@ namespace NPDisk {
249246
auto sbInfo = GenerateStateStorageInfo(sbreplicas, NToSelect, nrings, ringSize);
250247
auto bInfo = GenerateStateStorageInfo(breplicas, NToSelect, nrings, ringSize);
251248

252-
249+
253250
for (ui32 ssIndex = 0; ssIndex < nrings * ringSize; ++ssIndex) {
254251
runtime.AddLocalService(ssreplicas[ssIndex],
255252
TActorSetupCmd(CreateStateStorageReplica(ssInfo.Get(), ssIndex), TMailboxType::Revolving, 0), ssIndex);
@@ -265,7 +262,7 @@ namespace NPDisk {
265262
}
266263
}
267264

268-
265+
269266
void SetupStateStorage(TTestActorRuntime& runtime, ui32 nodeIndex, bool firstNode)
270267
{
271268
const TActorId ssreplicas[3] = {

ydb/core/tx/scheme_board/populator.cpp

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ namespace {
5050

5151
} // anonymous
5252

53+
bool ShouldIgnore(const TStateStorageInfo::TRingGroup& ringGroup) {
54+
return ringGroup.WriteOnly || ringGroup.State == ERingGroupState::DISCONNECTED;
55+
}
56+
57+
bool IsMajorityReached(const TStateStorageInfo::TRingGroup& ringGroup, ui32 ringGroupAcks) {
58+
return ringGroupAcks > ringGroup.NToSelect / 2;
59+
}
60+
5361
class TReplicaPopulator: public TMonitorableActor<TReplicaPopulator> {
5462
void ProcessSync(NInternalEvents::TEvDescribeResult* msg = nullptr, const TPathId& pathId = TPathId()) {
5563
if (msg == nullptr) {
@@ -707,36 +715,31 @@ class TPopulator: public TMonitorableActor<TPopulator> {
707715
}
708716
}
709717

710-
bool CheckQuorum(TVector<ui32> &replicaRepliesCounter, TActorId foundReplica) const {
711-
ui32 quorumCnt = 0;
712-
for (const auto& ringGroup : GroupInfo->RingGroups) {
713-
if (!ringGroup.WriteOnly) {
714-
++quorumCnt;
715-
}
716-
}
717-
TVector<bool> quorum(GroupInfo->RingGroups.size());
718-
718+
void ProcessReplicaAck(TVector<ui32>& ringGroupAcks, TActorId ackedReplica, TVector<bool>& ringGroupQuorums) const {
719719
for (ui32 ringGroupIndex : xrange(GroupInfo->RingGroups.size())) {
720720
const auto& ringGroup = GroupInfo->RingGroups[ringGroupIndex];
721-
if (ringGroup.WriteOnly) {
722-
continue;
723-
}
724721
for (const auto& ring : ringGroup.Rings) {
725722
for (const auto& replica : ring.Replicas) {
726-
if (replica == foundReplica
727-
&& ++replicaRepliesCounter[ringGroupIndex] > (ringGroup.NToSelect / 2)
728-
&& !quorum[ringGroupIndex])
729-
{
730-
quorum[ringGroupIndex] = true;
731-
--quorumCnt;
732-
if (quorumCnt == 0) {
733-
return true;
723+
if (replica == ackedReplica) {
724+
++ringGroupAcks[ringGroupIndex];
725+
if (IsMajorityReached(ringGroup, ringGroupAcks[ringGroupIndex])) {
726+
ringGroupQuorums[ringGroupIndex] = true;
734727
}
728+
break;
735729
}
736730
}
737731
}
738732
}
739-
return quorumCnt == 0;
733+
}
734+
735+
bool CheckQuorum(TVector<ui32>& ringGroupAcks, TActorId ackedReplica) const {
736+
TVector<bool> ringGroupQuorums(GroupInfo->RingGroups.size(), false);
737+
for (ui32 ringGroupIndex : xrange(GroupInfo->RingGroups.size())) {
738+
const auto& ringGroup = GroupInfo->RingGroups[ringGroupIndex];
739+
ringGroupQuorums[ringGroupIndex] = ShouldIgnore(ringGroup) || IsMajorityReached(ringGroup, ringGroupAcks[ringGroupIndex]);
740+
}
741+
ProcessReplicaAck(ringGroupAcks, ackedReplica, ringGroupQuorums);
742+
return Count(ringGroupQuorums, false) == 0;
740743
}
741744

742745
void Handle(NSchemeshardEvents::TEvUpdateAck::TPtr& ev) {
@@ -761,9 +764,9 @@ class TPopulator: public TMonitorableActor<TPopulator> {
761764
while (pathIt != it->second.PathAcks.end()
762765
&& pathIt->first.first == pathId
763766
&& pathIt->first.second <= version) {
764-
TActorId* foundReplica = ReplicaToReplicaPopulatorBackMap.FindPtr(ev->Sender);
765-
Y_ABORT_UNLESS(foundReplica != nullptr);
766-
if (CheckQuorum(pathIt->second, *foundReplica)) {
767+
TActorId* ackedReplica = ReplicaToReplicaPopulatorBackMap.FindPtr(ev->Sender);
768+
Y_ABORT_UNLESS(ackedReplica != nullptr);
769+
if (CheckQuorum(pathIt->second, *ackedReplica)) {
767770
SBP_LOG_N("Ack update"
768771
<< ": ack to# " << it->second.AckTo
769772
<< ", cookie# " << ev->Cookie

ydb/core/tx/scheme_board/populator.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,21 @@
33
#include "defs.h"
44
#include "two_part_description.h"
55

6+
#include <ydb/core/base/statestorage.h>
67
#include <ydb/core/scheme/scheme_pathid.h>
78

89
#include <util/generic/map.h>
910

1011
namespace NKikimr {
1112

13+
namespace NSchemeBoard {
14+
15+
bool ShouldIgnore(const TStateStorageInfo::TRingGroup& ringGroup);
16+
17+
bool IsMajorityReached(const TStateStorageInfo::TRingGroup& ringGroup, ui32 ringGroupAcks);
18+
19+
}
20+
1221
IActor* CreateSchemeBoardPopulator(
1322
const ui64 owner,
1423
const ui64 generation,

0 commit comments

Comments
 (0)