From: Sage Weil Date: Thu, 9 Sep 2021 13:06:19 +0000 (-0500) Subject: os/bluestore: report mismatch write pointer during fsck X-Git-Tag: v17.1.0~535^2~32 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d492fbf775ca02005389fc48158773bd52747dfb;p=ceph.git os/bluestore: report mismatch write pointer during fsck Signed-off-by: Sage Weil --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 32f86bedc3d62..8899981b85114 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -5606,8 +5606,7 @@ int BlueStore::_init_alloc(std::map *zone_adjustments) derr << __func__ << " zone 0x" << std::hex << i << " bluestore write pointer 0x" << zones[i].write_pointer << " > device write pointer 0x" << p - << std::dec << dendl; - ceph_abort("bad write pointer"); + << std::dec << " -- VERY SUSPICIOUS!" << dendl; } else if (zones[i].write_pointer < p) { // this is "normal" in that it can happen after any crash (if we have a // write in flight but did not manage to commit the transaction) @@ -8720,6 +8719,30 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair) dout(1) << __func__ << " debug abort" << dendl; goto out_scan; } + +#ifdef HAVE_LIBZBD + if (bdev->is_smr()) { + auto a = dynamic_cast(shared_alloc.a); + ceph_assert(a); + auto f = dynamic_cast(fm); + ceph_assert(f); + vector wp = bdev->get_zones(); + vector zones = f->get_zone_states(db); + ceph_assert(wp.size() == zones.size()); + auto num_zones = bdev->get_size() / zone_size; + for (unsigned i = first_sequential_zone; i < num_zones; ++i) { + uint64_t p = wp[i] == (i + 1) * zone_size ? zone_size : wp[i] % zone_size; + if (zones[i].write_pointer > p) { + derr << "fsck error: zone 0x" << std::hex << i + << " bluestore write pointer 0x" << zones[i].write_pointer + << " > device write pointer 0x" << p + << std::dec << dendl; + ++errors; + } + } + } +#endif + // walk PREFIX_OBJ { dout(1) << __func__ << " walking object keyspace" << dendl;