PerfCounters *logger = NULL);
void write_if_dirty(ObjectStore::Transaction& t);
+ eversion_t projected_last_update;
eversion_t get_next_version() const {
- eversion_t at_version(get_osdmap()->get_epoch(),
- pg_log.get_head().version+1);
+ eversion_t at_version(
+ get_osdmap()->get_epoch(),
+ projected_last_update.version+1);
assert(at_version > info.last_update);
assert(at_version > pg_log.get_head());
+ assert(at_version > projected_last_update);
return at_version;
}
virtual void cancel_pull(const hobject_t &soid) = 0;
+ virtual void apply_stats(
+ const hobject_t &soid,
+ const object_stat_sum_t &delta_stats) = 0;
+
+
/**
* Bless a context
*
/// execute implementation specific transaction
virtual void submit_transaction(
const hobject_t &hoid, ///< [in] object
+ const object_stat_sum_t &delta_stats,///< [in] stat change
const eversion_t &at_version, ///< [in] version
PGTransactionUPtr &&t, ///< [in] trans to execute (move)
const eversion_t &trim_to, ///< [in] trim log to here
ctx->obc->ssc->snapset = ctx->new_snapset;
}
- apply_ctx_stats(ctx, scrub_ok);
+ apply_ctx_scrub_stats(ctx, scrub_ok);
}
-void ReplicatedPG::apply_ctx_stats(OpContext *ctx, bool scrub_ok)
-{
- info.stats.stats.add(ctx->delta_stats);
+void ReplicatedPG::apply_stats(
+ const hobject_t &soid,
+ const object_stat_sum_t &delta_stats) {
+
+ info.stats.stats.add(delta_stats);
- const hobject_t& soid = ctx->obs->oi.soid;
for (set<pg_shard_t>::iterator i = backfill_targets.begin();
i != backfill_targets.end();
++i) {
pg_shard_t bt = *i;
pg_info_t& pinfo = peer_info[bt];
if (cmp(soid, pinfo.last_backfill, get_sort_bitwise()) <= 0)
- pinfo.stats.stats.add(ctx->delta_stats);
+ pinfo.stats.stats.add(delta_stats);
else if (cmp(soid, last_backfill_started, get_sort_bitwise()) <= 0)
- pending_backfill_updates[soid].stats.add(ctx->delta_stats);
+ pending_backfill_updates[soid].stats.add(delta_stats);
}
+}
+void ReplicatedPG::apply_ctx_scrub_stats(OpContext *ctx, bool scrub_ok)
+{
+ const hobject_t& soid = ctx->obs->oi.soid;
if (!scrub_ok && scrubber.active) {
assert(cmp(soid, scrubber.start, get_sort_bitwise()) < 0 ||
cmp(soid, scrubber.end, get_sort_bitwise()) >= 0);
ctx->obc,
ctx->clone_obc,
unlock_snapset_obc ? ctx->snapset_obc : ObjectContextRef());
+ if (!(ctx->log.empty())) {
+ assert(ctx->at_version >= projected_last_update);
+ projected_last_update = ctx->at_version;
+ }
pgbackend->submit_transaction(
soid,
+ ctx->delta_stats,
ctx->at_version,
std::move(ctx->op_t),
pg_trim_to,
missing_loc.get_needs_recovery().end();
ObcLockManager manager;
- eversion_t v = info.last_update;
+ eversion_t v = get_next_version();
v.epoch = get_osdmap()->get_epoch();
unsigned num_unfound = missing_loc.num_unfound();
while (m != mend) {
prev = pick_newest_available(oid);
if (prev > eversion_t()) {
// log it
- ++v.version;
pg_log_entry_t e(
pg_log_entry_t::LOST_REVERT, oid, v,
m->second.need, 0, osd_reqid_t(), mtime, 0);
dout(10) << e << dendl;
// we are now missing the new version; recovery code will sort it out.
+ ++v.version;
++m;
break;
}
case pg_log_entry_t::LOST_DELETE:
{
- ++v.version;
pg_log_entry_t e(pg_log_entry_t::LOST_DELETE, oid, v, m->second.need,
0, osd_reqid_t(), mtime, 0);
if (get_osdmap()->test_flag(CEPH_OSDMAP_REQUIRE_JEWEL)) {
dout(10) << e << dendl;
log_entries.push_back(e);
+ ++v.version;
++m;
}
break;
utime_t now = ceph_clock_now(cct);
ctx->mtime = now;
hit_set_trim(ctx, 0);
- apply_ctx_stats(ctx.get());
+ apply_ctx_scrub_stats(ctx.get());
simple_opc_submit(std::move(ctx));
}
hit_set_trim(ctx, max);
- apply_ctx_stats(ctx.get());
+ apply_ctx_scrub_stats(ctx.get());
simple_opc_submit(std::move(ctx));
}
pg->queue_snap_trim();
});
- pg->apply_ctx_stats(ctx.get());
+ pg->apply_ctx_scrub_stats(ctx.get());
in_flight.insert(pos);
pg->simple_opc_submit(std::move(ctx));
const object_stat_sum_t &stat_diff) override;
void failed_push(const list<pg_shard_t> &from, const hobject_t &soid) override;
void cancel_pull(const hobject_t &soid) override;
+ void apply_stats(
+ const hobject_t &soid,
+ const object_stat_sum_t &delta_stats) override;
template<class T> class BlessedGenContext;
class BlessedContext;
void reply_ctx(OpContext *ctx, int err, eversion_t v, version_t uv);
void make_writeable(OpContext *ctx);
void log_op_stats(OpContext *ctx);
- void apply_ctx_stats(OpContext *ctx,
- bool scrub_ok=false); ///< true if we should skip scrub stat update
+ void apply_ctx_scrub_stats(
+ OpContext *ctx,
+ bool scrub_ok=false); ///< true if we should skip scrub stat update
void write_update_size_and_usage(object_stat_sum_t& stats, object_info_t& oi,
interval_set<uint64_t>& modified, uint64_t offset,