unsafe_sync_write++;
in->get_cap_ref(CEPH_CAP_WRBUFFER);
+ // hack
+ if (1) {
+ static int a = 0;
+ in->snaprealm->snaps.insert(in->snaprealm->snaps.begin(), ++a);
+ in->snaprealm->snaps.insert(in->snaprealm->snaps.begin(), ++a);
+ dout(10) << "snaps now " << in->snaprealm->snaps << dendl;
+ }
+
filer->write(in->inode.ino, &in->inode.layout,
CEPH_NOSNAP,
in->snaprealm->snaps,
tid_t rep_tid;
eversion_t version;
uint32_t inc_lock;
+
snapid_t follows_snap;
vector<snapid_t> snaps;
out << "osd_sub_op(" << reqid
<< " " << MOSDOp::get_opname(op)
<< " " << poid
- << " av" << version;
+ << " v " << version
+ << " follows_snap=" << follows_snap << " snaps=" << snaps;
if (length) out << " " << offset << "~" << length;
out << ")";
}
unsigned l;
for (l=1; l<snaps.size() && snaps[l] > follows_snap; l++) ;
- vector<snapid_t> csnaps;
- csnaps.insert(snaps.begin(), l);
+ vector<snapid_t> csnaps(l);
+ for (unsigned i=0; i<l; i++)
+ csnaps[i] = snaps[i];
// log clone
dout(10) << "cloning to " << coid << " v " << at_version << " csnaps=" << csnaps << dendl;
Log::Entry cloneentry(PG::Log::Entry::CLONE, coid.oid, at_version, reqid);
- log.add(cloneentry);
dout(10) << "prepare_transaction " << cloneentry << dendl;
log.add(cloneentry);
assert(log.top == at_version);
osd->messenger->send_message(wr, osd->osdmap->get_inst(dest));
}
-ReplicatedPG::RepGather *ReplicatedPG::new_rep_gather(MOSDOp *op, tid_t rep_tid, eversion_t nv)
+ReplicatedPG::RepGather *ReplicatedPG::new_rep_gather(MOSDOp *op, tid_t rep_tid, eversion_t nv,
+ snapid_t follows_snap, vector<snapid_t> &snaps)
{
dout(10) << "new_rep_gather rep_tid " << rep_tid << " on " << *op << dendl;
- RepGather *repop = new RepGather(op, rep_tid, nv, info.last_complete);
+ RepGather *repop = new RepGather(op, rep_tid, nv, info.last_complete,
+ follows_snap, snaps);
// osds. commits all come to me.
for (unsigned i=0; i<acting.size(); i++) {
int osd = acting[i];
repop->waitfor_ack.insert(osd);
}
-
+
repop->start = g_clock.now();
rep_gather[repop->rep_tid] = repop;
// issue replica writes
tid_t rep_tid = osd->get_tid();
- RepGather *repop = new_rep_gather(op, rep_tid, av);
+ RepGather *repop = new_rep_gather(op, rep_tid, av, follows, op->get_snaps());
for (unsigned i=1; i<acting.size(); i++)
issue_repop(repop, acting[i], now);
eversion_t pg_local_last_complete;
map<int,eversion_t> pg_complete_thru;
- RepGather(MOSDOp *o, tid_t rt, eversion_t av, eversion_t lc) :
+ RepGather(MOSDOp *o, tid_t rt, eversion_t av, eversion_t lc,
+ snapid_t fs, vector<snapid_t> &sn) :
op(o), rep_tid(rt),
applied(false),
sent_ack(false), sent_commit(false),
at_version(av),
+ follows_snap(fs), snaps(sn),
pg_local_last_complete(lc) { }
bool can_send_ack() {
void apply_repop(RepGather *repop);
void put_rep_gather(RepGather*);
void issue_repop(RepGather *repop, int dest, utime_t now);
- RepGather *new_rep_gather(MOSDOp *op, tid_t rep_tid, eversion_t nv);
+ RepGather *new_rep_gather(MOSDOp *op, tid_t rep_tid, eversion_t nv,
+ snapid_t follows_snap, vector<snapid_t> &snaps);
void repop_ack(RepGather *repop,
int result, bool commit,
int fromosd, eversion_t pg_complete_thru=eversion_t(0,0));
MOSDOp *m = new MOSDOp(messenger->get_myinst(), client_inc, last_tid,
ex.oid, ex.layout, osdmap->get_epoch(),
CEPH_OSD_OP_STAT, flags);
+ m->get_snaps() = st->snaps;
if (inc_lock > 0) {
st->inc_lock = inc_lock;
m->set_inc_lock(inc_lock);
MOSDOp *m = new MOSDOp(messenger->get_myinst(), client_inc, last_tid,
ex.oid, ex.layout, osdmap->get_epoch(),
CEPH_OSD_OP_READ, flags);
+ m->get_snaps() = rd->snaps;
if (inc_lock > 0) {
rd->inc_lock = inc_lock;
m->set_inc_lock(inc_lock);
MOSDOp *m = new MOSDOp(messenger->get_myinst(), client_inc, tid,
ex.oid, ex.layout, osdmap->get_epoch(),
wr->op, flags);
+ m->get_snaps() = wr->snaps;
if (inc_lock > 0) {
wr->inc_lock = inc_lock;
m->set_inc_lock(inc_lock);
$CEPH_BIN/osdmaptool --clobber --createsimple .ceph_monmap 4 --print .ceph_osdmap # --pgbits 2
$CEPH_BIN/cmonctl osd setmap -i .ceph_osdmap
-for osd in 0 1 2 3 #4 5 6 7 8 9 10 11 12 13 14 15
+for osd in 0 1 #2 3 #4 5 6 7 8 9 10 11 12 13 14 15
do
$CEPH_BIN/cosd --mkfs_for_osd $osd dev/osd$osd # initialize empty object store
#valgrind --leak-check=full --show-reachable=yes $CEPH_BIN/cosd dev/osd$osd --debug_ms 1 --debug_osd 20 --debug_filestore 10 1>out/o$osd & #--debug_osd 40