CEPH_OSD_OP_INCLOCK_FAIL = 8, /* fail on inclock collision */
CEPH_OSD_OP_BALANCE_READS = 16,
CEPH_OSD_OP_ACKNVRAM = 32, /* ACK when stable in NVRAM, not RAM */
+ CEPH_OSD_OP_ORDERSNAP = 64, /* fail (EBADF) if snap ordering is incorrect */
};
struct ceph_osd_peer_stat {
#include "messages/MOSDPing.h"
#include "messages/MOSDFailure.h"
#include "messages/MOSDOp.h"
-#include "messages/MOSDOpReply.h"
#include "messages/MOSDSubOp.h"
#include "messages/MOSDSubOpReply.h"
#include "messages/MOSDBoot.h"
}
};
+void ReplicatedPG::reply_op_error(MOSDOp *op, int err)
+{
+ MOSDOpReply *reply = new MOSDOpReply(op, err, osd->osdmap->get_epoch(), true);
+ osd->messenger->send_message(reply, op->get_orig_source_inst());
+ delete op;
+}
void ReplicatedPG::op_modify(MOSDOp *op)
{
if (cur > op->get_inc_lock()) {
dout(10) << " inc_lock " << cur << " > " << op->get_inc_lock()
<< " on " << poid << dendl;
- MOSDOpReply *reply = new MOSDOpReply(op, -EINCLOCKED, osd->osdmap->get_epoch(), true);
- osd->messenger->send_message(reply, op->get_orig_source_inst());
- delete op;
+ reply_op_error(op, -EINCLOCKED);
return;
}
}
<< " snapset " << snapset
<< dendl;
+ // verify snap ordering
+ if ((op->get_flags() & CEPH_OSD_OP_ORDERSNAP) &&
+ snapc.seq < snapset.seq) {
+ dout(10) << " ORDERSNAP flag set and snapc seq " << snapc.seq << " < snapset seq " << snapset.seq
+ << " on " << poid << dendl;
+ reply_op_error(op, -EBADF);
+ return;
+ }
+
// are any peers missing this?
for (unsigned i=1; i<acting.size(); i++) {
int peer = acting[i];
bool do_recovery();
void do_peer_recovery();
+ void reply_op_error(MOSDOp *op, int r);
+
bool pick_read_snap(pobject_t& poid);
void op_read(MOSDOp *op);
void op_modify(MOSDOp *op);