osd/PrimaryLogPG: defer evict if head *or* object intersect scrub interval
Consider a scenario like:
- scrub [3:
2525d100:::earlier:head,3:
2525d12f:::foo:200]
- we see 3:
2525d12f:::foo:100 and include it in scrub map
- scrub [3:
2525d12f:::foo:200, 3:
2525dfff:::later:head]
- some op(s) that cause scrub to be preempted
- agent_work wants to evict 3:
2525d12f:::foo:100
- write_blocked_by_scrub sees scrub is preempted, returns false
- 3:
2525d12f:::foo:100 is removed, :head SnapSet is updated
- scrub rescrubs [3:
2525d12f:::foo:200, 3:
2525dfff:::later:head]
- includes (updated) :head SnapSet
- issues error like "3:
2525d12f:::foo:100 is an unexpected clone"
Fix the problem by checking if anything part of the object-to-evict and
its head touch the scrub range; if so, back off. Do not let eviction
preempt scrub; we can come back and do it later.
Fixes: http://tracker.ceph.com/issues/23646
Signed-off-by: Sage Weil <sage@redhat.com>