diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2020-06-03 23:47:50 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:40 -0400 |
commit | 784d8d173d7aa68a32ea04c45bc8a038e4cfbc4e (patch) | |
tree | 7d463363f4e6fc9797ce3688dd9ae2c6abf9dc0b /fs | |
parent | 255adc515aeab4bd870e548bb4154c2682871c05 (diff) |
bcachefs: Improve warning for copygc failing to move data
This will help narrow down which code is at fault when this happens.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/bcachefs/move.c | 5 | ||||
-rw-r--r-- | fs/bcachefs/move_types.h | 1 | ||||
-rw-r--r-- | fs/bcachefs/movinggc.c | 17 |
3 files changed, 20 insertions, 3 deletions
diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c index 02cc5089a163..a061e60e3d7a 100644 --- a/fs/bcachefs/move.c +++ b/fs/bcachefs/move.c @@ -177,9 +177,12 @@ next: } continue; nomatch: - if (m->ctxt) + if (m->ctxt) { + BUG_ON(k.k->p.offset <= iter->pos.offset); + atomic64_inc(&m->ctxt->stats->keys_raced); atomic64_add(k.k->p.offset - iter->pos.offset, &m->ctxt->stats->sectors_raced); + } atomic_long_inc(&c->extent_migrate_raced); trace_move_race(&new->k); bch2_btree_iter_next_slot(iter); diff --git a/fs/bcachefs/move_types.h b/fs/bcachefs/move_types.h index 6788170d3f95..fc0de165af9f 100644 --- a/fs/bcachefs/move_types.h +++ b/fs/bcachefs/move_types.h @@ -8,6 +8,7 @@ struct bch_move_stats { struct bpos pos; atomic64_t keys_moved; + atomic64_t keys_raced; atomic64_t sectors_moved; atomic64_t sectors_seen; atomic64_t sectors_raced; diff --git a/fs/bcachefs/movinggc.c b/fs/bcachefs/movinggc.c index 7e08a7940a35..d22f26c02b67 100644 --- a/fs/bcachefs/movinggc.c +++ b/fs/bcachefs/movinggc.c @@ -78,7 +78,17 @@ static bool __copygc_pred(struct bch_dev *ca, ssize_t i = eytzinger0_find_le(h->data, h->used, sizeof(h->data[0]), bucket_offset_cmp, &search); +#if 0 + /* eytzinger search verify code: */ + ssize_t j = -1, k; + for (k = 0; k < h->used; k++) + if (h->data[k].offset <= ptr->offset && + (j < 0 || h->data[k].offset > h->data[j].offset)) + j = k; + + BUG_ON(i != j); +#endif return (i >= 0 && ptr->offset < h->data[i].offset + ca->mi.bucket_size && ptr->gen == h->data[i].gen); @@ -203,9 +213,12 @@ static void bch2_copygc(struct bch_fs *c, struct bch_dev *ca) if (sectors_not_moved && !ret) bch_warn_ratelimited(c, - "copygc finished but %llu/%llu sectors, %llu/%llu buckets not moved", + "copygc finished but %llu/%llu sectors, %llu/%llu buckets not moved (move stats: moved %llu sectors, raced %llu keys, %llu sectors)", sectors_not_moved, sectors_to_move, - buckets_not_moved, buckets_to_move); + buckets_not_moved, buckets_to_move, + atomic64_read(&move_stats.sectors_moved), + atomic64_read(&move_stats.keys_raced), + atomic64_read(&move_stats.sectors_raced)); trace_copygc(ca, atomic64_read(&move_stats.sectors_moved), sectors_not_moved, |