void calc_snap_set_diff(CephContext *cct, const librados::snap_set_t& snap_set,
librados::snap_t start, librados::snap_t end,
interval_set<uint64_t> *diff, uint64_t *end_size,
- bool *end_exists, librados::snap_t *clone_end_snap_id)
+ bool *end_exists, librados::snap_t *clone_end_snap_id,
+ bool *whole_object)
{
ldout(cct, 10) << "calc_snap_set_diff start " << start << " end " << end
<< ", snap_set seq " << snap_set.seq << dendl;
*end_size = 0;
*end_exists = false;
*clone_end_snap_id = 0;
+ *whole_object = false;
for (vector<librados::clone_info_t>::const_iterator r = snap_set.clones.begin();
r != snap_set.clones.end();
// head is valid starting from right after the last seen seq
a = snap_set.seq + 1;
b = librados::SNAP_HEAD;
+ } else if (r->snaps.empty()) {
+ ldout(cct, 1) << "clone " << r->cloneid
+ << ": empty snaps, return whole object" << dendl;
+ *whole_object = true;
+ return;
} else {
a = r->snaps[0];
// note: b might be < r->cloneid if a snap has been trimmed.