From 7bf8b854ab573016bba10fe2904b4d4f4e9b1ee1 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 2 Mar 2017 15:03:57 -0600 Subject: [PATCH] osd/osd_internal_types: wake snaptrimmer on put_read lock, too The snaptrimmer can block taking a write lock, which might happen due to a conficting EC read. When the EC read completes, we need to wake up the snaptrimmer. Fixes: http://tracker.ceph.com/issues/19131 Signed-off-by: Sage Weil (cherry picked from commit 993179870ef7eece47cb9ccfb7275c29bf8536eb) Conflicts: src/osd/osd_internal_types.h: ObjectContext::put_lock_type() is defined in src/osd/osd_types.h in Jewel, patch that file --- src/osd/osd_types.h | 46 ++++++++++++++------------------------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 850fa32a27243..710ccc8cb6e78 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -3698,35 +3698,6 @@ public: rwstate.put_read(ls); rwstate.recovery_read_marker = false; } - void put_read(list *to_wake) { - rwstate.put_read(to_wake); - } - void put_excl(list *to_wake, - bool *requeue_recovery, - bool *requeue_snaptrimmer) { - rwstate.put_excl(to_wake); - if (rwstate.empty() && rwstate.recovery_read_marker) { - rwstate.recovery_read_marker = false; - *requeue_recovery = true; - } - if (rwstate.empty() && rwstate.snaptrimmer_write_marker) { - rwstate.snaptrimmer_write_marker = false; - *requeue_snaptrimmer = true; - } - } - void put_write(list *to_wake, - bool *requeue_recovery, - bool *requeue_snaptrimmer) { - rwstate.put_write(to_wake); - if (rwstate.empty() && rwstate.recovery_read_marker) { - rwstate.recovery_read_marker = false; - *requeue_recovery = true; - } - if (rwstate.empty() && rwstate.snaptrimmer_write_marker) { - rwstate.snaptrimmer_write_marker = false; - *requeue_snaptrimmer = true; - } - } void put_lock_type( ObjectContext::RWState::State type, list *to_wake, @@ -3734,14 +3705,25 @@ public: bool *requeue_snaptrimmer) { switch (type) { case ObjectContext::RWState::RWWRITE: - return put_write(to_wake, requeue_recovery, requeue_snaptrimmer); + rwstate.put_write(to_wake); + break; case ObjectContext::RWState::RWREAD: - return put_read(to_wake); + rwstate.put_read(to_wake); + break; case ObjectContext::RWState::RWEXCL: - return put_excl(to_wake, requeue_recovery, requeue_snaptrimmer); + rwstate.put_excl(to_wake); + break; default: assert(0 == "invalid lock type"); } + if (rwstate.empty() && rwstate.recovery_read_marker) { + rwstate.recovery_read_marker = false; + *requeue_recovery = true; + } + if (rwstate.empty() && rwstate.snaptrimmer_write_marker) { + rwstate.snaptrimmer_write_marker = false; + *requeue_snaptrimmer = true; + } } bool is_request_pending() { return (rwstate.count > 0); -- 2.39.5