From ba0dc904d90cfffb7222dbbeeb923220f5a7b869 Mon Sep 17 00:00:00 2001 From: Stelios Fragkakis <52996999+stelfrag@users.noreply.github.com> Date: Fri, 17 Oct 2025 08:39:42 +0300 Subject: [PATCH] Periodic sync data on windows --- src/database/engine/datafile.c | 16 ++++++++++++++++ src/database/engine/datafile.h | 7 +++++++ src/database/engine/rrdengine.c | 17 +++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/src/database/engine/datafile.c b/src/database/engine/datafile.c index 9dd786fe0fa2ad..218185dbd812cc 100644 --- a/src/database/engine/datafile.c +++ b/src/database/engine/datafile.c @@ -1,6 +1,15 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "rrdengine.h" +#ifdef OS_WINDOWS +void sync_uv_file_data(uv_file file) +{ + uv_fs_t req; + (void) uv_fs_fsync(NULL, &req, file, NULL); + uv_fs_req_cleanup(&req); +} +#endif + void datafile_list_insert(struct rrdengine_instance *ctx, struct rrdengine_datafile *datafile) { netdata_rwlock_wrlock(&ctx->datafiles.rwlock); @@ -9,6 +18,13 @@ void datafile_list_insert(struct rrdengine_instance *ctx, struct rrdengine_dataf fatal("DBENGINE: cannot insert datafile %u of tier %d into the datafiles list", datafile->fileno, ctx->config.tier); *Pvalue = datafile; + +#ifdef OS_WINDOWS + sync_uv_file_data(datafile->file); + sync_uv_file_data(datafile->journalfile->file); + datafile->writers.last_sync_time = now_realtime_sec(); +#endif + netdata_rwlock_wrunlock(&ctx->datafiles.rwlock); } diff --git a/src/database/engine/datafile.h b/src/database/engine/datafile.h index 874dbfe0658612..e8bcff362814e5 100644 --- a/src/database/engine/datafile.h +++ b/src/database/engine/datafile.h @@ -69,6 +69,9 @@ struct rrdengine_datafile { SPINLOCK spinlock; size_t running; size_t flushed_to_open_running; +#ifdef OS_WINDOWS + time_t last_sync_time; +#endif } writers; struct { @@ -115,4 +118,8 @@ static struct rrdengine_instance *datafile_ctx(struct rrdengine_datafile *datafi return datafile->ctx; } +#ifdef OS_WINDOWS +void sync_uv_file_data(uv_file file); +#endif + #endif /* NETDATA_DATAFILE_H */ \ No newline at end of file diff --git a/src/database/engine/rrdengine.c b/src/database/engine/rrdengine.c index 0a2f1c13a0649a..9fd0fe9f4db2df 100644 --- a/src/database/engine/rrdengine.c +++ b/src/database/engine/rrdengine.c @@ -726,8 +726,19 @@ extent_flush_to_open(struct rrdengine_instance *ctx, struct extent_io_descriptor static bool datafile_is_full(struct rrdengine_instance *ctx, struct rrdengine_datafile *datafile) { bool ret = false; + spinlock_lock(&datafile->writers.spinlock); +#ifdef OS_WINDOWS + time_t now = now_realtime_sec(); + if (now - datafile->writers.last_sync_time > 60) { + nd_log_daemon(NDLP_INFO, "DBENGINE: datafile %d, last sync time: %ld, now: %ld", datafile->fileno, datafile->writers.last_sync_time, now); + sync_uv_file_data(datafile->file); + sync_uv_file_data(datafile->journalfile->file); + datafile->writers.last_sync_time = now_realtime_sec(); + } +#endif + if(datafile->pos > rrdeng_target_data_file_size(ctx)) ret = true; @@ -862,6 +873,12 @@ static struct rrdengine_datafile *get_datafile_to_write_extent(struct rrdengine_ // release the writers on the old datafile spinlock_lock(&old_datafile->writers.spinlock); old_datafile->writers.running--; +#ifdef OS_WINDOWS + sync_uv_file_data(old_datafile->file); + sync_uv_file_data(old_datafile->journalfile->file); + datafile->writers.last_sync_time = now_realtime_sec(); + old_datafile->writers.last_sync_time = now_realtime_sec(); +#endif spinlock_unlock(&old_datafile->writers.spinlock); }