diff --git a/src/libpmemobj/heap.c b/src/libpmemobj/heap.c index 2374e0c4debc476fde8db82fe188c9ac0fdf622b..1604bcf6746f9fbfb7988c687e411f34648d5724 100644 --- a/src/libpmemobj/heap.c +++ b/src/libpmemobj/heap.c @@ -616,7 +616,7 @@ heap_reclaim_run(struct palloc_heap *heap, struct memory_block *m, int startup) STATS_INC(heap->stats, transient, heap_run_active, m->size_idx * CHUNKSIZE); STATS_INC(heap->stats, transient, heap_run_allocated, - c->run.nallocs - e.free_space); + (c->run.nallocs - e.free_space) * run->hdr.block_size); } if (recycler_put(heap->rt->recyclers[c->id], m, e) < 0) diff --git a/src/test/obj_ctl_stats/obj_ctl_stats.c b/src/test/obj_ctl_stats/obj_ctl_stats.c index 7e443a190850adbe97e99df9d0bc410d55dbb95f..e613482fe9f1088c28e30bb9c854ae92710c101e 100644 --- a/src/test/obj_ctl_stats/obj_ctl_stats.c +++ b/src/test/obj_ctl_stats/obj_ctl_stats.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2019, Intel Corporation + * Copyright 2017-2020, Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -122,6 +122,29 @@ main(int argc, char *argv[]) UT_ASSERTeq(ret, 0); UT_ASSERTeq(tmp, run_allocated); /* shouldn't change */ + /* the deallocated object shouldn't be reflected in rebuilt stats */ + pmemobj_free(&oid); + + pmemobj_close(pop); + + pop = pmemobj_open(path, "ctl"); + UT_ASSERTne(pop, NULL); + + /* stats are rebuilt lazily, so initially this should be 0 */ + tmp = 0; + ret = pmemobj_ctl_get(pop, "stats.heap.run_allocated", &tmp); + UT_ASSERTeq(ret, 0); + UT_ASSERTeq(tmp, 0); + + ret = pmemobj_alloc(pop, NULL, 1, 0, NULL, NULL); + UT_ASSERTeq(ret, 0); + + /* after first alloc, the previously allocated object will be found */ + tmp = 0; + ret = pmemobj_ctl_get(pop, "stats.heap.run_allocated", &tmp); + UT_ASSERTeq(ret, 0); + UT_ASSERTeq(tmp, run_allocated + oid_size); + pmemobj_close(pop); DONE(NULL);