Skip to content

Commit 49244c8

Browse files
one path will not reduce write speed for another (#16855)
1 parent d9f5407 commit 49244c8

File tree

2 files changed

+31
-15
lines changed

2 files changed

+31
-15
lines changed

ydb/core/tx/columnshard/tablet/write_queue.cpp

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,6 @@
77
namespace NKikimr::NColumnShard {
88

99
bool TWriteTask::Execute(TColumnShard* owner, const TActorContext& /* ctx */) {
10-
auto overloadStatus = owner->CheckOverloadedWait(PathId);
11-
if (overloadStatus != TColumnShard::EOverloadStatus::None) {
12-
AFL_DEBUG(NKikimrServices::TX_COLUMNSHARD_WRITE)("event", "wait_overload")("status", overloadStatus);
13-
return false;
14-
}
15-
1610
owner->Counters.GetCSCounters().WritingCounters->OnWritingTaskDequeue(TMonotonic::Now() - Created);
1711
owner->OperationsManager->RegisterLock(LockId, owner->Generation());
1812
auto writeOperation = owner->OperationsManager->RegisterOperation(
@@ -37,21 +31,39 @@ bool TWriteTasksQueue::Drain(const bool onWakeup, const TActorContext& ctx) {
3731
if (onWakeup) {
3832
WriteTasksOverloadCheckerScheduled = false;
3933
}
40-
while (WriteTasks.size() && WriteTasks.front().Execute(Owner, ctx)) {
41-
WriteTasks.pop_front();
34+
std::vector<TInternalPathId> toRemove;
35+
ui32 countTasks = 0;
36+
for (auto&& i : WriteTasks) {
37+
auto overloadStatus = Owner->CheckOverloadedWait(i.first);
38+
if (overloadStatus != TColumnShard::EOverloadStatus::None) {
39+
countTasks += i.second.size();
40+
AFL_DEBUG(NKikimrServices::TX_COLUMNSHARD_WRITE)("event", "wait_overload")("status", overloadStatus)("path_id", i.first)(
41+
"size", i.second.size());
42+
continue;
43+
}
44+
for (auto&& t : i.second) {
45+
t.Execute(Owner, ctx);
46+
}
47+
toRemove.emplace_back(i.first);
4248
}
43-
if (WriteTasks.size() && !WriteTasksOverloadCheckerScheduled) {
49+
50+
for (auto&& i : toRemove) {
51+
AFL_VERIFY(WriteTasks.erase(i));
52+
}
53+
54+
if (countTasks && !WriteTasksOverloadCheckerScheduled) {
4455
Owner->Schedule(TDuration::MilliSeconds(300), new NActors::TEvents::TEvWakeup(1));
4556
WriteTasksOverloadCheckerScheduled = true;
46-
AFL_WARN(NKikimrServices::TX_COLUMNSHARD)("event", "queue_on_write")("size", WriteTasks.size());
57+
AFL_WARN(NKikimrServices::TX_COLUMNSHARD)("event", "queue_on_write")("size", countTasks);
4758
}
48-
Owner->Counters.GetCSCounters().WritingCounters->QueueWaitSize->Add((i64)WriteTasks.size() - PredWriteTasksSize);
49-
PredWriteTasksSize = (i64)WriteTasks.size();
50-
return !WriteTasks.size();
59+
Owner->Counters.GetCSCounters().WritingCounters->QueueWaitSize->Add((i64)countTasks - PredWriteTasksSize);
60+
PredWriteTasksSize = (i64)countTasks;
61+
return !countTasks;
5162
}
5263

5364
void TWriteTasksQueue::Enqueue(TWriteTask&& task) {
54-
WriteTasks.emplace_back(std::move(task));
65+
const TInternalPathId pathId = task.GetPathId();
66+
WriteTasks[pathId].emplace_back(std::move(task));
5567
}
5668

5769
TWriteTasksQueue::~TWriteTasksQueue() {

ydb/core/tx/columnshard/tablet/write_queue.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ class TWriteTask: TMoveOnly {
3535
, Behaviour(behaviour) {
3636
}
3737

38+
const TInternalPathId& GetPathId() const {
39+
return PathId;
40+
}
41+
3842
const TMonotonic& GetCreatedMonotonic() const {
3943
return Created;
4044
}
@@ -45,7 +49,7 @@ class TWriteTask: TMoveOnly {
4549
class TWriteTasksQueue {
4650
private:
4751
bool WriteTasksOverloadCheckerScheduled = false;
48-
std::deque<TWriteTask> WriteTasks;
52+
THashMap<TInternalPathId, std::deque<TWriteTask>> WriteTasks;
4953
i64 PredWriteTasksSize = 0;
5054
TColumnShard* Owner;
5155

0 commit comments

Comments
 (0)