]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon:Added server-side handling of MPoolSnap.
authorGreg Farnum <gregf@hq.newdream.net>
Tue, 16 Jun 2009 21:22:32 +0000 (14:22 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Tue, 16 Jun 2009 21:22:32 +0000 (14:22 -0700)
Currently assumes it's a snap-create message.

src/messages/MPoolSnapReply.h
src/mon/Monitor.cc
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h

index a73031f908b6e917339c0912343e610c921e8907..63885173f86c8b6a3285d97a95b6e691fcb9dd57 100644 (file)
@@ -21,10 +21,12 @@ public:
   ceph_fsid_t fsid;
   tid_t tid;
   int replyCode;
+  int epoch;
+
 
   MPoolSnapReply() : Message(MSG_POOLSNAPREPLY) {}
-  MPoolSnapReply( ceph_fsid_t& f, tid_t t, int rc) :
-    Message(MSG_POOLSNAPREPLY), fsid(f), tid(t), replyCode(rc) {}
+  MPoolSnapReply( ceph_fsid_t& f, tid_t t, int rc, int e) :
+    Message(MSG_POOLSNAPREPLY), fsid(f), tid(t), replyCode(rc), epoch(e) {}
 
   const char *get_type_name() { return "poolsnapreply"; }
 
index a7e061fcb68e029efa19775b5d24b6eb1c4c8f3e..e6eb6cdb971ea5629e99bddfd436ccaea385f874 100644 (file)
@@ -419,6 +419,10 @@ bool Monitor::dispatch_impl(Message *m)
       paxos_service[PAXOS_PGMAP]->dispatch(m);
       break;
 
+    case MSG_POOLSNAP:
+      paxos_service[PAXOS_OSDMAP]->dispatch(m);
+      break;
+
       // log
     case MSG_LOG:
       paxos_service[PAXOS_LOG]->dispatch(m);
index fc8a5283a4bb772a6bf9907e9734b5b9655380dc..911b5b19983b5202c42b92fbcc70b02a33e09c14 100644 (file)
@@ -271,6 +271,9 @@ bool OSDMonitor::preprocess_query(Message *m)
     return preprocess_out((MOSDOut*)m);
     */
 
+  case MSG_POOLSNAP:
+    return preprocess_pool_snap((MPoolSnap*)m);
+
   case MSG_REMOVE_SNAPS:
     return preprocess_remove_snaps((MRemoveSnaps*)m);
     
@@ -301,6 +304,8 @@ bool OSDMonitor::prepare_update(Message *m)
   case MSG_OSD_OUT:
     return prepare_out((MOSDOut*)m);
     */
+  case MSG_POOLSNAP:
+    return prepare_pool_snap((MPoolSnap*)m);
 
   case MSG_REMOVE_SNAPS:
     return prepare_remove_snaps((MRemoveSnaps*)m);
@@ -1264,4 +1269,44 @@ out:
   return false;
 }
 
+bool OSDMonitor::preprocess_pool_snap ( MPoolSnap *m) {
+  if (m->pool < 0 ) {
+    ss << "unrecognized pool '" << m->pool << "'";
+    err = -ENOENT;
+    //create reply, set replyCode to badness
+    _pool_snap(m->fsid, m->tid, -1, pending_inc.epoch);
+    return true;
+  }
+  
+}
+
+bool OSDMonitor::prepare_pool_snap ( MPoolSnap *m) {
+  const pg_pool_t *p = &osdmap.get_pg_pool(m->pool);
+  pg_pool_t *pp = 0;
+  if (pending_inc.new_pools.count(pool)) pp = &pending_inc.new_pools[pool];
+  //if the snapname is already in use, we have a problem
+  if (p->snap_exists(m->name) ||
+      pp && pp->snap_exists(m->name)) {
+    ss << "pool " << m->pool << " snap " << m->name << " already exists";
+    err = -EEXIST;
+    _pool_snap(m->fsid, m->tid, -2, pending_inc.epoch);
+    return false;
+  } else {
+    if(!pp) {
+      pp = &pending_inc.new_pools[pool];
+      *pp = *p;
+    }
+    pp->add_snap(m->name, g_clock.now());
+    pp->set_snap_epoch(pending_inc.epoch);
+    ss << "created pool " << m->pool << " snap " << m->name;
+    getline(ss, rs);
+    paxos->wait_for_commit(new Monitor::C_Snap(mon, m, 0, pending_inc.epoch));
+    return true;
+  }
+}
 
+ void _pool_snap(ceph_fsid_t fsid, tid_t tid, int replyCode, int epoch) {
+   MPoolSnapReply *m = new MPoolSnapReply(fsid, tid, replyCode, epoch);
+   mon->messenger->send_message(m, m->get_orig_source_inst());
+   delete m;
+ }
index 2a93bda44b5ea6e624c2cb67c95788794f7de9da..502b25315b2e5695e574245d4d9efb6aefb9d03b 100644 (file)
@@ -83,6 +83,10 @@ private:
   bool prepare_alive(class MOSDAlive *m);
   void _alive(MOSDAlive *m);
 
+  bool preprocess_pool_snap ( class MPoolSnap *m);
+  bool prepare_pool_snap (MPoolSnap *m);
+  void _pool_snap(ceph_fsid_t fsid, tid_t tid, int replyCode, int epoch);
+
   struct C_Booted : public Context {
     OSDMonitor *cmon;
     MOSDBoot *m;
@@ -115,6 +119,17 @@ private:
        cmon->dispatch((Message*)m);
     }
   };
+  struct C_Snap : public Context {
+    OSDMonitor *osdmon;
+    MPoolSnap *m;
+    int replyCode;
+    int epoch;
+    C_Snap(OSDMonitor * osd, MPoolSnap *m_, int rc, int e) :
+      osdmon(osd), m(m_), replyCode(rc), epoch(e) {}
+    void finish(int r) {
+      osdmon->_pool_snap(m->fsid, m->tid, replyCode, epoch);
+    }
+  };
 
   bool preprocess_out(class MOSDOut *m);
   bool prepare_out(class MOSDOut *m);