aboutsummaryrefslogtreecommitdiffhomepage
path: root/tddb
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2022-10-13 16:04:24 +0300
committerlevlam <levlam@telegram.org>2022-10-13 16:04:24 +0300
commitec86b34d557c031b0b07929734decc561315eac1 (patch)
tree9f162cad834e7640a54bc04891143a468ea9c2a1 /tddb
parentec4ae065b02bbb12c98806d2b542eb2081fec22f (diff)
Don't allow TQueue::run_gc to run for more than 50 milliseconds.
Diffstat (limited to 'tddb')
-rw-r--r--tddb/td/db/TQueue.cpp16
-rw-r--r--tddb/td/db/TQueue.h3
2 files changed, 16 insertions, 3 deletions
diff --git a/tddb/td/db/TQueue.cpp b/tddb/td/db/TQueue.cpp
index 9aa22fb32..899998b47 100644
--- a/tddb/td/db/TQueue.cpp
+++ b/tddb/td/db/TQueue.cpp
@@ -15,6 +15,7 @@
#include "td/utils/misc.h"
#include "td/utils/Random.h"
#include "td/utils/StorerBase.h"
+#include "td/utils/Time.h"
#include "td/utils/tl_helpers.h"
#include "td/utils/tl_parsers.h"
#include "td/utils/tl_storers.h"
@@ -234,8 +235,10 @@ class TQueueImpl final : public TQueue {
return get_size(q);
}
- int64 run_gc(int32 unix_time_now) final {
+ std::pair<int64, bool> run_gc(int32 unix_time_now) final {
int64 deleted_events = 0;
+ auto max_finish_time = Time::now() + 0.05;
+ int64 counter = 0;
while (!queue_gc_at_.empty()) {
auto it = queue_gc_at_.begin();
if (it->first >= unix_time_now) {
@@ -250,6 +253,12 @@ class TQueueImpl final : public TQueue {
size_t size_before = get_size(q);
for (auto event_it = q.events.begin(); event_it != q.events.end();) {
auto &event = event_it->second;
+ if ((++counter & 128) == 0 && Time::now() >= max_finish_time) {
+ if (new_gc_at == 0) {
+ new_gc_at = event.expires_at;
+ }
+ break;
+ }
if (event.expires_at < unix_time_now || event.data.empty()) {
pop(q, queue_id, event_it, q.tail_id);
} else {
@@ -265,8 +274,11 @@ class TQueueImpl final : public TQueue {
deleted_events += size_before - size_after;
}
schedule_queue_gc(queue_id, q, new_gc_at);
+ if (Time::now() >= max_finish_time) {
+ return {deleted_events, false};
+ }
}
- return deleted_events;
+ return {deleted_events, true};
}
size_t get_size(QueueId queue_id) const final {
diff --git a/tddb/td/db/TQueue.h b/tddb/td/db/TQueue.h
index 934d8a02e..df8dbc5d1 100644
--- a/tddb/td/db/TQueue.h
+++ b/tddb/td/db/TQueue.h
@@ -112,7 +112,8 @@ class TQueue {
virtual size_t get_size(QueueId queue_id) const = 0;
- virtual int64 run_gc(int32 unix_time_now) = 0;
+ // returns number of deleted events and whether garbage collection was completed
+ virtual std::pair<int64, bool> run_gc(int32 unix_time_now) = 0;
virtual void close(Promise<> promise) = 0;
};