This fixes a bug when the time of the OSDs and clients are not
synchronized (especially when client is ahead of OSD), and the cache
tier dirty ratio reaches the threshold, the agent skips the flush work
because it thinks the object is too young.
Signed-off-by: Zhiqiang Wang <wonzhq@hotmail.com>
(cherry picked from commit
13b9dc708426c35436ba58388fc54f04f066f03a)
dout(20) << __func__ << " " << soid << " " << ctx
<< " op " << pg_log_entry_t::get_op_name(log_op_type)
<< dendl;
+ utime_t now = ceph_clock_now(cct);
// snapset
bufferlist bss;
ctx->snapset_obc->obs.oi.version = ctx->at_version;
ctx->snapset_obc->obs.oi.last_reqid = ctx->reqid;
ctx->snapset_obc->obs.oi.mtime = ctx->mtime;
+ ctx->snapset_obc->obs.oi.local_mtime = now;
bufferlist bv(sizeof(ctx->new_obs.oi));
::encode(ctx->snapset_obc->obs.oi, bv);
if (ctx->mtime != utime_t()) {
ctx->new_obs.oi.mtime = ctx->mtime;
dout(10) << " set mtime to " << ctx->new_obs.oi.mtime << dendl;
+ ctx->new_obs.oi.local_mtime = now;
} else {
dout(10) << " mtime unchanged at " << ctx->new_obs.oi.mtime << dendl;
}
}
utime_t now = ceph_clock_now(NULL);
- if (obc->obs.oi.mtime + utime_t(pool.info.cache_min_flush_age, 0) > now) {
+ utime_t ob_local_mtime;
+ if (obc->obs.oi.local_mtime != utime_t()) {
+ ob_local_mtime = obc->obs.oi.local_mtime;
+ } else {
+ ob_local_mtime = obc->obs.oi.mtime;
+ }
+ if (ob_local_mtime + utime_t(pool.info.cache_min_flush_age, 0) > now) {
dout(20) << __func__ << " skip (too young) " << obc->obs.oi << dendl;
osd->logger->inc(l_osd_agent_skip);
return false;
// these bits are copied from head->clone.
size = other.size;
mtime = other.mtime;
+ local_mtime = other.local_mtime;
last_reqid = other.last_reqid;
truncate_seq = other.truncate_seq;
truncate_size = other.truncate_size;
++i) {
old_watchers.insert(make_pair(i->first.second, i->second));
}
- ENCODE_START(13, 8, bl);
+ ENCODE_START(14, 8, bl);
::encode(soid, bl);
::encode(myoloc, bl); //Retained for compatibility
::encode(category, bl);
::encode(watchers, bl);
__u32 _flags = flags;
::encode(_flags, bl);
+ ::encode(local_mtime, bl);
ENCODE_FINISH(bl);
}
::decode(_flags, bl);
flags = (flag_t)_flags;
}
+ if (struct_v >= 14) {
+ ::decode(local_mtime, bl);
+ } else {
+ local_mtime = utime_t();
+ }
DECODE_FINISH(bl);
}
f->dump_unsigned("user_version", user_version);
f->dump_unsigned("size", size);
f->dump_stream("mtime") << mtime;
+ f->dump_stream("local_mtime") << local_mtime;
f->dump_unsigned("lost", (int)is_lost());
f->dump_unsigned("flags", (int)flags);
f->dump_stream("wrlock_by") << wrlock_by;
uint64_t size;
utime_t mtime;
+ utime_t local_mtime; // local mtime
// note: these are currently encoded into a total 16 bits; see
// encode()/decode() for the weirdness.