| 221 | |
| 222 | template <typename I> |
| 223 | void ObjectReadRequest<I>::read_object() { |
| 224 | I *image_ctx = this->m_ictx; |
| 225 | |
| 226 | std::shared_lock image_locker{image_ctx->image_lock}; |
| 227 | auto read_snap_id = this->m_io_context->get_read_snap(); |
| 228 | if (read_snap_id == image_ctx->snap_id && |
| 229 | image_ctx->object_map != nullptr && |
| 230 | !image_ctx->object_map->object_may_exist(this->m_object_no)) { |
| 231 | image_ctx->asio_engine->post([this]() { read_parent(); }); |
| 232 | return; |
| 233 | } |
| 234 | image_locker.unlock(); |
| 235 | |
| 236 | ldout(image_ctx->cct, 20) << "snap_id=" << read_snap_id << dendl; |
| 237 | |
| 238 | neorados::ReadOp read_op; |
| 239 | for (auto& extent: *this->m_extents) { |
| 240 | if (extent.length >= image_ctx->sparse_read_threshold_bytes) { |
| 241 | read_op.sparse_read(extent.offset, extent.length, &extent.bl, |
| 242 | &extent.extent_map); |
| 243 | } else { |
| 244 | read_op.read(extent.offset, extent.length, &extent.bl); |
| 245 | } |
| 246 | } |
| 247 | util::apply_op_flags( |
| 248 | m_op_flags, image_ctx->get_read_flags(read_snap_id), &read_op); |
| 249 | |
| 250 | image_ctx->rados_api.execute( |
| 251 | {data_object_name(this->m_ictx, this->m_object_no)}, |
| 252 | *this->m_io_context, std::move(read_op), nullptr, |
| 253 | librbd::asio::util::get_callback_adapter( |
| 254 | [this](int r) { handle_read_object(r); }), m_version, |
| 255 | (this->m_trace.valid() ? this->m_trace.get_info() : nullptr)); |
| 256 | } |
| 257 | |
| 258 | template <typename I> |
| 259 | void ObjectReadRequest<I>::handle_read_object(int r) { |
nothing calls this directly
no test coverage detected