From ee43dee5f6655879f059a5fd15242e08ee64f7fa Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 2 Jul 2008 21:20:45 -0700 Subject: [PATCH] filer: set object snap field --- src/client/Client.cc | 13 ++++++++---- src/client/SyntheticClient.cc | 2 +- src/dumpjournal.cc | 3 ++- src/mds/MDCache.cc | 6 ++++-- src/mds/MDSTable.cc | 4 ++-- src/mds/SessionMap.cc | 4 ++-- src/osdc/Filer.cc | 13 ++++++------ src/osdc/Filer.h | 38 +++++++++++++++++------------------ src/osdc/Journaler.cc | 12 +++++------ src/osdc/ObjectCacher.h | 24 +++++++++++----------- 10 files changed, 63 insertions(+), 56 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 4822881e0ab25..d9d3939bcb795 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1658,7 +1658,7 @@ void Client::handle_file_caps(MClientFileCaps *m) m->get_size() < in->inode.size) { // map range to objects list 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); @@ -3157,7 +3157,9 @@ int Client::_read(Fh *f, __s64 offset, __u64 size, bufferlist *bl) // 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); @@ -3317,7 +3319,10 @@ int Client::_write(Fh *f, __s64 offset, __u64 size, const char *buf) 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); @@ -4326,7 +4331,7 @@ int Client::enumerate_layout(int fd, list& result, 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; diff --git a/src/client/SyntheticClient.cc b/src/client/SyntheticClient.cc index 1f63b73765ba9..9b9bbf6b00e34 100644 --- a/src/client/SyntheticClient.cc +++ b/src/client/SyntheticClient.cc @@ -3167,7 +3167,7 @@ int SyntheticClient::chunk_file(string &filename) 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(); diff --git a/src/dumpjournal.cc b/src/dumpjournal.cc index 4f4295d65b2d0..ba65ff076d105 100644 --- a/src/dumpjournal.cc +++ b/src/dumpjournal.cc @@ -114,7 +114,8 @@ int main(int argc, const char **argv, const char *envp[]) Filer filer(objecter); bufferlist bl; vector 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); diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 1d8070250f69b..aeb72986e2d5c 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -2974,7 +2974,8 @@ void MDCache::do_file_recover() 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 @@ -3071,7 +3072,8 @@ void MDCache::_do_purge_inode(CInode *in, off_t newsize, off_t oldsize) // remove if (newsize < oldsize) { vector 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 diff --git a/src/mds/MDSTable.cc b/src/mds/MDSTable.cc index a12cf0f593c49..51302eeb490d6 100644 --- a/src/mds/MDSTable.cc +++ b/src/mds/MDSTable.cc @@ -58,7 +58,7 @@ void MDSTable::save(Context *onfinish, version_t v) // write (async) vector 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)); @@ -113,7 +113,7 @@ void MDSTable::load(Context *onfinish) C_MT_Load *c = new C_MT_Load(this, onfinish); vector snaps; - mds->filer->read(ino, &layout, snaps, + mds->filer->read(ino, &layout, 0, snaps, 0, ceph_file_layout_su(layout), &c->bl, 0, c); diff --git a/src/mds/SessionMap.cc b/src/mds/SessionMap.cc index ff8531ead5a81..c0b752864e97f 100644 --- a/src/mds/SessionMap.cc +++ b/src/mds/SessionMap.cc @@ -63,7 +63,7 @@ void SessionMap::load(Context *onload) C_SM_Load *c = new C_SM_Load(this); vector 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); @@ -114,7 +114,7 @@ void SessionMap::save(Context *onsave, version_t needv) encode(bl); committing = version; vector 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)); diff --git a/src/osdc/Filer.cc b/src/osdc/Filer.cc index 5ee4070211211..62c8d7c53babe 100644 --- a/src/osdc/Filer.cc +++ b/src/osdc/Filer.cc @@ -45,7 +45,7 @@ public: int Filer::probe(inodeno_t ino, ceph_file_layout *layout, - vector &snaps, + snapid_t snap, vector &snaps, __u64 start_from, __u64 *end, // LB, when !fwd bool fwd, @@ -57,7 +57,7 @@ int Filer::probe(inodeno_t ino, << " 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); @@ -86,7 +86,7 @@ void Filer::_probe(Probe *probe) << 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::iterator p = probe->probing.begin(); p != probe->probing.end(); @@ -183,10 +183,9 @@ void Filer::_probed(Probe *probe, object_t oid, __u64 size) } -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& extents, - objectrev_t rev) + list& extents) { dout(10) << "file_to_extents " << offset << "~" << len << " on " << hex << ino << dec @@ -217,7 +216,7 @@ void Filer::file_to_extents(inodeno_t ino, ceph_file_layout *layout, // 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 { diff --git a/src/osdc/Filer.h b/src/osdc/Filer.h index 80a5aa877e28d..92bb0938ca146 100644 --- a/src/osdc/Filer.h +++ b/src/osdc/Filer.h @@ -52,6 +52,7 @@ class Filer { struct Probe { inodeno_t ino; ceph_file_layout layout; + snapid_t snap; vector snaps; __u64 from; // for !fwd, this is start of extent we are probing, thus possibly < our endpoint. __u64 *end; @@ -67,12 +68,13 @@ class Filer { map known; map ops; - Probe(inodeno_t i, ceph_file_layout &l, vector &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 &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); @@ -88,65 +90,64 @@ class Filer { /*** async file interface ***/ Objecter::OSDRead *prepare_read(inodeno_t ino, ceph_file_layout *layout, - vector& snaps, + snapid_t snap, vector& 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& snaps, + snapid_t snap, vector& 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& snaps, + snapid_t snap, vector& 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& snaps, + snapid_t snap, vector& 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& snaps, + snapid_t snap, vector& 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; } @@ -157,7 +158,7 @@ class Filer { */ int probe(inodeno_t ino, ceph_file_layout *layout, - vector &snaps, + snapid_t snap, vector &snaps, __u64 start_from, __u64 *end, bool fwd, @@ -171,11 +172,10 @@ class Filer { * 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& extents, - objectrev_t rev=0); + list& extents); }; diff --git a/src/osdc/Journaler.cc b/src/osdc/Journaler.cc index 834ab237c0fc0..cc85c2bbef02a 100644 --- a/src/osdc/Journaler.cc +++ b/src/osdc/Journaler.cc @@ -82,7 +82,7 @@ void Journaler::recover(Context *onread) state = STATE_READHEAD; C_ReadHead *fin = new C_ReadHead(this); vector 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) @@ -114,7 +114,7 @@ void Journaler::_finish_read_head(int r, bufferlist& bl) state = STATE_PROBING; C_ProbeEnd *fin = new C_ProbeEnd(this); vector 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) @@ -171,7 +171,7 @@ void Journaler::write_head(Context *oncommit) bufferlist bl; ::encode(last_written, bl); vector 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)); } @@ -342,7 +342,7 @@ void Journaler::_do_flush() // flush _start_ pos to _finish_flush utime_t now = g_clock.now(); vector 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 @@ -531,7 +531,7 @@ void Journaler::_issue_read(__s64 len) << dendl; vector 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; } @@ -716,7 +716,7 @@ void Journaler::trim() << dendl; vector 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; } diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index dda4097305eda..946716e9fab99 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -484,22 +484,21 @@ class ObjectCacher { // file functions /*** async+caching (non-blocking) file interface ***/ - int file_read(inodeno_t ino, ceph_file_layout *layout, vector &snaps, + int file_read(inodeno_t ino, ceph_file_layout *layout, snapid_t snap, vector &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 &snaps, + int file_write(inodeno_t ino, ceph_file_layout *layout, snapid_t snap, vector &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); } @@ -507,22 +506,23 @@ class ObjectCacher { /*** sync+blocking file interface ***/ - int file_atomic_sync_read(inodeno_t ino, ceph_file_layout *layout, vector &snaps, + int file_atomic_sync_read(inodeno_t ino, ceph_file_layout *layout, + snapid_t snap, vector &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 &snaps, + int file_atomic_sync_write(inodeno_t ino, ceph_file_layout *layout, + snapid_t snap, vector &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); } -- 2.39.5