Skip to content

Commit fda8b5a

Browse files
authored
Merge pull request ceph#55579 from idryomov/wip-64423
librbd: fix split() for SparseExtent and SparseBufferlistExtent Reviewed-by: Mykola Golub <[email protected]>
2 parents aface5a + 69c18cf commit fda8b5a

File tree

2 files changed

+150
-10
lines changed

2 files changed

+150
-10
lines changed

src/librbd/io/Types.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,9 @@ struct SparseExtent {
179179
std::ostream& operator<<(std::ostream& os, const SparseExtent& state);
180180

181181
struct SparseExtentSplitMerge {
182-
SparseExtent split(uint64_t offset, uint64_t length, SparseExtent &se) const {
183-
return SparseExtent(se.state, se.length);
182+
SparseExtent split(uint64_t offset, uint64_t length,
183+
const SparseExtent& se) const {
184+
return SparseExtent(se.state, length);
184185
}
185186

186187
bool can_merge(const SparseExtent& left, const SparseExtent& right) const {
@@ -231,10 +232,10 @@ struct SparseBufferlistExtent : public SparseExtent {
231232

232233
struct SparseBufferlistExtentSplitMerge {
233234
SparseBufferlistExtent split(uint64_t offset, uint64_t length,
234-
SparseBufferlistExtent& sbe) const {
235+
const SparseBufferlistExtent& sbe) const {
235236
ceph::bufferlist bl;
236237
if (sbe.state == SPARSE_EXTENT_STATE_DATA) {
237-
bl.substr_of(bl, offset, length);
238+
bl.substr_of(sbe.bl, offset, length);
238239
}
239240
return SparseBufferlistExtent(sbe.state, length, std::move(bl));
240241
}
@@ -246,14 +247,13 @@ struct SparseBufferlistExtentSplitMerge {
246247

247248
SparseBufferlistExtent merge(SparseBufferlistExtent&& left,
248249
SparseBufferlistExtent&& right) const {
250+
ceph::bufferlist bl;
249251
if (left.state == SPARSE_EXTENT_STATE_DATA) {
250-
ceph::bufferlist bl{std::move(left.bl)};
251-
bl.claim_append(std::move(right.bl));
252-
return SparseBufferlistExtent(SPARSE_EXTENT_STATE_DATA,
253-
bl.length(), std::move(bl));
254-
} else {
255-
return SparseBufferlistExtent(left.state, left.length + right.length, {});
252+
bl.claim_append(left.bl);
253+
bl.claim_append(right.bl);
256254
}
255+
return SparseBufferlistExtent(left.state, left.length + right.length,
256+
std::move(bl));
257257
}
258258

259259
uint64_t length(const SparseBufferlistExtent& sbe) const {

src/test/librbd/io/test_mock_ObjectRequest.cc

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2070,6 +2070,146 @@ TEST_F(TestMockIoObjectRequest, ListSnapsNoSnapsInSnapSet) {
20702070
EXPECT_EQ(expected_snapshot_delta, snapshot_delta);
20712071
}
20722072

2073+
TEST(SparseExtents, Split) {
2074+
SparseExtents extents;
2075+
extents.insert(50, 100, {SPARSE_EXTENT_STATE_DATA, 100});
2076+
extents.erase(80, 30);
2077+
extents.insert(45, 10, {SPARSE_EXTENT_STATE_ZEROED, 10});
2078+
extents.insert(140, 20, {SPARSE_EXTENT_STATE_DNE, 20});
2079+
extents.insert(125, 5, {SPARSE_EXTENT_STATE_ZEROED, 5});
2080+
2081+
SparseExtents expected_extents = {
2082+
{45, {10, {SPARSE_EXTENT_STATE_ZEROED, 10}}},
2083+
{55, {25, {SPARSE_EXTENT_STATE_DATA, 25}}},
2084+
{110, {15, {SPARSE_EXTENT_STATE_DATA, 15}}},
2085+
{125, {5, {SPARSE_EXTENT_STATE_ZEROED, 5}}},
2086+
{130, {10, {SPARSE_EXTENT_STATE_DATA, 10}}},
2087+
{140, {20, {SPARSE_EXTENT_STATE_DNE, 20}}}
2088+
};
2089+
EXPECT_EQ(expected_extents, extents);
2090+
}
2091+
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+
2111+
TEST(SparseBufferlist, Split) {
2112+
bufferlist bl;
2113+
bl.append(std::string(5, '1'));
2114+
bl.append(std::string(25, '2'));
2115+
bl.append(std::string(30, '3'));
2116+
bl.append(std::string(15, '4'));
2117+
bl.append(std::string(5, '5'));
2118+
bl.append(std::string(10, '6'));
2119+
bl.append(std::string(10, '7'));
2120+
bufferlist expected_bl1;
2121+
expected_bl1.append(std::string(25, '2'));
2122+
bufferlist expected_bl2;
2123+
expected_bl2.append(std::string(15, '4'));
2124+
bufferlist expected_bl3;
2125+
expected_bl3.append(std::string(10, '6'));
2126+
2127+
SparseBufferlist extents;
2128+
extents.insert(50, 100, {SPARSE_EXTENT_STATE_DATA, 100, std::move(bl)});
2129+
extents.erase(80, 30);
2130+
extents.insert(45, 10, {SPARSE_EXTENT_STATE_ZEROED, 10});
2131+
extents.insert(140, 20, {SPARSE_EXTENT_STATE_DNE, 20});
2132+
extents.insert(125, 5, {SPARSE_EXTENT_STATE_ZEROED, 5});
2133+
2134+
SparseBufferlist expected_extents = {
2135+
{45, {10, {SPARSE_EXTENT_STATE_ZEROED, 10}}},
2136+
{55, {25, {SPARSE_EXTENT_STATE_DATA, 25, std::move(expected_bl1)}}},
2137+
{110, {15, {SPARSE_EXTENT_STATE_DATA, 15, std::move(expected_bl2)}}},
2138+
{125, {5, {SPARSE_EXTENT_STATE_ZEROED, 5}}},
2139+
{130, {10, {SPARSE_EXTENT_STATE_DATA, 10, std::move(expected_bl3)}}},
2140+
{140, {20, {SPARSE_EXTENT_STATE_DNE, 20}}}
2141+
};
2142+
EXPECT_EQ(expected_extents, extents);
2143+
}
2144+
2145+
TEST(SparseBufferlist, SplitData) {
2146+
bufferlist bl1;
2147+
bl1.append(std::string(100, '1'));
2148+
bufferlist bl2;
2149+
bl2.append(std::string(15, '2'));
2150+
bufferlist bl3;
2151+
bl3.append(std::string(40, '3'));
2152+
bufferlist bl4;
2153+
bl4.append(std::string(10, '4'));
2154+
bufferlist expected_bl1 = bl2;
2155+
bufferlist expected_bl2;
2156+
expected_bl2.append(std::string(35, '1'));
2157+
bufferlist expected_bl3 = bl4;
2158+
bufferlist expected_bl4;
2159+
expected_bl4.append(std::string(30, '1'));
2160+
bufferlist expected_bl5;
2161+
expected_bl5.append(std::string(5, '3'));
2162+
bufferlist expected_bl6;
2163+
expected_bl6.append(std::string(15, '3'));
2164+
2165+
SparseBufferlist extents;
2166+
extents.insert(50, 100, {SPARSE_EXTENT_STATE_DATA, 100, std::move(bl1)});
2167+
extents.insert(40, 15, {SPARSE_EXTENT_STATE_DATA, 15, std::move(bl2)});
2168+
extents.insert(130, 40, {SPARSE_EXTENT_STATE_DATA, 40, std::move(bl3)});
2169+
extents.erase(135, 20);
2170+
extents.insert(90, 10, {SPARSE_EXTENT_STATE_DATA, 10, std::move(bl4)});
2171+
2172+
SparseBufferlist expected_extents = {
2173+
{40, {15, {SPARSE_EXTENT_STATE_DATA, 15, std::move(expected_bl1)}}},
2174+
{55, {35, {SPARSE_EXTENT_STATE_DATA, 35, std::move(expected_bl2)}}},
2175+
{90, {10, {SPARSE_EXTENT_STATE_DATA, 10, std::move(expected_bl3)}}},
2176+
{100, {30, {SPARSE_EXTENT_STATE_DATA, 30, std::move(expected_bl4)}}},
2177+
{130, {5, {SPARSE_EXTENT_STATE_DATA, 5, std::move(expected_bl5)}}},
2178+
{155, {15, {SPARSE_EXTENT_STATE_DATA, 15, std::move(expected_bl6)}}}
2179+
};
2180+
EXPECT_EQ(expected_extents, extents);
2181+
}
2182+
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+
20732213
} // namespace io
20742214
} // namespace librbd
20752215

0 commit comments

Comments
 (0)