[lvm-devel] master - cache: use same alg for cache size calc
Zdenek Kabelac
zkabelac at fedoraproject.org
Mon Oct 6 13:33:17 UTC 2014
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=f76f2ce1df4e95774b8fded602a8e35f8ae71fe1
Commit: f76f2ce1df4e95774b8fded602a8e35f8ae71fe1
Parent: d46c2f1c946e21393537a730eaa624665cb96bbc
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Mon Oct 6 12:22:03 2014 +0200
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Oct 6 15:18:06 2014 +0200
cache: use same alg for cache size calc
Use the same algorithm for cache metadata size as the cache tool is using.
---
lib/metadata/cache_manip.c | 26 +++++++++++++++++---------
1 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/lib/metadata/cache_manip.c b/lib/metadata/cache_manip.c
index ed08726..350a18e 100644
--- a/lib/metadata/cache_manip.c
+++ b/lib/metadata/cache_manip.c
@@ -22,6 +22,12 @@
#include "activate.h"
#include "defaults.h"
+/* https://github.com/jthornber/thin-provisioning-tools/blob/master/caching/cache_metadata_size.cc */
+#define DM_TRANSACTION_OVERHEAD 4096 /* KiB */
+#define DM_BYTES_PER_BLOCK 16 /* bytes */
+#define DM_HINT_OVERHEAD_PER_BLOCK 8 /* bytes */
+#define DM_MAX_HINT_WIDTH (4+16) /* bytes, TODO: configurable ?? */
+
const char *get_cachepool_cachemode_name(const struct lv_segment *seg)
{
if (seg->feature_flags & DM_CACHE_FEATURE_WRITEBACK)
@@ -39,6 +45,7 @@ int update_cache_pool_params(struct volume_group *vg, unsigned attr,
int *chunk_size_calc_method, uint32_t *chunk_size)
{
uint64_t min_meta_size;
+ uint32_t extent_size = vg->extent_size;
if (!(passed_args & PASS_ARG_CHUNK_SIZE))
*chunk_size = DEFAULT_CACHE_POOL_CHUNK_SIZE * 2;
@@ -59,15 +66,16 @@ int update_cache_pool_params(struct volume_group *vg, unsigned attr,
/*
* Default meta size is:
- * (4MiB + (16 Bytes for each chunk-sized block))
- * ... plus a good amount of padding (2x) to cover any
- * policy hint data that may be added in the future.
+ * (Overhead + mapping size + hint size)
*/
- min_meta_size = (uint64_t)data_extents * vg->extent_size * 16;
- min_meta_size /= *chunk_size; /* # of Bytes we need */
- min_meta_size *= 2; /* plus some padding */
- min_meta_size /= 512; /* in sectors */
- min_meta_size += 4*1024*2; /* plus 4MiB */
+ min_meta_size = (uint64_t) data_extents * extent_size / *chunk_size; /* nr_chunks */
+ min_meta_size *= (DM_BYTES_PER_BLOCK + DM_MAX_HINT_WIDTH + DM_HINT_OVERHEAD_PER_BLOCK);
+ min_meta_size = (min_meta_size + (SECTOR_SIZE - 1)) >> SECTOR_SHIFT; /* in sectors */
+ min_meta_size += DM_TRANSACTION_OVERHEAD * (1024 >> SECTOR_SHIFT);
+
+ /* Round up to extent size */
+ if (min_meta_size % extent_size)
+ min_meta_size += extent_size - min_meta_size % extent_size;
if (!*pool_metadata_size)
*pool_metadata_size = min_meta_size;
@@ -79,7 +87,7 @@ int update_cache_pool_params(struct volume_group *vg, unsigned attr,
display_size(vg->cmd, *pool_metadata_size));
} else if (*pool_metadata_size < min_meta_size) {
if (passed_args & PASS_ARG_POOL_METADATA_SIZE)
- log_warn("WARNING: Minimum supported pool metadata size is %s "
+ log_warn("WARNING: Minimum required pool metadata size is %s "
"(needs extra %s).",
display_size(vg->cmd, min_meta_size),
display_size(vg->cmd, min_meta_size - *pool_metadata_size));
More information about the lvm-devel
mailing list