@@ -1383,17 +1383,43 @@ ObjectDataHandler::clear_ret ObjectDataHandler::clear(
13831383 });
13841384}
13851385
1386+ ObjectDataHandler::clone_ret
1387+ ObjectDataHandler::do_clone (
1388+ context_t ctx,
1389+ object_data_t &object_data,
1390+ object_data_t &d_object_data,
1391+ LBAMapping first_mapping,
1392+ bool updateref)
1393+ {
1394+ LOG_PREFIX (" ObjectDataHandler::do_clone" );
1395+ assert (d_object_data.is_null ());
1396+ auto old_base = object_data.get_reserved_data_base ();
1397+ auto old_len = object_data.get_reserved_data_len ();
1398+ auto mapping = co_await prepare_data_reservation (
1399+ ctx, d_object_data, old_len);
1400+ ceph_assert (mapping.has_value ());
1401+ DEBUGT (" new obj reserve_data_base: {}, len 0x{:x}" ,
1402+ ctx.t ,
1403+ d_object_data.get_reserved_data_base (),
1404+ d_object_data.get_reserved_data_len ());
1405+ auto pos = co_await ctx.tm .remove (ctx.t , std::move (*mapping)
1406+ ).handle_error_interruptible (
1407+ clone_iertr::pass_further{},
1408+ crimson::ct_error::assert_all{" unexpected enoent" }
1409+ );
1410+ auto base = d_object_data.get_reserved_data_base ();
1411+ auto len = d_object_data.get_reserved_data_len ();
1412+ auto cr_ret = co_await ctx.tm .clone_range (
1413+ ctx.t , old_base, base, 0 , len, std::move (pos),
1414+ std::move (first_mapping), updateref);
1415+ if (cr_ret.shared_direct_mapping ) {
1416+ ctx.onode .set_need_cow (ctx.t );
1417+ }
1418+ }
1419+
13861420ObjectDataHandler::clone_ret ObjectDataHandler::clone (
13871421 context_t ctx)
13881422{
1389- // the whole clone procedure can be seperated into the following steps:
1390- // 1. let clone onode(d_object_data) take the head onode's
1391- // object data base;
1392- // 2. reserve a new region in lba tree for the head onode;
1393- // 3. clone all extents of the clone onode, see transaction_manager.h
1394- // for the details of clone_pin;
1395- // 4. reserve the space between the head onode's size and its reservation
1396- // length.
13971423 return with_objects_data (
13981424 ctx,
13991425 [ctx, this ](auto &object_data, auto &d_object_data) {
@@ -1403,50 +1429,8 @@ ObjectDataHandler::clone_ret ObjectDataHandler::clone(
14031429 }
14041430 return ctx.tm .get_pin (ctx.t , object_data.get_reserved_data_base ()
14051431 ).si_then ([this , &object_data, &d_object_data, ctx](auto mapping) {
1406- auto old_base = object_data.get_reserved_data_base ();
1407- auto old_len = object_data.get_reserved_data_len ();
1408- return prepare_data_reservation (
1409- ctx,
1410- d_object_data,
1411- object_data.get_reserved_data_len ()
1412- ).si_then ([&object_data, &d_object_data, ctx](auto mapping) {
1413- assert (!object_data.is_null ());
1414- assert (mapping);
1415- LOG_PREFIX (ObjectDataHandler::clone);
1416- DEBUGT (" cloned obj reserve_data_base: {}, len 0x{:x}" ,
1417- ctx.t ,
1418- d_object_data.get_reserved_data_base (),
1419- d_object_data.get_reserved_data_len ());
1420- return ctx.tm .remove (ctx.t , std::move (*mapping));
1421- }).si_then ([mapping, &d_object_data, ctx](auto pos) mutable {
1422- auto base = d_object_data.get_reserved_data_base ();
1423- auto len = d_object_data.get_reserved_data_len ();
1424- return ctx.tm .clone_range (
1425- ctx.t , base, len, std::move (pos), std::move (mapping), true );
1426- }).si_then ([ctx, &object_data, &d_object_data, this ] {
1427- object_data.clear ();
1428- return prepare_data_reservation (
1429- ctx,
1430- object_data,
1431- d_object_data.get_reserved_data_len ()
1432- ).si_then ([ctx, &object_data](auto mapping) {
1433- LOG_PREFIX (" ObjectDataHandler::clone" );
1434- DEBUGT (" head obj reserve_data_base: {}, len 0x{:x}" ,
1435- ctx.t ,
1436- object_data.get_reserved_data_base (),
1437- object_data.get_reserved_data_len ());
1438- return ctx.tm .remove (ctx.t , std::move (*mapping));
1439- });
1440- }).si_then ([ctx, &object_data, mapping](auto pos) mutable {
1441- auto base = object_data.get_reserved_data_base ();
1442- auto len = object_data.get_reserved_data_len ();
1443- return ctx.tm .clone_range (
1444- ctx.t , base, len, std::move (pos), std::move (mapping), false );
1445- }).si_then ([ctx, mapping, old_base, old_len] {
1446- return ctx.tm .remove_mappings_in_range (
1447- ctx.t , old_base, old_len, std::move (mapping), {false , true }
1448- ).discard_result ();
1449- });
1432+ ceph_assert (ctx.d_onode );
1433+ return do_clone (ctx, object_data, d_object_data, std::move (mapping), true );
14501434 }).handle_error_interruptible (
14511435 clone_iertr::pass_further{},
14521436 crimson::ct_error::assert_all{" unexpected enoent" }
0 commit comments