@@ -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,8 @@ void TBlackboard::AddErrorResponse(const TLogoBlobID &id, ui32 orderNumber) {
361367}
362368
363369EStrategyOutcome TBlackboard::RunStrategies (TLogContext &logCtx, const TStackVec<IStrategy*, 1 >& s,
364- TBatchedVec<TFinishedBlob> *finished, const TBlobStorageGroupInfo::TGroupVDisks *expired) {
370+ const TAccelerationParams& accelerationParams, TBatchedVec<TFinishedBlob> *finished,
371+ const TBlobStorageGroupInfo::TGroupVDisks *expired) {
365372 for (auto it = BlobStates.begin (); it != BlobStates.end (); ) {
366373 auto & blob = it->second ;
367374 if (!std::exchange (blob.IsChanged , false )) {
@@ -373,7 +380,7 @@ EStrategyOutcome TBlackboard::RunStrategies(TLogContext &logCtx, const TStackVec
373380 NKikimrProto::EReplyStatus status = NKikimrProto::OK;
374381 TString errorReason;
375382 for (IStrategy *strategy : s) {
376- switch (auto res = strategy->Process (logCtx, blob, *Info, *this , GroupDiskRequests)) {
383+ switch (auto res = strategy->Process (logCtx, blob, *Info, *this , GroupDiskRequests, accelerationParams )) {
377384 case EStrategyOutcome::IN_PROGRESS:
378385 status = NKikimrProto::UNKNOWN;
379386 break ;
@@ -415,8 +422,9 @@ EStrategyOutcome TBlackboard::RunStrategies(TLogContext &logCtx, const TStackVec
415422}
416423
417424EStrategyOutcome TBlackboard::RunStrategy (TLogContext &logCtx, const IStrategy& s,
418- TBatchedVec<TFinishedBlob> *finished, const TBlobStorageGroupInfo::TGroupVDisks *expired) {
419- return RunStrategies (logCtx, {const_cast <IStrategy*>(&s)}, finished, expired);
425+ const TAccelerationParams& accelerationParams, TBatchedVec<TFinishedBlob> *finished,
426+ const TBlobStorageGroupInfo::TGroupVDisks *expired) {
427+ return RunStrategies (logCtx, {const_cast <IStrategy*>(&s)}, accelerationParams, finished, expired);
420428}
421429
422430TBlobState& TBlackboard::GetState (const TLogoBlobID &id) {
@@ -458,13 +466,17 @@ void TBlackboard::ReportPartMapStatus(const TLogoBlobID &id, ssize_t partMapInde
458466}
459467
460468void TBlackboard::GetWorstPredictedDelaysNs (const TBlobStorageGroupInfo &info, TGroupQueues &groupQueues,
461- NKikimrBlobStorage::EVDiskQueueId queueId, ui32 nWorst, TDiskDelayPredictions *outNWorst) const {
469+ NKikimrBlobStorage::EVDiskQueueId queueId, TDiskDelayPredictions *outNWorst,
470+ double multiplier) const {
462471 ui32 totalVDisks = info.GetTotalVDisksNum ();
463472 outNWorst->resize (totalVDisks);
464473 for (ui32 orderNumber = 0 ; orderNumber < totalVDisks; ++orderNumber) {
465- (*outNWorst)[orderNumber] = { groupQueues.GetPredictedDelayNsByOrderNumber (orderNumber, queueId), orderNumber };
474+ (*outNWorst)[orderNumber] = {
475+ static_cast <ui64>(groupQueues.GetPredictedDelayNsByOrderNumber (orderNumber, queueId) * multiplier),
476+ orderNumber
477+ };
466478 }
467- 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 ());
468480}
469481
470482void TBlackboard::RegisterBlobForPut (const TLogoBlobID& id, size_t blobIdx) {
0 commit comments