Skip to content

Commit 69c18cf

Browse files
committed
librbd: refactor merge() for SparseBufferlistExtent
- pass left.length + right.length instead of bl.length() for consistency and to avoid circumventing the assert in SparseBufferlistExtent constructor - claim_append() takes an lvalue reference, no need to move - follow the pattern used in split() Signed-off-by: Ilya Dryomov <[email protected]>
1 parent 746cb28 commit 69c18cf

File tree

2 files changed

+54
-6
lines changed

2 files changed

+54
-6
lines changed

src/librbd/io/Types.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -247,14 +247,13 @@ struct SparseBufferlistExtentSplitMerge {
247247

248248
SparseBufferlistExtent merge(SparseBufferlistExtent&& left,
249249
SparseBufferlistExtent&& right) const {
250+
ceph::bufferlist bl;
250251
if (left.state == SPARSE_EXTENT_STATE_DATA) {
251-
ceph::bufferlist bl{std::move(left.bl)};
252-
bl.claim_append(std::move(right.bl));
253-
return SparseBufferlistExtent(SPARSE_EXTENT_STATE_DATA,
254-
bl.length(), std::move(bl));
255-
} else {
256-
return SparseBufferlistExtent(left.state, left.length + right.length, {});
252+
bl.claim_append(left.bl);
253+
bl.claim_append(right.bl);
257254
}
255+
return SparseBufferlistExtent(left.state, left.length + right.length,
256+
std::move(bl));
258257
}
259258

260259
uint64_t length(const SparseBufferlistExtent& sbe) const {

src/test/librbd/io/test_mock_ObjectRequest.cc

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2089,6 +2089,25 @@ TEST(SparseExtents, Split) {
20892089
EXPECT_EQ(expected_extents, extents);
20902090
}
20912091

2092+
TEST(SparseExtents, Merge) {
2093+
SparseExtents extents;
2094+
extents.insert(50, 100, {SPARSE_EXTENT_STATE_DATA, 100});
2095+
extents.insert(30, 15, {SPARSE_EXTENT_STATE_ZEROED, 15});
2096+
extents.insert(45, 10, {SPARSE_EXTENT_STATE_DATA, 10});
2097+
extents.insert(200, 40, {SPARSE_EXTENT_STATE_DNE, 40});
2098+
extents.insert(160, 25, {SPARSE_EXTENT_STATE_DNE, 25});
2099+
extents.insert(140, 20, {SPARSE_EXTENT_STATE_DATA, 20});
2100+
extents.insert(25, 5, {SPARSE_EXTENT_STATE_ZEROED, 5});
2101+
extents.insert(185, 15, {SPARSE_EXTENT_STATE_DNE, 15});
2102+
2103+
SparseExtents expected_extents = {
2104+
{25, {20, {SPARSE_EXTENT_STATE_ZEROED, 20}}},
2105+
{45, {115, {SPARSE_EXTENT_STATE_DATA, 115}}},
2106+
{160, {80, {SPARSE_EXTENT_STATE_DNE, 80}}}
2107+
};
2108+
EXPECT_EQ(expected_extents, extents);
2109+
}
2110+
20922111
TEST(SparseBufferlist, Split) {
20932112
bufferlist bl;
20942113
bl.append(std::string(5, '1'));
@@ -2161,6 +2180,36 @@ TEST(SparseBufferlist, SplitData) {
21612180
EXPECT_EQ(expected_extents, extents);
21622181
}
21632182

2183+
TEST(SparseBufferlist, Merge) {
2184+
bufferlist bl1;
2185+
bl1.append(std::string(100, '1'));
2186+
bufferlist bl2;
2187+
bl2.append(std::string(10, '2'));
2188+
bufferlist bl3;
2189+
bl3.append(std::string(20, '3'));
2190+
bufferlist expected_bl;
2191+
expected_bl.append(std::string(10, '2'));
2192+
expected_bl.append(std::string(85, '1'));
2193+
expected_bl.append(std::string(20, '3'));
2194+
2195+
SparseBufferlist extents;
2196+
extents.insert(50, 100, {SPARSE_EXTENT_STATE_DATA, 100, std::move(bl1)});
2197+
extents.insert(30, 15, {SPARSE_EXTENT_STATE_ZEROED, 15});
2198+
extents.insert(45, 10, {SPARSE_EXTENT_STATE_DATA, 10, std::move(bl2)});
2199+
extents.insert(200, 40, {SPARSE_EXTENT_STATE_DNE, 40});
2200+
extents.insert(160, 25, {SPARSE_EXTENT_STATE_DNE, 25});
2201+
extents.insert(140, 20, {SPARSE_EXTENT_STATE_DATA, 20, std::move(bl3)});
2202+
extents.insert(25, 5, {SPARSE_EXTENT_STATE_ZEROED, 5});
2203+
extents.insert(185, 15, {SPARSE_EXTENT_STATE_DNE, 15});
2204+
2205+
SparseBufferlist expected_extents = {
2206+
{25, {20, {SPARSE_EXTENT_STATE_ZEROED, 20}}},
2207+
{45, {115, {SPARSE_EXTENT_STATE_DATA, 115, std::move(expected_bl)}}},
2208+
{160, {80, {SPARSE_EXTENT_STATE_DNE, 80}}}
2209+
};
2210+
EXPECT_EQ(expected_extents, extents);
2211+
}
2212+
21642213
} // namespace io
21652214
} // namespace librbd
21662215

0 commit comments

Comments
 (0)