Skip to content

Commit 3b10297

Browse files
yumkamkardymonds
authored andcommitted
dqrun pq simulation: add queue limit (ydb-platform#9962)
1 parent e481fc4 commit 3b10297

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

ydb/library/yql/providers/pq/gateway/dummy/yql_pq_file_topic_client.cpp

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@ namespace NYql {
1212

1313
class TBlockingEQueue {
1414
public:
15-
void Push(NYdb::NTopic::TReadSessionEvent::TEvent&& e) {
15+
TBlockingEQueue(size_t maxSize):MaxSize_(maxSize) {
16+
}
17+
void Push(NYdb::NTopic::TReadSessionEvent::TEvent&& e, size_t size) {
1618
with_lock(Mutex_) {
17-
Events_.push_back(std::move(e));
19+
CanPush_.WaitI(Mutex_, [this] () {return Stopped_ || Size_ < MaxSize_;});
20+
Events_.emplace_back(std::move(e), size );
21+
Size_ += size;
1822
}
1923
CanPop_.BroadCast();
2024
}
@@ -29,26 +33,26 @@ class TBlockingEQueue {
2933
with_lock(Mutex_) {
3034
if (block) {
3135
CanPop_.WaitI(Mutex_, [this] () {return CanPopPredicate();});
32-
33-
auto front = Events_.front();
34-
Events_.pop_front();
35-
return front;
3636
} else {
3737
if (!CanPopPredicate()) {
3838
return {};
3939
}
40-
41-
auto front = Events_.front();
42-
Events_.pop_front();
43-
return front;
4440
}
41+
auto [front, size] = std::move(Events_.front());
42+
Events_.pop_front();
43+
Size_ -= size;
44+
if (Size_ < MaxSize_) {
45+
CanPush_.BroadCast();
46+
}
47+
return front;
4548
}
4649
}
4750

4851
void Stop() {
4952
with_lock(Mutex_) {
5053
Stopped_ = true;
5154
CanPop_.BroadCast();
55+
CanPush_.BroadCast();
5256
}
5357
}
5458

@@ -63,10 +67,13 @@ class TBlockingEQueue {
6367
return !Events_.empty() && !Stopped_;
6468
}
6569

66-
TDeque<NYdb::NTopic::TReadSessionEvent::TEvent> Events_;
70+
size_t MaxSize_;
71+
size_t Size_ = 0;
72+
TDeque<std::pair<NYdb::NTopic::TReadSessionEvent::TEvent, size_t>> Events_;
6773
bool Stopped_ = false;
6874
TMutex Mutex_;
6975
TCondVar CanPop_;
76+
TCondVar CanPush_;
7077
};
7178

7279
class TFileTopicReadSession : public NYdb::NTopic::IReadSession {
@@ -174,21 +181,23 @@ constexpr static auto FILE_POLL_PERIOD = TDuration::MilliSeconds(100);
174181
while (!EventsQ_.IsStopped()) {
175182
TString rawMsg;
176183
TVector<TMessage> msgs;
184+
size_t size = 0;
177185

178186
while (size_t read = fi.ReadLine(rawMsg)) {
179187
msgs.emplace_back(MakeNextMessage(rawMsg));
180188
MsgOffset_++;
189+
size += rawMsg.size();
181190
}
182191
if (!msgs.empty()) {
183-
EventsQ_.Push(NYdb::NTopic::TReadSessionEvent::TDataReceivedEvent(msgs, {}, Session_));
192+
EventsQ_.Push(NYdb::NTopic::TReadSessionEvent::TDataReceivedEvent(msgs, {}, Session_), size);
184193
}
185194

186195
Sleep(FILE_POLL_PERIOD);
187196
}
188197
}
189198

190199
TFile File_;
191-
TBlockingEQueue EventsQ_;
200+
TBlockingEQueue EventsQ_ {4_MB};
192201
NYdb::NTopic::TPartitionSession::TPtr Session_;
193202
TString ProducerId_;
194203
std::thread FilePoller_;
@@ -298,4 +307,4 @@ NYdb::TAsyncStatus TFileTopicClient::CommitOffset(const TString& path, ui64 part
298307
return NThreading::MakeFuture(NYdb::TStatus(NYdb::EStatus::SUCCESS, {}));
299308
}
300309

301-
}
310+
}

0 commit comments

Comments
 (0)