Add some item cache/range counters

Signed-off-by: Zach Brown <zab@versity.com>
This commit is contained in:
Zach Brown
2017-04-18 13:44:54 -07:00
parent 822ce205c5
commit 8a302609f2
2 changed files with 39 additions and 16 deletions
+8 -2
View File
@@ -22,10 +22,16 @@
EXPAND_COUNTER(compact_segment_moved) \
EXPAND_COUNTER(compact_segment_skipped) \
EXPAND_COUNTER(compact_segment_read) \
EXPAND_COUNTER(compact_segment_written)
EXPAND_COUNTER(compact_segment_written) \
EXPAND_COUNTER(item_create) \
EXPAND_COUNTER(item_lookup_hit) \
EXPAND_COUNTER(item_lookup_miss) \
EXPAND_COUNTER(item_range_hit) \
EXPAND_COUNTER(item_range_miss) \
EXPAND_COUNTER(item_range_insert)
#define FIRST_COUNTER alloc_alloc
#define LAST_COUNTER compact_segment_written
#define LAST_COUNTER item_range_insert
#undef EXPAND_COUNTER
#define EXPAND_COUNTER(which) struct percpu_counter which;
+31 -14
View File
@@ -22,6 +22,7 @@
#include "manifest.h"
#include "item.h"
#include "seg.h"
#include "counters.h"
#include "scoutfs_trace.h"
/*
@@ -102,12 +103,21 @@ static struct cached_item *walk_items(struct rb_root *root, struct kvec *key,
return NULL;
}
static struct cached_item *find_item(struct rb_root *root, struct kvec *key)
static struct cached_item *find_item(struct super_block *sb,
struct rb_root *root, struct kvec *key)
{
struct cached_item *prev;
struct cached_item *next;
struct cached_item *item;
return walk_items(root, key, &prev, &next);
item = walk_items(root, key, &prev, &next);
if (item)
scoutfs_inc_counter(sb, item_lookup_hit);
else
scoutfs_inc_counter(sb, item_lookup_miss);
return item;
}
static struct cached_item *next_item(struct rb_root *root, struct kvec *key)
@@ -252,8 +262,8 @@ static int insert_item(struct rb_root *root, struct cached_item *ins)
* instead in an uncached hole. end is set to the start of the next
* cached range.
*/
static bool check_range(struct rb_root *root, struct kvec *key,
struct kvec *end)
static bool check_range(struct super_block *sb, struct rb_root *root,
struct kvec *key, struct kvec *end)
{
struct rb_node *node = root->rb_node;
struct cached_range *next = NULL;
@@ -272,6 +282,7 @@ static bool check_range(struct rb_root *root, struct kvec *key,
node = node->rb_right;
} else {
scoutfs_kvec_memcpy_truncate(end, rng->end);
scoutfs_inc_counter(sb, item_range_hit);
return true;
}
}
@@ -281,6 +292,7 @@ static bool check_range(struct rb_root *root, struct kvec *key,
else
scoutfs_kvec_set_max_key(end);
scoutfs_inc_counter(sb, item_range_miss);
return false;
}
@@ -301,7 +313,8 @@ static void free_range(struct cached_range *rng)
* We're responsible for the ins allocation. We free it if we don't
* insert it in the tree.
*/
static void insert_range(struct rb_root *root, struct cached_range *ins)
static void insert_range(struct super_block *sb, struct rb_root *root,
struct cached_range *ins)
{
struct cached_range *rng;
struct rb_node *parent;
@@ -310,6 +323,8 @@ static void insert_range(struct rb_root *root, struct cached_range *ins)
int end_cmp;
int cmp;
scoutfs_inc_counter(sb, item_range_insert);
restart:
parent = NULL;
node = &root->rb_node;
@@ -379,10 +394,10 @@ int scoutfs_item_lookup(struct super_block *sb, struct kvec *key,
spin_lock_irqsave(&cac->lock, flags);
item = find_item(&cac->items, key);
item = find_item(sb, &cac->items, key);
if (item)
ret = scoutfs_kvec_memcpy(val, item->val);
else if (check_range(&cac->ranges, key, end))
else if (check_range(sb, &cac->ranges, key, end))
ret = -ENOENT;
else
ret = -ENODATA;
@@ -465,7 +480,7 @@ int scoutfs_item_next(struct super_block *sb, struct kvec *key,
scoutfs_kvec_init_key(range_end);
/* see if we have a usable item in cache and before last */
cached = check_range(&cac->ranges, key, range_end);
cached = check_range(sb, &cac->ranges, key, range_end);
if (cached && (item = next_item(&cac->items, key)) &&
scoutfs_kvec_memcmp(item->key, range_end) <= 0 &&
@@ -639,8 +654,10 @@ int scoutfs_item_create(struct super_block *sb, struct kvec *key,
spin_lock_irqsave(&cac->lock, flags);
ret = insert_item(&cac->items, item);
if (!ret)
if (!ret) {
scoutfs_inc_counter(sb, item_create);
mark_item_dirty(cac, item);
}
spin_unlock_irqrestore(&cac->lock, flags);
if (ret)
@@ -716,7 +733,7 @@ int scoutfs_item_insert_batch(struct super_block *sb, struct list_head *list,
spin_lock_irqsave(&cac->lock, flags);
insert_range(&cac->ranges, rng);
insert_range(sb, &cac->ranges, rng);
list_for_each_entry_safe(item, tmp, list, entry) {
list_del(&item->entry);
@@ -766,11 +783,11 @@ int scoutfs_item_dirty(struct super_block *sb, struct kvec *key)
spin_lock_irqsave(&cac->lock, flags);
item = find_item(&cac->items, key);
item = find_item(sb, &cac->items, key);
if (item) {
mark_item_dirty(cac, item);
ret = 0;
} else if (check_range(&cac->ranges, key, end)) {
} else if (check_range(sb, &cac->ranges, key, end)) {
ret = -ENOENT;
} else {
ret = -ENODATA;
@@ -821,13 +838,13 @@ int scoutfs_item_update(struct super_block *sb, struct kvec *key,
spin_lock_irqsave(&cac->lock, flags);
item = find_item(&cac->items, key);
item = find_item(sb, &cac->items, key);
if (item) {
clear_item_dirty(cac, item);
scoutfs_kvec_swap(up_val, item->val);
mark_item_dirty(cac, item);
ret = 0;
} else if (check_range(&cac->ranges, key, end)) {
} else if (check_range(sb, &cac->ranges, key, end)) {
ret = -ENOENT;
} else {
ret = -ENODATA;