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;