Skip to content

Commit e6dccfb

Browse files
va-kuznecovVlad Kuznecov
andcommitted
Merge into stream-nb-24-3. Improvements of LWTrace and PDisk's main cycle (#9174)
Co-authored-by: Vlad Kuznecov <va-kuznecov@nebius.com>
1 parent be5bdc2 commit e6dccfb

10 files changed

+112
-46
lines changed

ydb/core/blobstorage/lwtrace_probes/blobstorage_probes.h

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -207,22 +207,22 @@ struct TEventTypeField {
207207
NAMES("pdisk", "schedStep")) \
208208
PROBE(PDiskChunkReadPieceAddToScheduler, GROUPS("PDisk", "PDiskRequest"), \
209209
TYPES(TPDiskIdField, ui32, ui64, ui64), \
210-
NAMES("pdisk", "pieceIdx", "size", "offset")) \
211-
PROBE(PDiskChunkReadPieceSendToDevice, GROUPS("PDisk", "PDiskRequest"), \
212-
TYPES(TPDiskIdField, ui64), \
213-
NAMES("pdisk", "size")) \
210+
NAMES("pdisk", "pieceIdx", "offset", "size")) \
211+
PROBE(PDiskChunkReadPiecesSendToDevice, GROUPS("PDisk", "PDiskRequest"), \
212+
TYPES(TPDiskIdField), \
213+
NAMES("pdisk")) \
214214
PROBE(PDiskChunkReadPieceComplete, GROUPS("PDisk", "PDiskRequest"), \
215-
TYPES(TPDiskIdField, ui64, ui64), \
216-
NAMES("pdisk", "size", "relativeOffset")) \
217-
PROBE(PDiskAddWritePieceToScheduler, GROUPS("PDisk", "PDiskRequest"), \
215+
TYPES(TPDiskIdField, ui64, ui64, double), \
216+
NAMES("pdisk", "size", "relativeOffset", "deviceTimeMs")) \
217+
PROBE(PDiskChunkWriteAddToScheduler, GROUPS("PDisk", "PDiskRequest"), \
218218
TYPES(TPDiskIdField, ui64, double, ui64, bool, ui64, ui64), \
219219
NAMES("pdisk", "reqId", "creationTimeSec", "owner", "isFast", "priorityClass", "size")) \
220-
PROBE(PDiskChunkWritePieceSendToDevice, GROUPS("PDisk", "PDiskRequest"), \
220+
PROBE(PDiskChunkWriteLastPieceSendToDevice, GROUPS("PDisk", "PDiskRequest"), \
221221
TYPES(TPDiskIdField, ui64, ui64, ui64, ui64), \
222222
NAMES("pdisk", "owner", "chunkIdx", "pieceOffset", "pieceSize")) \
223223
PROBE(PDiskLogWriteComplete, GROUPS("PDisk", "PDiskRequest"), \
224-
TYPES(TPDiskIdField, ui64, double, double, double, double, double, double), \
225-
NAMES("pdisk", "reqId", "creationTimeSec", "costMs", "responseTimeMs", "inputTimeMs", "scheduleTimeMs", "deviceTotalTimeMs")) \
224+
TYPES(TPDiskIdField, ui64, double, double, double, double, double, double, double, ui64), \
225+
NAMES("pdisk", "reqId", "creationTimeSec", "costMs", "responseTimeMs", "inputTimeMs", "scheduleTimeMs", "deviceTotalTimeMs", "deviceOnlyTimeMs", "batchSize")) \
226226
PROBE(PDiskChunkResponseTime, GROUPS("PDisk", "PDiskRequest"), \
227227
TYPES(TPDiskIdField, ui64, ui64, double, ui64), \
228228
NAMES("pdisk", "reqId", "priorityClass", "responseTimeMs", "sizeBytes")) \
@@ -235,6 +235,12 @@ struct TEventTypeField {
235235
PROBE(PDiskDeviceWriteDuration, GROUPS("PDisk"), \
236236
TYPES(TPDiskIdField, double, ui64), \
237237
NAMES("pdisk", "deviceTimeMs", "size")) \
238+
PROBE(PDiskDeviceGetFromDevice, GROUPS("PDisk"), \
239+
TYPES(), \
240+
NAMES()) \
241+
PROBE(PDiskDeviceGetFromWaiting, GROUPS("PDisk"), \
242+
TYPES(), \
243+
NAMES()) \
238244
PROBE(PDiskDeviceTrimDuration, GROUPS("PDisk"), \
239245
TYPES(TPDiskIdField, double, ui64), \
240246
NAMES("pdisk", "trimTimeMs", "trimOffset")) \
@@ -255,8 +261,11 @@ struct TEventTypeField {
255261
TYPES(ui32, ui64, ui64), \
256262
NAMES("chunkIdx", "size", "offset")) \
257263
PROBE(PDiskUpdateCycleDetails, GROUPS("PDisk"), \
258-
TYPES(float, float, float, float, float), \
259-
NAMES("entireUpdateMs", "inputQueueMs", "schedulingMs", "processingMs", "waitingMs")) \
264+
TYPES(ui32, float, float, float, float, float), \
265+
NAMES("pdisk", "entireUpdateMs", "inputQueueMs", "schedulingMs", "processingMs", "waitingMs")) \
266+
PROBE(PDiskEnqueueAllDetails, GROUPS("PDisk"), \
267+
TYPES(ui64, size_t, size_t, size_t, double), \
268+
NAMES("pdisk", "initialQueueSize", "processedReqs", "pushedToForsetiReqs", "spentTimeMs")) \
260269
PROBE(DSProxyGetEnqueue, GROUPS("DSProxy", "LWTrackStart"), TYPES(), NAMES()) \
261270
PROBE(DSProxyGetBootstrap, GROUPS("DSProxy"), TYPES(), NAMES()) \
262271
PROBE(DSProxyGetHandle, GROUPS("DSProxy", "LWTrackStart"), TYPES(), NAMES()) \

