From: xie xingguo Date: Mon, 26 Dec 2016 02:19:46 +0000 (+0800) Subject: os/bluestore/BitAllocator: shutdown BitAllocator in a more graceful way X-Git-Tag: v12.0.0~182^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c58d13fe57849c2b4a8dbc4e2f46fc6d4aa63077;p=ceph.git os/bluestore/BitAllocator: shutdown BitAllocator in a more graceful way Signed-off-by: xie xingguo --- 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);