From: Sage Weil Date: Thu, 2 Mar 2017 21:03:57 +0000 (-0600) Subject: osd/osd_internal_types: wake snaptrimmer on put_read lock, too X-Git-Tag: v12.0.1~166^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=993179870ef7eece47cb9ccfb7275c29bf8536eb;p=ceph.git 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 --- diff --git a/src/osd/osd_internal_types.h b/src/osd/osd_internal_types.h index a415a4bf6e2e..d754109ad58a 100644 --- a/src/osd/osd_internal_types.h +++ b/src/osd/osd_internal_types.h @@ -254,35 +254,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, @@ -290,14 +261,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);