diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-02-03 23:45:00 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-02-04 01:54:14 -0500 |
commit | dc0dc2b43e358ca1c399170bb357b4e20b73b857 (patch) | |
tree | 4e9d57b8dcb3a89f7d9b6bc7267ca5e67dffc92f | |
parent | de9413c0902ad902d2c3600b8cda21df0203cb0c (diff) |
bcachefs: better threshold for compacting whiteouts
-rw-r--r-- | fs/bcachefs/btree_io.c | 13 | ||||
-rw-r--r-- | fs/bcachefs/btree_io.h | 20 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_interior.h | 7 |
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; |