@@ -174,16 +174,22 @@ void TBlobState::AddNotYetResponse(const TBlobStorageGroupInfo &info, const TLog
174174ui64 TBlobState::GetPredictedDelayNs (const TBlobStorageGroupInfo &info, TGroupQueues &groupQueues,
175175 ui32 diskIdxInSubring, NKikimrBlobStorage::EVDiskQueueId queueId) const {
176176 Y_UNUSED (info);
177- return groupQueues.GetPredictedDelayNsByOrderNumber (Disks[diskIdxInSubring].OrderNumber , queueId);
177+ auto res = groupQueues.GetPredictedDelayNsByOrderNumber (Disks[diskIdxInSubring].OrderNumber , queueId);
178+ return res;
178179}
179180
180181void TBlobState::GetWorstPredictedDelaysNs (const TBlobStorageGroupInfo &info, TGroupQueues &groupQueues,
181- NKikimrBlobStorage::EVDiskQueueId queueId, ui32 nWorst, TDiskDelayPredictions *outNWorst) const {
182+ NKikimrBlobStorage::EVDiskQueueId queueId, TDiskDelayPredictions *outNWorst,
183+ double multiplier) const {
182184 outNWorst->resize (Disks.size ());
183185 for (ui32 diskIdx = 0 ; diskIdx < Disks.size (); ++diskIdx) {
184- (*outNWorst)[diskIdx] = { GetPredictedDelayNs (info, groupQueues, diskIdx, queueId), diskIdx };
186+ (*outNWorst)[diskIdx] = {
187+ static_cast <ui64>(GetPredictedDelayNs (info, groupQueues, diskIdx, queueId) * multiplier),
188+ diskIdx
189+ };
185190 }
186- std::partial_sort (outNWorst->begin (), outNWorst->begin () + std::min (nWorst, (ui32)Disks.size ()), outNWorst->end ());
191+ ui32 sortedPrefixSize = std::min (3u , (ui32)Disks.size ());
192+ std::partial_sort (outNWorst->begin (), outNWorst->begin () + sortedPrefixSize, outNWorst->end ());
187193}
188194
189195bool TBlobState::HasWrittenQuorum (const TBlobStorageGroupInfo& info, const TBlobStorageGroupInfo::TGroupVDisks& expired) const {
@@ -361,7 +367,7 @@ void TBlackboard::AddErrorResponse(const TLogoBlobID &id, ui32 orderNumber) {
361367}
362368
363369EStrategyOutcome TBlackboard::RunStrategies (TLogContext &logCtx, const TStackVec<IStrategy*, 1 >& s,
364- float slowDiskThreshold , TBatchedVec<TFinishedBlob> *finished,
370+ const TAccelerationParams& accelerationParams , TBatchedVec<TFinishedBlob> *finished,
365371 const TBlobStorageGroupInfo::TGroupVDisks *expired) {
366372 for (auto it = BlobStates.begin (); it != BlobStates.end (); ) {
367373 auto & blob = it->second ;
@@ -374,7 +380,7 @@ EStrategyOutcome TBlackboard::RunStrategies(TLogContext &logCtx, const TStackVec
374380 NKikimrProto::EReplyStatus status = NKikimrProto::OK;
375381 TString errorReason;
376382 for (IStrategy *strategy : s) {
377- switch (auto res = strategy->Process (logCtx, blob, *Info, *this , GroupDiskRequests, slowDiskThreshold )) {
383+ switch (auto res = strategy->Process (logCtx, blob, *Info, *this , GroupDiskRequests, accelerationParams )) {
378384 case EStrategyOutcome::IN_PROGRESS:
379385 status = NKikimrProto::UNKNOWN;
380386 break ;
@@ -415,9 +421,10 @@ EStrategyOutcome TBlackboard::RunStrategies(TLogContext &logCtx, const TStackVec
415421 return BlobStates.empty () ? EStrategyOutcome::DONE : EStrategyOutcome::IN_PROGRESS;
416422}
417423
418- EStrategyOutcome TBlackboard::RunStrategy (TLogContext &logCtx, const IStrategy& s, float slowDiskThreshold,
419- TBatchedVec<TFinishedBlob> *finished, const TBlobStorageGroupInfo::TGroupVDisks *expired) {
420- return RunStrategies (logCtx, {const_cast <IStrategy*>(&s)}, slowDiskThreshold, finished, expired);
424+ EStrategyOutcome TBlackboard::RunStrategy (TLogContext &logCtx, const IStrategy& s,
425+ const TAccelerationParams& accelerationParams, TBatchedVec<TFinishedBlob> *finished,
426+ const TBlobStorageGroupInfo::TGroupVDisks *expired) {
427+ return RunStrategies (logCtx, {const_cast <IStrategy*>(&s)}, accelerationParams, finished, expired);
421428}
422429
423430TBlobState& TBlackboard::GetState (const TLogoBlobID &id) {
@@ -459,13 +466,17 @@ void TBlackboard::ReportPartMapStatus(const TLogoBlobID &id, ssize_t partMapInde
459466}
460467
461468void TBlackboard::GetWorstPredictedDelaysNs (const TBlobStorageGroupInfo &info, TGroupQueues &groupQueues,
462- NKikimrBlobStorage::EVDiskQueueId queueId, ui32 nWorst, TDiskDelayPredictions *outNWorst) const {
469+ NKikimrBlobStorage::EVDiskQueueId queueId, TDiskDelayPredictions *outNWorst,
470+ double multiplier) const {
463471 ui32 totalVDisks = info.GetTotalVDisksNum ();
464472 outNWorst->resize (totalVDisks);
465473 for (ui32 orderNumber = 0 ; orderNumber < totalVDisks; ++orderNumber) {
466- (*outNWorst)[orderNumber] = { groupQueues.GetPredictedDelayNsByOrderNumber (orderNumber, queueId), orderNumber };
474+ (*outNWorst)[orderNumber] = {
475+ static_cast <ui64>(groupQueues.GetPredictedDelayNsByOrderNumber (orderNumber, queueId) * multiplier),
476+ orderNumber
477+ };
467478 }
468- std::partial_sort (outNWorst->begin (), outNWorst->begin () + std::min (nWorst , totalVDisks), outNWorst->end ());
479+ std::partial_sort (outNWorst->begin (), outNWorst->begin () + std::min (3u , totalVDisks), outNWorst->end ());
469480}
470481
471482void TBlackboard::RegisterBlobForPut (const TLogoBlobID& id, size_t blobIdx) {
0 commit comments