m->get_size() < in->inode.size) {
// map range to objects
list<ObjectExtent> ls;
- filer->file_to_extents(in->inode.ino, &in->inode.layout,
+ filer->file_to_extents(in->inode.ino, &in->inode.layout, CEPH_NOSNAP,
m->get_size(), in->inode.size - m->get_size(),
ls);
objectcacher->truncate_set(in->inode.ino, ls);
// object cache OFF -- non-atomic sync read from osd
// do sync read
- Objecter::OSDRead *rd = filer->prepare_read(in->inode.ino, &in->inode.layout, in->snaprealm->snaps, offset, size, bl, 0);
+ Objecter::OSDRead *rd = filer->prepare_read(in->inode.ino, &in->inode.layout,
+ CEPH_NOSNAP, in->snaprealm->snaps,
+ offset, size, bl, 0);
if (in->hack_balance_reads || g_conf.client_hack_balance_reads)
rd->flags |= CEPH_OSD_OP_BALANCE_READS;
r = objecter->readx(rd, onfinish);
unsafe_sync_write++;
in->get_cap_ref(CEPH_CAP_WRBUFFER);
- filer->write(in->inode.ino, &in->inode.layout, in->snaprealm->snaps, offset, size, bl, 0, onfinish, onsafe);
+ filer->write(in->inode.ino, &in->inode.layout,
+ CEPH_NOSNAP,
+ in->snaprealm->snaps,
+ offset, size, bl, 0, onfinish, onsafe);
while (!done)
cond.Wait(client_lock);
Inode *in = f->inode;
// map to a list of extents
- filer->file_to_extents(in->inode.ino, &in->inode.layout, offset, length, result);
+ filer->file_to_extents(in->inode.ino, &in->inode.layout, CEPH_NOSNAP, offset, length, result);
dout(3) << "enumerate_layout(" << fd << ", " << length << ", " << offset << ") = 0" << dendl;
return 0;
lock.Lock();
Context *onfinish = new C_SafeCond(&lock, &cond, &done);
- filer->read(inode.ino, &inode.layout, snaps, pos, get, &bl, 0, onfinish);
+ filer->read(inode.ino, &inode.layout, 0, snaps, pos, get, &bl, 0, onfinish);
while (!done)
cond.Wait(lock);
lock.Unlock();
Filer filer(objecter);
bufferlist bl;
vector<snapid_t> snaps;
- filer.read(log_inode.ino, &log_inode.layout, snaps, start, len, &bl, 0, new C_SafeCond(&lock, &cond, &done));
+ filer.read(log_inode.ino, &log_inode.layout, 0, snaps,
+ start, len, &bl, 0, new C_SafeCond(&lock, &cond, &done));
lock.Lock();
while (!done)
cond.Wait(lock);
dout(10) << "do_file_recover starting " << in->inode.size << "/" << in->inode.max_size
<< " " << *in << dendl;
file_recovering.insert(in);
- mds->filer->probe(in->inode.ino, &in->inode.layout, snaps, in->inode.max_size, &in->inode.size, false,
+ mds->filer->probe(in->inode.ino, &in->inode.layout, CEPH_NOSNAP, snaps,
+ in->inode.max_size, &in->inode.size, false,
0, new C_MDC_Recover(this, in));
} else {
dout(10) << "do_file_recover skipping " << in->inode.size << "/" << in->inode.max_size
// remove
if (newsize < oldsize) {
vector<snapid_t> snaps;
- mds->filer->remove(in->inode.ino, &in->inode.layout, snaps, newsize, oldsize-newsize, 0,
+ mds->filer->remove(in->inode.ino, &in->inode.layout, CEPH_NOSNAP, snaps,
+ newsize, oldsize-newsize, 0,
0, new C_MDC_PurgeFinish(this, in, newsize, oldsize));
} else {
// no need, empty file, just log it
// write (async)
vector<snapid_t> snaps;
- mds->filer->write(ino, &layout, snaps,
+ mds->filer->write(ino, &layout, 0, snaps,
0, bl.length(), bl,
0,
0, new C_MT_Save(this, version));
C_MT_Load *c = new C_MT_Load(this, onfinish);
vector<snapid_t> snaps;
- mds->filer->read(ino, &layout, snaps,
+ mds->filer->read(ino, &layout, 0, snaps,
0, ceph_file_layout_su(layout),
&c->bl, 0,
c);
C_SM_Load *c = new C_SM_Load(this);
vector<snapid_t> snaps;
- mds->filer->read(inode.ino, &inode.layout, snaps,
+ mds->filer->read(inode.ino, &inode.layout, 0, snaps,
0, ceph_file_layout_su(inode.layout),
&c->bl, 0,
c);
encode(bl);
committing = version;
vector<snapid_t> snaps;
- mds->filer->write(inode.ino, &inode.layout, snaps,
+ mds->filer->write(inode.ino, &inode.layout, 0, snaps,
0, bl.length(), bl,
0,
0, new C_SM_Save(this, version));
int Filer::probe(inodeno_t ino,
ceph_file_layout *layout,
- vector<snapid_t> &snaps,
+ snapid_t snap, vector<snapid_t> &snaps,
__u64 start_from,
__u64 *end, // LB, when !fwd
bool fwd,
<< " starting from " << start_from
<< dendl;
- Probe *probe = new Probe(ino, *layout, snaps, start_from, end, flags, fwd, onfinish);
+ Probe *probe = new Probe(ino, *layout, snap, snaps, start_from, end, flags, fwd, onfinish);
// period (bytes before we jump unto a new set of object(s))
__u64 period = ceph_file_layout_period(*layout);
<< dendl;
// map range onto objects
- file_to_extents(probe->ino, &probe->layout, probe->from, probe->probing_len, probe->probing);
+ file_to_extents(probe->ino, &probe->layout, 0, probe->from, probe->probing_len, probe->probing);
for (list<ObjectExtent>::iterator p = probe->probing.begin();
p != probe->probing.end();
}
-void Filer::file_to_extents(inodeno_t ino, ceph_file_layout *layout,
+void Filer::file_to_extents(inodeno_t ino, ceph_file_layout *layout, snapid_t snap,
__u64 offset, size_t len,
- list<ObjectExtent>& extents,
- objectrev_t rev)
+ list<ObjectExtent>& extents)
{
dout(10) << "file_to_extents " << offset << "~" << len
<< " on " << hex << ino << dec
// find oid, extent
ObjectExtent *ex = 0;
- object_t oid( ino, objectno, rev );
+ object_t oid( ino, objectno, snap );
if (object_extents.count(oid))
ex = &object_extents[oid];
else {
struct Probe {
inodeno_t ino;
ceph_file_layout layout;
+ snapid_t snap;
vector<snapid_t> snaps;
__u64 from; // for !fwd, this is start of extent we are probing, thus possibly < our endpoint.
__u64 *end;
map<object_t, __u64> known;
map<object_t, tid_t> ops;
- Probe(inodeno_t i, ceph_file_layout &l, vector<snapid_t> &sn, __u64 f, __u64 *e, int fl, bool fw, Context *c) :
- ino(i), layout(l), snaps(sn), from(f), end(e), flags(fl), fwd(fw), onfinish(c), probing_len(0) {}
+ Probe(inodeno_t i, ceph_file_layout &l, snapid_t sn, vector<snapid_t> &sns,
+ __u64 f, __u64 *e, int fl, bool fw, Context *c) :
+ ino(i), layout(l), snap(sn), snaps(sns),
+ from(f), end(e), flags(fl), fwd(fw), onfinish(c), probing_len(0) {}
};
class C_Probe;
- //friend class C_Probe;
void _probe(Probe *p);
void _probed(Probe *p, object_t oid, __u64 size);
/*** async file interface ***/
Objecter::OSDRead *prepare_read(inodeno_t ino,
ceph_file_layout *layout,
- vector<snapid_t>& snaps,
+ snapid_t snap, vector<snapid_t>& snaps,
__u64 offset,
size_t len,
bufferlist *bl,
int flags) {
Objecter::OSDRead *rd = objecter->prepare_read(snaps, bl, flags);
- file_to_extents(ino, layout, offset, len, rd->extents);
+ file_to_extents(ino, layout, snap, offset, len, rd->extents);
return rd;
}
int read(inodeno_t ino,
ceph_file_layout *layout,
- vector<snapid_t>& snaps,
+ snapid_t snap, vector<snapid_t>& snaps,
__u64 offset,
size_t len,
bufferlist *bl, // ptr to data
int flags,
Context *onfinish) {
- Objecter::OSDRead *rd = prepare_read(ino, layout, snaps, offset, len, bl, flags);
+ Objecter::OSDRead *rd = prepare_read(ino, layout, snap, snaps, offset, len, bl, flags);
return objecter->readx(rd, onfinish) > 0 ? 0:-1;
}
int write(inodeno_t ino,
ceph_file_layout *layout,
- vector<snapid_t>& snaps,
+ snapid_t snap, vector<snapid_t>& snaps,
__u64 offset,
size_t len,
bufferlist& bl,
int flags,
Context *onack,
- Context *oncommit,
- objectrev_t rev=0) {
+ Context *oncommit) {
Objecter::OSDWrite *wr = objecter->prepare_write(snaps, bl, flags);
- file_to_extents(ino, layout, offset, len, wr->extents, rev);
+ file_to_extents(ino, layout, snap, offset, len, wr->extents);
return objecter->modifyx(wr, onack, oncommit) > 0 ? 0:-1;
}
int zero(inodeno_t ino,
ceph_file_layout *layout,
- vector<snapid_t>& snaps,
+ snapid_t snap, vector<snapid_t>& snaps,
__u64 offset,
size_t len,
int flags,
Context *onack,
Context *oncommit) {
Objecter::OSDModify *z = objecter->prepare_modify(snaps, CEPH_OSD_OP_ZERO, flags);
- file_to_extents(ino, layout, offset, len, z->extents);
+ file_to_extents(ino, layout, snap, offset, len, z->extents);
return objecter->modifyx(z, onack, oncommit) > 0 ? 0:-1;
}
int remove(inodeno_t ino,
ceph_file_layout *layout,
- vector<snapid_t>& snaps,
+ snapid_t snap, vector<snapid_t>& snaps,
__u64 offset,
size_t len,
int flags,
Context *onack,
Context *oncommit) {
Objecter::OSDModify *z = objecter->prepare_modify(snaps, CEPH_OSD_OP_DELETE, flags);
- file_to_extents(ino, layout, offset, len, z->extents);
+ file_to_extents(ino, layout, snap, offset, len, z->extents);
return objecter->modifyx(z, onack, oncommit) > 0 ? 0:-1;
}
*/
int probe(inodeno_t ino,
ceph_file_layout *layout,
- vector<snapid_t> &snaps,
+ snapid_t snap, vector<snapid_t> &snaps,
__u64 start_from,
__u64 *end,
bool fwd,
* map (ino, layout, offset, len) to a (list of) OSDExtents (byte
* ranges in objects on (primary) osds)
*/
- void file_to_extents(inodeno_t ino, ceph_file_layout *layout,
+ void file_to_extents(inodeno_t ino, ceph_file_layout *layout, snapid_t snap,
__u64 offset,
size_t len,
- list<ObjectExtent>& extents,
- objectrev_t rev=0);
+ list<ObjectExtent>& extents);
};
state = STATE_READHEAD;
C_ReadHead *fin = new C_ReadHead(this);
vector<snapid_t> snaps;
- filer.read(ino, &layout, snaps, 0, sizeof(Header), &fin->bl, CEPH_OSD_OP_INCLOCK_FAIL, fin);
+ filer.read(ino, &layout, 0, snaps, 0, sizeof(Header), &fin->bl, CEPH_OSD_OP_INCLOCK_FAIL, fin);
}
void Journaler::_finish_read_head(int r, bufferlist& bl)
state = STATE_PROBING;
C_ProbeEnd *fin = new C_ProbeEnd(this);
vector<snapid_t> snaps;
- filer.probe(ino, &layout, snaps, h.write_pos, (__u64 *)&fin->end, true, CEPH_OSD_OP_INCLOCK_FAIL, fin);
+ filer.probe(ino, &layout, 0, snaps, h.write_pos, (__u64 *)&fin->end, true, CEPH_OSD_OP_INCLOCK_FAIL, fin);
}
void Journaler::_finish_probe_end(int r, __s64 end)
bufferlist bl;
::encode(last_written, bl);
vector<snapid_t> snaps;
- filer.write(ino, &layout, snaps, 0, bl.length(), bl, CEPH_OSD_OP_INCLOCK_FAIL,
+ filer.write(ino, &layout, 0, snaps, 0, bl.length(), bl, CEPH_OSD_OP_INCLOCK_FAIL,
NULL,
new C_WriteHead(this, last_written, oncommit));
}
// flush _start_ pos to _finish_flush
utime_t now = g_clock.now();
vector<snapid_t> snaps;
- filer.write(ino, &layout, snaps, flush_pos, len, write_buf,
+ filer.write(ino, &layout, 0, snaps, flush_pos, len, write_buf,
CEPH_OSD_OP_INCLOCK_FAIL,
new C_Flush(this, flush_pos, now, false), // on ACK
new C_Flush(this, flush_pos, now, true)); // on COMMIT
<< dendl;
vector<snapid_t> snaps;
- filer.read(ino, &layout, snaps, requested_pos, len, &reading_buf, CEPH_OSD_OP_INCLOCK_FAIL,
+ filer.read(ino, &layout, 0, snaps, requested_pos, len, &reading_buf, CEPH_OSD_OP_INCLOCK_FAIL,
new C_Read(this));
requested_pos += len;
}
<< dendl;
vector<snapid_t> snaps;
- filer.remove(ino, &layout, snaps, trimming_pos, trim_to-trimming_pos, CEPH_OSD_OP_INCLOCK_FAIL,
+ filer.remove(ino, &layout, 0, snaps, trimming_pos, trim_to-trimming_pos, CEPH_OSD_OP_INCLOCK_FAIL,
NULL, new C_Trim(this, trim_to));
trimming_pos = trim_to;
}
// file functions
/*** async+caching (non-blocking) file interface ***/
- int file_read(inodeno_t ino, ceph_file_layout *layout, vector<snapid_t> &snaps,
+ int file_read(inodeno_t ino, ceph_file_layout *layout, snapid_t snap, vector<snapid_t> &snaps,
off_t offset, size_t len,
bufferlist *bl,
int flags,
Context *onfinish) {
Objecter::OSDRead *rd = objecter->prepare_read(snaps, bl, flags);
- filer.file_to_extents(ino, layout, offset, len, rd->extents);
+ filer.file_to_extents(ino, layout, snap, offset, len, rd->extents);
return readx(rd, ino, onfinish);
}
- int file_write(inodeno_t ino, ceph_file_layout *layout, vector<snapid_t> &snaps,
+ int file_write(inodeno_t ino, ceph_file_layout *layout, snapid_t snap, vector<snapid_t> &snaps,
off_t offset, size_t len,
- bufferlist& bl, int flags,
- objectrev_t rev=0) {
+ bufferlist& bl, int flags) {
Objecter::OSDWrite *wr = objecter->prepare_write(snaps, bl, flags);
- filer.file_to_extents(ino, layout, offset, len, wr->extents);
+ filer.file_to_extents(ino, layout, snap, offset, len, wr->extents);
return writex(wr, ino);
}
/*** sync+blocking file interface ***/
- int file_atomic_sync_read(inodeno_t ino, ceph_file_layout *layout, vector<snapid_t> &snaps,
+ int file_atomic_sync_read(inodeno_t ino, ceph_file_layout *layout,
+ snapid_t snap, vector<snapid_t> &snaps,
off_t offset, size_t len,
bufferlist *bl, int flags,
Mutex &lock) {
Objecter::OSDRead *rd = objecter->prepare_read(snaps, bl, flags);
- filer.file_to_extents(ino, layout, offset, len, rd->extents);
+ filer.file_to_extents(ino, layout, snap, offset, len, rd->extents);
return atomic_sync_readx(rd, ino, lock);
}
- int file_atomic_sync_write(inodeno_t ino, ceph_file_layout *layout, vector<snapid_t> &snaps,
+ int file_atomic_sync_write(inodeno_t ino, ceph_file_layout *layout,
+ snapid_t snap, vector<snapid_t> &snaps,
off_t offset, size_t len,
bufferlist& bl, int flags,
- Mutex &lock,
- objectrev_t rev=0) {
+ Mutex &lock) {
Objecter::OSDWrite *wr = objecter->prepare_write(snaps, bl, flags);
- filer.file_to_extents(ino, layout, offset, len, wr->extents);
+ filer.file_to_extents(ino, layout, snap, offset, len, wr->extents);
return atomic_sync_writex(wr, ino, lock);
}