ydb/core/blobstorage/pdisk/blobstorage_pdisk_blockdevice_async.cpp

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,9 @@ class TRealBlockDevice : public IBlockDevice {
242242
EIoResult ret = EIoResult::TryAgain;
243243
while (ret == EIoResult::TryAgain) {
244244
action->SubmitTime = HPNow();
245+
if (action->FlushAction) {
246+
action->FlushAction->SubmitTime = action->SubmitTime;
247+
}
245248

246249
if (op->GetType() == IAsyncIoOperation::EType::PWrite) {
247250
PDISK_FAIL_INJECTION(1);
@@ -334,8 +337,8 @@ class TRealBlockDevice : public IBlockDevice {
334337
class TSharedCallback : public ICallback {
335338
ui64 NextPossibleNoop = 0;
336339
ui64 EndOffset = 0;
337-
ui64 PrevEventGotAtCycle = HPNow();
338-
ui64 PrevEstimationAtCycle = HPNow();
340+
NHPTimer::STime PrevEventGotAtCycle = HPNow();
341+
NHPTimer::STime PrevEstimationAtCycle = HPNow();
339342
ui64 PrevEstimatedCostNs = 0;
340343
ui64 PrevActualCostNs = 0;
341344

@@ -366,29 +369,32 @@ class TRealBlockDevice : public IBlockDevice {
366369
void Exec(TAsyncIoOperationResult *event) {
367370
IAsyncIoOperation *op = event->Operation;
368371
// Add up the execution time of all the events
369-
ui64 totalExecutionCycles = 0;
370-
ui64 totalCostNs = 0;
371-
ui64 eventGotAtCycle = HPNow();
372+
NHPTimer::STime eventGotAtCycle = HPNow();
372373
AtomicSet(Device.Mon.LastDoneOperationTimestamp, eventGotAtCycle);
373374

374375
TCompletionAction *completionAction = static_cast<TCompletionAction*>(op->GetCookie());
375376
FillCompletionAction(completionAction, op, event->Result);
377+
completionAction->GetTime = eventGotAtCycle;
378+
LWTRACK(PDiskDeviceGetFromDevice, completionAction->Orbit);
379+
if (completionAction->FlushAction) {
380+
completionAction->FlushAction->GetTime = eventGotAtCycle;
381+
LWTRACK(PDiskDeviceGetFromDevice, completionAction->FlushAction->Orbit);
382+
}
376383

377384
Device.QuitCounter.Decrement();
378385
Device.IdleCounter.Decrement();
379386
Device.FlightControl.MarkComplete(completionAction->OperationIdx);
380387

381-
ui64 startCycle = Max((ui64)completionAction->SubmitTime, PrevEventGotAtCycle);
382-
ui64 durationCycles = (eventGotAtCycle > startCycle) ? eventGotAtCycle - startCycle : 0;
383-
totalExecutionCycles = Max(totalExecutionCycles, durationCycles);
384-
totalCostNs += completionAction->CostNs;
388+
NHPTimer::STime startCycle = Max(completionAction->SubmitTime, (i64)PrevEventGotAtCycle);
389+
NHPTimer::STime durationCycles = (eventGotAtCycle > startCycle) ? eventGotAtCycle - startCycle : 0;
390+
NHPTimer::STime totalExecutionCycles = durationCycles;
391+
NHPTimer::STime totalCostNs = completionAction->CostNs;
385392

386-
bool isSeekExpected =
387-
((ui64)completionAction->SubmitTime + Device.SeekCostNs / 25ull >= PrevEventGotAtCycle);
393+
bool isSeekExpected = (completionAction->SubmitTime + (NHPTimer::STime)Device.SeekCostNs / 25ll >= PrevEventGotAtCycle);
388394

389395
const ui64 opSize = op->GetSize();
390396
Device.DecrementMonInFlight(op->GetType(), opSize);
391-
if (opSize == 0) {
397+
if (opSize == 0) { // Special case for flush operation, which is a read operation with 0 bytes size
392398
if (op->GetType() == IAsyncIoOperation::EType::PRead) {
393399
Y_ABORT_UNLESS(WaitingNoops[completionAction->OperationIdx % MaxWaitingNoops] == nullptr);
394400
WaitingNoops[completionAction->OperationIdx % MaxWaitingNoops] = completionAction;
@@ -432,6 +438,9 @@ class TRealBlockDevice : public IBlockDevice {
432438
while (NextPossibleNoop < firstIncompleteIdx) {
433439
ui64 i = NextPossibleNoop % MaxWaitingNoops;
434440
if (WaitingNoops[i] && WaitingNoops[i]->OperationIdx == NextPossibleNoop) {
441+
LWTRACK(PDiskDeviceGetFromWaiting, WaitingNoops[i]->Orbit);
442+
double durationMs = HPMilliSecondsFloat(HPNow() - WaitingNoops[i]->GetTime);
443+
Device.Mon.DeviceFlushDuration.Increment(durationMs);
435444
Device.CompletionThread->Schedule(WaitingNoops[i]);
436445
WaitingNoops[i] = nullptr;
437446
}
@@ -556,6 +565,9 @@ class TRealBlockDevice : public IBlockDevice {
556565
EIoResult ret = EIoResult::TryAgain;
557566
while (ret == EIoResult::TryAgain) {
558567
action->SubmitTime = HPNow();
568+
if (action->FlushAction) {
569+
action->FlushAction->SubmitTime = action->SubmitTime;
570+
}
559571
ret = Device.IoContext->Submit(op, Device.SharedCallback.Get());
560572
if (ret == EIoResult::Ok) {
561573
return true;

ydb/core/blobstorage/pdisk/blobstorage_pdisk_completion.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ namespace NKikimr::NPDisk {
1212
struct TCompletionAction {
1313
ui64 OperationIdx;
1414
NHPTimer::STime SubmitTime;
15+
NHPTimer::STime GetTime;
1516
TCompletionAction *FlushAction = nullptr;
1617
ui64 CostNs = 0;
1718
NWilson::TTraceId TraceId;

ydb/core/blobstorage/pdisk/blobstorage_pdisk_completion_impl.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#include "blobstorage_pdisk_impl.h"
33
#include "blobstorage_pdisk_sectorrestorator.h"
44

5+
constexpr size_t MAX_RESULTS_PER_BATCH = 50; // It took ~0.25ms in VDisk's handler to process such batch
6+
57
namespace NKikimr {
68
namespace NPDisk {
79

@@ -53,7 +55,9 @@ void TCompletionLogWrite::Exec(TActorSystem *actorSystem) {
5355
HPMilliSecondsFloat(now - evLog.CreationTime),
5456
HPMilliSecondsFloat(evLog.InputTime - evLog.CreationTime),
5557
HPMilliSecondsFloat(evLog.ScheduleTime - evLog.InputTime),
56-
HPMilliSecondsFloat(now - evLog.ScheduleTime));
58+
HPMilliSecondsFloat(now - evLog.ScheduleTime),
59+
HPMilliSecondsFloat(GetTime - SubmitTime),
60+
batch ? batch->Result->Results.size() : 0);
5761
if (evLog.Result->Results) {
5862
evLog.Result->Results.front().Orbit = std::move(evLog.Orbit);
5963
}
@@ -65,7 +69,7 @@ void TCompletionLogWrite::Exec(TActorSystem *actorSystem) {
6569
}
6670
if (evLog.Result->Status == NKikimrProto::OK) {
6771
if (batch) {
68-
if (batch->Sender == evLog.Sender) {
72+
if (batch->Sender == evLog.Sender && batch->Result->Results.size() < MAX_RESULTS_PER_BATCH) {
6973
batch->Result->Results.push_back(std::move(evLog.Result->Results[0]));
7074
} else {
7175
sendResponse(batch);
@@ -275,7 +279,9 @@ void TCompletionChunkReadPart::Exec(TActorSystem *actorSystem) {
275279
endBadUserOffset = 0xffffffff;
276280
}
277281

278-
LWTRACK(PDiskChunkReadPieceComplete, Read->Orbit, PDisk->PDiskId, RawReadSize, CommonBufferOffset);
282+
double deviceTimeMs = HPMilliSecondsFloat(GetTime - SubmitTime);
283+
LWTRACK(PDiskChunkReadPieceComplete, Orbit, PDisk->PDiskId, RawReadSize, CommonBufferOffset, deviceTimeMs);
284+
Read->Orbit.Join(Orbit);
279285
CumulativeCompletion->PartReadComplete(actorSystem);
280286
CumulativeCompletion = nullptr;
281287

ydb/core/blobstorage/pdisk/blobstorage_pdisk_completion_impl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ class TCompletionChunkWrite : public TCompletionAction {
111111
Mon->IncrementResponseTime(PriorityClass, responseTimeMs, SizeBytes);
112112
}
113113
LWTRACK(PDiskChunkResponseTime, Orbit, PDiskId, ReqId.Id, PriorityClass, responseTimeMs, SizeBytes);
114+
Event->Orbit = std::move(Orbit);
114115
actorSystem->Send(Recipient, Event.Release());
115116
if (Mon) {
116117
Mon->GetWriteCounter(PriorityClass)->CountResponse();

ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
#include <util/system/unaligned_mem.h>
1515

16+
constexpr size_t MAX_REQS_PER_CYCLE = 200; // 200 requests take ~0.2ms in EnqueueAll function
17+
1618
namespace NKikimr {
1719
namespace NPDisk {
1820

@@ -843,9 +845,6 @@ bool TPDisk::ChunkWritePiece(TChunkWrite *evChunkWrite, ui32 pieceShift, ui32 pi
843845

844846
guard.Release();
845847

846-
LWTRACK(PDiskChunkWritePieceSendToDevice, evChunkWrite->Orbit, PDiskId, evChunkWrite->Owner, chunkIdx,
847-
pieceShift, pieceSize);
848-
849848
ui32 bytesAvailable = pieceSize;
850849
Y_ABORT_UNLESS(evChunkWrite->BytesWritten == pieceShift);
851850
const ui32 count = evChunkWrite->PartsPtr->Size();
@@ -904,6 +903,9 @@ bool TPDisk::ChunkWritePiece(TChunkWrite *evChunkWrite, ui32 pieceShift, ui32 pi
904903
LOG_INFO(*ActorSystem, NKikimrServices::BS_PDISK, "PDiskId# %" PRIu32 " chunkIdx# %" PRIu32
905904
" was zero-padded after writing", (ui32)PDiskId, (ui32)chunkIdx);
906905
}
906+
LWTRACK(PDiskChunkWriteLastPieceSendToDevice, evChunkWrite->Orbit, PDiskId, evChunkWrite->Owner, chunkIdx,
907+
pieceShift, pieceSize);
908+
907909
auto traceId = evChunkWrite->SpanStack.GetTraceId();
908910
evChunkWrite->Completion->Orbit = std::move(evChunkWrite->Orbit);
909911
writer.Flush(evChunkWrite->ReqId, &traceId, evChunkWrite->Completion.Release());
@@ -946,7 +948,7 @@ void TPDisk::SendChunkReadError(const TIntrusivePtr<TChunkRead>& read, TStringSt
946948
}
947949

948950
TPDisk::EChunkReadPieceResult TPDisk::ChunkReadPiece(TIntrusivePtr<TChunkRead> &read, ui64 pieceCurrentSector,
949-
ui64 pieceSizeLimit, ui64 *reallyReadDiskBytes, NWilson::TTraceId traceId) {
951+
ui64 pieceSizeLimit, ui64 *reallyReadDiskBytes, NWilson::TTraceId traceId, NLWTrace::TOrbit&& orbit) {
950952
if (read->IsReplied) {
951953
return ReadPieceResultOk;
952954
}
@@ -1015,6 +1017,8 @@ TPDisk::EChunkReadPieceResult TPDisk::ChunkReadPiece(TIntrusivePtr<TChunkRead> &
10151017
THolder<TCompletionChunkReadPart> completion(new TCompletionChunkReadPart(this, read, bytesToRead,
10161018
payloadBytesToRead, payloadOffset, read->FinalCompletion, isTheLastPart, Cfg->UseT1ha0HashInFooter, std::move(span)));
10171019
completion->CostNs = DriveModel.TimeForSizeNs(bytesToRead, read->ChunkIdx, TDriveModel::OP_TYPE_READ);
1020+
LWTRACK(PDiskChunkReadPiecesSendToDevice, orbit, PDiskId);
1021+
completion->Orbit = std::move(orbit);
10181022
Y_ABORT_UNLESS(bytesToRead <= completion->GetBuffer()->Size());
10191023
ui8 *data = completion->GetBuffer()->Data();
10201024
BlockDevice->PreadAsync(data, bytesToRead, readOffset, completion.Release(),
@@ -2279,7 +2283,7 @@ void TPDisk::ProcessChunkReadQueue() {
22792283
ui64 currentLimit = Min(bufferSize, piece->PieceSizeLimit - size);
22802284
ui64 reallyReadDiskBytes;
22812285
EChunkReadPieceResult result = ChunkReadPiece(read, piece->PieceCurrentSector + size / Format.SectorSize,
2282-
currentLimit, &reallyReadDiskBytes, piece->SpanStack.GetTraceId());
2286+
currentLimit, &reallyReadDiskBytes, piece->SpanStack.GetTraceId(), std::move(piece->Orbit));
22832287
isComplete = (result != ReadPieceResultInProgress);
22842288
// Read pieces is sliced previously and it is expected that ChunkReadPiece will read exactly
22852289
// currentLimit bytes
@@ -2941,7 +2945,6 @@ bool TPDisk::PreprocessRequest(TRequestBase *request) {
29412945

29422946
auto result = std::make_unique<TEvChunkWriteResult>(NKikimrProto::OK, ev.ChunkIdx, ev.Cookie,
29432947
GetStatusFlags(ev.Owner, ev.OwnerGroupType), TString());
2944-
result->Orbit = std::move(ev.Orbit);
29452948

29462949
++state.OperationsInProgress;
29472950
++ownerData.InFlight->ChunkWrites;
@@ -3185,7 +3188,7 @@ void TPDisk::PushRequestToForseti(TRequestBase *request) {
31853188
TChunkWritePiece *piece = new TChunkWritePiece(whole, smallJobCount * smallJobSize, largeJobSize, std::move(span));
31863189
piece->EstimateCost(DriveModel);
31873190
AddJobToForseti(cbs, piece, request->JobKind);
3188-
LWTRACK(PDiskAddWritePieceToScheduler, request->Orbit, PDiskId, request->ReqId.Id,
3191+
LWTRACK(PDiskChunkWriteAddToScheduler, request->Orbit, PDiskId, request->ReqId.Id,
31893192
HPSecondsFloat(HPNow() - request->CreationTime), request->Owner, request->IsFast,
31903193
request->PriorityClass, whole->TotalSize);
31913194
} else if (request->GetType() == ERequestType::RequestChunkRead) {
@@ -3206,7 +3209,8 @@ void TPDisk::PushRequestToForseti(TRequestBase *request) {
32063209
// Schedule small job.
32073210
auto piece = new TChunkReadPiece(read, idx * smallJobSize,
32083211
smallJobSize * Format.SectorSize, false, std::move(span));
3209-
LWTRACK(PDiskChunkReadPieceAddToScheduler, read->Orbit, PDiskId, idx, idx * smallJobSize,
3212+
read->Orbit.Fork(piece->Orbit);
3213+
LWTRACK(PDiskChunkReadPieceAddToScheduler, piece->Orbit, PDiskId, idx, idx * smallJobSize * Format.SectorSize,
32103214
smallJobSize * Format.SectorSize);
32113215
piece->EstimateCost(DriveModel);
32123216
piece->SelfPointer = piece;
@@ -3217,8 +3221,9 @@ void TPDisk::PushRequestToForseti(TRequestBase *request) {
32173221
span.Attribute("is_last_piece", true);
32183222
auto piece = new TChunkReadPiece(read, smallJobCount * smallJobSize,
32193223
largeJobSize * Format.SectorSize, true, std::move(span));
3220-
LWTRACK(PDiskChunkReadPieceAddToScheduler, read->Orbit, PDiskId, smallJobCount,
3221-
smallJobCount * smallJobSize, largeJobSize * Format.SectorSize);
3224+
read->Orbit.Fork(piece->Orbit);
3225+
LWTRACK(PDiskChunkReadPieceAddToScheduler, piece->Orbit, PDiskId, smallJobCount,
3226+
smallJobCount * smallJobSize * Format.SectorSize, largeJobSize * Format.SectorSize);
32223227
piece->EstimateCost(DriveModel);
32233228
piece->SelfPointer = piece;
32243229
AddJobToForseti(cbs, piece, request->JobKind);
@@ -3406,7 +3411,14 @@ void TPDisk::ProcessYardInitSet() {
34063411
}
34073412

34083413
void TPDisk::EnqueueAll() {
3414+
TInstant start = TInstant::Now();
3415+
34093416
TGuard<TMutex> guard(StateMutex);
3417+
size_t initialQueueSize = InputQueue.GetWaitingSize();
3418+
size_t processedReqs = 0;
3419+
size_t pushedToForsetiReqs = 0;
3420+
3421+
34103422
while (InputQueue.GetWaitingSize() > 0) {
34113423
TRequestBase* request = InputQueue.Pop();
34123424
AtomicSub(InputQueueCost, request->Cost);
@@ -3449,9 +3461,17 @@ void TPDisk::EnqueueAll() {
34493461
} else {
34503462
if (PreprocessRequest(request)) {
34513463
PushRequestToForseti(request);
3464+
++pushedToForsetiReqs;
34523465
}
34533466
}
3467+
++processedReqs;
3468+
if (processedReqs >= MAX_REQS_PER_CYCLE) {
3469+
break;
3470+
}
34543471
}
3472+
3473+
double spentTimeMs = (TInstant::Now() - start).MillisecondsFloat();
3474+
LWPROBE(PDiskEnqueueAllDetails, PDiskId, initialQueueSize, processedReqs, pushedToForsetiReqs, spentTimeMs);
34553475
}
34563476

34573477
void TPDisk::Update() {

ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ class TPDisk : public IPDisk {
288288
void SendChunkReadError(const TIntrusivePtr<TChunkRead>& read, TStringStream& errorReason,
289289
NKikimrProto::EReplyStatus status);
290290
EChunkReadPieceResult ChunkReadPiece(TIntrusivePtr<TChunkRead> &read, ui64 pieceCurrentSector, ui64 pieceSizeLimit,
291-
ui64 *reallyReadBytes, NWilson::TTraceId traceId);
291+
ui64 *reallyReadBytes, NWilson::TTraceId traceId, NLWTrace::TOrbit&& orbit);
292292
void SplitChunkJobSize(ui32 totalSize, ui32 *outSmallJobSize, ui32 *outLargeJObSize, ui32 *outSmallJobCount);
293293
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
294294
// Chunk locking

0 commit comments

Comments
 (0)