]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
pass snaps through filer, objecter. link snaprealm to inode (not cap) in client...
authorSage Weil <sage@newdream.net>
Wed, 2 Jul 2008 23:31:02 +0000 (16:31 -0700)
committerSage Weil <sage@newdream.net>
Wed, 2 Jul 2008 23:31:02 +0000 (16:31 -0700)
22 files changed:
src/client/Client.cc
src/client/Client.h
src/client/SyntheticClient.cc
src/dumpjournal.cc
src/mds/AnchorTable.cc
src/mds/CDir.cc
src/mds/CDir.h
src/mds/CInode.h
src/mds/Capability.h
src/mds/MDCache.cc
src/mds/MDSTable.cc
src/mds/Server.cc
src/mds/SessionMap.cc
src/mds/mdstypes.h
src/messages/MClientReply.h
src/osdc/Filer.cc
src/osdc/Filer.h
src/osdc/Journaler.cc
src/osdc/ObjectCacher.cc
src/osdc/ObjectCacher.h
src/osdc/Objecter.cc
src/osdc/Objecter.h

index 335c2b8293924803328dcb3c598745d8b8e47237..4822881e0ab25a93354064e62c0726fedd0a9b18 100644 (file)
@@ -1516,15 +1516,18 @@ void Client::add_update_inode_cap(Inode *in, int mds,
     cap = in->caps[mds];
   } else {
     mds_sessions[mds].num_caps++;
-    if (in->caps.empty())
+    if (in->caps.empty()) {
+      assert(in->snaprealm == 0);
+      in->snaprealm = get_snap_realm(realm, snaps);
       in->get();
+    }
     if (in->exporting_mds == mds) {
       dout(10) << " clearing exporting_caps on " << mds << dendl;
       in->exporting_mds = -1;
       in->exporting_issued = 0;
       in->exporting_mseq = 0;
     }
-    in->caps[mds] = cap = new InodeCap(get_cap_realm(realm, snaps));
+    in->caps[mds] = cap = new InodeCap;
   }
 
   unsigned old_caps = cap->issued;
@@ -1540,13 +1543,12 @@ void Client::add_update_inode_cap(Inode *in, int mds,
 void Client::remove_cap(Inode *in, int mds)
 {
   assert(in->caps.count(mds));
-  InodeCap *cap = in->caps[mds];
-  cap->realm_cap_item.remove_myself();
-  if (cap->realm->caps.empty())
-    remove_cap_realm(cap->realm);
   in->caps.erase(mds);
-  if (in->caps.empty())
+  if (in->caps.empty()) {
     put_inode(in);
+    put_snap_realm(in->snaprealm);
+    in->snaprealm = 0;
+  }
 }
 
 void Client::handle_file_caps(MClientFileCaps *m)
@@ -3135,7 +3137,8 @@ int Client::_read(Fh *f, __s64 offset, __u64 size, bufferlist *bl)
        in->get_cap_ref(CEPH_CAP_RDCACHE);
 
       // read (and possibly block)
-      r = objectcacher->file_read(in->inode.ino, &in->inode.layout, offset, size, bl, 0, onfinish);
+  #warning bleh
+      //r = objectcacher->file_read(in->inode.ino, &in->inode.layout, offset, size, bl, 0, onfinish);
       
       if (r == 0) {
        while (!done) 
@@ -3146,14 +3149,15 @@ int Client::_read(Fh *f, __s64 offset, __u64 size, bufferlist *bl)
        delete onfinish;
       }
     } else {
-      r = objectcacher->file_atomic_sync_read(in->inode.ino, &in->inode.layout, offset, size, bl, 0, client_lock);
+  #warning bleh
+      //r = objectcacher->file_atomic_sync_read(in->inode.ino, &in->inode.layout, offset, size, bl, 0, client_lock);
     }
     
   } else {
     // object cache OFF -- non-atomic sync read from osd
   
     // do sync read
-    Objecter::OSDRead *rd = filer->prepare_read(in->inode.ino, &in->inode.layout, offset, size, bl, 0);
+    Objecter::OSDRead *rd = filer->prepare_read(in->inode.ino, &in->inode.layout, 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);
@@ -3296,10 +3300,12 @@ int Client::_write(Fh *f, __s64 offset, __u64 size, const char *buf)
       objectcacher->wait_for_write(size, client_lock);
       
       // async, caching, non-blocking.
-      objectcacher->file_write(in->inode.ino, &in->inode.layout, offset, size, bl, 0);
+  #warning bleh
+      //objectcacher->file_write(in->inode.ino, &in->inode.layout, offset, size, bl, 0);
     } else {
       // atomic, synchronous, blocking.
-      objectcacher->file_atomic_sync_write(in->inode.ino, &in->inode.layout, offset, size, bl, 0, client_lock);
+  #warning bleh
+      //objectcacher->file_atomic_sync_write(in->inode.ino, &in->inode.layout, offset, size, bl, 0, client_lock);
     }   
   } else {
     // simple, non-atomic sync write
@@ -3311,7 +3317,7 @@ 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, offset, size, bl, 0, onfinish, onsafe);
+    filer->write(in->inode.ino, &in->inode.layout, in->snaprealm->snaps, offset, size, bl, 0, onfinish, onsafe);
     
     while (!done)
       cond.Wait(client_lock);
