}
snapset.clones.push_back(coid.oid.snap);
+ snapset.clone_diffs[coid.oid.snap].swap(snapset.head_diffs);
at_version.version++;
}
t.write(info.pgid.to_coll(), poid, offset, length, nbl);
if (inc_lock) t.setattr(info.pgid.to_coll(), poid, "inc_lock", &inc_lock, sizeof(inc_lock));
snapset.head_exists = true;
- snapset.head_diffs.insert(offset, length);
+ interval_set<__u64> ch;
+ ch.insert(offset, length);
+ snapset.head_diffs.union_of(ch);
}
break;
{ // zero
t.zero(info.pgid.to_coll(), poid, offset, length);
if (inc_lock) t.setattr(info.pgid.to_coll(), poid, "inc_lock", &inc_lock, sizeof(inc_lock));
+ interval_set<__u64> ch;
+ ch.insert(offset, length);
+ snapset.head_diffs.union_of(ch);
}
break;
{ // truncate
t.truncate(info.pgid.to_coll(), poid, length);
if (inc_lock) t.setattr(info.pgid.to_coll(), poid, "inc_lock", &inc_lock, sizeof(inc_lock));
+ interval_set<__u64> keep;
+ keep.insert(0, length);
+ snapset.head_diffs.intersection_of(keep);
}
break;
case CEPH_OSD_OP_DELETE:
{ // delete
t.remove(info.pgid.to_coll(), poid);
+ snapset.head_diffs.clear();
}
break;
#include "msg/msg_types.h"
#include "include/types.h"
#include "include/pobject.h"
+#include "include/interval_set.h"
/* osdreqid_t - caller name + incarnation# + tid to unique identify this request
* use for metadata and osd ops.
// -------
+inline void encode(const interval_set<__u64>& s, bufferlist& bl) {
+ ::encode(s.m, bl);
+}
+inline void decode(interval_set<__u64>& s, bufferlist::iterator& bl) {
+ ::decode(s.m, bl);
+}
+
/*
* attached to object head. describes most recent snap context, and
* set of existing clones.
bool head_exists;
vector<snapid_t> snaps;
vector<snapid_t> clones;
+ interval_set<__u64> head_diffs; // subset of data that is "new"
+ map<snapid_t, interval_set<__u64> > clone_diffs; // diff to previous
SnapSet() : head_exists(false) {}
::encode(head_exists, bl);
::encode(snaps, bl);
::encode(clones, bl);
+ ::encode(head_diffs, bl);
+ ::encode(clone_diffs, bl);
}
void decode(bufferlist::iterator& bl) {
::decode(seq, bl);
::decode(head_exists, bl);
::decode(snaps, bl);
::decode(clones, bl);
+ ::decode(head_diffs, bl);
+ ::decode(clone_diffs, bl);
}
};
WRITE_CLASS_ENCODER(SnapSet)