]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: create initial states after quorum is formed
authorSage Weil <sage@newdream.net>
Fri, 11 Nov 2011 19:01:50 +0000 (11:01 -0800)
committerSage Weil <sage@newdream.net>
Fri, 11 Nov 2011 19:41:42 +0000 (11:41 -0800)
Signed-off-by: Sage Weil <sage@newdream.net>
src/auth/cephx/CephxKeyServer.h
src/mon/AuthMonitor.cc
src/mon/Monitor.cc
src/mon/PaxosService.cc

index 949ea5bfaaebaa0aa6e78dcb32e3698d3d66fb8d..fafeaa864875c14303a54374a909cf910f74724e 100644 (file)
@@ -71,6 +71,10 @@ struct KeyServerData {
     return (secrets.find(name) != secrets.end());
   }
 
+  void clear_secrets() {
+    secrets.clear();
+  }
+
   void add_auth(const EntityName& name, EntityAuth& auth) {
     secrets[name] = auth;
   }
@@ -149,6 +153,10 @@ struct KeyServerData {
     }
   };
 
+  void bootstrap_keyring(KeyRing& keyring) {
+    secrets = keyring.get_keys();
+  }
+
   void apply_incremental(Incremental& inc) {
     switch (inc.op) {
     case AUTH_INC_ADD:
@@ -229,6 +237,10 @@ public:
     return data.version;    
   }
 
+  void clear_secrets() {
+    data.clear_secrets();
+  }
+
   void apply_data_incremental(KeyServerData::Incremental& inc) {
     data.apply_incremental(inc);
   }
@@ -271,6 +283,11 @@ public:
   Mutex& get_lock() const { return lock; }
   bool get_service_caps(const EntityName& name, uint32_t service_id,
                        AuthCapsInfo& caps) const;
+
+  void bootstrap_keyring(KeyRing& keyring) {
+    data.bootstrap_keyring(keyring);
+  }
+
 };
 WRITE_CLASS_ENCODER(KeyServer);
 
index b2590f908e33ed7f0b1f2be6f0d159deac5de7aa..7acc13a16b3c44ca1f631160abf3f4a497932726 100644 (file)
@@ -137,6 +137,12 @@ bool AuthMonitor::update_from_paxos()
     bool success = paxos->read(keys_ver+1, bl);
     assert(success);
 
+    // reset if we are moving to initial state.  we will normally have
+    // keys in here temporarily for bootstrapping that we need to
+    // clear out.
+    if (keys_ver == 0) 
+      mon->key_server.clear_secrets();
+
     bufferlist::iterator p = bl.begin();
     __u8 v;
     ::decode(v, p);
index a0dfc6ad7f9f7e4fe2932e2961520ce769592afd..b85529a7814689623029aa742cf410f8d57f802e 100644 (file)
@@ -181,6 +181,18 @@ void Monitor::init()
   for (vector<PaxosService*>::iterator ps = paxos_service.begin(); ps != paxos_service.end(); ps++)
     (*ps)->update_from_paxos();
 
+  // we need to bootstrap authentication keys so we can form an
+  // initial quorum.
+  if (authmon()->paxos->get_version() == 0) {
+    dout(10) << "loading initial keyring to bootstrap authentication for mkfs" << dendl;
+    bufferlist bl;
+    store->get_bl_ss(bl, "mkfs", "keyring");
+    KeyRing keyring;
+    bufferlist::iterator p = bl.begin();
+    ::decode(keyring, p);
+    key_server.bootstrap_keyring(keyring);
+  }
+
   // i'm ready!
   messenger->add_dispatcher_tail(this);
   messenger->add_dispatcher_head(&clog);
@@ -1527,24 +1539,6 @@ int Monitor::mkfs(bufferlist& osdmapbl)
   ::encode(keyring, keyringbl);
   store->put_bl_ss(keyringbl, "mkfs", "keyring");
 
-
-  // do it
-  for (vector<PaxosService*>::iterator p = paxos_service.begin(); p != paxos_service.end(); p++) {
-    PaxosService *svc = *p;
-    if (!svc)
-      continue;
-    dout(10) << "initializing " << svc->get_machine_name() << dendl;
-    svc->paxos->init();
-    svc->create_pending();
-    svc->create_initial();
-    // commit to paxos
-    bufferlist bl;
-    svc->encode_pending(bl);
-    store->put_bl_sn(bl, svc->get_machine_name(), 1);
-    store->put_int(1, svc->get_machine_name(), "first_committed");
-    store->put_int(1, svc->get_machine_name(), "last_committed");
-  }
-
   return 0;
 }
 
index 552ffe973fdc1f08656a3766977d6ebe35e2efe2..d07637eead492b10223b071f232803f851ff080b 100644 (file)
@@ -185,6 +185,13 @@ void PaxosService::_active()
       create_pending();
       have_pending = true;
     }
+
+    if (paxos->get_version() == 0) {
+      // create initial state
+      create_initial();
+      propose_pending();
+      return;
+    }
   }
 
   on_active();