index e502a8fdd4131b5cb8588cb4dae9c04511818373..b62997a1f1b512980a2f4daf30d123197f228165 100644 (file)
@@ -127,12 +127,12 @@ class Dir {
 
 struct InodeCap;
 
-struct CapRealm {
+struct SnapRealm {
   inodeno_t dirino;
   vector<snapid_t> snaps;
-  xlist<InodeCap*> caps;
+  int nref;
 
-  CapRealm(inodeno_t i, vector<snapid_t> &s) : dirino(i) {
+  SnapRealm(inodeno_t i, vector<snapid_t> &s) : dirino(i), nref(0) {
     snaps.swap(s);
   }
 };
@@ -143,13 +143,7 @@ struct InodeCap {
   __u64 seq;
   __u32 mseq;  // migration seq
 
-  CapRealm *realm;
-  xlist<InodeCap*>::item realm_cap_item;
-
-  InodeCap(CapRealm *r) : issued(0), implemented(0), seq(0), mseq(0), 
-                         realm(r), realm_cap_item(this) {
-    realm->caps.push_back(&realm_cap_item);
-  }
+  InodeCap() : issued(0), implemented(0), seq(0), mseq(0) {}
 };
 
 
@@ -171,6 +165,8 @@ class Inode {
   int exporting_mds;
   capseq_t exporting_mseq;
 
+  SnapRealm *snaprealm;
+
   //int open_by_mode[CEPH_FILE_MODE_NUM];
   map<int,int> open_by_mode;
   map<int,int> cap_refs;
@@ -224,6 +220,7 @@ class Inode {
     lease_mask(0), lease_mds(-1),
     dir_auth(-1), dir_hashed(false), dir_replicated(false), 
     exporting_issued(0), exporting_mds(-1), exporting_mseq(0),
+    snaprealm(0),
     reported_size(0), wanted_max_size(0), requested_max_size(0),
     ref(0), ll_ref(0), 
     dir(0), dn(0), symlink(0),
@@ -579,18 +576,22 @@ protected:
   Inode*                 root;
   LRU                    lru;    // lru list of Dentry's in our local metadata cache.
 
-  map<inodeno_t,CapRealm*> cap_realms;
+  map<inodeno_t,SnapRealm*> snap_realms;
 
-  CapRealm *get_cap_realm(inodeno_t r, vector<snapid_t> &snaps) {
-    if (cap_realms.count(r))
-      return cap_realms[r];
-    CapRealm *realm = new CapRealm(r, snaps);
-    cap_realms[r] = realm;
+  SnapRealm *get_snap_realm(inodeno_t r, vector<snapid_t> &snaps) {
+    SnapRealm *realm = snap_realms[r];
+    if (!realm) {
+      new SnapRealm(r, snaps);
+      snap_realms[r] = realm;
+    }
+    realm->nref++;
     return realm;
   }
-  void remove_cap_realm(CapRealm *realm) {
-    assert(realm->caps.empty());
-    cap_realms.erase(realm->dirino);
+  void put_snap_realm(SnapRealm *realm) {
+    if (realm->nref-- == 0) {
+      snap_realms.erase(realm->dirino);
+      delete realm;
+    }
   }
 
   // file handles, etc.
index 9e1f76d3ae390f27a4d1eaecf0e55e2af5f0d037..1f63b73765ba96ee222aa92f807d2d26068d236b 100644 (file)
@@ -1275,7 +1275,8 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
       lock.Lock();
       ceph_object_layout layout = client->osdmap->make_object_layout(oid, pg_t::TYPE_REP, 2, 0);
       __u64 size;
-      client->objecter->stat(oid, &size, layout, 0, new C_SafeCond(&lock, &cond, &ack));
+      vector<snapid_t> snaps;
+      client->objecter->stat(oid, &size, layout, snaps, 0, new C_SafeCond(&lock, &cond, &ack));
       while (!ack) cond.Wait(lock);
       lock.Unlock();
     }
@@ -1288,7 +1289,8 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
       lock.Lock();
       ceph_object_layout layout = client->osdmap->make_object_layout(oid, pg_t::TYPE_REP, 2, 0);
       bufferlist bl;
-      client->objecter->read(oid, off, len, layout, &bl, 0, new C_SafeCond(&lock, &cond, &ack));
+      vector<snapid_t> snaps;
+      client->objecter->read(oid, off, len, layout, snaps, &bl, 0, new C_SafeCond(&lock, &cond, &ack));
       while (!ack) cond.Wait(lock);
       lock.Unlock();
     }
@@ -1303,7 +1305,8 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
       bufferptr bp(len);
       bufferlist bl;
       bl.push_back(bp);
-      client->objecter->write(oid, off, len, layout, bl, 0,
+      vector<snapid_t> snaps;
+      client->objecter->write(oid, off, len, layout, snaps, bl, 0,
                              new C_SafeCond(&lock, &cond, &ack),
                              safeg->new_sub());
       while (!ack) cond.Wait(lock);
@@ -1317,7 +1320,8 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
       object_t oid(oh, ol);
       lock.Lock();
       ceph_object_layout layout = client->osdmap->make_object_layout(oid, pg_t::TYPE_REP, 2, 0);
-      client->objecter->zero(oid, off, len, layout, 0,
+      vector<snapid_t> snaps;
+      client->objecter->zero(oid, off, len, layout, snaps, 0,
                             new C_SafeCond(&lock, &cond, &ack),
                             safeg->new_sub());
       while (!ack) cond.Wait(lock);
@@ -2003,6 +2007,7 @@ int SyntheticClient::create_objects(int nobj, int osize, int inflight)
     object_t oid(0x1000, i);
     ceph_object_layout layout = client->osdmap->make_object_layout(oid, pg_t::TYPE_REP, 
                                                                   g_default_file_layout.fl_pg_size, 0);
+    vector<snapid_t> snaps;
     
     if (i % inflight == 0) {
       dout(6) << "create_objects " << i << "/" << (nobj+1) << dendl;
@@ -2011,7 +2016,7 @@ int SyntheticClient::create_objects(int nobj, int osize, int inflight)
     
     starts.push_back(g_clock.now());
     client->client_lock.Lock();
-    client->objecter->write(oid, 0, osize, layout, bl, 0,
+    client->objecter->write(oid, 0, osize, layout, snaps, bl, 0,
                            new C_Ref(lock, cond, &unack),
                            new C_Ref(lock, cond, &unsafe));
     client->client_lock.Unlock();
@@ -2106,18 +2111,19 @@ int SyntheticClient::object_rw(int nobj, int osize, int wrpc,
 
     ceph_object_layout layout = client->osdmap->make_object_layout(oid, pg_t::TYPE_REP, 
                                                                   g_default_file_layout.fl_pg_size, 0);
+    vector<snapid_t> snaps;
     
     client->client_lock.Lock();
     utime_t start = g_clock.now();
     if (write) {
       dout(10) << "write to " << oid << dendl;
-      client->objecter->write(oid, 0, osize, layout, bl, 0,
+      client->objecter->write(oid, 0, osize, layout, snaps, bl, 0,
                              new C_Ref(lock, cond, &unack),
                              new C_Ref(lock, cond, &unsafe));
     } else {
       dout(10) << "read from " << oid << dendl;
       bufferlist inbl;
-      client->objecter->read(oid, 0, osize, layout, &inbl, 0,
+      client->objecter->read(oid, 0, osize, layout, snaps, &inbl, 0,
                             new C_Ref(lock, cond, &unack));
     }
     client->client_lock.Unlock();
@@ -3157,10 +3163,11 @@ int SyntheticClient::chunk_file(string &filename)
     Cond cond;
     bool done;
     bufferlist bl;
+    vector<snapid_t> snaps;
     
     lock.Lock();
     Context *onfinish = new C_SafeCond(&lock, &cond, &done);
-    filer->read(inode.ino, &inode.layout, pos, get, &bl, 0, onfinish);
+    filer->read(inode.ino, &inode.layout, snaps, pos, get, &bl, 0, onfinish);
     while (!done)
       cond.Wait(lock);
     lock.Unlock();
index 86e7358fa2c477c7758e4d74891ac142f69b5ee8..4f4295d65b2d0d0ae7fb73f65da5e40bd24ed689 100644 (file)
@@ -113,7 +113,8 @@ int main(int argc, const char **argv, const char *envp[])
 
   Filer filer(objecter);
   bufferlist bl;
-  filer.read(log_inode.ino, &log_inode.layout, start, len, &bl, 0, new C_SafeCond(&lock, &cond, &done));
+  vector<snapid_t> snaps;
+  filer.read(log_inode.ino, &log_inode.layout, snaps, start, len, &bl, 0, new C_SafeCond(&lock, &cond, &done));
     lock.Lock();
   while (!done)
     cond.Wait(lock);
index 772718097379539b88be64943b6cfbf549fa2eb3..149034953be65c5a35a1cdfbe74291002287f2ed 100644 (file)
@@ -557,9 +557,11 @@ void AnchorTable::save(Context *onfinish)
 
   // write!
   object_t oid = object_t(MDS_INO_ANCHORTABLE+mds->get_nodeid(), 0);
+  vector<snapid_t> snaps;
   mds->objecter->write(oid,
                       0, bl.length(),
                       mds->objecter->osdmap->file_to_object_layout(oid, g_default_mds_anchortable_layout),
+                      snaps,
                       bl, 0,
                       NULL, new C_AT_Saved(this, version));
 }
@@ -598,9 +600,11 @@ void AnchorTable::load(Context *onfinish)
 
   C_AT_Load *fin = new C_AT_Load(this);
   object_t oid = object_t(MDS_INO_ANCHORTABLE+mds->get_nodeid(), 0);
+  vector<snapid_t> snaps;
   mds->objecter->read(oid,
                      0, 0,
                      mds->objecter->osdmap->file_to_object_layout(oid, g_default_mds_anchortable_layout),
+                     snaps,
                      &fin->bl, 0,
                      fin);
 }
index 4bbe0994f9d25ba405b653b2eedc3e65348b5f08..e59f514acf289cc794642578fa6ea5e941690eb0 100644 (file)
@@ -958,10 +958,12 @@ void CDir::fetch(Context *c, bool ignore_authpinnability)
 
   // start by reading the first hunk of it
   C_Dir_Fetch *fin = new C_Dir_Fetch(this);
-  cache->mds->objecter->read( get_ondisk_object(), 
+  vector<snapid_t> snaps;
+  cache->mds->objecter->read( get_ondisk_object(),
                              0, 0,   // whole object
                              cache->mds->objecter->osdmap->file_to_object_layout( get_ondisk_object(),
                                                                                   g_default_mds_dir_layout ),
+                             snaps,
                              &fin->bl, 0,
                              fin );
 }
@@ -1304,10 +1306,12 @@ void CDir::_commit(version_t want)
   assert(n == 0);
 
   // write it.
+  vector<snapid_t> snaps;
   cache->mds->objecter->write( get_ondisk_object(),
                               0, bl.length(),
                               cache->mds->objecter->osdmap->file_to_object_layout( get_ondisk_object(),
                                                                                    g_default_mds_dir_layout ),
+                              snaps,
                               bl, 0,
                               NULL, new C_Dir_Committed(this, get_version()) );
 }
index 765df291b51b9435f2fe03ab9c3653016fdc5471..f8961da098a7ab48e7d07a2432db8fd7542f347d 100644 (file)
@@ -359,6 +359,22 @@ private:
        ls.insert(auth);
     }
   }
+  void encode_dirstat(bufferlist& bl, int whoami) {
+    /*
+     * note: encoding matches struct ceph_client_reply_dirfrag
+     */
+    frag_t frag = get_frag();
+    __s32 auth;
+    set<__s32> dist;
+    
+    auth = dir_auth.first;
+    if (is_auth()) 
+      get_dist_spec(dist, whoami);
+
+    ::encode(frag, bl);
+    ::encode(auth, bl);
+    ::encode(dist, bl);
+  }
 
   CDirDiscover *replicate_to(int mds);
 
index 412755cce09af7ff4ae5f61c37b3375f5299d72a..4a1e349abd2f4367f4b806b64128c055f24714b4 100644 (file)
@@ -357,6 +357,54 @@ private:
   void decode_import(bufferlist::iterator& p, LogSegment *ls);
   
 
+  // for giving to clients
+  void encode_inodestat(bufferlist& bl) {
+    /*
+     * note: encoding matches struct ceph_client_reply_inode
+     */
+    struct ceph_mds_reply_inode e;
+    memset(&e, 0, sizeof(e));
+    e.ino = inode.ino;
+    e.version = inode.version;
+    e.layout = inode.layout;
+    inode.ctime.encode_timeval(&e.ctime);
+    inode.mtime.encode_timeval(&e.mtime);
+    inode.atime.encode_timeval(&e.atime);
+    e.time_warp_seq = inode.time_warp_seq;
+    e.mode = inode.mode;
+    e.uid = inode.uid;
+    e.gid = inode.gid;
+    e.nlink = inode.nlink;
+    e.size = inode.size;
+    e.max_size = inode.max_size;
+
+    e.files = inode.dirstat.nfiles;
+    e.subdirs = inode.dirstat.nsubdirs;
+    inode.dirstat.rctime.encode_timeval(&e.rctime);
+    e.rbytes = inode.dirstat.rbytes;
+    e.rfiles = inode.dirstat.rfiles;
+    e.rsubdirs = inode.dirstat.rsubdirs;
+
+    e.rdev = inode.rdev;
+    e.fragtree.nsplits = dirfragtree._splits.size();
+    ::encode(e, bl);
+    for (map<frag_t,int32_t>::iterator p = dirfragtree._splits.begin();
+        p != dirfragtree._splits.end();
+        p++) {
+      ::encode(p->first, bl);
+      ::encode(p->second, bl);
+    }
+    ::encode(symlink, bl);
+
+    bufferlist xbl;
+    if (!xattrs.empty())
+      ::encode(xattrs, xbl);
+    ::encode(xbl, bl);
+
+
+  }
+
+
   // -- locks --
 public:
   LocalLock  versionlock;
index 661b85399355ccc67d7d14b86d24fae853306adf..de242a26ccb76835d2081e1c8ff3f32727264e49 100644 (file)
@@ -28,23 +28,6 @@ using namespace std;
 // heuristics
 //#define CEPH_CAP_DELAYFLUSH  32
 
-inline string cap_string(int cap)
-{
-  string s;
-  s = "[";
-  if (cap & CEPH_CAP_PIN) s += " pin";
-  if (cap & CEPH_CAP_RDCACHE) s += " rdcache";
-  if (cap & CEPH_CAP_RD) s += " rd";
-  if (cap & CEPH_CAP_WR) s += " wr";
-  if (cap & CEPH_CAP_WRBUFFER) s += " wrbuffer";
-  if (cap & CEPH_CAP_WRBUFFER) s += " wrextend";
-  if (cap & CEPH_CAP_LAZYIO) s += " lazyio";
-  if (cap & CEPH_CAP_EXCL) s += " excl";
-  s += " ]";
-  return s;
-}
-
-typedef __u32 capseq_t;
 
 class CInode;
 
index 257fbda0552d95ffe6e2458593abceb6c2286b20..1d8070250f69b09a916dae100a24ec1f79c61cb0 100644 (file)
@@ -2967,11 +2967,14 @@ void MDCache::do_file_recover()
     CInode *in = *file_recover_queue.begin();
     file_recover_queue.erase(in);
 
+    vector<snapid_t> snaps;
+    in->find_containing_snaprealm()->get_snap_vector(snaps);
+
     if (in->inode.max_size > in->inode.size) {
       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, in->inode.max_size, &in->inode.size, false,
+      mds->filer->probe(in->inode.ino, &in->inode.layout, 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 
@@ -3067,7 +3070,8 @@ void MDCache::_do_purge_inode(CInode *in, off_t newsize, off_t oldsize)
 
   // remove
   if (newsize < oldsize) {
-    mds->filer->remove(in->inode.ino, &in->inode.layout, newsize, oldsize-newsize, 0,
+    vector<snapid_t> snaps;
+    mds->filer->remove(in->inode.ino, &in->inode.layout, snaps, newsize, oldsize-newsize, 0,
                       0, new C_MDC_PurgeFinish(this, in, newsize, oldsize));
   } else {
     // no need, empty file, just log it
index 78c921887cea1e28635dc5f2d1333e5a1dd0c076..a12cf0f593c49918e87ab64d6b7be402b6604f42 100644 (file)
@@ -57,7 +57,8 @@ void MDSTable::save(Context *onfinish, version_t v)
     waitfor_save[version].push_back(onfinish);
 
   // write (async)
-  mds->filer->write(ino, &layout,
+  vector<snapid_t> snaps;
+  mds->filer->write(ino, &layout, snaps,
                     0, bl.length(), bl,
                     0,
                    0, new C_MT_Save(this, version));
@@ -111,7 +112,8 @@ void MDSTable::load(Context *onfinish)
   state = STATE_OPENING;
 
   C_MT_Load *c = new C_MT_Load(this, onfinish);
-  mds->filer->read(ino, &layout,
+  vector<snapid_t> snaps;
+  mds->filer->read(ino, &layout, snaps,
                    0, ceph_file_layout_su(layout),
                    &c->bl, 0,
                    c);
index 8ec2fa0ff0d50958c75c0a6ccc80917b66540648..cc934d28ecf91dc0f5ed5527527c0aaebca78732 100644 (file)
@@ -613,7 +613,7 @@ void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, C
   }
 
  inode:
-  InodeStat::encode(bl, in);
+  in->encode_inodestat(bl);
   lmask = mds->locker->issue_client_lease(in, client, bl, now, session);
   numi++;
   dout(20) << " trace added " << lmask << " " << *in << dendl;
@@ -635,7 +635,7 @@ void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, C
     dn->get_dir()->verify_fragstat();
 #endif
 
-  DirStat::encode(bl, dn->get_dir(), whoami);
+  dn->get_dir()->encode_dirstat(bl, whoami);
   dout(20) << " trace added " << *dn->get_dir() << dendl;
 
   in = dn->get_dir()->get_inode();
@@ -1870,7 +1870,7 @@ void Server::handle_client_readdir(MDRequest *mdr)
 
   // build dir contents
   bufferlist dirbl, dnbl;
-  DirStat::encode(dirbl, dir, mds->get_nodeid());
+  dir->encode_dirstat(dirbl, mds->get_nodeid());
 
   __u32 numfiles = 0;
   for (CDir::map_t::iterator it = dir->begin(); 
@@ -1910,7 +1910,7 @@ void Server::handle_client_readdir(MDRequest *mdr)
     mds->locker->issue_client_lease(dn, client, dnbl, mdr->now, mdr->session);
 
     // inode
-    InodeStat::encode(dnbl, in);
+    in->encode_inodestat(dnbl);
     mds->locker->issue_client_lease(in, client, dnbl, mdr->now, mdr->session);
     numfiles++;
 
index 169965e16af3901c90fc798b68f454694e807ade..ff8531ead5a816430726f8968a167a75c3a2441e 100644 (file)
@@ -62,7 +62,8 @@ void SessionMap::load(Context *onload)
        waiting_for_load.push_back(onload);
   
   C_SM_Load *c = new C_SM_Load(this);
-  mds->filer->read(inode.ino, &inode.layout,
+  vector<snapid_t> snaps;
+  mds->filer->read(inode.ino, &inode.layout, snaps,
                    0, ceph_file_layout_su(inode.layout),
                    &c->bl, 0,
                    c);
@@ -112,7 +113,8 @@ void SessionMap::save(Context *onsave, version_t needv)
   init_inode();
   encode(bl);
   committing = version;
-  mds->filer->write(inode.ino, &inode.layout,
+  vector<snapid_t> snaps;
+  mds->filer->write(inode.ino, &inode.layout, snaps,
                     0, bl.length(), bl,
                     0,
                    0, new C_SM_Save(this, version));
index 8cf9a34ef6badfc27e7d88dd8f618fdbd7a547b2..d4194f4f9e31988051ee1352611b4ef579255bf2 100644 (file)
@@ -53,6 +53,23 @@ using namespace std;
 
 
 
+typedef __u32 capseq_t;
+
+inline string cap_string(int cap)
+{
+  string s;
+  s = "[";
+  if (cap & CEPH_CAP_PIN) s += " pin";
+  if (cap & CEPH_CAP_RDCACHE) s += " rdcache";
+  if (cap & CEPH_CAP_RD) s += " rd";
+  if (cap & CEPH_CAP_WR) s += " wr";
+  if (cap & CEPH_CAP_WRBUFFER) s += " wrbuffer";
+  if (cap & CEPH_CAP_WRBUFFER) s += " wrextend";
+  if (cap & CEPH_CAP_LAZYIO) s += " lazyio";
+  if (cap & CEPH_CAP_EXCL) s += " excl";
+  s += " ]";
+  return s;
+}
 
 
 struct frag_info_t {
index 6705f55db50fc618786d0defbefe5a150ed263d2..8fdda35a5d93fb29b4b0b3f9bb1f8b594170eab0 100644 (file)
 #include "MClientRequest.h"
 
 #include "msg/Message.h"
-#include "mds/CInode.h"
-#include "mds/CDir.h"
-#include "mds/CDentry.h"
 
 #include <vector>
 using namespace std;
 
-class CInode;
-
 /***
  *
  * MClientReply - container message for MDS reply to a client's MClientRequest
@@ -82,22 +77,7 @@ struct DirStat {
     ::decode(dist, p);
   }
 
-  static void encode(bufferlist& bl, CDir *dir, int whoami) {
-    /*
-     * note: encoding matches struct ceph_client_reply_dirfrag
-     */
-    frag_t frag = dir->get_frag();
-    __s32 auth;
-    set<__s32> dist;
-    
-    auth = dir->get_dir_auth().first;
-    if (dir->is_auth()) 
-      dir->get_dist_spec(dist, whoami);
-
-    ::encode(frag, bl);
-    ::encode(auth, bl);
-    ::encode(dist, bl);
-  }  
+  // see CDir::encode_dirstat for encoder.
 };
 
 struct InodeStat {
@@ -163,51 +143,8 @@ struct InodeStat {
       ::decode(xattrs, q);
     }
   }
-
-  static void encode(bufferlist &bl, CInode *in) {
-    /*
-     * note: encoding matches struct ceph_client_reply_inode
-     */
-    struct ceph_mds_reply_inode e;
-    memset(&e, 0, sizeof(e));
-    e.ino = in->inode.ino;
-    e.version = in->inode.version;
-    e.layout = in->inode.layout;
-    in->inode.ctime.encode_timeval(&e.ctime);
-    in->inode.mtime.encode_timeval(&e.mtime);
-    in->inode.atime.encode_timeval(&e.atime);
-    e.time_warp_seq = in->inode.time_warp_seq;
-    e.mode = in->inode.mode;
-    e.uid = in->inode.uid;
-    e.gid = in->inode.gid;
-    e.nlink = in->inode.nlink;
-    e.size = in->inode.size;
-    e.max_size = in->inode.max_size;
-
-    e.files = in->inode.dirstat.nfiles;
-    e.subdirs = in->inode.dirstat.nsubdirs;
-    in->inode.dirstat.rctime.encode_timeval(&e.rctime);
-    e.rbytes = in->inode.dirstat.rbytes;
-    e.rfiles = in->inode.dirstat.rfiles;
-    e.rsubdirs = in->inode.dirstat.rsubdirs;
-
-    e.rdev = in->inode.rdev;
-    e.fragtree.nsplits = in->dirfragtree._splits.size();
-    ::encode(e, bl);
-    for (map<frag_t,int32_t>::iterator p = in->dirfragtree._splits.begin();
-        p != in->dirfragtree._splits.end();
-        p++) {
-      ::encode(p->first, bl);
-      ::encode(p->second, bl);
-    }
-    ::encode(in->symlink, bl);
-
-    bufferlist xbl;
-    if (!in->xattrs.empty())
-      ::encode(in->xattrs, xbl);
-    ::encode(xbl, bl);
-  }
   
+  // see CInode::encode_inodestat for encoder.
 };
 
 
index 8ce281cb2193fec35849f3caabcca9a3c9eb1fe4..5ee40702112116356746fc06c1776ff97bf2bc8f 100644 (file)
@@ -45,6 +45,7 @@ public:
 
 int Filer::probe(inodeno_t ino,
                 ceph_file_layout *layout,
+                vector<snapid_t> &snaps,
                 __u64 start_from,
                 __u64 *end,           // LB, when !fwd
                 bool fwd,
@@ -56,7 +57,7 @@ int Filer::probe(inodeno_t ino,
           << " starting from " << start_from
           << dendl;
 
-  Probe *probe = new Probe(ino, *layout, start_from, end, flags, fwd, onfinish);
+  Probe *probe = new Probe(ino, *layout, 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);
@@ -92,7 +93,7 @@ void Filer::_probe(Probe *probe)
        p++) {
     dout(10) << "_probe  probing " << p->oid << dendl;
     C_Probe *c = new C_Probe(this, probe, p->oid);
-    probe->ops[p->oid] = objecter->stat(p->oid, &c->size, p->layout, probe->flags, c);
+    probe->ops[p->oid] = objecter->stat(p->oid, &c->size, p->layout, probe->snaps, probe->flags, c);
   }
 }
 
index 043b62f18cbcdf1e46a0b876ef920d0f44ca69f5..80a5aa877e28d0b93e3abbd403a4bb75982fb555 100644 (file)
@@ -52,6 +52,7 @@ class Filer {
   struct Probe {
     inodeno_t ino;
     ceph_file_layout layout;
+    vector<snapid_t> snaps;
     __u64 from;        // for !fwd, this is start of extent we are probing, thus possibly < our endpoint.
     __u64 *end;
     int flags;
@@ -66,8 +67,8 @@ class Filer {
     map<object_t, __u64> known;
     map<object_t, tid_t> ops;
 
-    Probe(inodeno_t i, ceph_file_layout &l, __u64 f, __u64 *e, int fl, bool fw, Context *c) : 
-      ino(i), layout(l), from(f), end(e), flags(fl), fwd(fw), onfinish(c), probing_len(0) {}
+    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) {}
   };
   
   class C_Probe;
@@ -87,27 +88,30 @@ class Filer {
   /*** async file interface ***/
   Objecter::OSDRead *prepare_read(inodeno_t ino,
                                  ceph_file_layout *layout,
+                                 vector<snapid_t>& snaps,
                                  __u64 offset, 
                                  size_t len, 
                                  bufferlist *bl, 
                                  int flags) {
-    Objecter::OSDRead *rd = objecter->prepare_read(bl, flags);
+    Objecter::OSDRead *rd = objecter->prepare_read(snaps, bl, flags);
     file_to_extents(ino, layout, offset, len, rd->extents);
     return rd;
   }
   int read(inodeno_t ino,
           ceph_file_layout *layout,
+          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, offset, len, bl, flags);
+    Objecter::OSDRead *rd = prepare_read(ino, layout, 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,
            __u64 offset, 
             size_t len, 
             bufferlist& bl,
@@ -115,31 +119,33 @@ class Filer {
             Context *onack,
             Context *oncommit,
            objectrev_t rev=0) {
-    Objecter::OSDWrite *wr = objecter->prepare_write(bl, flags);
+    Objecter::OSDWrite *wr = objecter->prepare_write(snaps, bl, flags);
     file_to_extents(ino, layout, offset, len, wr->extents, rev);
     return objecter->modifyx(wr, onack, oncommit) > 0 ? 0:-1;
   }
 
   int zero(inodeno_t ino,
           ceph_file_layout *layout,
+          vector<snapid_t>& snaps,
           __u64 offset,
            size_t len,
           int flags,
            Context *onack,
            Context *oncommit) {
-    Objecter::OSDModify *z = objecter->prepare_modify(CEPH_OSD_OP_ZERO, flags);
+    Objecter::OSDModify *z = objecter->prepare_modify(snaps, CEPH_OSD_OP_ZERO, flags);
     file_to_extents(ino, layout, 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,
             __u64 offset,
             size_t len,
             int flags,
             Context *onack,
             Context *oncommit) {
-    Objecter::OSDModify *z = objecter->prepare_modify(CEPH_OSD_OP_DELETE, flags);
+    Objecter::OSDModify *z = objecter->prepare_modify(snaps, CEPH_OSD_OP_DELETE, flags);
     file_to_extents(ino, layout, offset, len, z->extents);
     return objecter->modifyx(z, onack, oncommit) > 0 ? 0:-1;
   }
@@ -151,6 +157,7 @@ class Filer {
    */
   int probe(inodeno_t ino,
            ceph_file_layout *layout,
+           vector<snapid_t> &snaps,
            __u64 start_from,
            __u64 *end,
            bool fwd,
index 8a9b1efdcc043d897945dcafee32e35747cd65c3..834ab237c0fc0ae97daead76cfc7c235fefb9985 100644 (file)
@@ -81,7 +81,8 @@ void Journaler::recover(Context *onread)
   dout(1) << "read_head" << dendl;
   state = STATE_READHEAD;
   C_ReadHead *fin = new C_ReadHead(this);
-  filer.read(ino, &layout, 0, sizeof(Header), &fin->bl, CEPH_OSD_OP_INCLOCK_FAIL, fin);
+  vector<snapid_t> snaps;
+  filer.read(ino, &layout, snaps, 0, sizeof(Header), &fin->bl, CEPH_OSD_OP_INCLOCK_FAIL, fin);
 }
 
 void Journaler::_finish_read_head(int r, bufferlist& bl)
@@ -112,7 +113,8 @@ void Journaler::_finish_read_head(int r, bufferlist& bl)
   // probe the log
   state = STATE_PROBING;
   C_ProbeEnd *fin = new C_ProbeEnd(this);
-  filer.probe(ino, &layout, h.write_pos, (__u64 *)&fin->end, true, CEPH_OSD_OP_INCLOCK_FAIL, fin);
+  vector<snapid_t> snaps;
+  filer.probe(ino, &layout, snaps, h.write_pos, (__u64 *)&fin->end, true, CEPH_OSD_OP_INCLOCK_FAIL, fin);
 }
 
 void Journaler::_finish_probe_end(int r, __s64 end)
@@ -168,7 +170,8 @@ void Journaler::write_head(Context *oncommit)
 
   bufferlist bl;
   ::encode(last_written, bl);
-  filer.write(ino, &layout, 0, bl.length(), bl, CEPH_OSD_OP_INCLOCK_FAIL, 
+  vector<snapid_t> snaps;
+  filer.write(ino, &layout, snaps, 0, bl.length(), bl, CEPH_OSD_OP_INCLOCK_FAIL, 
              NULL, 
              new C_WriteHead(this, last_written, oncommit));
 }
@@ -338,7 +341,8 @@ void Journaler::_do_flush()
   // submit write for anything pending
   // flush _start_ pos to _finish_flush
   utime_t now = g_clock.now();
-  filer.write(ino, &layout, flush_pos, len, write_buf, 
+  vector<snapid_t> snaps;
+  filer.write(ino, &layout, 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
@@ -526,7 +530,8 @@ void Journaler::_issue_read(__s64 len)
           << ", read pointers " << read_pos << "/" << received_pos << "/" << (requested_pos+len)
           << dendl;
   
-  filer.read(ino, &layout, requested_pos, len, &reading_buf, CEPH_OSD_OP_INCLOCK_FAIL,
+  vector<snapid_t> snaps;
+  filer.read(ino, &layout, snaps, requested_pos, len, &reading_buf, CEPH_OSD_OP_INCLOCK_FAIL,
             new C_Read(this));
   requested_pos += len;
 }
@@ -710,7 +715,8 @@ void Journaler::trim()
           << trimmed_pos << "/" << trimming_pos << "/" << expire_pos
           << dendl;
   
-  filer.remove(ino, &layout, trimming_pos, trim_to-trimming_pos, CEPH_OSD_OP_INCLOCK_FAIL, 
+  vector<snapid_t> snaps;
+  filer.remove(ino, &layout, snaps, trimming_pos, trim_to-trimming_pos, CEPH_OSD_OP_INCLOCK_FAIL, 
               NULL, new C_Trim(this, trim_to));
   trimming_pos = trim_to;  
 }
index 195e0a26984debf25514c444d26d509bb61b0907..ba6a8ee93f1b2afbcd206188e5ea3495171a0a17 100644 (file)
@@ -401,8 +401,9 @@ void ObjectCacher::bh_read(BufferHead *bh)
   C_ReadFinish *onfinish = new C_ReadFinish(this, bh->ob->get_oid(), bh->start(), bh->length());
 
   // go
-  objecter->read(bh->ob->get_oid(), bh->start(), bh->length(), bh->ob->get_layout(), &onfinish->bl, 0,
-                 onfinish);
+  #warning bleh
+  //objecter->read(bh->ob->get_oid(), bh->start(), bh->length(), bh->ob->get_layout(), &onfinish->bl, 0,
+  //onfinish);
 }
 
 void ObjectCacher::bh_read_finish(object_t oid, off_t start, size_t length, bufferlist &bl)
@@ -490,8 +491,11 @@ void ObjectCacher::bh_write(BufferHead *bh)
   C_WriteCommit *oncommit = new C_WriteCommit(this, bh->ob->get_oid(), bh->start(), bh->length());
 
   // go
-  tid_t tid = objecter->write(bh->ob->get_oid(), bh->start(), bh->length(), bh->ob->get_layout(), bh->bl, 0,
-                              onack, oncommit);
+  tid_t tid = 
+    0;
+  #warning bleh
+  //objecter->write(bh->ob->get_oid(), bh->start(), bh->length(), bh->ob->get_layout(), bh->bl, 0,
+  //                          onack, oncommit);
 
   // set bh last_write_tid
   onack->tid = tid;
@@ -1135,8 +1139,9 @@ void ObjectCacher::rdlock(Object *o)
     
     commit->tid = 
       ack->tid = 
-      o->last_write_tid = 
-      objecter->lock(CEPH_OSD_OP_RDLOCK, o->get_oid(), 0, o->get_layout(), ack, commit);
+      o->last_write_tid = 0;
+  #warning bleh 
+    //     objecter->lock(CEPH_OSD_OP_RDLOCK, o->get_oid(), 0, o->get_layout(), ack, commit);
   }
   
   // stake our claim.
@@ -1180,7 +1185,9 @@ void ObjectCacher::wrlock(Object *o)
     commit->tid = 
       ack->tid = 
       o->last_write_tid = 
-      objecter->lock(op, o->get_oid(), 0, o->get_layout(), ack, commit);
+      0;
+  #warning bleh
+    //objecter->lock(op, o->get_oid(), 0, o->get_layout(), ack, commit);
   }
   
   // stake our claim.
@@ -1224,7 +1231,9 @@ void ObjectCacher::rdunlock(Object *o)
   commit->tid = 
     lockack->tid = 
     o->last_write_tid = 
-    objecter->lock(CEPH_OSD_OP_RDUNLOCK, o->get_oid(), 0, o->get_layout(), lockack, commit);
+    0;
+  #warning bleh
+  //objecter->lock(CEPH_OSD_OP_RDUNLOCK, o->get_oid(), 0, o->get_layout(), lockack, commit);
 }
 
 void ObjectCacher::wrunlock(Object *o)
@@ -1257,7 +1266,9 @@ void ObjectCacher::wrunlock(Object *o)
   commit->tid = 
     lockack->tid = 
     o->last_write_tid = 
-    objecter->lock(op, o->get_oid(), 0, o->get_layout(), lockack, commit);
+    0;
+  #warning bleh
+  //objecter->lock(op, o->get_oid(), 0, o->get_layout(), lockack, commit);
 }
 
 
index 2f45ba7c903206c5554b31c6c55c3215e59d4f78..dda4097305edab9f82c3a8096192de18689f3893 100644 (file)
@@ -136,15 +136,15 @@ class ObjectCacher {
       last_write_tid(0), last_ack_tid(0), last_commit_tid(0),
       lock_state(LOCK_NONE), wrlock_ref(0), rdlock_ref(0)
       {}
-       ~Object() {
-         assert(data.empty());
-       }
+    ~Object() {
+      assert(data.empty());
+    }
 
     object_t get_oid() { return oid; }
     inodeno_t get_ino() { return ino; }
-
-       ceph_object_layout& get_layout() { return layout; }
-       void set_layout(ceph_object_layout& l) { layout = l; }
+    
+    ceph_object_layout& get_layout() { return layout; }
+    void set_layout(ceph_object_layout& l) { layout = l; }
 
     bool can_close() {
       return data.empty() && lock_state == LOCK_NONE &&
@@ -484,21 +484,21 @@ class ObjectCacher {
   // file functions
 
   /*** async+caching (non-blocking) file interface ***/
-  int file_read(inodeno_t ino, ceph_file_layout *layout,
+  int file_read(inodeno_t ino, ceph_file_layout *layout, vector<snapid_t> &snaps,
                 off_t offset, size_t len, 
                 bufferlist *bl,
                int flags,
                 Context *onfinish) {
-    Objecter::OSDRead *rd = objecter->prepare_read(bl, flags);
+    Objecter::OSDRead *rd = objecter->prepare_read(snaps, bl, flags);
     filer.file_to_extents(ino, layout, offset, len, rd->extents);
     return readx(rd, ino, onfinish);
   }
 
-  int file_write(inodeno_t ino, ceph_file_layout *layout,
+  int file_write(inodeno_t ino, ceph_file_layout *layout, vector<snapid_t> &snaps,
                  off_t offset, size_t len, 
                  bufferlist& bl, int flags,
                 objectrev_t rev=0) {
-    Objecter::OSDWrite *wr = objecter->prepare_write(bl, flags);
+    Objecter::OSDWrite *wr = objecter->prepare_write(snaps, bl, flags);
     filer.file_to_extents(ino, layout, offset, len, wr->extents);
     return writex(wr, ino);
   }
@@ -507,21 +507,21 @@ class ObjectCacher {
 
   /*** sync+blocking file interface ***/
   
-  int file_atomic_sync_read(inodeno_t ino, ceph_file_layout *layout,
+  int file_atomic_sync_read(inodeno_t ino, ceph_file_layout *layout, vector<snapid_t> &snaps,
                             off_t offset, size_t len, 
                             bufferlist *bl, int flags,
                             Mutex &lock) {
-    Objecter::OSDRead *rd = objecter->prepare_read(bl, flags);
+    Objecter::OSDRead *rd = objecter->prepare_read(snaps, bl, flags);
     filer.file_to_extents(ino, layout, offset, len, rd->extents);
     return atomic_sync_readx(rd, ino, lock);
   }
 
-  int file_atomic_sync_write(inodeno_t ino, ceph_file_layout *layout,
+  int file_atomic_sync_write(inodeno_t ino, ceph_file_layout *layout, vector<snapid_t> &snaps,
                              off_t offset, size_t len, 
                              bufferlist& bl, int flags,
                              Mutex &lock,
                             objectrev_t rev=0) {
-    Objecter::OSDWrite *wr = objecter->prepare_write(bl, flags);
+    Objecter::OSDWrite *wr = objecter->prepare_write(snaps, bl, flags);
     filer.file_to_extents(ino, layout, offset, len, wr->extents);
     return atomic_sync_writex(wr, ino, lock);
   }
index be8ddc3ec0ff0e21721a294558dd405b2f97105f..acc9ef1f1b69421e9410aa087188f0d7bb35253b 100644 (file)
@@ -336,9 +336,9 @@ void Objecter::handle_osd_op_reply(MOSDOpReply *m)
 
 // stat -----------------------------------
 
-tid_t Objecter::stat(object_t oid, __u64 *size, ceph_object_layout ol, int flags, Context *onfinish)
+tid_t Objecter::stat(object_t oid, __u64 *size, ceph_object_layout ol, vector<snapid_t>& snaps, int flags, Context *onfinish)
 {
-  OSDStat *st = prepare_stat(size, flags);
+  OSDStat *st = prepare_stat(snaps, size, flags);
   st->extents.push_back(ObjectExtent(oid, 0, 0));
   st->extents.front().layout = ol;
   st->onfinish = onfinish;
@@ -451,10 +451,10 @@ void Objecter::handle_osd_stat_reply(MOSDOpReply *m)
 // read -----------------------------------
 
 
-tid_t Objecter::read(object_t oid, __u64 off, size_t len, ceph_object_layout ol, bufferlist *bl, int flags, 
+tid_t Objecter::read(object_t oid, __u64 off, size_t len, ceph_object_layout ol, vector<snapid_t> &snaps, bufferlist *bl, int flags, 
                      Context *onfinish)
 {
-  OSDRead *rd = prepare_read(bl, flags);
+  OSDRead *rd = prepare_read(snaps, bl, flags);
   rd->extents.push_back(ObjectExtent(oid, off, len));
   rd->extents.front().layout = ol;
   readx(rd, onfinish);
@@ -708,10 +708,10 @@ void Objecter::handle_osd_read_reply(MOSDOpReply *m)
 
 // write ------------------------------------
 
-tid_t Objecter::write(object_t oid, __u64 off, size_t len, ceph_object_layout ol, bufferlist &bl, int flags,
+tid_t Objecter::write(object_t oid, __u64 off, size_t len, ceph_object_layout ol, vector<snapid_t> &snaps, bufferlist &bl, int flags,
                       Context *onack, Context *oncommit)
 {
-  OSDWrite *wr = prepare_write(bl, flags);
+  OSDWrite *wr = prepare_write(snaps, bl, flags);
   wr->extents.push_back(ObjectExtent(oid, off, len));
   wr->extents.front().layout = ol;
   wr->extents.front().buffer_extents[0] = len;
@@ -722,10 +722,10 @@ tid_t Objecter::write(object_t oid, __u64 off, size_t len, ceph_object_layout ol
 
 // zero
 
-tid_t Objecter::zero(object_t oid, __u64 off, size_t len, ceph_object_layout ol, int flags, 
+tid_t Objecter::zero(object_t oid, __u64 off, size_t len, ceph_object_layout ol, vector<snapid_t> &snaps, int flags, 
                      Context *onack, Context *oncommit)
 {
-  OSDModify *z = prepare_modify(CEPH_OSD_OP_ZERO, flags);
+  OSDModify *z = prepare_modify(snaps, CEPH_OSD_OP_ZERO, flags);
   z->extents.push_back(ObjectExtent(oid, off, len));
   z->extents.front().layout = ol;
   modifyx(z, onack, oncommit);
@@ -735,10 +735,10 @@ tid_t Objecter::zero(object_t oid, __u64 off, size_t len, ceph_object_layout ol,
 
 // lock ops
 
-tid_t Objecter::lock(int op, object_t oid, int flags, ceph_object_layout ol, 
+tid_t Objecter::lock(int op, object_t oid, int flags, ceph_object_layout ol, vector<snapid_t> &snaps,
                      Context *onack, Context *oncommit)
 {
-  OSDModify *l = prepare_modify(op, flags);
+  OSDModify *l = prepare_modify(snaps, op, flags);
   l->extents.push_back(ObjectExtent(oid, 0, 0));
   l->extents.front().layout = ol;
   modifyx(l, onack, oncommit);
index 2727849b31610bb503631b222982eb392d21729e..04efaaaf577ced310cd88e311a9e96d87fae0e36 100644 (file)
@@ -71,8 +71,9 @@ class Objecter {
   class OSDOp {
   public:
     list<ObjectExtent> extents;
+    vector<snapid_t> snaps;
     int inc_lock;
-    OSDOp() : inc_lock(0) {}
+    OSDOp(vector<snapid_t>& s) : snaps(s), inc_lock(0) {}
     virtual ~OSDOp() {}
   };
 
@@ -84,13 +85,13 @@ class Objecter {
     map<object_t, bufferlist*> read_data;  // bits of data as they come back
     int flags;
 
-    OSDRead(bufferlist *b, int f) : bl(b), onfinish(0), flags(f) {
+    OSDRead(vector<snapid_t> &s, bufferlist *b, int f) : OSDOp(s), bl(b), onfinish(0), flags(f) {
       bl->clear();
     }
   };
 
-  OSDRead *prepare_read(bufferlist *b, int f) {
-    return new OSDRead(b, f);
+  OSDRead *prepare_read(vector<snapid_t>& snaps, bufferlist *b, int f) {
+    return new OSDRead(snaps, b, f);
   }
 
   class OSDStat : public OSDOp {
@@ -99,11 +100,11 @@ class Objecter {
     __u64 *size;  // where the size goes.
     int flags;
     Context *onfinish;
-    OSDStat(__u64 *s, int f) : tid(0), size(s), flags(f), onfinish(0) { }
+    OSDStat(vector<snapid_t> &sn, __u64 *s, int f) : OSDOp(sn), tid(0), size(s), flags(f), onfinish(0) { }
   };
 
-  OSDStat *prepare_stat(__u64 *s, int f) {
-    return new OSDStat(s, f);
+  OSDStat *prepare_stat(vector<snapid_t>& snaps, __u64 *s, int f) {
+    return new OSDStat(snaps, s, f);
   }
 
   // generic modify
@@ -118,22 +119,22 @@ class Objecter {
     map<tid_t, eversion_t>   tid_version;
     map<tid_t, ObjectExtent> waitfor_commit;
 
-    OSDModify(int o, int f) : op(o), flags(f), onack(0), oncommit(0) {}
+    OSDModify(vector<snapid_t>& sn, int o, int f) : OSDOp(sn) ,op(o), flags(f), onack(0), oncommit(0) {}
   };
 
-  OSDModify *prepare_modify(int o, int f) { 
-    return new OSDModify(o, f); 
+  OSDModify *prepare_modify(vector<snapid_t>& snaps, int o, int f) { 
+    return new OSDModify(snaps, o, f); 
   }
   
   // write (includes the bufferlist)
   class OSDWrite : public OSDModify {
   public:
     bufferlist bl;
-    OSDWrite(bufferlist &b, int f) : OSDModify(CEPH_OSD_OP_WRITE, f), bl(b) {}
+    OSDWrite(vector<snapid_t>& sn, bufferlist &b, int f) : OSDModify(sn, CEPH_OSD_OP_WRITE, f), bl(b) {}
   };
 
-  OSDWrite *prepare_write(bufferlist &b, int f) { 
-    return new OSDWrite(b, f); 
+  OSDWrite *prepare_write(vector<snapid_t>& snaps, bufferlist &b, int f) { 
+    return new OSDWrite(snaps, b, f); 
   }
 
   
@@ -235,15 +236,15 @@ class Objecter {
   tid_t modifyx(OSDModify *wr, Context *onack, Context *oncommit);
 
   // even lazier
-  tid_t read(object_t oid, __u64 off, size_t len, ceph_object_layout ol, bufferlist *bl, int flags,
+  tid_t read(object_t oid, __u64 off, size_t len, ceph_object_layout ol, vector<snapid_t>& snaps, bufferlist *bl, int flags,
              Context *onfinish);
-  tid_t write(object_t oid, __u64 off, size_t len, ceph_object_layout ol, bufferlist &bl, int flags,
+  tid_t write(object_t oid, __u64 off, size_t len, ceph_object_layout ol, vector<snapid_t>& snaps, bufferlist &bl, int flags,
               Context *onack, Context *oncommit);
-  tid_t zero(object_t oid, __u64 off, size_t len, ceph_object_layout ol, int flags,
+  tid_t zero(object_t oid, __u64 off, size_t len, ceph_object_layout ol, vector<snapid_t>& snaps, int flags,
              Context *onack, Context *oncommit);
-  tid_t stat(object_t oid, __u64 *size, ceph_object_layout ol, int flags, Context *onfinish);
+  tid_t stat(object_t oid, __u64 *size, ceph_object_layout ol, vector<snapid_t>& snaps, int flags, Context *onfinish);
   
-  tid_t lock(int op, object_t oid, int flags, ceph_object_layout ol, Context *onack, Context *oncommit);
+  tid_t lock(int op, object_t oid, int flags, ceph_object_layout ol, vector<snapid_t>& snaps, Context *onack, Context *oncommit);
 
 
   void ms_handle_failure(Message *m, entity_name_t dest, const entity_inst_t& inst);