Improve datafile indexing (#20607)
* Set users available false only when file can be deleted * Retry to acquire datafile for INDEXING before moving to next
Stelios Fragkakis committed
Jul 1, 2025 at 10:41 UTC
22277cc1b35bd021a61108a71f009345cc7e8951
2 files changed
+21
-8
src/database/engine/datafile.c
+10
-6
@@ -73,11 +73,11 @@ bool datafile_acquire_for_deletion(struct rrdengine_datafile *df, bool is_shutdo
73
bool can_be_deleted = false;
74
75
spinlock_lock(&df->users.spinlock);
76
- df->users.available = false;
76
78
- if(!df->users.lockers)
77
+ if(!df->users.lockers) {
78
can_be_deleted = true;
80
-
79
+ df->users.available = false;
80
+ }
81
else {
82
// there are lockers
83
@@ -86,9 +86,10 @@ bool datafile_acquire_for_deletion(struct rrdengine_datafile *df, bool is_shutdo
86
pgc_open_evict_clean_pages_of_datafile(open_cache, df);
87
spinlock_lock(&df->users.spinlock);
88
89
- if(!df->users.lockers)
89
+ if(!df->users.lockers) {
90
can_be_deleted = true;
91
-
91
+ df->users.available = false;
92
+ }
93
else {
94
// there are lockers still
95
@@ -100,8 +101,10 @@ bool datafile_acquire_for_deletion(struct rrdengine_datafile *df, bool is_shutdo
101
time_to_scan_ut = now_monotonic_usec() - time_to_scan_ut;
102
spinlock_lock(&df->users.spinlock);
103
103
- if(!df->users.lockers)
104
+ if(!df->users.lockers) {
105
can_be_deleted = true;
106
+ df->users.available = false;
107
+ }
108
109
else if(!clean_pages_in_open_cache && !hot_pages_in_open_cache) {
110
// no pages in the open cache related to this datafile
@@ -128,6 +131,7 @@ bool datafile_acquire_for_deletion(struct rrdengine_datafile *df, bool is_shutdo
131
else if(now_s > df->users.time_to_evict) {
132
// time expired, lets remove it
133
can_be_deleted = true;
134
+ df->users.available = false;
135
internal_error(true, "DBENGINE: datafile %u of tier %d is not used by any open cache pages, "
136
"but it has %u lockers (oc:%u, pd:%u), "
137
"%zu clean and %zu hot open cache pages "
src/database/engine/rrdengine.c
+11
-2
@@ -1780,12 +1780,21 @@ static struct rrdengine_datafile *release_and_aquire_next_datafile_for_indexing(
1780
datafile = datafile->next;
1781
continue;
1782
}
1783
- bool locked = datafile_acquire(datafile, DATAFILE_ACQUIRE_INDEXING);
1783
+
1784
+ int retries = 5;
1785
+ bool locked = false;
1786
+ while (retries-- > 0) {
1787
+ locked = datafile_acquire(datafile, DATAFILE_ACQUIRE_INDEXING);
1788
+ if (locked)
1789
+ break;
1790
+ sleep_usec(200 * USEC_PER_MS);
1791
+ }
1792
if (locked) {
1793
uv_rwlock_rdunlock(&ctx->datafiles.rwlock);
1794
return datafile;
1795
}
1788
- nd_log_daemon(NDLP_INFO, "DBENGINE: Datafile %u CANNOT be locked for indexing; skipping", datafile->fileno);
1796
+ nd_log_daemon(NDLP_INFO, "DBENGINE: Datafile %u CANNOT be locked for indexing after retries; skipping", datafile->fileno);
1797
+ datafile = datafile->next;
1798
}
1799
uv_rwlock_rdunlock(&ctx->datafiles.rwlock);
1800
return NULL;