CephContext *cct = m_cct;
// merge per-snapshot deltas into an aggregate
- interval_map<uint64_t, io::SnapshotExtent, io::SnapshotExtentSplitMerge>
- aggregate_snapshot_extents;
+ io::SparseExtents aggregate_snapshot_extents;
for (auto& [key, snapshot_extents] : m_snapshot_delta) {
for (auto& snapshot_extent : snapshot_extents) {
auto state = snapshot_extent.get_val().state;
// ignore DNE object (and parent)
if (key == io::WriteReadSnapIds{0, 0} &&
- state != io::SNAPSHOT_EXTENT_STATE_DATA) {
+ state != io::SPARSE_EXTENT_STATE_DATA) {
continue;
}
<< "state=" << snapshot_extent.get_val().state << dendl;
diffs->emplace_back(
snapshot_extent.get_off(), snapshot_extent.get_len(),
- snapshot_extent.get_val().state == io::SNAPSHOT_EXTENT_STATE_DATA);
+ snapshot_extent.get_val().state == io::SPARSE_EXTENT_STATE_DATA);
}
}
};
for (auto& image_interval : image_intervals) {
auto state = image_interval.get_val().state;
switch (state) {
- case io::SNAPSHOT_EXTENT_STATE_DNE:
+ case io::SPARSE_EXTENT_STATE_DNE:
ceph_assert(write_read_snap_ids == io::INITIAL_WRITE_READ_SNAP_IDS);
if (read_from_parent) {
// special-case for DNE object-extents since when flattening we need
image_interval.get_off(), image_interval.get_len());
}
break;
- case io::SNAPSHOT_EXTENT_STATE_ZEROED:
+ case io::SPARSE_EXTENT_STATE_ZEROED:
only_dne_extents = false;
break;
- case io::SNAPSHOT_EXTENT_STATE_DATA:
+ case io::SPARSE_EXTENT_STATE_DATA:
ldout(m_cct, 20) << "read op: "
<< "snap_ids=" << write_read_snap_ids << " "
<< image_interval.get_off() << "~"
for (auto& image_interval : image_intervals) {
auto state = image_interval.get_val().state;
switch (state) {
- case io::SNAPSHOT_EXTENT_STATE_ZEROED:
+ case io::SPARSE_EXTENT_STATE_ZEROED:
if (write_read_snap_ids != io::WriteReadSnapIds{0, 0}) {
ldout(m_cct, 20) << "zeroed extent: "
<< "src_snap_seq=" << src_snap_seq << " "
image_interval.get_off(), image_interval.get_len());
}
break;
- case io::SNAPSHOT_EXTENT_STATE_DNE:
- case io::SNAPSHOT_EXTENT_STATE_DATA:
+ case io::SPARSE_EXTENT_STATE_DNE:
+ case io::SPARSE_EXTENT_STATE_DATA:
break;
default:
ceph_abort();
auto& intervals = (*image_snapshot_delta)[key];
auto& assembled_intervals = (*assembled_image_snapshot_delta)[key];
for (auto [image_offset, image_length] : image_extents) {
- SnapshotExtent snapshot_extent{object_extent.get_val().state,
- image_length};
- intervals.insert(image_offset, image_length, snapshot_extent);
+ SparseExtent sparse_extent{object_extent.get_val().state,
+ image_length};
+ intervals.insert(image_offset, image_length, sparse_extent);
assembled_intervals.insert(image_offset, image_length,
- snapshot_extent);
+ sparse_extent);
}
}
}
for (auto& interval : diff_interval) {
snapshot_delta[{end_snap_id, clone_end_snap_id}].insert(
interval.first, interval.second,
- SnapshotExtent(SNAPSHOT_EXTENT_STATE_DATA, interval.second));
+ SparseExtent(SPARSE_EXTENT_STATE_DATA, interval.second));
if (maybe_whiteout_detected) {
initial_written_extents.union_insert(interval.first,
interval.second);
for (auto& interval : zero_interval) {
snapshot_delta[{end_snap_id, end_snap_id}].insert(
interval.first, interval.second,
- SnapshotExtent(SNAPSHOT_EXTENT_STATE_ZEROED, interval.second));
+ SparseExtent(SPARSE_EXTENT_STATE_ZEROED, interval.second));
if (maybe_whiteout_detected) {
initial_written_extents.union_insert(interval.first,
interval.second);
<< dendl;
(*m_snapshot_delta)[INITIAL_WRITE_READ_SNAP_IDS].insert(
offset, length,
- SnapshotExtent(
- (dne ? SNAPSHOT_EXTENT_STATE_DNE : SNAPSHOT_EXTENT_STATE_ZEROED),
+ SparseExtent(
+ (dne ? SPARSE_EXTENT_STATE_DNE : SPARSE_EXTENT_STATE_ZEROED),
length));
}
}
const WriteReadSnapIds INITIAL_WRITE_READ_SNAP_IDS{0, 0};
-std::ostream& operator<<(std::ostream& os, SnapshotExtentState state) {
+std::ostream& operator<<(std::ostream& os, SparseExtentState state) {
switch (state) {
- case SNAPSHOT_EXTENT_STATE_ZEROED:
+ case SPARSE_EXTENT_STATE_DNE:
+ os << "dne";
+ break;
+ case SPARSE_EXTENT_STATE_ZEROED:
os << "zeroed";
break;
- case SNAPSHOT_EXTENT_STATE_DATA:
+ case SPARSE_EXTENT_STATE_DATA:
os << "data";
break;
default:
return os;
}
-std::ostream& operator<<(std::ostream& os, const SnapshotExtent& se) {
+std::ostream& operator<<(std::ostream& os, const SparseExtent& se) {
os << "["
<< "state=" << se.state << ", "
<< "length=" << se.length << "]";
LIST_SNAPS_FLAG_IGNORE_ZEROED_EXTENTS = 1UL << 2,
};
-enum SnapshotExtentState {
- SNAPSHOT_EXTENT_STATE_DNE, /* does not exist */
- SNAPSHOT_EXTENT_STATE_ZEROED,
- SNAPSHOT_EXTENT_STATE_DATA
+enum SparseExtentState {
+ SPARSE_EXTENT_STATE_DNE, /* does not exist */
+ SPARSE_EXTENT_STATE_ZEROED,
+ SPARSE_EXTENT_STATE_DATA
};
-std::ostream& operator<<(std::ostream& os, SnapshotExtentState state);
+std::ostream& operator<<(std::ostream& os, SparseExtentState state);
-struct SnapshotExtent {
- SnapshotExtentState state;
+struct SparseExtent {
+ SparseExtentState state;
size_t length;
- SnapshotExtent(SnapshotExtentState state, size_t length)
+ SparseExtent(SparseExtentState state, size_t length)
: state(state), length(length) {
}
- operator SnapshotExtentState() const {
+ operator SparseExtentState() const {
return state;
}
- bool operator==(const SnapshotExtent& rhs) const {
+ bool operator==(const SparseExtent& rhs) const {
return state == rhs.state && length == rhs.length;
}
};
-std::ostream& operator<<(std::ostream& os, const SnapshotExtent& state);
+std::ostream& operator<<(std::ostream& os, const SparseExtent& state);
-struct SnapshotExtentSplitMerge {
- SnapshotExtent split(uint64_t offset, uint64_t length,
- SnapshotExtent &se) const {
- return SnapshotExtent(se.state, se.length);
+struct SparseExtentSplitMerge {
+ SparseExtent split(uint64_t offset, uint64_t length, SparseExtent &se) const {
+ return SparseExtent(se.state, se.length);
}
- bool can_merge(const SnapshotExtent& left,
- const SnapshotExtent& right) const {
+ bool can_merge(const SparseExtent& left, const SparseExtent& right) const {
return left.state == right.state;
}
- SnapshotExtent merge(SnapshotExtent&& left, SnapshotExtent&& right) const {
- SnapshotExtent se(left);
+ SparseExtent merge(SparseExtent&& left, SparseExtent&& right) const {
+ SparseExtent se(left);
se.length += right.length;
return se;
}
- uint64_t length(const SnapshotExtent& se) const {
+ uint64_t length(const SparseExtent& se) const {
return se.length;
}
};
+typedef interval_map<uint64_t,
+ SparseExtent,
+ SparseExtentSplitMerge> SparseExtents;
+
typedef std::vector<uint64_t> SnapIds;
typedef std::pair<librados::snap_t, librados::snap_t> WriteReadSnapIds;
extern const WriteReadSnapIds INITIAL_WRITE_READ_SNAP_IDS;
-typedef std::map<WriteReadSnapIds,
- interval_map<uint64_t,
- SnapshotExtent,
- SnapshotExtentSplitMerge>> SnapshotDelta;
+typedef std::map<WriteReadSnapIds, SparseExtents> SnapshotDelta;
using striper::LightweightBufferExtents;
using striper::LightweightObjectExtent;
SnapshotDelta object_snapshot_delta;
object_snapshot_delta[{5,6}].insert(
- 0, 1024, {SNAPSHOT_EXTENT_STATE_DATA, 1024});
+ 0, 1024, {SPARSE_EXTENT_STATE_DATA, 1024});
object_snapshot_delta[{5,5}].insert(
- 4096, 4096, {SNAPSHOT_EXTENT_STATE_ZEROED, 4096});
+ 4096, 4096, {SPARSE_EXTENT_STATE_ZEROED, 4096});
expect_object_list_snaps_request(mock_image_ctx, 0, object_snapshot_delta, 0);
object_snapshot_delta = {};
object_snapshot_delta[{5,6}].insert(
- 1024, 3072, {SNAPSHOT_EXTENT_STATE_DATA, 3072});
+ 1024, 3072, {SPARSE_EXTENT_STATE_DATA, 3072});
object_snapshot_delta[{5,5}].insert(
- 2048, 2048, {SNAPSHOT_EXTENT_STATE_ZEROED, 2048});
+ 2048, 2048, {SPARSE_EXTENT_STATE_ZEROED, 2048});
expect_object_list_snaps_request(mock_image_ctx, 1, object_snapshot_delta, 0);
SnapshotDelta snapshot_delta;
SnapshotDelta expected_snapshot_delta;
expected_snapshot_delta[{5,6}].insert(
- 0, 1024, {SNAPSHOT_EXTENT_STATE_DATA, 1024});
+ 0, 1024, {SPARSE_EXTENT_STATE_DATA, 1024});
expected_snapshot_delta[{5,6}].insert(
- 5120, 3072, {SNAPSHOT_EXTENT_STATE_DATA, 3072});
+ 5120, 3072, {SPARSE_EXTENT_STATE_DATA, 3072});
expected_snapshot_delta[{5,5}].insert(
- 6144, 6144, {SNAPSHOT_EXTENT_STATE_ZEROED, 6144});
+ 6144, 6144, {SPARSE_EXTENT_STATE_ZEROED, 6144});
ASSERT_EQ(expected_snapshot_delta, snapshot_delta);
}
SnapshotDelta expected_snapshot_delta;
expected_snapshot_delta[{5,6}].insert(
- 440320, 1024, {SNAPSHOT_EXTENT_STATE_DATA, 1024});
+ 440320, 1024, {SPARSE_EXTENT_STATE_DATA, 1024});
expected_snapshot_delta[{5,6}].insert(
- 2122728, 1024, {SNAPSHOT_EXTENT_STATE_DATA, 1024});
+ 2122728, 1024, {SPARSE_EXTENT_STATE_DATA, 1024});
expected_snapshot_delta[{5,6}].insert(
- 2220032, 2048, {SNAPSHOT_EXTENT_STATE_DATA, 2048});
+ 2220032, 2048, {SPARSE_EXTENT_STATE_DATA, 2048});
expected_snapshot_delta[{7,CEPH_NOSNAP}].insert(
- 2122728, 1024, {SNAPSHOT_EXTENT_STATE_DATA, 1024});
+ 2122728, 1024, {SPARSE_EXTENT_STATE_DATA, 1024});
expected_snapshot_delta[{7,CEPH_NOSNAP}].insert(
- 2221056, 1024, {SNAPSHOT_EXTENT_STATE_DATA, 1024});
+ 2221056, 1024, {SPARSE_EXTENT_STATE_DATA, 1024});
expected_snapshot_delta[{7,CEPH_NOSNAP}].insert(
- 3072000, 4096, {SNAPSHOT_EXTENT_STATE_DATA, 4096});
+ 3072000, 4096, {SPARSE_EXTENT_STATE_DATA, 4096});
expected_snapshot_delta[{5,5}].insert(
- 3072000, 4096, {SNAPSHOT_EXTENT_STATE_ZEROED, 4096});
+ 3072000, 4096, {SPARSE_EXTENT_STATE_ZEROED, 4096});
ASSERT_EQ(expected_snapshot_delta, snapshot_delta);
}
SnapshotDelta expected_snapshot_delta;
expected_snapshot_delta[{0,0}].insert(
- 440320, 1024, {SNAPSHOT_EXTENT_STATE_DNE, 1024});
+ 440320, 1024, {SPARSE_EXTENT_STATE_DNE, 1024});
ASSERT_EQ(expected_snapshot_delta, snapshot_delta);
}
SnapshotDelta expected_snapshot_delta;
expected_snapshot_delta[{0,0}].insert(
- 440320, 1024, {SNAPSHOT_EXTENT_STATE_ZEROED, 1024});
+ 440320, 1024, {SPARSE_EXTENT_STATE_ZEROED, 1024});
ASSERT_EQ(expected_snapshot_delta, snapshot_delta);
}
MockImageListSnapsRequest mock_image_list_snaps_request;
SnapshotDelta image_snapshot_delta;
image_snapshot_delta[{1,6}].insert(
- 0, 1024, {SNAPSHOT_EXTENT_STATE_DATA, 1024});
+ 0, 1024, {SPARSE_EXTENT_STATE_DATA, 1024});
expect_image_list_snaps(mock_image_list_snaps_request,
{{0, 4096}}, image_snapshot_delta, 0);
SnapshotDelta expected_snapshot_delta;
expected_snapshot_delta[{0,0}].insert(
- 0, 1024, {SNAPSHOT_EXTENT_STATE_DATA, 1024});
+ 0, 1024, {SPARSE_EXTENT_STATE_DATA, 1024});
ASSERT_EQ(expected_snapshot_delta, snapshot_delta);
}
SnapshotDelta expected_snapshot_delta;
expected_snapshot_delta[{CEPH_NOSNAP,CEPH_NOSNAP}].insert(
0, mock_image_ctx.layout.object_size - 1,
- {SNAPSHOT_EXTENT_STATE_DATA, mock_image_ctx.layout.object_size - 1});
+ {SPARSE_EXTENT_STATE_DATA, mock_image_ctx.layout.object_size - 1});
ASSERT_EQ(expected_snapshot_delta, snapshot_delta);
}