@@ -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