From c58d13fe57849c2b4a8dbc4e2f46fc6d4aa63077 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Mon, 26 Dec 2016 10:19:46 +0800 Subject: [PATCH] os/bluestore/BitAllocator: shutdown BitAllocator in a more graceful way Signed-off-by: xie xingguo --- src/os/bluestore/BitAllocator.cc | 30 ++++++++++++++++++++++++++++-- src/os/bluestore/BitAllocator.h | 2 ++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/os/bluestore/BitAllocator.cc b/src/os/bluestore/BitAllocator.cc index 193cb06f86c7..4fe1dd89f760 100644 --- a/src/os/bluestore/BitAllocator.cc +++ b/src/os/bluestore/BitAllocator.cc @@ -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(); diff --git a/src/os/bluestore/BitAllocator.h b/src/os/bluestore/BitAllocator.h index 028899929cc6..1eeadde47749 100644 --- a/src/os/bluestore/BitAllocator.h +++ b/src/os/bluestore/BitAllocator.h @@ -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); -- 2.47.3