Errors should only be used for dup detection.
Signed-off-by: Josh Durgin <jdurgin@redhat.com>
i->soid,
&_t);
assert(r == 0);
- } else {
+ } else if (i->is_update()) {
assert(i->snaps.length() > 0);
vector<snapid_t> snaps;
bufferlist snapbl = i->snaps;
ldpp_dout(dpp, 20) << "update missing, append " << ne << dendl;
log->index(ne);
}
- if (cmp(p->soid, last_backfill, last_backfill_bitwise) <= 0) {
+ if (cmp(p->soid, last_backfill, last_backfill_bitwise) <= 0 &&
+ !p->is_error()) {
missing.add_next_event(*p);
if (rollbacker) {
// hack to match PG::mark_all_unfound_lost
if (i->version <= info.last_complete) break;
if (cmp(i->soid, info.last_backfill, info.last_backfill_bitwise) > 0)
continue;
+ if (i->is_error())
+ continue;
if (did.count(i->soid)) continue;
did.insert(i->soid);
missing[e.soid] = item(e.version, e.prior_version);
}
rmissing[e.version.version] = e.soid;
- } else
+ } else if (e.is_delete()) {
rm(e.soid, e.version);
+ }
}
void pg_missing_t::revise_need(hobject_t oid, eversion_t need)
EXPECT_FALSE(missing.is_missing(oid));
EXPECT_TRUE(e.reqid_is_indexed());
}
+
+ // ERROR op should not affect previous entries
+ {
+ pg_missing_t missing;
+ pg_log_entry_t modify = sample_e;
+
+ modify.op = pg_log_entry_t::MODIFY;
+ EXPECT_FALSE(missing.is_missing(oid));
+ missing.add_next_event(modify);
+ EXPECT_TRUE(missing.is_missing(oid));
+ EXPECT_EQ(missing.missing[oid].need, version);
+
+ pg_log_entry_t error = sample_e;
+ error.op = pg_log_entry_t::ERROR;
+ error.return_code = -ENOENT;
+ error.version = eversion_t(11, 5);
+ missing.add_next_event(error);
+ EXPECT_TRUE(missing.is_missing(oid));
+ EXPECT_EQ(missing.missing[oid].need, version);
+ }
}
TEST(pg_missing_t, revise_need)