]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: do split in mksnap
authorSage Weil <sage@newdream.net>
Wed, 13 Aug 2008 19:27:00 +0000 (12:27 -0700)
committerSage Weil <sage@newdream.net>
Wed, 13 Aug 2008 19:37:21 +0000 (12:37 -0700)
src/mds/CInode.cc
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/Server.cc

index 47d2904334f89df8e7e6a8299e87dc7ce42fcdf2..cd27a403d59047b071a71a32f0d8631b2fe9a749 100644 (file)
@@ -845,11 +845,8 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
       if (snaprealm)
        seq = snaprealm->seq;
       decode_snap(p);
-      if (snaprealm && snaprealm->seq != seq) {
-       if (!seq)
-         mdcache->do_realm_split_notify(this);
-       mdcache->do_realm_invalidate_and_update_notify(this, CEPH_SNAP_OP_UPDATE);
-      }
+      if (snaprealm && snaprealm->seq != seq)
+       mdcache->do_realm_invalidate_and_update_notify(this, seq ? CEPH_SNAP_OP_UPDATE:CEPH_SNAP_OP_SPLIT);
     }
     break;
 
index 58a42cfdeeb49147ef6eec029a61c6835bc5ae04..1f63efd39922bd9476d82f1157fe8abca5746040 100644 (file)
@@ -6119,57 +6119,23 @@ void MDCache::snaprealm_create(MDRequest *mdr, CInode *in)
 }
 
 
