@cryptotaxi247 / netdata-1 / commits / 22277cc1b

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;