// idempotent op(s)
list<pair<metareqid_t,uint64_t> > client_reqs;
+ list<pair<metareqid_t,uint64_t> > client_flushes;
public:
void encode(bufferlist& bl) const;
void add_client_req(metareqid_t r, uint64_t tid=0) {
client_reqs.push_back(pair<metareqid_t,uint64_t>(r, tid));
}
+ void add_client_flush(metareqid_t r, uint64_t tid=0) {
+ client_flushes.push_back(pair<metareqid_t,uint64_t>(r, tid));
+ }
void add_table_transaction(int table, version_t tid) {
table_tids.push_back(pair<__u8, version_t>(table, tid));
*/
void EMetaBlob::encode(bufferlist& bl) const
{
- ENCODE_START(7, 5, bl);
+ ENCODE_START(8, 5, bl);
::encode(lump_order, bl);
::encode(lump_map, bl);
::encode(roots, bl);
::encode(i, bl);
::encode(b, bl);
}
+ ::encode(client_flushes, bl);
ENCODE_FINISH(bl);
}
void EMetaBlob::decode(bufferlist::iterator &bl)
::decode(i, bl);
::decode(b, bl);
}
+ if (struct_v >= 8) {
+ ::decode(client_flushes, bl);
+ }
DECODE_FINISH(bl);
}
}
}
+ // client flushes
+ for (list<pair<metareqid_t, uint64_t> >::iterator p = client_flushes.begin();
+ p != client_flushes.end();
+ ++p) {
+ if (p->first.name.is_client()) {
+ dout(10) << "EMetaBlob.replay flush " << p->first << " trim_to " << p->second << dendl;
+ Session *session = mds->sessionmap.get_session(p->first.name);
+ if (session) {
+ session->add_completed_flush(p->first.tid);
+ if (p->second)
+ session->trim_completed_flushes(p->second);
+ }
+ }
+ }
+
// update segment
update_segment(logseg);