::decode(ino, p); // not used, currently.
::decode(snapid, p);
version++;
- pending_destroy[version] = snapid;
- dout(10) << "prepare v" << version << " destroy " << snapid << dendl;
// bump last_snap... we use it as a version value on the snaprealm.
- bl.clear();
++last_snap;
+
+ pending_destroy[version] = pair<snapid_t,snapid_t>(snapid, last_snap);
+ dout(10) << "prepare v" << version << " destroy " << snapid << " seq " << last_snap << dendl;
+
+ bl.clear();
::encode(last_snap, bl);
}
break;
}
else if (pending_destroy.count(tid)) {
- snapid_t sn = pending_destroy[tid];
- dout(7) << "commit " << tid << " destroy " << sn << dendl;
+ snapid_t sn = pending_destroy[tid].first;
+ snapid_t seq = pending_destroy[tid].second;
+ dout(7) << "commit " << tid << " destroy " << sn << " seq " << seq << dendl;
snaps.erase(sn);
for (vector<__u32>::const_iterator p = mds->mdsmap->get_data_pg_pools().begin();
p != mds->mdsmap->get_data_pg_pools().end();
- p++)
+ p++) {
need_to_purge[*p].insert(sn);
+ need_to_purge[*p].insert(seq);
+ }
pending_destroy.erase(tid);
}
map<int, set<snapid_t> > need_to_purge;
map<version_t, SnapInfo> pending_create;
- map<version_t, snapid_t> pending_destroy;
+ map<version_t, pair<snapid_t,snapid_t> > pending_destroy; // (removed_snap, seq)
set<version_t> pending_noop;
version_t last_checked_osdmap;
void reset_state();
void encode_server_state(bufferlist& bl) {
- __u8 v = 1;
+ __u8 v = 2;
::encode(v, bl);
::encode(last_snap, bl);
::encode(snaps, bl);
::decode(snaps, bl);
::decode(need_to_purge, bl);
::decode(pending_create, bl);
- ::decode(pending_destroy, bl);
+ if (v >= 2)
+ ::decode(pending_destroy, bl);
+ else {
+ map<version_t, snapid_t> t;
+ ::decode(t, bl);
+ for (map<version_t, snapid_t>::iterator p = t.begin(); p != t.end(); p++)
+ pending_destroy[p->first].first = p->second;
+ }
::decode(pending_noop, bl);
}