If a user sends reference_chunk() to the original object
(not manifest object) which has not recovered snapshots,
the OSD triggers assert() because
reference_chunk() try to find adjacent unrecovered clones,
resulting in the assert().
This is because the original object does not wait the recovery
of snapshots.
To avoid this, this commit add a condition to check a base snapshot
is readable whether the object is manifest or not.
If the base snapshot is valid and the snapshot is manifest
, osd try to calculate reference count.
fixes: https://tracker.ceph.com/issues/54509
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
if (osdmap->in_removed_snaps_queue(info.pgid.pgid.pool(), *p)) {
return -EBUSY;
}
+ if (is_unreadable_object(clone_oid)) {
+ dout(10) << __func__ << ": " << clone_oid
+ << " is unreadable. Need to wait for recovery" << dendl;
+ wait_for_unreadable_object(clone_oid, op);
+ return -EAGAIN;
+ }
ObjectContextRef clone_obc = get_object_context(clone_oid, false);
if (!clone_obc) {
break;