@cryptotaxi247 / netdata-1 / commits / 850d584d3

Remove pinned page reference (#13108)

* Disable reference to prev_descr as we do not keep two pages pinned * Remove extra pinned page from page cache calculations * Removed invalid comment * Remove unused variable

Stelios Fragkakis committed Jun 16, 2022 at 10:59 UTC 850d584d3b977935d83d317c6ed26d4cb02ce552
4 files changed +7 -40
daemon/global_statistics.c
+3 -10
@@ -796,7 +796,7 @@ static void dbengine_statistics_charts(void) {
796 static RRDDIM *rd_index_metadata = NULL;
797 static RRDDIM *rd_pages_metadata = NULL;
798
799 - collected_number cached_pages, pinned_pages, API_producers, populated_pages, cache_metadata, pages_on_disk,
799 + collected_number API_producers, populated_pages, cache_metadata, pages_on_disk,
800 page_cache_descriptors, index_metadata, pages_metadata;
801
802 if (unlikely(!st_ram_usage)) {
@@ -827,13 +827,6 @@ static void dbengine_statistics_charts(void) {
827 populated_pages = (collected_number)stats_array[3];
828 page_cache_descriptors = (collected_number)stats_array[27];
829
830 - if (API_producers * 2 > populated_pages) {
831 - pinned_pages = API_producers;
832 - } else {
833 - pinned_pages = API_producers * 2;
834 - }
835 - cached_pages = populated_pages - pinned_pages;
836 -
830 cache_metadata = page_cache_descriptors * sizeof(struct page_cache_descr);
831
832 pages_metadata = pages_on_disk * sizeof(struct rrdeng_page_descr);
@@ -841,8 +834,8 @@ static void dbengine_statistics_charts(void) {
834 /* This is an empirical estimation for Judy array indexing and extent structures */
835 index_metadata = pages_on_disk * 58;
836
844 - rrddim_set_by_pointer(st_ram_usage, rd_cached, cached_pages);
845 - rrddim_set_by_pointer(st_ram_usage, rd_pinned, pinned_pages);
837 + rrddim_set_by_pointer(st_ram_usage, rd_cached, populated_pages - API_producers);
838 + rrddim_set_by_pointer(st_ram_usage, rd_pinned, API_producers);
839 rrddim_set_by_pointer(st_ram_usage, rd_cache_metadata, cache_metadata);
840 rrddim_set_by_pointer(st_ram_usage, rd_pages_metadata, pages_metadata);
841 rrddim_set_by_pointer(st_ram_usage, rd_index_metadata, index_metadata);
database/engine/pagecache.c
+2 -4
@@ -238,8 +238,7 @@ static void pg_cache_release_pages(struct rrdengine_instance *ctx, unsigned numb
238 */
239 unsigned long pg_cache_hard_limit(struct rrdengine_instance *ctx)
240 {
241 - /* it's twice the number of producers since we pin 2 pages per producer */
242 - return ctx->max_cache_pages + 2 * (unsigned long)ctx->metric_API_max_producers;
241 + return ctx->max_cache_pages + (unsigned long)ctx->metric_API_max_producers;
242 }
243
244 /*
@@ -248,8 +247,7 @@ unsigned long pg_cache_hard_limit(struct rrdengine_instance *ctx)
247 */
248 unsigned long pg_cache_soft_limit(struct rrdengine_instance *ctx)
249 {
251 - /* it's twice the number of producers since we pin 2 pages per producer */
252 - return ctx->cache_pages_low_watermark + 2 * (unsigned long)ctx->metric_API_max_producers;
250 + return ctx->cache_pages_low_watermark + (unsigned long)ctx->metric_API_max_producers;
251 }
252
253 /*
database/engine/rrdengine.h
+1 -1
@@ -35,7 +35,7 @@ struct rrdengine_instance;
35 #define RRDENG_FILE_NUMBER_PRINT_TMPL "%1.1u-%10.10u"
36
37 struct rrdeng_collect_handle {
38 - struct rrdeng_page_descr *descr, *prev_descr;
38 + struct rrdeng_page_descr *descr;
39 unsigned long page_correlation_id;
40 struct rrdengine_instance *ctx;
41 // set to 1 when this dimension is not page aligned with the other dimensions in the chart
database/engine/rrdengineapi.c
+1 -25
@@ -131,7 +131,6 @@ void rrdeng_store_metric_init(RRDDIM *rd)
131 handle = callocz(1, sizeof(struct rrdeng_collect_handle));
132 handle->ctx = ctx;
133 handle->descr = NULL;
134 - handle->prev_descr = NULL;
134 handle->unaligned_page = 0;
135 rd->state->handle = (STORAGE_COLLECT_HANDLE *)handle;
136
@@ -177,10 +176,6 @@ void rrdeng_store_metric_flush_current_page(RRDDIM *rd)
176
177 rrd_stat_atomic_add(&ctx->stats.metric_API_producers, -1);
178
180 - if (handle->prev_descr) {
181 - /* unpin old second page */
182 - pg_cache_put(ctx, handle->prev_descr);
183 - }
179 page_is_empty = page_has_only_empty_metrics(descr);
180 if (page_is_empty) {
181 debug(D_RRDENGINE, "Page has empty metrics only, deleting:");
@@ -188,21 +183,8 @@ void rrdeng_store_metric_flush_current_page(RRDDIM *rd)
183 print_page_cache_descr(descr);
184 pg_cache_put(ctx, descr);
185 pg_cache_punch_hole(ctx, descr, 1, 0, NULL);
191 - handle->prev_descr = NULL;
192 - } else {
193 - /*
194 - * Disable pinning for now as it leads to deadlocks. When a collector stops collecting the extra pinned page
195 - * eventually gets rotated but it cannot be destroyed due to the extra reference.
196 - */
197 - /* added 1 extra reference to keep 2 dirty pages pinned per metric, expected refcnt = 2 */
198 -/* rrdeng_page_descr_mutex_lock(ctx, descr);
199 - ret = pg_cache_try_get_unsafe(descr, 0);
200 - rrdeng_page_descr_mutex_unlock(ctx, descr);
201 - fatal_assert(1 == ret);*/
202 -
186 + } else
187 rrdeng_commit_page(ctx, descr, handle->page_correlation_id);
204 - /* handle->prev_descr = descr;*/
205 - }
188 } else {
189 dbengine_page_free(descr->pg_cache_descr->page);
190 rrdeng_destroy_pg_cache_descr(ctx, descr->pg_cache_descr);
@@ -298,18 +280,12 @@ void rrdeng_store_metric_next(RRDDIM *rd, usec_t point_in_time, storage_number n
280 int rrdeng_store_metric_finalize(RRDDIM *rd)
281 {
282 struct rrdeng_collect_handle *handle;
301 - struct rrdengine_instance *ctx;
283 struct pg_cache_page_index *page_index;
284 uint8_t can_delete_metric = 0;
285
286 handle = (struct rrdeng_collect_handle *)rd->state->handle;
306 - ctx = handle->ctx;
287 page_index = rd->state->page_index;
288 rrdeng_store_metric_flush_current_page(rd);
309 - if (handle->prev_descr) {
310 - /* unpin old second page */
311 - pg_cache_put(ctx, handle->prev_descr);
312 - }
289 uv_rwlock_wrlock(&page_index->lock);
290 if (!--page_index->writers && !page_index->page_count) {
291 can_delete_metric = 1;