| 385 | } |
| 386 | |
| 387 | void ECBackend::handle_sub_write( |
| 388 | pg_shard_t from, |
| 389 | OpRequestRef msg, |
| 390 | ECSubWrite &op, |
| 391 | const ZTracer::Trace &trace, |
| 392 | ECListener &) { |
| 393 | if (msg) { |
| 394 | msg->mark_event("sub_op_started"); |
| 395 | } |
| 396 | trace.event("handle_sub_write"); |
| 397 | |
| 398 | if (cct->_conf->bluestore_debug_inject_read_err && |
| 399 | ECInject::test_write_error3(op.soid)) { |
| 400 | ceph_abort_msg("Error inject - OSD down"); |
| 401 | } |
| 402 | if (!get_parent()->pgb_is_primary()) |
| 403 | get_parent()->update_stats(op.stats); |
| 404 | ObjectStore::Transaction localt; |
| 405 | if (!op.temp_added.empty()) { |
| 406 | switcher->add_temp_objs(op.temp_added); |
| 407 | } |
| 408 | if (op.backfill_or_async_recovery) { |
| 409 | for (set<hobject_t>::iterator i = op.temp_removed.begin(); |
| 410 | i != op.temp_removed.end(); |
| 411 | ++i) { |
| 412 | dout(10) << __func__ << ": removing object " << *i |
| 413 | << " since we won't get the transaction" << dendl; |
| 414 | localt.remove( |
| 415 | switcher->coll, |
| 416 | ghobject_t( |
| 417 | *i, |
| 418 | ghobject_t::NO_GEN, |
| 419 | get_parent()->whoami_shard().shard)); |
| 420 | } |
| 421 | } |
| 422 | switcher->clear_temp_objs(op.temp_removed); |
| 423 | dout(30) << __func__ << " missing before " << |
| 424 | get_parent()->get_log().get_missing().get_items() << dendl; |
| 425 | |
| 426 | // Update EC omap journal on non-primary shards from log entries |
| 427 | // This ensures the journal has the correct generation info when transactions are applied |
| 428 | if (get_parent()->get_pool().supports_omap()) { |
| 429 | for (auto &&e: op.log_entries) { |
| 430 | if (e.is_delete() || e.is_lost_delete() || e.is_replace() || (e.is_clone() && !e.soid.is_snap())) { |
| 431 | if (!op.backfill_or_async_recovery) { |
| 432 | ec_omap_journal.append_delete(e.soid, e.version.version, e.is_lost_delete()); |
| 433 | dout(20) << __func__ << " appending delete to journal: " |
| 434 | << (e.is_clone() ? "clone" : "delete") |
| 435 | << " " << e.soid << " version=" << e.version.version |
| 436 | << " lost_delete=" << e.is_lost_delete() << dendl; |
| 437 | } else { |
| 438 | dout(20) << __func__ << " skipping journal append_delete during backfill/recovery: " |
| 439 | << (e.is_clone() ? "clone" : "delete") |
| 440 | << " " << e.soid << " version=" << e.version.version |
| 441 | << " lost_delete=" << e.is_lost_delete() << dendl; |
| 442 | } |
| 443 | } |
| 444 | } |
nothing calls this directly
no test coverage detected