summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-02-03 23:45:00 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2018-02-04 01:54:14 -0500
commitdc0dc2b43e358ca1c399170bb357b4e20b73b857 (patch)
tree4e9d57b8dcb3a89f7d9b6bc7267ca5e67dffc92f
parentde9413c0902ad902d2c3600b8cda21df0203cb0c (diff)
bcachefs: better threshold for compacting whiteouts
-rw-r--r--fs/bcachefs/btree_io.c13
-rw-r--r--fs/bcachefs/btree_io.h20
-rw-r--r--fs/bcachefs/btree_update_interior.h7
3 files changed, 20 insertions, 20 deletions
diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c
index 0babac37f162..ee636847a8e0 100644
--- a/fs/bcachefs/btree_io.c
+++ b/fs/bcachefs/btree_io.c
@@ -266,19 +266,16 @@ static unsigned should_compact_bset(struct btree *b, struct bset_tree *t,
bool compacting,
enum compact_mode mode)
{
- unsigned live_u64s = b->nr.bset_u64s[t - b->set];
unsigned bset_u64s = le16_to_cpu(bset(b, t)->u64s);
-
- if (live_u64s == bset_u64s)
- return 0;
+ unsigned dead_u64s = bset_u64s - b->nr.bset_u64s[t - b->set];
if (mode == COMPACT_LAZY) {
- if (live_u64s * 4 < bset_u64s * 3 ||
+ if (should_compact_bset_lazy(b, t) ||
(compacting && bset_unwritten(b, bset(b, t))))
- return bset_u64s - live_u64s;
+ return dead_u64s;
} else {
if (bset_written(b, bset(b, t)))
- return bset_u64s - live_u64s;
+ return dead_u64s;
}
return 0;
@@ -426,7 +423,7 @@ static bool bch2_drop_whiteouts(struct btree *b)
struct bset *i = bset(b, t);
struct bkey_packed *k, *n, *out, *start, *end;
- if (!should_compact_bset(b, t, true, true))
+ if (!should_compact_bset(b, t, true, COMPACT_WRITTEN))
continue;
start = btree_bkey_first(b, t);
diff --git a/fs/bcachefs/btree_io.h b/fs/bcachefs/btree_io.h
index 8c7e60dfa816..c0b5a0b637e1 100644
--- a/fs/bcachefs/btree_io.h
+++ b/fs/bcachefs/btree_io.h
@@ -57,21 +57,23 @@ enum compact_mode {
bool __bch2_compact_whiteouts(struct bch_fs *, struct btree *, enum compact_mode);
+static inline unsigned should_compact_bset_lazy(struct btree *b, struct bset_tree *t)
+{
+ unsigned bset_u64s = le16_to_cpu(bset(b, t)->u64s);
+ unsigned dead_u64s = bset_u64s - b->nr.bset_u64s[t - b->set];
+
+ return dead_u64s > 128 && dead_u64s * 3 > bset_u64s;
+}
+
static inline bool bch2_maybe_compact_whiteouts(struct bch_fs *c, struct btree *b)
{
struct bset_tree *t;
- for_each_bset(b, t) {
- unsigned live_u64s = b->nr.bset_u64s[t - b->set];
- unsigned bset_u64s = le16_to_cpu(bset(b, t)->u64s);
-
- if (live_u64s * 4 < bset_u64s * 3)
- goto compact;
- }
+ for_each_bset(b, t)
+ if (should_compact_bset_lazy(b, t))
+ return __bch2_compact_whiteouts(c, b, COMPACT_LAZY);
return false;
-compact:
- return __bch2_compact_whiteouts(c, b, COMPACT_LAZY);
}
void bch2_btree_sort_into(struct bch_fs *, struct btree *, struct btree *);
diff --git a/fs/bcachefs/btree_update_interior.h b/fs/bcachefs/btree_update_interior.h
index b90447430749..31a8f7f9cea6 100644
--- a/fs/bcachefs/btree_update_interior.h
+++ b/fs/bcachefs/btree_update_interior.h
@@ -221,16 +221,17 @@ static inline struct btree_node_entry *want_new_bset(struct bch_fs *c,
struct bset *i = btree_bset_last(b);
unsigned offset = max_t(unsigned, b->written << 9,
bset_byte_offset(b, vstruct_end(i)));
- ssize_t n = (ssize_t) btree_bytes(c) - (ssize_t)
+ ssize_t remaining_space = (ssize_t) btree_bytes(c) - (ssize_t)
(offset + sizeof(struct btree_node_entry) +
b->whiteout_u64s * sizeof(u64) +
b->uncompacted_whiteout_u64s * sizeof(u64));
EBUG_ON(offset > btree_bytes(c));
- if ((unlikely(bset_written(b, i)) && n > 0) ||
+ if ((unlikely(bset_written(b, i)) &&
+ remaining_space > block_bytes(c)) ||
(unlikely(vstruct_bytes(i) > btree_write_set_buffer(b)) &&
- n > btree_write_set_buffer(b)))
+ remaining_space > btree_write_set_buffer(b)))
return (void *) b->data + offset;
return NULL;