Skip to content

Commit e7ab6ea

Browse files
authored
Fix acceleration in mirror-3-dc groups (#7931)
1 parent 30d882c commit e7ab6ea

25 files changed

+280
-238
lines changed

ydb/core/blobstorage/dsproxy/dsproxy.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,10 @@ const ui32 MaskSizeBits = 32;
5555
constexpr bool DefaultEnablePutBatching = true;
5656
constexpr bool DefaultEnableVPatch = false;
5757

58-
constexpr float DefaultSlowDiskThreshold = 2;
59-
constexpr float DefaultPredictedDelayMultiplier = 1;
58+
constexpr double DefaultSlowDiskThreshold = 2;
59+
constexpr double DefaultPredictedDelayMultiplier = 1;
6060
constexpr TDuration DefaultLongRequestThreshold = TDuration::Seconds(50);
61+
constexpr ui32 DefaultMaxNumOfSlowDisks = 2;
6162

6263
constexpr bool WithMovingPatchRequestToStaticNode = true;
6364

@@ -193,8 +194,9 @@ inline void SetExecutionRelay(IEventBase& ev, std::shared_ptr<TEvBlobStorage::TE
193194
}
194195

195196
struct TAccelerationParams {
196-
double SlowDiskThreshold = 2;
197-
double PredictedDelayMultiplier = 1;
197+
double SlowDiskThreshold = DefaultSlowDiskThreshold;
198+
double PredictedDelayMultiplier = DefaultPredictedDelayMultiplier;
199+
ui32 MaxNumOfSlowDisks = DefaultMaxNumOfSlowDisks;
198200
};
199201

200202
class TBlobStorageGroupRequestActor : public TActor<TBlobStorageGroupRequestActor> {
@@ -520,6 +522,7 @@ struct TBlobStorageProxyParameters {
520522
const TControlWrapper& SlowDiskThreshold;
521523
const TControlWrapper& PredictedDelayMultiplier;
522524
const TControlWrapper& LongRequestThresholdMs = TControlWrapper(DefaultLongRequestThreshold.MilliSeconds(), 1, 1'000'000);
525+
const TControlWrapper& MaxNumOfSlowDisks = TControlWrapper(DefaultMaxNumOfSlowDisks, 1, 2);
523526
};
524527

525528
IActor* CreateBlobStorageGroupProxyConfigured(TIntrusivePtr<TBlobStorageGroupInfo>&& info,

ydb/core/blobstorage/dsproxy/dsproxy_blackboard.cpp

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -179,15 +179,16 @@ ui64 TBlobState::GetPredictedDelayNs(const TBlobStorageGroupInfo &info, TGroupQu
179179

180180
void TBlobState::GetWorstPredictedDelaysNs(const TBlobStorageGroupInfo &info, TGroupQueues &groupQueues,
181181
NKikimrBlobStorage::EVDiskQueueId queueId, TDiskDelayPredictions *outNWorst,
182-
double multiplier) const {
182+
const TAccelerationParams& accelerationParams) const {
183183
outNWorst->resize(Disks.size());
184184
for (ui32 diskIdx = 0; diskIdx < Disks.size(); ++diskIdx) {
185+
ui64 predictedDelayNs = GetPredictedDelayNs(info, groupQueues, diskIdx, queueId);
185186
(*outNWorst)[diskIdx] = {
186-
static_cast<ui64>(GetPredictedDelayNs(info, groupQueues, diskIdx, queueId) * multiplier),
187+
static_cast<ui64>(predictedDelayNs * accelerationParams.PredictedDelayMultiplier),
187188
diskIdx
188189
};
189190
}
190-
ui32 sortedPrefixSize = std::min(3u, (ui32)Disks.size());
191+
ui32 sortedPrefixSize = std::min(accelerationParams.MaxNumOfSlowDisks + 1, (ui32)Disks.size());
191192
std::partial_sort(outNWorst->begin(), outNWorst->begin() + sortedPrefixSize, outNWorst->end());
192193
}
193194

@@ -466,16 +467,18 @@ void TBlackboard::ReportPartMapStatus(const TLogoBlobID &id, ssize_t partMapInde
466467

467468
void TBlackboard::GetWorstPredictedDelaysNs(const TBlobStorageGroupInfo &info, TGroupQueues &groupQueues,
468469
NKikimrBlobStorage::EVDiskQueueId queueId, TDiskDelayPredictions *outNWorst,
469-
double multiplier) const {
470+
const TAccelerationParams& accelerationParams) const {
470471
ui32 totalVDisks = info.GetTotalVDisksNum();
471472
outNWorst->resize(totalVDisks);
472473
for (ui32 orderNumber = 0; orderNumber < totalVDisks; ++orderNumber) {
474+
ui64 predictedDelayNs = groupQueues.GetPredictedDelayNsByOrderNumber(orderNumber, queueId);
473475
(*outNWorst)[orderNumber] = {
474-
static_cast<ui64>(groupQueues.GetPredictedDelayNsByOrderNumber(orderNumber, queueId) * multiplier),
476+
static_cast<ui64>(predictedDelayNs * accelerationParams.PredictedDelayMultiplier),
475477
orderNumber
476478
};
477479
}
478-
std::partial_sort(outNWorst->begin(), outNWorst->begin() + std::min(3u, totalVDisks), outNWorst->end());
480+
ui32 sortedPrefixSize = std::min(accelerationParams.MaxNumOfSlowDisks + 1, totalVDisks);
481+
std::partial_sort(outNWorst->begin(), outNWorst->begin() + sortedPrefixSize, outNWorst->end());
479482
}
480483

481484
void TBlackboard::RegisterBlobForPut(const TLogoBlobID& id, size_t blobIdx) {
@@ -542,4 +545,35 @@ void TBlackboard::InvalidatePartStates(ui32 orderNumber) {
542545
}
543546
}
544547

548+
void TBlackboard::MarkSlowDisks(TBlobState& state, bool isPut, const TAccelerationParams& accelerationParams) {
549+
// by default all disks are considered fast
550+
for (TBlobState::TDisk& disk : state.Disks) {
551+
disk.IsSlow = false;
552+
}
553+
554+
ui32 maxNumSlow = accelerationParams.MaxNumOfSlowDisks;
555+
if (Info->GetTotalVDisksNum() <= maxNumSlow) {
556+
// all disks cannot be slow
557+
return;
558+
}
559+
560+
TDiskDelayPredictions worstDisks;
561+
state.GetWorstPredictedDelaysNs(*Info, *GroupQueues,
562+
(isPut ? HandleClassToQueueId(PutHandleClass) : HandleClassToQueueId(GetHandleClass)),
563+
&worstDisks, accelerationParams);
564+
565+
ui64 slowThreshold = worstDisks[maxNumSlow].PredictedNs * accelerationParams.SlowDiskThreshold;
566+
if (slowThreshold == 0) {
567+
// invalid or non-initialized predicted ns, consider all disks not slow
568+
return;
569+
}
570+
571+
for (ui32 idx = 0; idx < maxNumSlow; ++idx) {
572+
if (worstDisks[idx].PredictedNs > slowThreshold) {
573+
ui32 orderNumber = worstDisks[idx].DiskIdx;
574+
state.Disks[orderNumber].IsSlow = true;
575+
}
576+
}
577+
}
578+
545579
}//NKikimr

ydb/core/blobstorage/dsproxy/dsproxy_blackboard.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,9 @@ struct TBlobState {
9999
ui32 diskIdxInSubring, NKikimrBlobStorage::EVDiskQueueId queueId) const;
100100
void GetWorstPredictedDelaysNs(const TBlobStorageGroupInfo &info, TGroupQueues &groupQueues,
101101
NKikimrBlobStorage::EVDiskQueueId queueId, TDiskDelayPredictions *outNWorst,
102-
double multipler = 1) const;
102+
const TAccelerationParams& accelerationParams) const;
103103
TString ToString() const;
104104
bool HasWrittenQuorum(const TBlobStorageGroupInfo& info, const TBlobStorageGroupInfo::TGroupVDisks& expired) const;
105-
106105
static TString SituationToString(ESituation situation);
107106
};
108107

@@ -166,7 +165,7 @@ class IStrategy {
166165

167166
struct TBlackboard {
168167
enum EAccelerationMode {
169-
AccelerationModeSkipOneSlowest,
168+
AccelerationModeSkipNSlowest,
170169
AccelerationModeSkipMarked
171170
};
172171

@@ -190,7 +189,7 @@ struct TBlackboard {
190189
NKikimrBlobStorage::EPutHandleClass putHandleClass, NKikimrBlobStorage::EGetHandleClass getHandleClass)
191190
: Info(info)
192191
, GroupQueues(groupQueues)
193-
, AccelerationMode(AccelerationModeSkipOneSlowest)
192+
, AccelerationMode(AccelerationModeSkipNSlowest)
194193
, PutHandleClass(putHandleClass)
195194
, GetHandleClass(getHandleClass)
196195
{}
@@ -213,7 +212,7 @@ struct TBlackboard {
213212
void ReportPartMapStatus(const TLogoBlobID &id, ssize_t partMapIndex, ui32 responseIndex, NKikimrProto::EReplyStatus status);
214213
void GetWorstPredictedDelaysNs(const TBlobStorageGroupInfo &info, TGroupQueues &groupQueues,
215214
NKikimrBlobStorage::EVDiskQueueId queueId, TDiskDelayPredictions *outNWorst,
216-
double multiplier = 1) const;
215+
const TAccelerationParams& accelerationParams) const;
217216
TString ToString() const;
218217

219218
void ChangeAll() {
@@ -226,6 +225,8 @@ struct TBlackboard {
226225

227226
void RegisterBlobForPut(const TLogoBlobID& id, size_t blobIdx);
228227

228+
void MarkSlowDisks(TBlobState& state, bool isPut, const TAccelerationParams& accelerationParams);
229+
229230
TBlobState& operator [](const TLogoBlobID& id);
230231
};
231232

ydb/core/blobstorage/dsproxy/dsproxy_get.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -326,9 +326,9 @@ class TBlobStorageGroupGetRequest : public TBlobStorageGroupRequestActor {
326326
}
327327

328328
void TryScheduleGetAcceleration() {
329-
if (!IsGetAccelerateScheduled && GetsAccelerated < 2) {
330-
// Count VDisks that have requests in flight, if there is no more than 2 such VDisks, Accelerate
331-
if (CountDisksWithActiveRequests() <= 2) {
329+
if (!IsGetAccelerateScheduled && GetsAccelerated < AccelerationParams.MaxNumOfSlowDisks) {
330+
// Count VDisks with requests in flight, if there are <= the maximum number of slow VDisks, Accelerate
331+
if (CountDisksWithActiveRequests() <= AccelerationParams.MaxNumOfSlowDisks) {
332332
ui64 timeToAccelerateUs = GetImpl.GetTimeToAccelerateGetNs(LogCtx) / 1000;
333333
TDuration timeToAccelerate = TDuration::MicroSeconds(timeToAccelerateUs);
334334
TMonotonic now = TActivationContext::Monotonic();
@@ -345,9 +345,9 @@ class TBlobStorageGroupGetRequest : public TBlobStorageGroupRequestActor {
345345
}
346346

347347
void TrySchedulePutAcceleration() {
348-
if (!IsPutAccelerateScheduled && PutsAccelerated < 2) {
349-
// Count VDisks that have requests in flight, if there is no more than 2 such VDisks, Accelerate
350-
if (CountDisksWithActiveRequests() <= 2) {
348+
if (!IsPutAccelerateScheduled && PutsAccelerated < AccelerationParams.MaxNumOfSlowDisks) {
349+
// Count VDisks with requests in flight, if there are <= the maximum number of slow VDisks, Accelerate
350+
if (CountDisksWithActiveRequests() <= AccelerationParams.MaxNumOfSlowDisks) {
351351
ui64 timeToAccelerateUs = GetImpl.GetTimeToAcceleratePutNs(LogCtx) / 1000;
352352
TDuration timeToAccelerate = TDuration::MicroSeconds(timeToAccelerateUs);
353353
TMonotonic now = TActivationContext::Monotonic();

ydb/core/blobstorage/dsproxy/dsproxy_get_impl.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,13 @@ ui64 TGetImpl::GetTimeToAccelerateNs(TLogContext &logCtx, NKikimrBlobStorage::EV
146146
// Find the slowest disk
147147
TDiskDelayPredictions worstDisks;
148148
if (Blackboard.BlobStates.size() == 1) {
149-
Blackboard.BlobStates.begin()->second.GetWorstPredictedDelaysNs(
150-
*Info, *Blackboard.GroupQueues, queueId, &worstDisks,
151-
AccelerationParams.PredictedDelayMultiplier);
149+
Blackboard.BlobStates.begin()->second.GetWorstPredictedDelaysNs(*Info, *Blackboard.GroupQueues,
150+
queueId, &worstDisks, AccelerationParams);
152151
} else {
153-
Blackboard.GetWorstPredictedDelaysNs(
154-
*Info, *Blackboard.GroupQueues, queueId, &worstDisks,
155-
AccelerationParams.PredictedDelayMultiplier);
152+
Blackboard.GetWorstPredictedDelaysNs(*Info, *Blackboard.GroupQueues, queueId, &worstDisks,
153+
AccelerationParams);
156154
}
157-
return worstDisks[std::min(3u, (ui32)worstDisks.size() - 1)].PredictedNs;
155+
return worstDisks[std::min(AccelerationParams.MaxNumOfSlowDisks, (ui32)worstDisks.size() - 1)].PredictedNs;
158156
}
159157

160158
ui64 TGetImpl::GetTimeToAccelerateGetNs(TLogContext &logCtx) {

ydb/core/blobstorage/dsproxy/dsproxy_impl.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ namespace NKikimr {
1919
, EnableVPatch(params.EnableVPatch)
2020
, SlowDiskThreshold(params.SlowDiskThreshold)
2121
, PredictedDelayMultiplier(params.PredictedDelayMultiplier)
22+
, MaxNumOfSlowDisks(params.MaxNumOfSlowDisks)
2223
, LongRequestThresholdMs(params.LongRequestThresholdMs)
2324
{}
2425

@@ -33,6 +34,7 @@ namespace NKikimr {
3334
, EnableVPatch(params.EnableVPatch)
3435
, SlowDiskThreshold(params.SlowDiskThreshold)
3536
, PredictedDelayMultiplier(params.PredictedDelayMultiplier)
37+
, MaxNumOfSlowDisks(params.MaxNumOfSlowDisks)
3638
, LongRequestThresholdMs(params.LongRequestThresholdMs)
3739
{}
3840

ydb/core/blobstorage/dsproxy/dsproxy_impl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,11 @@ class TBlobStorageGroupProxy : public TActorBootstrapped<TBlobStorageGroupProxy>
121121
bool HasInvalidGroupId() const { return GroupId.GetRawId() == Max<ui32>(); }
122122
void ProcessInitQueue();
123123

124+
// Acceleration parameters
124125
TMemorizableControlWrapper SlowDiskThreshold;
125126
TMemorizableControlWrapper PredictedDelayMultiplier;
127+
TMemorizableControlWrapper MaxNumOfSlowDisks;
128+
126129
TMemorizableControlWrapper LongRequestThresholdMs;
127130

128131
TAccelerationParams GetAccelerationParams();

ydb/core/blobstorage/dsproxy/dsproxy_put.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,8 +416,8 @@ class TBlobStorageGroupPutRequest : public TBlobStorageGroupRequestActor {
416416
}
417417

418418
void TryToScheduleNextAcceleration() {
419-
if (!IsAccelerateScheduled && AccelerateRequestsSent < 2) {
420-
if (WaitingVDiskCount > 0 && WaitingVDiskCount <= 2 && RequestsSent > 1) {
419+
if (!IsAccelerateScheduled && AccelerateRequestsSent < AccelerationParams.MaxNumOfSlowDisks) {
420+
if (WaitingVDiskCount > 0 && WaitingVDiskCount <= AccelerationParams.MaxNumOfSlowDisks && RequestsSent > 1) {
421421
ui64 timeToAccelerateUs = Max<ui64>(1, PutImpl.GetTimeToAccelerateNs(LogCtx) / 1000);
422422
if (RequestsPendingBeforeAcceleration == 1 && AccelerateRequestsSent == 1) {
423423
// if there is only one request pending, but first accelerate is unsuccessful, make a pause

ydb/core/blobstorage/dsproxy/dsproxy_put_impl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@ ui64 TPutImpl::GetTimeToAccelerateNs(TLogContext &logCtx) {
9191
// Find the n'th slowest disk
9292
TDiskDelayPredictions worstDisks;
9393
state.GetWorstPredictedDelaysNs(*Info, *Blackboard.GroupQueues, HandleClassToQueueId(Blackboard.PutHandleClass),
94-
&worstDisks, AccelerationParams.PredictedDelayMultiplier);
95-
nthWorstPredictedNsVec[idx++] = worstDisks[2].PredictedNs;
94+
&worstDisks, AccelerationParams);
95+
nthWorstPredictedNsVec[idx++] = worstDisks[AccelerationParams.MaxNumOfSlowDisks].PredictedNs;
9696
}
9797
return *MaxElement(nthWorstPredictedNsVec.begin(), nthWorstPredictedNsVec.end());
9898
}

ydb/core/blobstorage/dsproxy/dsproxy_state.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ namespace NKikimr {
327327
return TAccelerationParams{
328328
.SlowDiskThreshold = .001f * SlowDiskThreshold.Update(TActivationContext::Now()),
329329
.PredictedDelayMultiplier = .001f * PredictedDelayMultiplier.Update(TActivationContext::Now()),
330+
.MaxNumOfSlowDisks = (ui32)MaxNumOfSlowDisks.Update(TActivationContext::Now()),
330331
};
331332
}
332333

ydb/core/blobstorage/dsproxy/dsproxy_strategy_accelerate_put.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,22 @@ class TAcceleratePutStrategy : public TStrategyBase {
1515
const TAccelerationParams& accelerationParams) override {
1616
Y_UNUSED(accelerationParams);
1717
// Find the unput part and disk
18-
TStackVec<ui32, 2> badDiskIdxs;
18+
ui32 badDisksMask = 0;
1919
for (size_t diskIdx = 0; diskIdx < state.Disks.size(); ++diskIdx) {
2020
TBlobState::TDisk &disk = state.Disks[diskIdx];
2121
for (size_t partIdx = 0; partIdx < disk.DiskParts.size(); ++partIdx) {
2222
TBlobState::TDiskPart &diskPart = disk.DiskParts[partIdx];
2323
if (diskPart.Situation == TBlobState::ESituation::Sent) {
24-
badDiskIdxs.push_back(diskIdx);
24+
badDisksMask |= (1 << diskIdx);
2525
}
2626
}
2727
}
2828

29-
if (!badDiskIdxs.empty()) {
29+
if (badDisksMask > 0) {
3030
// Mark the corresponding disks 'bad'
3131
// Prepare part layout if possible
3232
TBlobStorageGroupType::TPartLayout layout;
33-
PreparePartLayout(state, info, &layout, badDiskIdxs);
33+
PreparePartLayout(state, info, &layout, badDisksMask);
3434

3535
TBlobStorageGroupType::TPartPlacement partPlacement;
3636
bool isCorrectable = info.Type.CorrectLayout(layout, partPlacement);

ydb/core/blobstorage/dsproxy/dsproxy_strategy_accelerate_put_m3dc.h

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -30,50 +30,56 @@ class TAcceleratePut3dcStrategy : public TStrategyBase {
3030
}
3131

3232
EStrategyOutcome Process(TLogContext &logCtx, TBlobState &state, const TBlobStorageGroupInfo &info,
33-
TBlackboard& /*blackboard*/, TGroupDiskRequests &groupDiskRequests,
33+
TBlackboard& blackboard, TGroupDiskRequests &groupDiskRequests,
3434
const TAccelerationParams& accelerationParams) override {
3535
Y_UNUSED(accelerationParams);
3636
// Find the unput parts and disks
37-
ui32 badDiskMask = 0;
38-
for (size_t diskIdx = 0; diskIdx < state.Disks.size(); ++diskIdx) {
37+
bool unresponsiveDisk = false;
38+
for (size_t diskIdx = 0; diskIdx < state.Disks.size() && !unresponsiveDisk; ++diskIdx) {
3939
TBlobState::TDisk &disk = state.Disks[diskIdx];
40-
for (size_t partIdx = 0; partIdx < disk.DiskParts.size(); ++partIdx) {
41-
TBlobState::TDiskPart &diskPart = disk.DiskParts[partIdx];
40+
for (TBlobState::TDiskPart &diskPart : disk.DiskParts) {
4241
if (diskPart.Situation == TBlobState::ESituation::Sent) {
43-
badDiskMask |= (1 << diskIdx);
42+
unresponsiveDisk = true;
43+
break;
4444
}
4545
}
4646
}
47-
if (badDiskMask > 0) {
48-
// Mark the 'bad' disk as the single slow disk
49-
for (size_t diskIdx = 0; diskIdx < state.Disks.size(); ++diskIdx) {
50-
state.Disks[diskIdx].IsSlow = badDiskMask & (1 << diskIdx);
51-
}
52-
53-
// Prepare part placement if possible
54-
TBlobStorageGroupType::TPartPlacement partPlacement;
55-
bool degraded = false;
56-
57-
// check if we are in degraded mode -- that means that we have one fully failed realm
58-
TBlobStorageGroupInfo::TSubgroupVDisks success(&info.GetTopology());
59-
TBlobStorageGroupInfo::TSubgroupVDisks error(&info.GetTopology());
60-
Evaluate3dcSituation(state, NumFailRealms, NumFailDomainsPerFailRealm, info, true, success, error, degraded);
61-
62-
// check for failure tolerance; we issue ERROR in case when it is not possible to achieve success condition in
63-
// any way; also check if we have already finished writing replicas
64-
const auto& checker = info.GetQuorumChecker();
65-
if (checker.CheckFailModelForSubgroup(error)) {
66-
if (checker.CheckQuorumForSubgroup(success)) {
67-
// OK
68-
return EStrategyOutcome::DONE;
69-
}
70-
71-
// now check every realm and check if we have to issue some write requests to it
72-
Prepare3dcPartPlacement(state, NumFailRealms, NumFailDomainsPerFailRealm,
73-
PreferredReplicasPerRealm(degraded), true, partPlacement);
74-
75-
if (IsPutNeeded(state, partPlacement)) {
76-
PreparePutsForPartPlacement(logCtx, state, info, groupDiskRequests, partPlacement);
47+
if (unresponsiveDisk) {
48+
blackboard.MarkSlowDisks(state, true, accelerationParams);
49+
50+
for (bool considerSlowAsError : {true, false}) {
51+
// Prepare part placement if possible
52+
TBlobStorageGroupType::TPartPlacement partPlacement;
53+
bool degraded = false;
54+
55+
// check if we are in degraded mode -- that means that we have one fully failed realm
56+
TBlobStorageGroupInfo::TSubgroupVDisks success(&info.GetTopology());
57+
TBlobStorageGroupInfo::TSubgroupVDisks error(&info.GetTopology());
58+
Evaluate3dcSituation(state, NumFailRealms, NumFailDomainsPerFailRealm, info, considerSlowAsError,
59+
success, error, degraded);
60+
// check for failure tolerance; we issue ERROR in case when it is not possible to achieve success condition in
61+
// any way; also check if we have already finished writing replicas
62+
const auto& checker = info.GetQuorumChecker();
63+
if (checker.CheckFailModelForSubgroup(error)) {
64+
if (checker.CheckQuorumForSubgroup(success)) {
65+
// OK
66+
return EStrategyOutcome::DONE;
67+
}
68+
69+
// now check every realm and check if we have to issue some write requests to it
70+
bool fullPlacement;
71+
Prepare3dcPartPlacement(state, NumFailRealms, NumFailDomainsPerFailRealm,
72+
PreferredReplicasPerRealm(degraded), considerSlowAsError, true, partPlacement, fullPlacement);
73+
74+
if (considerSlowAsError && !fullPlacement) {
75+
// unable to place all parts to fast disks, retry
76+
continue;
77+
}
78+
79+
if (IsPutNeeded(state, partPlacement)) {
80+
PreparePutsForPartPlacement(logCtx, state, info, groupDiskRequests, partPlacement);
81+
}
82+
break;
7783
}
7884
}
7985
}

0 commit comments

Comments
 (0)