]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
filer: set object snap field
authorSage Weil <sage@newdream.net>
Thu, 3 Jul 2008 04:20:45 +0000 (21:20 -0700)
committerSage Weil <sage@newdream.net>
Thu, 3 Jul 2008 04:20:45 +0000 (21:20 -0700)
src/client/Client.cc
src/client/SyntheticClient.cc
src/dumpjournal.cc
src/mds/MDCache.cc
src/mds/MDSTable.cc
src/mds/SessionMap.cc
src/osdc/Filer.cc
src/osdc/Filer.h
src/osdc/Journaler.cc
src/osdc/ObjectCacher.h

index 4822881e0ab25a93354064e62c0726fedd0a9b18..d9d3939bcb795054a3a96ae5b6bd645a9dbd2a61 100644 (file)
@@ -1658,7 +1658,7 @@ void Client::handle_file_caps(MClientFileCaps *m)
        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);
@@ -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<ObjectExtent>& 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;
index 1f63b73765ba96ee222aa92f807d2d26068d236b..9b9bbf6b00e349faba8e70beba15cf23ff78cd3c 100644 (file)
@@ -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();
index 4f4295d65b2d0d0ae7fb73f65da5e40bd24ed689..ba65ff076d1052bc3051319678e3f96336dce28e 100644 (file)
@@ -114,7 +114,8 @@ int main(int argc, const char **argv, const char *envp[])
   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);
index 1d8070250f69b09a916dae100a24ec1f79c61cb0..aeb72986e2d5cd4f55b5bb09459d600627724f3a 100644 (file)
@@ -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<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
index a12cf0f593c49918e87ab64d6b7be402b6604f42..51302eeb490d6840624adeb80f338c651fd11555 100644 (file)
@@ -58,7 +58,7 @@ void MDSTable::save(Context *onfinish, version_t v)
 
   // 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));
@@ -113,7 +113,7 @@ void MDSTable::load(Context *onfinish)
 
   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);
index ff8531ead5a816430726f8968a167a75c3a2441e..c0b752864e97fe837a9b76ac46d034b532324c0c 100644 (file)
@@ -63,7 +63,7 @@ void SessionMap::load(Context *onload)
   
   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);
@@ -114,7 +114,7 @@ void SessionMap::save(Context *onsave, version_t needv)
   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));
index 5ee40702112116356746fc06c1776ff97bf2bc8f..62c8d7c53babe41a2428857d921e57f68b3ccab5 100644 (file)
@@ -45,7 +45,7 @@ public:
 
 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,
@@ -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<ObjectExtent>::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<ObjectExtent>& extents,
-                           objectrev_t rev) 
+                            list<ObjectExtent>& 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 {
index 80a5aa877e28d0b93e3abbd403a4bb75982fb555..92bb0938ca1464b8e08d99c55116650f1ec5482c 100644 (file)
@@ -52,6 +52,7 @@ class Filer {
   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;
@@ -67,12 +68,13 @@ class Filer {
     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);
@@ -88,65 +90,64 @@ class Filer {
   /*** 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;
   }
 
@@ -157,7 +158,7 @@ class Filer {
    */
   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,
@@ -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<ObjectExtent>& extents,
-                      objectrev_t rev=0);
+                      list<ObjectExtent>& extents);
   
 };
 
index 834ab237c0fc0ae97daead76cfc7c235fefb9985..cc85c2bbef02a14276c6ebd1500af0af908e1dd3 100644 (file)
@@ -82,7 +82,7 @@ void Journaler::recover(Context *onread)
   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)
@@ -114,7 +114,7 @@ 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)
@@ -171,7 +171,7 @@ void Journaler::write_head(Context *oncommit)
   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));
 }
@@ -342,7 +342,7 @@ void Journaler::_do_flush()
   // 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
@@ -531,7 +531,7 @@ void Journaler::_issue_read(__s64 len)
           << 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;
 }
@@ -716,7 +716,7 @@ void Journaler::trim()
           << 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;  
 }
index dda4097305edab9f82c3a8096192de18689f3893..946716e9fab995471f42b633eb15d8d58d385d23 100644 (file)
@@ -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<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);
   }
 
@@ -507,22 +506,23 @@ class ObjectCacher {
 
   /*** 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);
   }