From 9016932fef255207c61e48621629b7d275970ec5 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 20 Aug 2020 12:38:20 -0700 Subject: [PATCH] crimson/os/seastore/transaction_manager: only add pin if not already pending If it's already pending, cache.duplicate_for_write is a noop and the extent will already have a pin. Also, add some debugging. Signed-off-by: Samuel Just --- src/crimson/os/seastore/transaction_manager.h | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index c9c2eb0f594..5b6f03f1151 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -136,10 +136,25 @@ public: /// Obtain mutable copy of extent LogicalCachedExtentRef get_mutable_extent(Transaction &t, LogicalCachedExtentRef ref) { + auto &logger = crimson::get_logger(ceph_subsys_filestore); auto ret = cache.duplicate_for_write( t, ref)->cast(); - ret->set_pin(ref->get_pin().duplicate()); + if (!ret->has_pin()) { + logger.debug( + "{}: duplicating {} for write: {}", + __func__, + *ref, + *ret); + ret->set_pin(ref->get_pin().duplicate()); + } else { + logger.debug( + "{}: {} already pending", + __func__, + *ref); + assert(ref->is_pending()); + assert(&*ref == &*ret); + } return ret; }