]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
OSD: add session waiting_for_map mechanisms
authorSamuel Just <sam.just@inktank.com>
Fri, 8 Nov 2013 23:15:46 +0000 (15:15 -0800)
committerGreg Farnum <greg@inktank.com>
Mon, 5 May 2014 22:29:16 +0000 (15:29 -0700)
This will replace the existing waiting_for_osdmap mechanism
with a per-session wait list.

Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
src/osd/OSD.cc
src/osd/OSD.h

index df037d297c65c9ce88a2cbdc87641dd4a813939f..67213fe763fce1b0fedfd3ff44e895ad79ce802f 100644 (file)
@@ -921,6 +921,7 @@ OSD::OSD(CephContext *cct_, ObjectStore *store_,
   disk_tp(cct, "OSD::disk_tp", cct->_conf->osd_disk_threads, "osd_disk_threads"),
   command_tp(cct, "OSD::command_tp", 1),
   paused_recovery(false),
+  session_waiting_for_map_lock("OSD::session_waiting_for_map_lock"),
   heartbeat_lock("OSD::heartbeat_lock"),
   heartbeat_stop(false), heartbeat_need_update(true), heartbeat_epoch(0),
   hbclient_messenger(hb_clientm),
index 90f225d3dc75a267293f476349e51a0e17a5d016..8eb4650d23cfbfa33a942f88c12ea0cfd63645a8 100644 (file)
@@ -992,8 +992,34 @@ public:
     ConnectionRef con;
     WatchConState wstate;
 
-    Session() : auid(-1), last_sent_epoch(0), con(0) {}
+    Mutex session_dispatch_lock;
+    list<OpRequestRef> waiting_on_map;
+
+    Session() :
+      auid(-1), last_sent_epoch(0), con(0),
+      session_dispatch_lock("Session::session_dispatch_lock")
+    {}
   };
+  Mutex session_waiting_for_map_lock;
+  set<Session*> session_waiting_for_map;
+  /// Caller assumes refs for included Sessions
+  void get_sessions_waiting_for_map(set<Session*> *out) {
+    Mutex::Locker l(session_waiting_for_map_lock);
+    out->swap(session_waiting_for_map);
+  }
+  void register_session_waiting_on_map(Session *session) {
+    Mutex::Locker l(session_waiting_for_map_lock);
+    session->get();
+    session_waiting_for_map.insert(session);
+  }
+  void clear_session_waiting_on_map(Session *session) {
+    Mutex::Locker l(session_waiting_for_map_lock);
+    set<Session*>::iterator i = session_waiting_for_map.find(session);
+    if (i != session_waiting_for_map.end()) {
+      (*i)->put();
+      session_waiting_for_map.erase(i);
+    }
+  }
 
 private:
   /**