Objecter::C_ObjectOperation_sparse_read throws/catches exceptions on -ENOENT
Running RBD small IO performance tests against a mostly sparse image shows that the Objecter is throwing/catching a buffer decode error. The object doesn't exist so the op failed with -ENOENT, but the sparse_read finisher is still run and attempts to decode an empty bufferlist. This results in a non-negligible amount of CPU being wasted on throwing and immediately catching an exception when instead the decode should never have been attempted since the object didn't exist.
- 14.21% Objecter::handle_osd_op_reply - 7.64% Context::complete - 6.83% ObjectOperation::C_ObjectOperation_sparse_read::finish - 6.15% ceph::buffer::list::iterator_impl<false>::copy - 5.94% __cxa_throw - 5.75% _Unwind_RaiseException