ceph_fsid_t fsid;
tid_t tid;
int replyCode;
- int epoch;
+ epoch_t epoch;
MPoolSnapReply() : Message(MSG_POOLSNAPREPLY) {}
return true;
}
-void OSDMonitor::_pool_snap(MPoolSnap *m, int replyCode, int epoch)
+void OSDMonitor::_pool_snap(MPoolSnap *m, int replyCode, epoch_t epoch)
{
MPoolSnapReply *reply = new MPoolSnapReply(m->fsid, m->tid, replyCode, epoch);
mon->messenger->send_message(reply, m->get_orig_source_inst());
bool preprocess_pool_snap ( class MPoolSnap *m);
bool prepare_pool_snap (MPoolSnap *m);
- void _pool_snap(MPoolSnap *m, int replyCode, int epoch);
+ void _pool_snap(MPoolSnap *m, int replyCode, epoch_t epoch);
struct C_Booted : public Context {
OSDMonitor *cmon;
kick_requests(changed_pgs);
}
- finish_contexts(waiting_for_map);
+ map<epoch_t,list<Context*> >::iterator p = waiting_for_map.begin();
+ while (p != waiting_for_map.end() &&
+ p->first <= osdmap->get_epoch()) {
+ finish_contexts(p->second);
+ waiting_for_map.erase(p++);
+ }
delete m;
}
SnapOp *op = op_snap[tid];
dout(10) << "have request " << tid << " at " << op << " Create: " << op->create << dendl;
*(op->replyCode) = m->replyCode;
- op->onfinish->finish(0);
- delete op->onfinish;
+ if (osdmap->get_epoch() < m->epoch)
+ wait_for_new_map(op->onfinish, m->epoch);
+ else {
+ op->onfinish->finish(0);
+ delete op->onfinish;
+ }
op_snap.erase(tid);
delete op;
} else {
map<tid_t,StatfsOp*> op_statfs;
map<tid_t,SnapOp*> op_snap;
- list<Context*> waiting_for_map;
+ map<epoch_t,list<Context*> > waiting_for_map;
/**
* track pending ops by pg
int get_client_incarnation() const { return client_inc; }
void set_client_incarnation(int inc) { client_inc = inc; }
- void wait_for_new_map(Context *c) {
- waiting_for_map.push_back(c);
+ void wait_for_new_map(Context *c, epoch_t epoch) {
+ waiting_for_map[epoch].push_back(c);
}
// mid-level helpers