]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/BitAllocator: shutdown BitAllocator in a more graceful way 12661/head
authorxie xingguo <xie.xingguo@zte.com.cn>
Mon, 26 Dec 2016 02:19:46 +0000 (10:19 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Thu, 29 Dec 2016 11:30:05 +0000 (19:30 +0800)
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/os/bluestore/BitAllocator.cc
src/os/bluestore/BitAllocator.h

index 193cb06f86c7a0da5419431bc0df9f298d565999..4fe1dd89f760f4233b9376df317afc3d46bde9ea 100644 (file)
@@ -1279,6 +1279,16 @@ void BitAllocator::lock_shared()
   pthread_rwlock_rdlock(&m_rw_lock);
 }
 
+bool BitAllocator::try_lock()
+{
+  bool get_lock = false;
+  if (pthread_rwlock_trywrlock(&m_rw_lock) == 0) {
+    get_lock = true;
+  }
+
+  return get_lock;
+}
+
 void BitAllocator::unlock()
 {
   pthread_rwlock_unlock(&m_rw_lock);
@@ -1304,8 +1314,11 @@ BitAllocator::~BitAllocator()
 void
 BitAllocator::shutdown()
 {
-  lock_excl();
-  serial_lock();
+  bool get_lock = try_lock();
+  assert(get_lock);
+  bool get_serial_lock = try_serial_lock();
+  assert(get_serial_lock);
+  serial_unlock();
   unlock();
 }
 
@@ -1328,6 +1341,19 @@ void BitAllocator::serial_unlock()
   }
 }
 
+bool BitAllocator::try_serial_lock()
+{
+  bool get_lock = false;
+  if (m_alloc_mode == SERIAL) {
+    if (m_serial_mutex.try_lock() == 0) {
+      get_lock = true;
+    }
+  } else {
+    get_lock = true;
+  }
+  return get_lock;
+}
+
 bool BitAllocator::child_check_n_lock(BitMapArea *child)
 {
   child->lock_shared();
index 028899929cc6e749aef18e80b76ec9eacd1c2c85..1eeadde47749013afde1356d8633c453cbeb3179 100644 (file)
@@ -491,9 +491,11 @@ private:
   virtual void child_unlock(BitMapArea *child);
 
   void serial_lock();
+  bool try_serial_lock();
   void serial_unlock();
   void lock_excl();
   void lock_shared();
+  bool try_lock();
   void unlock();
 
   bool check_input(int64_t num_blocks);