Skip to content

Commit 73d66a6

Browse files
committed
crimson/os/seastore/ObjectDataHandler: handle block not alinged input
Signed-off-by: Zhang Song <[email protected]>
1 parent b2d604e commit 73d66a6

File tree

2 files changed

+88
-52
lines changed

2 files changed

+88
-52
lines changed

src/crimson/os/seastore/object_data_handler.cc

Lines changed: 86 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -625,13 +625,16 @@ std::ostream& operator<<(
625625
* left_paddr right_paddr
626626
*/
627627
struct overwrite_plan_t {
628-
// addresses
628+
// reserved data base of object data
629+
laddr_t data_base;
630+
631+
// addresses about extents
629632
laddr_t pin_begin;
630633
laddr_t pin_end;
631634
paddr_t left_paddr;
632635
paddr_t right_paddr;
633-
laddr_t data_begin;
634-
laddr_t data_end;
636+
laddr_offset_t data_begin;
637+
laddr_offset_t data_end;
635638
laddr_t aligned_data_begin;
636639
laddr_t aligned_data_end;
637640

@@ -681,7 +684,8 @@ struct overwrite_plan_t {
681684
std::ostream& out,
682685
const overwrite_plan_t& overwrite_plan) {
683686
return out << "overwrite_plan_t("
684-
<< "pin_begin=" << overwrite_plan.pin_begin
687+
<< "data_base=" << overwrite_plan.data_base
688+
<< ", pin_begin=" << overwrite_plan.pin_begin
685689
<< ", pin_end=" << overwrite_plan.pin_end
686690
<< ", left_paddr=" << overwrite_plan.left_paddr
687691
<< ", right_paddr=" << overwrite_plan.right_paddr
@@ -697,18 +701,20 @@ struct overwrite_plan_t {
697701
<< ")";
698702
}
699703

700-
overwrite_plan_t(laddr_t offset,
704+
overwrite_plan_t(laddr_t data_base,
705+
objaddr_t offset,
701706
extent_len_t len,
702707
const lba_pin_list_t& pins,
703708
extent_len_t block_size) :
709+
data_base(data_base),
704710
pin_begin(pins.front()->get_key()),
705711
pin_end(pins.back()->get_key() + pins.back()->get_length()),
706712
left_paddr(pins.front()->get_val()),
707713
right_paddr(pins.back()->get_val()),
708-
data_begin(offset),
709-
data_end(offset + len),
710-
aligned_data_begin(data_begin.get_aligned_laddr(block_size)),
711-
aligned_data_end(data_end.get_roundup_laddr(block_size)),
714+
data_begin(data_base + offset),
715+
data_end(data_base + offset + len),
716+
aligned_data_begin(data_begin.get_aligned_laddr()),
717+
aligned_data_end(data_end.get_roundup_laddr()),
712718
left_operation(overwrite_operation_t::UNKNOWN),
713719
right_operation(overwrite_operation_t::UNKNOWN),
714720
block_size(block_size),
@@ -1076,14 +1082,14 @@ ObjectDataHandler::clear_ret ObjectDataHandler::trim_data_reservation(
10761082
extent_to_write_list_t(),
10771083
[ctx, size, &object_data, this](auto &pins, auto &to_write) {
10781084
LOG_PREFIX(ObjectDataHandler::trim_data_reservation);
1079-
DEBUGT("object_data: {}~{}",
1080-
ctx.t,
1081-
object_data.get_reserved_data_base(),
1082-
object_data.get_reserved_data_len());
1085+
auto data_base = object_data.get_reserved_data_base();
1086+
auto data_len = object_data.get_reserved_data_len();
1087+
DEBUGT("object_data: {}~{}", ctx.t, data_base, data_len);
1088+
laddr_t aligned_start = (data_base + size).get_aligned_laddr();
1089+
loffset_t aligned_length =
1090+
data_len - aligned_start.get_byte_distance<loffset_t>(data_base);
10831091
return ctx.tm.get_pins(
1084-
ctx.t,
1085-
object_data.get_reserved_data_base() + size,
1086-
object_data.get_reserved_data_len() - size
1092+
ctx.t, aligned_start, aligned_length
10871093
).si_then([ctx, size, &pins, &object_data, &to_write](auto _pins) {
10881094
_pins.swap(pins);
10891095
ceph_assert(pins.size());
@@ -1181,12 +1187,13 @@ ObjectDataHandler::clear_ret ObjectDataHandler::trim_data_reservation(
11811187
* optionally on the right.
11821188
*/
11831189
extent_to_write_list_t get_to_writes_with_zero_buffer(
1190+
laddr_t data_base,
11841191
const extent_len_t block_size,
1185-
laddr_t offset, extent_len_t len,
1192+
objaddr_t offset, extent_len_t len,
11861193
std::optional<bufferptr> &&headptr, std::optional<bufferptr> &&tailptr)
11871194
{
1188-
auto zero_left = offset.get_roundup_laddr(block_size);
1189-
auto zero_right = (offset + len).get_aligned_laddr(block_size);
1195+
auto zero_left = p2roundup(offset, (objaddr_t)block_size);
1196+
auto zero_right = p2align(offset + len, (objaddr_t)block_size);
11901197
auto left = headptr ? (offset - headptr->length()) : offset;
11911198
auto right = tailptr ?
11921199
(offset + len + tailptr->length()) :
@@ -1218,7 +1225,8 @@ extent_to_write_list_t get_to_writes_with_zero_buffer(
12181225
assert(bl.length() % block_size == 0);
12191226
assert(bl.length() == (right - left));
12201227
extent_to_write_list_t ret;
1221-
ret.push_back(extent_to_write_t::create_data(left, bl));
1228+
ret.push_back(extent_to_write_t::create_data(
1229+
(data_base + left).checked_to_laddr(), bl));
12221230
return ret;
12231231
} else {
12241232
// reserved section between ends, headptr and tailptr in different extents
@@ -1229,10 +1237,13 @@ extent_to_write_list_t get_to_writes_with_zero_buffer(
12291237
headbl.append_zero(zero_left - left - headbl.length());
12301238
assert(headbl.length() % block_size == 0);
12311239
assert(headbl.length() > 0);
1232-
ret.push_back(extent_to_write_t::create_data(left, headbl));
1240+
ret.push_back(extent_to_write_t::create_data(
1241+
(data_base + left).checked_to_laddr(), headbl));
12331242
}
12341243
// reserved zero region
1235-
ret.push_back(extent_to_write_t::create_zero(zero_left, zero_right - zero_left));
1244+
ret.push_back(extent_to_write_t::create_zero(
1245+
(data_base + zero_left).checked_to_laddr(),
1246+
zero_right - zero_left));
12361247
assert(ret.back().len % block_size == 0);
12371248
assert(ret.back().len > 0);
12381249
if (tailptr) {
@@ -1241,7 +1252,8 @@ extent_to_write_list_t get_to_writes_with_zero_buffer(
12411252
tailbl.append_zero(right - zero_right - tailbl.length());
12421253
assert(tailbl.length() % block_size == 0);
12431254
assert(tailbl.length() > 0);
1244-
ret.push_back(extent_to_write_t::create_data(zero_right, tailbl));
1255+
ret.push_back(extent_to_write_t::create_data(
1256+
(data_base + zero_right).checked_to_laddr(), tailbl));
12451257
}
12461258
return ret;
12471259
}
@@ -1263,19 +1275,20 @@ extent_to_write_list_t get_to_writes(laddr_t offset, bufferlist &bl)
12631275

12641276
ObjectDataHandler::write_ret ObjectDataHandler::overwrite(
12651277
context_t ctx,
1266-
laddr_t offset,
1278+
laddr_t data_base,
1279+
objaddr_t offset,
12671280
extent_len_t len,
12681281
std::optional<bufferlist> &&bl,
12691282
lba_pin_list_t &&_pins)
12701283
{
12711284
if (bl.has_value()) {
12721285
assert(bl->length() == len);
12731286
}
1274-
overwrite_plan_t overwrite_plan(offset, len, _pins, ctx.tm.get_block_size());
1287+
overwrite_plan_t overwrite_plan(data_base, offset, len, _pins, ctx.tm.get_block_size());
12751288
return seastar::do_with(
12761289
std::move(_pins),
12771290
extent_to_write_list_t(),
1278-
[ctx, len, offset, overwrite_plan, bl=std::move(bl), this]
1291+
[ctx, data_base, len, offset, overwrite_plan, bl=std::move(bl), this]
12791292
(auto &pins, auto &to_write) mutable
12801293
{
12811294
LOG_PREFIX(ObjectDataHandler::overwrite);
@@ -1290,7 +1303,7 @@ ObjectDataHandler::write_ret ObjectDataHandler::overwrite(
12901303
ctx,
12911304
pins.front(),
12921305
overwrite_plan
1293-
).si_then([ctx, len, offset, overwrite_plan, bl=std::move(bl),
1306+
).si_then([ctx, data_base, len, offset, overwrite_plan, bl=std::move(bl),
12941307
&to_write, &pins, this](auto p) mutable {
12951308
auto &[left_extent, headptr] = p;
12961309
if (left_extent) {
@@ -1304,7 +1317,7 @@ ObjectDataHandler::write_ret ObjectDataHandler::overwrite(
13041317
ctx,
13051318
pins.back(),
13061319
overwrite_plan
1307-
).si_then([ctx, len, offset,
1320+
).si_then([ctx, data_base, len, offset,
13081321
pin_begin=overwrite_plan.pin_begin,
13091322
pin_end=overwrite_plan.pin_end,
13101323
bl=std::move(bl), headptr=std::move(headptr),
@@ -1324,11 +1337,12 @@ ObjectDataHandler::write_ret ObjectDataHandler::overwrite(
13241337
}
13251338
splice_extent_to_write(
13261339
to_write,
1327-
get_to_writes(write_offset, write_bl));
1340+
get_to_writes((data_base + write_offset).checked_to_laddr(), write_bl));
13281341
} else {
13291342
splice_extent_to_write(
13301343
to_write,
13311344
get_to_writes_with_zero_buffer(
1345+
data_base,
13321346
ctx.tm.get_block_size(),
13331347
offset,
13341348
len,
@@ -1380,14 +1394,20 @@ ObjectDataHandler::zero_ret ObjectDataHandler::zero(
13801394
object_data,
13811395
p2roundup(offset + len, ctx.tm.get_block_size())
13821396
).si_then([this, ctx, offset, len, &object_data] {
1383-
auto logical_offset = object_data.get_reserved_data_base() + offset;
1397+
auto data_base = object_data.get_reserved_data_base();
1398+
laddr_offset_t l_start = data_base + offset;
1399+
laddr_offset_t l_end = l_start + len;
1400+
laddr_t aligned_start = l_start.get_aligned_laddr();
1401+
loffset_t aligned_length =
1402+
l_end.get_roundup_laddr().get_byte_distance<
1403+
loffset_t>(aligned_start);
13841404
return ctx.tm.get_pins(
13851405
ctx.t,
1386-
logical_offset,
1387-
len
1388-
).si_then([this, ctx, logical_offset, len](auto pins) {
1406+
aligned_start,
1407+
aligned_length
1408+
).si_then([this, ctx, data_base, offset, len](auto pins) {
13891409
return overwrite(
1390-
ctx, logical_offset, len,
1410+
ctx, data_base, offset, len,
13911411
std::nullopt, std::move(pins));
13921412
});
13931413
});
@@ -1415,15 +1435,21 @@ ObjectDataHandler::write_ret ObjectDataHandler::write(
14151435
object_data,
14161436
p2roundup(offset + bl.length(), ctx.tm.get_block_size())
14171437
).si_then([this, ctx, offset, &object_data, &bl] {
1418-
auto logical_offset = object_data.get_reserved_data_base() + offset;
1438+
auto data_base = object_data.get_reserved_data_base();
1439+
laddr_offset_t l_start = data_base + offset;
1440+
laddr_offset_t l_end = l_start + bl.length();
1441+
laddr_t aligned_start = l_start.get_aligned_laddr();
1442+
loffset_t aligned_length =
1443+
l_end.get_roundup_laddr().get_byte_distance<
1444+
loffset_t>(aligned_start);
14191445
return ctx.tm.get_pins(
14201446
ctx.t,
1421-
logical_offset,
1422-
bl.length()
1423-
).si_then([this, ctx,logical_offset, &bl](
1447+
aligned_start,
1448+
aligned_length
1449+
).si_then([this, ctx, offset, data_base, &bl](
14241450
auto pins) {
14251451
return overwrite(
1426-
ctx, logical_offset, bl.length(),
1452+
ctx, data_base, offset, bl.length(),
14271453
bufferlist(bl), std::move(pins));
14281454
});
14291455
});
@@ -1451,17 +1477,21 @@ ObjectDataHandler::read_ret ObjectDataHandler::read(
14511477
ceph_assert(!object_data.is_null());
14521478
ceph_assert((obj_offset + len) <= object_data.get_reserved_data_len());
14531479
ceph_assert(len > 0);
1454-
laddr_t l_start =
1480+
laddr_offset_t l_start =
14551481
object_data.get_reserved_data_base() + obj_offset;
1482+
laddr_offset_t l_end = l_start + len;
1483+
laddr_t aligned_start = l_start.get_aligned_laddr();
1484+
loffset_t aligned_length =
1485+
l_end.get_roundup_laddr().get_byte_distance<
1486+
loffset_t>(aligned_start);
14561487
return ctx.tm.get_pins(
14571488
ctx.t,
1458-
l_start,
1459-
len
1460-
).si_then([FNAME, ctx, l_start, len, &ret](auto _pins) {
1489+
aligned_start,
1490+
aligned_length
1491+
).si_then([FNAME, ctx, l_start, l_end, &ret](auto _pins) {
14611492
// offset~len falls within reserved region and len > 0
14621493
ceph_assert(_pins.size() >= 1);
14631494
ceph_assert((*_pins.begin())->get_key() <= l_start);
1464-
auto l_end = l_start + len;
14651495
return seastar::do_with(
14661496
std::move(_pins),
14671497
l_start,
@@ -1480,9 +1510,9 @@ ObjectDataHandler::read_ret ObjectDataHandler::read(
14801510
ceph_assert(l_current < l_end);
14811511
auto pin_len = pin->get_length();
14821512
assert(pin_len > 0);
1483-
laddr_t l_pin_end = pin_key + pin_len;
1513+
laddr_offset_t l_pin_end = pin_key + pin_len;
14841514
ceph_assert(l_current < l_pin_end);
1485-
laddr_t l_current_end = std::min(l_pin_end, l_end);
1515+
laddr_offset_t l_current_end = std::min(l_pin_end, l_end);
14861516
if (pin->get_val().is_zero()) {
14871517
DEBUGT("got {}~{} from zero-pin {}~{}",
14881518
ctx.t,
@@ -1584,19 +1614,24 @@ ObjectDataHandler::fiemap_ret ObjectDataHandler::fiemap(
15841614
ceph_assert(!object_data.is_null());
15851615
ceph_assert((obj_offset + len) <= object_data.get_reserved_data_len());
15861616
ceph_assert(len > 0);
1587-
laddr_t l_start =
1617+
laddr_offset_t l_start =
15881618
object_data.get_reserved_data_base() + obj_offset;
1619+
laddr_offset_t l_end = l_start + len;
1620+
laddr_t aligned_start = l_start.get_aligned_laddr();
1621+
loffset_t aligned_length =
1622+
l_end.get_roundup_laddr().get_byte_distance<
1623+
loffset_t>(aligned_start);
15891624
return ctx.tm.get_pins(
15901625
ctx.t,
1591-
l_start,
1592-
len
1626+
aligned_start,
1627+
aligned_length
15931628
).si_then([l_start, len, &object_data, &ret](auto &&pins) {
15941629
ceph_assert(pins.size() >= 1);
15951630
ceph_assert((*pins.begin())->get_key() <= l_start);
15961631
for (auto &&i: pins) {
15971632
if (!(i->get_val().is_zero())) {
1598-
auto ret_left = std::max(i->get_key(), l_start);
1599-
auto ret_right = std::min(
1633+
laddr_offset_t ret_left = std::max(laddr_offset_t(i->get_key(), 0), l_start);
1634+
laddr_offset_t ret_right = std::min(
16001635
i->get_key() + i->get_length(),
16011636
l_start + len);
16021637
assert(ret_right > ret_left);

src/crimson/os/seastore/object_data_handler.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,8 @@ class ObjectDataHandler {
229229
/// Updates region [_offset, _offset + bl.length) to bl
230230
write_ret overwrite(
231231
context_t ctx, ///< [in] ctx
232-
laddr_t offset, ///< [in] write offset
232+
laddr_t data_base, ///< [in] data base laddr
233+
objaddr_t offset, ///< [in] write offset
233234
extent_len_t len, ///< [in] len to write, len == bl->length() if bl
234235
std::optional<bufferlist> &&bl, ///< [in] buffer to write, empty for zeros
235236
lba_pin_list_t &&pins ///< [in] set of pins overlapping above region

0 commit comments

Comments
 (0)