From fdd9332c06601f7eb9e0fb686f15a5c156212600 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 3 Aug 2011 14:55:46 -0700 Subject: [PATCH] osd: allow 'category' to be set on object creation Allow a string category to be set on object creation. Object stats will be included in the category total (in addition to the overall total). Signed-off-by: Sage Weil --- src/osd/ReplicatedPG.cc | 16 +++++++++++++--- src/osd/osd_types.h | 7 ++++++- src/osdc/Objecter.h | 5 +++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index b9d4ba7481b55..eda6e72c274ac 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -880,7 +880,7 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const sobject_t &coid, delta.num_object_clones--; delta.num_bytes -= snapset.clone_size[last]; delta.num_kb -= SHIFT_ROUND_UP(snapset.clone_size[last], 10); - info.stats.stats.add(delta, string()); + info.stats.stats.add(delta, obc->obs.oi.category); snapset.clones.erase(p); snapset.clone_overlap.erase(last); @@ -1588,6 +1588,17 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops, t.touch(coll, soid); maybe_created = true; } + if (osd_op.data.length()) { + bufferlist::iterator p = osd_op.data.begin(); + string category; + ::decode(category, p); + if (obs.exists) { + if (obs.oi.category != category) + result = -EEXIST; + } else { + obs.oi.category = category; + } + } } break; @@ -2562,8 +2573,7 @@ int ReplicatedPG::prepare_transaction(OpContext *ctx) // apply new object state. ctx->obc->obs = ctx->new_obs; ctx->obc->ssc->snapset = ctx->new_snapset; - string cat; - info.stats.stats.add(ctx->delta_stats, cat); + info.stats.stats.add(ctx->delta_stats, ctx->obc->obs.oi.category); return result; } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 5dc2c3a1722e0..70f6885b2e8c5 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1478,6 +1478,7 @@ static inline ostream& operator<<(ostream& out, const notify_info_t& n) { struct object_info_t { sobject_t soid; object_locator_t oloc; + string category; eversion_t version, prior_version; eversion_t user_version; @@ -1500,15 +1501,17 @@ struct object_info_t { truncate_seq = other.truncate_seq; truncate_size = other.truncate_size; lost = other.lost; + category = other.category; } map watchers; void encode(bufferlist& bl) const { - const __u8 v = 4; + const __u8 v = 5; ::encode(v, bl); ::encode(soid, bl); ::encode(oloc, bl); + ::encode(category, bl); ::encode(version, bl); ::encode(prior_version, bl); ::encode(last_reqid, bl); @@ -1530,6 +1533,8 @@ struct object_info_t { ::decode(soid, bl); if (v >= 2) ::decode(oloc, bl); + if (v >= 5) + ::decode(category, bl); ::decode(version, bl); ::decode(prior_version, bl); ::decode(last_reqid, bl); diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index dd45660fd1646..ca43cc00deddf 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -141,6 +141,11 @@ struct ObjectOperation { OSDOp& o = add_op(CEPH_OSD_OP_CREATE); o.op.flags = (excl ? CEPH_OSD_OP_FLAG_EXCL : 0); } + void create(bool excl, const string& category) { + OSDOp& o = add_op(CEPH_OSD_OP_CREATE); + o.op.flags = (excl ? CEPH_OSD_OP_FLAG_EXCL : 0); + ::encode(category, o.data); + } // object data void read(uint64_t off, uint64_t len) { -- 2.39.5