osd: Fix problems in ReplicatedPG::do_op() logic

Fix assert(is_degraded_object(soid)) in ReplicatedPG::wait_for_degraded_object()
  Handle uncommon case of multi op source after line backfill and target before
  backfill line and !is_degraded_object().
  Include backfill line itself for before_backfill

Signed-off-by: David Zafman <david.zafman@inktank.com>

Signed-off-by: David Zafman <david.zafman@inktank.com>
osd: Return false for func that returns bool

Signed-off-by: David Zafman <david.zafman@inktank.com>
osd: Interim working version with backfill reserve state changes

Signed-off-by: David Zafman <david.zafman@inktank.com>
osd: Change waiting_on_backfill to a set<int>

Signed-off-by: David Zafman <david.zafman@inktank.com>
osd: Interim backfill changes

Make peer_backfill_info a map which holds a
BackfillInterval for all backfill targets.
Initially see if recover_backfill() can just backfill
the first one and mark them all finished.

Signed-off-by: David Zafman <david.zafman@inktank.com>
osd: Implement multiple backfill target handling

Fixes: #5858

Signed-off-by: David Zafman <david.zafman@inktank.com>
Fix do_op() logic (will squash)