From: Greg Farnum Date: Wed, 21 Aug 2013 00:13:53 +0000 (-0700) Subject: osd: switch object_info_t::user_version to be a version_t X-Git-Tag: v0.69~40^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2e764a81838b3fb197b33e54db76423250e922a8;p=ceph.git osd: switch object_info_t::user_version to be a version_t We never expose the full eversion_t data to users, and do not want to. However, we pull some tricks in the encode/decode functions to avoid having to change the object_info_t disk format for this change. When we can break compatibility, we should simplify this. Signed-off-by: Greg Farnum --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 81b037c0523..e42b532c50d 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -2432,9 +2432,9 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) uint64_t ver = op.watch.ver; if (!ver) result = -EINVAL; - else if (ver < oi.user_version.version) + else if (ver < oi.user_version) result = -ERANGE; - else if (ver > oi.user_version.version) + else if (ver > oi.user_version) result = -EOVERFLOW; break; } @@ -2549,9 +2549,9 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) uint64_t ver = op.watch.ver; if (!ver) result = -EINVAL; - else if (ver < src_obc->obs.oi.user_version.version) + else if (ver < src_obc->obs.oi.user_version) result = -ERANGE; - else if (ver > src_obc->obs.oi.user_version.version) + else if (ver > src_obc->obs.oi.user_version) result = -EOVERFLOW; break; } @@ -2832,7 +2832,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) dout(10) << "watch: ctx->obc=" << (void *)obc << " cookie=" << cookie << " oi.version=" << oi.version.version << " ctx->at_version=" << ctx->at_version << dendl; - dout(10) << "watch: oi.user_version=" << oi.user_version.version << dendl; + dout(10) << "watch: oi.user_version=" << oi.user_version<< dendl; dout(10) << "watch: peer_addr=" << ctx->op->request->get_connection()->get_peer_addr() << dendl; @@ -3720,7 +3720,7 @@ void ReplicatedPG::do_osd_op_effects(OpContext *ctx) p->timeout, p->cookie, osd->get_next_id(get_osdmap()->get_epoch()), - ctx->obc->obs.oi.user_version.version, + ctx->obc->obs.oi.user_version, osd)); for (map, WatchRef>::iterator i = ctx->obc->watchers.begin(); @@ -3792,7 +3792,7 @@ int ReplicatedPG::prepare_transaction(OpContext *ctx) // read-op? done? if (ctx->op_t.empty() && !ctx->modify) { - ctx->reply_user_version = ctx->obs->oi.user_version.version; + ctx->reply_user_version = ctx->obs->oi.user_version; unstable_stats.add(ctx->delta_stats, ctx->obc->obs.oi.category); return result; } @@ -3852,9 +3852,9 @@ int ReplicatedPG::prepare_transaction(OpContext *ctx) // finish and log the op. if (ctx->user_modify) { /* update the user_version for any modify ops, except for the watch op */ - ctx->new_obs.oi.user_version = ctx->at_version; + ctx->new_obs.oi.user_version = ctx->at_version.version; } - ctx->reply_user_version = ctx->new_obs.oi.user_version.version; + ctx->reply_user_version = ctx->new_obs.oi.user_version; ctx->bytes_written = ctx->op_t.get_encoded_bytes(); if (ctx->new_obs.exists) { diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index ea3e5d5c3eb..9594cc60579 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -2688,7 +2688,10 @@ void object_info_t::encode(bufferlist& bl) const ::encode(truncate_size, bl); ::encode(lost, bl); ::encode(old_watchers, bl); - ::encode(user_version, bl); + /* shenanigans to avoid breaking backwards compatibility in the disk format. + * When we can, switch this out for simply putting the version_t on disk. */ + eversion_t user_eversion(0, user_version); + ::encode(user_eversion, bl); ::encode(uses_tmap, bl); ::encode(watchers, bl); ENCODE_FINISH(bl); @@ -2733,7 +2736,9 @@ void object_info_t::decode(bufferlist::iterator& bl) lost = false; if (struct_v >= 4) { ::decode(old_watchers, bl); - ::decode(user_version, bl); + eversion_t user_eversion; + ::decode(user_eversion, bl); + user_version = user_eversion.version; } if (struct_v >= 9) ::decode(uses_tmap, bl); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 3cafdc2b035..4c34e81871f 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1952,7 +1952,7 @@ struct object_info_t { string category; eversion_t version, prior_version; - eversion_t user_version; + version_t user_version; osd_reqid_t last_reqid; uint64_t size; @@ -1983,12 +1983,12 @@ struct object_info_t { static void generate_test_instances(list& o); explicit object_info_t() - : size(0), lost(false), + : user_version(0), size(0), lost(false), truncate_seq(0), truncate_size(0), uses_tmap(false) {} object_info_t(const hobject_t& s) - : soid(s), size(0), + : soid(s), user_version(0), size(0), lost(false), truncate_seq(0), truncate_size(0), uses_tmap(false) {} object_info_t(bufferlist& bl) {