-void MDCache::do_realm_split_notify(CInode *in)
+void MDCache::do_realm_invalidate_and_update_notify(CInode *in, int snapop)
 {
-  dout(10) << "do_realm_split_notify " << *in->snaprealm << " " << *in << dendl;
-  
-  // notify clients of update|split
-  vector<inodeno_t> split_inos;
-  for (xlist<CInode*>::iterator p = in->snaprealm->inodes_with_caps.begin(); !p.end(); ++p)
-    split_inos.push_back((*p)->ino());
+  dout(10) << "do_realm_invalidate_and_update_notify " << *in->snaprealm << " " << *in << dendl;
 
+  vector<inodeno_t> split_inos;
   vector<inodeno_t> split_realms;
-  for (set<SnapRealm*>::iterator p = in->snaprealm->open_children.begin();
-       p != in->snaprealm->open_children.end();
-       p++)
-    split_realms.push_back((*p)->inode->ino());
-  
-  bufferlist snapbl;
-  in->snaprealm->build_snap_trace(snapbl);
-
-  map<int, MClientSnap*> updates;
-  
-  // send splits for all clients with caps in this _or nested_ realms.
-  list<SnapRealm*> q;
-  q.push_back(in->snaprealm);
-  while (!q.empty()) {
-    SnapRealm *realm = q.front();
-    q.pop_front();
 
-    for (map<int, xlist<Capability*> >::iterator p = realm->client_caps.begin();
-        p != realm->client_caps.end();
-        p++) {
-      assert(!p->second.empty());
-      MClientSnap *update = updates[p->first] = new MClientSnap(CEPH_SNAP_OP_SPLIT);
-      update->head.split = in->ino();
-      update->split_inos = split_inos;
-      update->split_realms = split_realms;
-      update->bl = snapbl;
-      updates[p->first] = update;
-    }
-
-    for (set<SnapRealm*>::iterator p = realm->open_children.begin();
-        p != realm->open_children.end();
+  if (snapop == CEPH_SNAP_OP_SPLIT) {
+    // notify clients of update|split
+    for (xlist<CInode*>::iterator p = in->snaprealm->inodes_with_caps.begin(); !p.end(); ++p)
+      split_inos.push_back((*p)->ino());
+    
+    for (set<SnapRealm*>::iterator p = in->snaprealm->open_children.begin();
+        p != in->snaprealm->open_children.end();
         p++)
-      q.push_back(*p);   
+      split_realms.push_back((*p)->inode->ino());
   }
-  
-  send_snaps(updates);
-}
-
-void MDCache::do_realm_invalidate_and_update_notify(CInode *in, int snapop)
-{
-  dout(10) << "do_realm_invalidate_and_update_notify " << *in->snaprealm << " " << *in << dendl;
 
   bufferlist snapbl;
   in->snaprealm->build_snap_trace(snapbl);
@@ -6181,8 +6147,7 @@ void MDCache::do_realm_invalidate_and_update_notify(CInode *in, int snapop)
     SnapRealm *realm = q.front();
     q.pop_front();
 
-    dout(10) << " realm " << *realm
-            << " on " << *realm->inode << dendl;
+    dout(10) << " realm " << *realm << " on " << *realm->inode << dendl;
     realm->invalidate_cached_snaps();
 
     for (map<int, xlist<Capability*> >::iterator p = realm->client_caps.begin();
@@ -6190,8 +6155,12 @@ void MDCache::do_realm_invalidate_and_update_notify(CInode *in, int snapop)
         p++) {
       assert(!p->second.empty());
       if (updates.count(p->first) == 0) {
-       MClientSnap *update = updates[p->first] = new MClientSnap(snapop);
+       MClientSnap *update = new MClientSnap(snapop);
+       update->head.split = in->ino();
+       update->split_inos = split_inos;
+       update->split_realms = split_realms;
        update->bl = snapbl;
+       updates[p->first] = update;
       }
     }
 
@@ -6227,7 +6196,7 @@ void MDCache::_snaprealm_create_finish(MDRequest *mdr, Mutation *mut, CInode *in
   in->open_snaprealm();
   in->snaprealm->seq = in->snaprealm->created = seq;
 
-  do_realm_split_notify(in);
+  do_realm_invalidate_and_update_notify(in, CEPH_SNAP_OP_SPLIT);
 
   /*
   static int count = 5;
index 8267f4112eb6cb7611dc7c350f431b4da80437d6..4d9db10884211faa90cf84f3f85b588a9e6cd5d7 100644 (file)
@@ -666,7 +666,6 @@ public:
   void process_reconnected_caps();
   void prepare_realm_split(SnapRealm *realm, int client, inodeno_t ino,
                           map<int,MClientSnap*>& splits);
-  void do_realm_split_notify(CInode *in);
   void do_realm_invalidate_and_update_notify(CInode *in, int snapop);
   void send_snaps(map<int,MClientSnap*>& splits);
   void rejoin_import_cap(CInode *in, int client, ceph_mds_cap_reconnect& icr, int frommds);
index 7e32a88ba90e2dce704db777e6c24e5c6856e1c0..0d2dabc266c0ed5f00804a855b8689d495c80d24 100644 (file)
@@ -3018,7 +3018,7 @@ void Server::_unlink_local_finish(MDRequest *mdr,
     }
     straydn->inode->snaprealm->add_past_parent(oldparent);
     if (isnew)
-      mdcache->do_realm_split_notify(straydn->inode);
+      mdcache->do_realm_invalidate_and_update_notify(straydn->inode, CEPH_SNAP_OP_SPLIT);
   }
 
   dn->mark_dirty(dnpv, mdr->ls);  
@@ -5025,13 +5025,6 @@ void Server::handle_client_mksnap(MDRequest *mdr)
   if (mdr->now == utime_t())
     mdr->now = g_clock.now();
 
-
-  // create snaprealm?
-  if (!diri->snaprealm) {
-    mds->mdcache->snaprealm_create(mdr, diri);
-    return;
-  }
-
   // allocate a snapid
   if (!mdr->more()->stid) {
     // prepare an stid
@@ -5067,6 +5060,12 @@ void Server::handle_client_mksnap(MDRequest *mdr)
   
   // project the snaprealm.. hack!
   bufferlist snapbl;
+  bool newrealm = false;
+  if (!diri->snaprealm) {
+    newrealm = true;
+    diri->open_snaprealm(true);
+    diri->snaprealm->created = snapid;
+  }
   snapid_t old_seq = diri->snaprealm->seq;
   snapid_t old_lc = diri->snaprealm->last_created;
   diri->snaprealm->snaps[snapid] = info;
@@ -5076,6 +5075,9 @@ void Server::handle_client_mksnap(MDRequest *mdr)
   diri->snaprealm->snaps.erase(snapid);
   diri->snaprealm->seq = old_seq;
   diri->snaprealm->last_created = old_lc;
+  if (newrealm)
+    diri->close_snaprealm(true);
+  
   le->metablob.add_primary_dentry(diri->get_projected_parent_dn(), true, 0, pi, 0, &snapbl);
 
   mdlog->submit_entry(le, new C_MDS_mksnap_finish(mds, mdr, diri, info));
@@ -5092,12 +5094,18 @@ void Server::_mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info)
 
   // create snap
   snapid_t snapid = info.snapid;
+  int op = CEPH_SNAP_OP_CREATE;
+  if (!diri->snaprealm) {
+    diri->open_snaprealm();
+    diri->snaprealm->created = snapid;
+    op = CEPH_SNAP_OP_SPLIT;
+  }
   diri->snaprealm->snaps[snapid] = info;
   diri->snaprealm->seq = snapid;
   diri->snaprealm->last_created = snapid;
   dout(10) << "snaprealm now " << *diri->snaprealm << dendl;
 
-  mdcache->do_realm_invalidate_and_update_notify(diri, CEPH_SNAP_OP_CREATE);
+  mdcache->do_realm_invalidate_and_update_notify(diri, op);
 
   // yay
   mdr->ref = diri;