-v0.3
-- fix mon osdmap send_full/latest ... never use get_source_inst()!
-
v0.4
-- fix msgr protocol wrt resets, and varying connection close policies
- ENOSPC
- finish client failure recovery (reconnect after long eviction; and slow delayed reconnect)
- make kclient sendpage (and rip out io interruption?)
*/
int Ebofs::pick_object_revision_lt(coll_t cid, pobject_t& oid)
{
- assert(oid.oid.rev > 0); // this is only useful for non-zero oid.rev
+ assert(oid.oid.snap > 0); // this is only useful for non-zero oid.rev
int r = -EEXIST; // return code
ebofs_lock.Lock();
{
pobject_t orig = oid;
pobject_t live = oid;
- live.oid.rev = 0;
+ live.oid.snap = 0;
if (object_tab->get_num_keys() > 0) {
Table<pobject_t, ebofs_inode_ptr>::Cursor cursor(object_tab);
if (t.oid.ino != oid.oid.ino ||
t.oid.bno != oid.oid.bno) // passed to previous object
break;
- if (oid.oid.rev < t.oid.rev) { // rev < desired. possible match.
+ if (oid.oid.snap < t.oid.snap) { // rev < desired. possible match.
r = 0;
oid = t;
break;
}
- if (firstpass && oid.oid.rev >= t.oid.rev) { // there is no old rev < desired. try live.
+ if (firstpass && oid.oid.snap >= t.oid.snap) { // there is no old rev < desired. try live.
r = 0;
oid = live;
break;
switch (rand() % 5) {//10) {
case 0:
{
- oid.oid.rev = rand() % 10;
+ oid.oid.snap = rand() % 10;
cout << t << " read " << hex << oid << dec << " at " << off << " len " << len << std::endl;
bufferlist bl;
fs.read(0, oid, off, len, bl);
case 10:
{
pobject_t newoid = oid;
- newoid.oid.rev = rand() % 10;
+ newoid.oid.snap = rand() % 10;
cout << t << " clone " << oid << " to " << newoid << std::endl;
fs.clone(0, oid, newoid, 0);
}
// clone it
pobject_t oid2;
oid2 = oid;
- oid2.oid.rev = 1;
+ oid2.oid.snap = 1;
fs.clone(0, oid, oid2, 0);
// ...
struct {
uint64_t ino; // "file" identifier
uint32_t bno; // "block" in that "file"
- objectrev_t rev; // revision. normally ctime (as epoch).
+ objectrev_t snap; // revision. normally ctime (as epoch).
} __attribute__ ((packed));
};
- object_t() : ino(0), bno(0), rev(0) {}
- object_t(uint64_t i, uint32_t b) : ino(i), bno(b), rev(0) {}
- object_t(uint64_t i, uint32_t b, uint64_t r) : ino(i), bno(b), rev(r) {}
+ object_t() : ino(0), bno(0), snap(0) {}
+ object_t(uint64_t i, uint32_t b) : ino(i), bno(b), snap(0) {}
+ object_t(uint64_t i, uint32_t b, uint64_t r) : ino(i), bno(b), snap(r) {}
// IMPORTANT: make this match struct ceph_object ****
object_t(const ceph_object& co) {
ino = co.ino;
bno = co.bno;
- rev = co.rev;
+ snap = co.snap;
}
operator ceph_object() {
ceph_object oid;
oid.ino = ino;
oid.bno = bno;
- oid.rev = rev;
+ oid.snap = snap;
return oid;
}
void encode(bufferlist &bl) const {
::encode(ino, bl);
::encode(bno, bl);
- ::encode(rev, bl);
+ ::encode(snap, bl);
}
void decode(bufferlist::iterator &bl) {
__u64 i, r;
::decode(r, bl);
ino = i;
bno = b;
- rev = r;
+ snap = r;
}
} __attribute__ ((packed));
WRITE_CLASS_ENCODER(object_t)
out.fill('0');
out << setw(8) << o.bno << dec;
out.unsetf(ios::right);
- if (o.rev)
- out << '.' << o.rev;
+ if (o.snap)
+ out << '.' << o.snap;
return out;
}
size_t operator()(const object_t &r) const {
static rjhash<uint64_t> H;
static rjhash<uint32_t> I;
- return H(r.ino) ^ I(r.bno) ^ H(r.rev);
+ return H(r.ino) ^ I(r.bno) ^ H(r.snap);
}
};
size_t operator()(const pobject_t &r) const {
static rjhash<uint64_t> H;
static rjhash<uint32_t> I;
- return I(r.volume) ^ I(r.rank) ^ H(r.oid.ino) ^ I(r.oid.bno) ^ I(r.oid.rev);
+ return I(r.volume) ^ I(r.rank) ^ H(r.oid.ino) ^ I(r.oid.bno) ^ H(r.oid.snap);
}
};
}
char *t = s + strlen(s);
#ifdef __LP64__
sprintf(t, "/%04x.%04x.%016lx.%08x.%lx",
- oid.volume, oid.rank, oid.oid.ino, oid.oid.bno, oid.oid.rev);
+ oid.volume, oid.rank, oid.oid.ino, oid.oid.bno, oid.oid.snap);
#else
sprintf(t, "/%04x.%04x.%016llx.%08x.%llx",
- oid.volume, oid.rank, oid.oid.ino, oid.oid.bno, oid.oid.rev);
+ oid.volume, oid.rank, oid.oid.ino, oid.oid.bno, oid.oid.snap);
#endif
//parse_object(t+1);
}
assert(s[26] == '.');
o.oid.bno = strtoll(s+27, 0, 16);
assert(s[35] == '.');
- o.oid.rev = strtoll(s+36, 0, 16);
+ o.oid.snap = strtoll(s+36, 0, 16);
dout(0) << " got " << o << " errno " << errno << " on " << s << dendl;
return o;
}
objectrev_t crev;
int r = osd->store->getattr(info.pgid, t, "crev", &crev, sizeof(crev));
assert(r >= 0);
- if (crev <= oid.rev) {
+ if (crev <= oid.snap) {
dout(10) << "pick_object_rev choosing " << t << " crev " << crev << " for " << oid << dendl;
oid = t.oid;
return true;
long r = 0;
// do it.
- if (oid.rev && !pick_object_rev(oid)) {
+ if (oid.snap && !pick_object_rev(oid)) {
// we have no revision for this request.
r = -EEXIST;
goto done;
if (crev && rev && rev > crev) {
assert(0);
pobject_t noid = poid; // FIXME ****
- noid.oid.rev = rev;
+ noid.oid.snap = rev;
dout(10) << "prepare_op_transaction cloning " << poid << " crev " << crev << " to " << noid << dendl;
t.clone(info.pgid, poid, noid);
did_clone = true;
assert(nv > log.top);
// will clone?
- if (crev && poid.oid.rev && poid.oid.rev > crev) {
+ if (crev && poid.oid.snap && poid.oid.snap > crev) {
clone_version = nv;
nv.version++;
}
nv.version = op->get_version().version;
// clone?
- if (crev && op->get_oid().rev && op->get_oid().rev > crev) {
+ if (crev && op->get_oid().snap && op->get_oid().snap > crev) {
// backstep clone
clone_version = nv;
clone_version.version--;
<< " " << poid.oid
<< " v " << nv
//<< " crev " << crev
- << " rev " << poid.oid.rev
+ << " rev " << poid.oid.snap
<< " " << op->get_offset() << "~" << op->get_length()
<< dendl;
if (op->get_op() != CEPH_OSD_OP_WRNOOP) {
// log and update later.
prepare_log_transaction(repop->t, op->get_reqid(), poid, op->get_op(), nv,
- crev, poid.oid.rev, peers_complete_thru);
+ crev, poid.oid.snap, peers_complete_thru);
prepare_op_transaction(repop->t, op->get_reqid(),
info.pgid, op->get_op(), poid,
op->get_offset(), op->get_length(), op->get_data(),
- nv, op->get_inc_lock(), crev, poid.oid.rev);
+ nv, op->get_inc_lock(), crev, poid.oid.snap);
}
// (logical) local ack.