aboutsummaryrefslogtreecommitdiffstats
path: root/lib/commit.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/commit.c')
-rw-r--r--lib/commit.c43
1 files changed, 36 insertions, 7 deletions
diff --git a/lib/commit.c b/lib/commit.c
index 45d4d73..b61b05b 100644
--- a/lib/commit.c
+++ b/lib/commit.c
@@ -1,21 +1,50 @@
#include "collect.h"
#include "main.h"
#include "sql.h"
+#include "util.h"
#include <zstd.h>
static void do_gc(sqlite3 *db, State *s) {
- uint32_t cur_size = s->header->raw_size;
+ int64_t cur_size = (int64_t)s->header->raw_size;
pthread_mutex_lock(&s->global->storage_consumed_lock);
- uint32_t remain_size =
+ int64_t remain_size =
s->global->storage_budget - s->global->storage_consumed - cur_size;
- uint32_t gc_size = -remain_size + cur_size * g_gc_rate;
- if (gc_size >= s->global->storage_consumed)
- gc_size = s->global->storage_consumed;
+ int64_t gc_size = 0;
+ if (remain_size <= 0) {
+ gc_size = -remain_size + cur_size * g_gc_rate;
+ if (gc_size >= s->global->storage_consumed)
+ gc_size = s->global->storage_consumed * g_gc_cap;
+ else if (gc_size >= s->global->storage_budget * g_gc_cap)
+ gc_size = s->global->storage_budget * g_gc_cap;
+ }
+ DEBUG("do_gc: gc_size %.2f KB, remain %.2f KB, cur_size, %.2f KB\n",
+ gc_size / 1024.0, remain_size / 1024.0, cur_size / 1024.0);
pthread_mutex_unlock(&s->global->storage_consumed_lock);
- if (remain_size <= 0)
- db_delete_oldest_bytes(db, gc_size);
+ uint32_t gc_count = 0;
+ if (gc_size > 0) {
+ gc_count = db_delete_oldest_bytes(db, gc_size);
+ db_vacuum(db);
+ }
+
+ int64_t dbsize = check_file_size(s->global->storage_file);
+ pthread_mutex_lock(&s->global->storage_consumed_lock);
+ s->global->storage_consumed = dbsize;
+ pthread_mutex_unlock(&s->global->storage_consumed_lock);
+
+ if (gc_count) {
+ INFO("gc: storage budget: %.2f MB, storage consumed: %.2f MB, (%.2f "
+ "MB/%d entries) vacuumed",
+ s->global->storage_budget / 1024.0 / 1024.0,
+ s->global->storage_consumed / 1024.0 / 1024.0,
+ gc_size / 1024.0 / 1024.0, gc_count);
+ } else {
+ DEBUG("gc: storage budget: %.2f MB, storage consumed: %.2f MB, skip "
+ "vacuuming",
+ s->global->storage_budget / 1024.0 / 1024.0,
+ s->global->storage_consumed / 1024.0 / 1024.0);
+ }
}
static int commit_lz4(State *s, void **buf) {