Earlier, we did pg_log.roll_forward(&handler), when
!transaction_applied, which advanced the crt and trimmed the entries
in rollforward(). Due to this, during _merge_object_divergent_entries(),
when we tried to rollback entries, those objects were not found in the
backend, and thus we hit this bug http://tracker.ceph.com/issues/36739.
With this change, we are advancing the crt value, without deleting the
objects, so that _merge_object_divergent_entries() does not fail
because of deleted objects.
Fixes: http://tracker.ceph.com/issues/36739
Signed-off-by: Neha Ojha <nojha@redhat.com>
(cherry picked from commit
17419ee39342257f5a6f41c792e8e45a8e243720)
/* We must be a backfill peer, so it's ok if we apply
* out-of-turn since we won't be considered when
* determining a min possible last_update.
+ *
+ * We skip_rollforward() here, which advances the crt, without
+ * doing an actual rollforward. This avoids cleaning up entries
+ * from the backend and we do not end up in a situation, where the
+ * object is deleted before we can _merge_object_divergent_entries().
*/
- pg_log.roll_forward(&handler);
+ pg_log.skip_rollforward();
}
for (vector<pg_log_entry_t>::const_iterator p = logv.begin();
h);
}
+ void skip_rollforward() {
+ log.skip_can_rollback_to_to_head();
+ }
+
//////////////////// get or set log & missing ////////////////////
void reset_backfill_claim_log(const pg_log_t &o, LogEntryHandler *h) {