else
sb = sb2;
super_epoch = sb->epoch;
- dout(3) << "mount epoch " << super_epoch << dendl;
+ op_seq = sb->op_seq;
+ dout(3) << "mount epoch " << super_epoch << " op_seq " << op_seq << dendl;
super_fsid = sb->fsid;
// open journal
if (journalfn) {
journal = new FileJournal(sb->fsid, &finisher, journalfn, g_conf.journal_dio);
- int err = journal->open(super_epoch);
+ int err = journal->open(op_seq+1);
if (err < 0) {
dout(3) << "mount journal " << journalfn << " open failed" << dendl;
delete journal;
while (1) {
bufferlist bl;
- __u64 e;
- if (!journal->read_entry(bl, e)) {
+ __u64 seq;
+ if (!journal->read_entry(bl, seq)) {
dout(3) << "mount replay: end of journal, done." << dendl;
break;
}
- if (e < super_epoch) {
- dout(3) << "mount replay: skipping old entry in epoch " << e << " < " << super_epoch << dendl;
+ if (seq <= op_seq) {
+ dout(3) << "mount replay: skipping old op seq " << seq << " <= " << op_seq << dendl;
continue;
}
- if (e == super_epoch+1) {
- super_epoch++;
- dout(3) << "mount replay: jumped to next epoch " << super_epoch << dendl;
- }
- assert(e == super_epoch);
+ op_seq++;
+ assert(seq == op_seq);
- dout(3) << "mount replay: applying transaction in epoch " << e << dendl;
+ dout(3) << "mount replay: applying op seq " << seq << dendl;
Transaction t(bl);
_apply_transaction(t);
}
sb->s_magic = EBOFS_MAGIC;
sb->fsid = super_fsid;
sb->epoch = epoch;
+ sb->op_seq = op_seq;
sb->num_blocks = dev.get_num_blocks();
sb->free_blocks = free_blocks;
commit_starting = false;
// --- get ready for a new epoch ---
+ __u64 last_op = op_seq;
super_epoch++;
dirty = false;
- derr(10) << "commit_thread commit start, new epoch " << super_epoch << dendl;
- dout(10) << "commit_thread commit start, new epoch " << super_epoch << dendl;
+ derr(10) << "commit_thread commit start, new epoch " << super_epoch << " last_op " << last_op << dendl;
+ dout(10) << "commit_thread commit start, new epoch " << super_epoch << " last_op " << last_op << dendl;
dout(2) << "commit_thread data: "
<< 100*(dev.get_num_blocks()-get_free_blocks())/dev.get_num_blocks() << "% used, "
<< get_free_blocks() << " (" << 100*get_free_blocks()/dev.get_num_blocks()
}
// trim journal
- if (journal) journal->committed_thru(super_epoch-1);
+ if (journal) journal->committed_thru(last_op);
// kick waiters
dout(10) << "commit_thread queueing commit + kicking sync waiters" << dendl;
Transaction t;
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
}
onsafe = 0;
}
if (journal) {
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
t.write(cid, oid, off, len, bl);
bufferlist tbl;
t.encode(tbl);
- journal->submit_entry(super_epoch, tbl, onsafe);
+ journal->submit_entry(++op_seq, tbl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.zero(cid, oid, off, len);
bufferlist tbl;
t.encode(tbl);
- journal->submit_entry(super_epoch, tbl, onsafe);
+ journal->submit_entry(++op_seq, tbl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.remove(cid, oid);
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.truncate(cid, oid, size);
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.clone(cid, from, to);
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.setattr(cid, oid, name, value, size);
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.setattrs(cid, oid, attrset);
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.rmattr(cid, oid, name);
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.create_collection(cid);
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.remove_collection(cid);
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.collection_add(cid, ocid, oid);
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.collection_remove(cid, oid);
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.collection_setattr(cid, name, value, size);
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {
t.collection_rmattr(cid, name);
bufferlist bl;
t.encode(bl);
- journal->submit_entry(super_epoch, bl, onsafe);
+ journal->submit_entry(++op_seq, bl, onsafe);
} else
queue_commit_waiter(onsafe);
} else {