case Transaction::OP_CLONE:
{
- pobject_t oid = t.get_oid();
- pobject_t noid = t.get_oid();
+ const pobject_t& oid = t.get_oid();
+ const pobject_t& noid = t.get_oid();
_clone(t.get_cid(), oid, noid);
}
break;
case Transaction::OP_CLONERANGE:
{
- pobject_t oid = t.get_oid();
- pobject_t noid = t.get_oid();
+ const pobject_t& oid = t.get_oid();
+ const pobject_t& noid = t.get_oid();
__u64 off = t.get_length();
__u64 len = t.get_length();
_clone_range(t.get_cid(), oid, noid, off, len);
return _write(cid, oid, offset, len, bl);
}
-int FileStore::_clone(coll_t cid, pobject_t oldoid, pobject_t newoid)
+int FileStore::_clone(coll_t cid, const pobject_t& oldoid, const pobject_t& newoid)
{
char ofn[PATH_MAX], nfn[PATH_MAX];
get_coname(cid, oldoid, ofn);
return r;
}
-int FileStore::_clone_range(coll_t cid, pobject_t oldoid, pobject_t newoid, __u64 off, __u64 len)
+int FileStore::_clone_range(coll_t cid, const pobject_t& oldoid, const pobject_t& newoid, __u64 off, __u64 len)
{
char ofn[PATH_MAX], nfn[PATH_MAX];
get_coname(cid, oldoid, ofn);
}
-int FileStore::_collection_add(coll_t c, coll_t cid, pobject_t o)
+int FileStore::_collection_add(coll_t c, coll_t cid, const pobject_t& o)
{
if (fake_collections) return collections.collection_add(c, o);
return r;
}
-int FileStore::_collection_remove(coll_t c, pobject_t o)
+int FileStore::_collection_remove(coll_t c, const pobject_t& o)
{
if (fake_collections) return collections.collection_remove(c, o);
int _write(coll_t cid, const pobject_t& oid, __u64 offset, size_t len, const bufferlist& bl);
int _zero(coll_t cid, const pobject_t& oid, __u64 offset, size_t len);
int _truncate(coll_t cid, const pobject_t& oid, __u64 size);
- int _clone(coll_t cid, pobject_t oldoid, pobject_t newoid);
- int _clone_range(coll_t cid, pobject_t oldoid, pobject_t newoid, __u64 off, __u64 len);
+ int _clone(coll_t cid, const pobject_t& oldoid, const pobject_t& newoid);
+ int _clone_range(coll_t cid, const pobject_t& oldoid, const pobject_t& newoid, __u64 off, __u64 len);
int _do_clone_range(int from, int to, __u64 off, __u64 len);
int _remove(coll_t cid, const pobject_t& oid);
int _create_collection(coll_t c);
int _destroy_collection(coll_t c);
- int _collection_add(coll_t c, coll_t ocid, pobject_t o);
- int _collection_remove(coll_t c, pobject_t o);
+ int _collection_add(coll_t c, coll_t ocid, const pobject_t& o);
+ int _collection_remove(coll_t c, const pobject_t& o);
- int pick_object_revision_lt(coll_t cid, pobject_t& oid) { return -1; }
void trim_from_cache(coll_t cid, const pobject_t& oid, __u64 offset, size_t len) {}
int is_cached(coll_t cid, const pobject_t& oid, __u64 offset, size_t len) { return -1; }
};
virtual int statfs(struct statfs *buf) = 0;
// objects
- virtual int pick_object_revision_lt(coll_t cid, pobject_t& oid) = 0;
virtual bool exists(coll_t cid, const pobject_t& oid) = 0; // useful?
virtual int stat(coll_t cid, const pobject_t& oid, struct stat *st) = 0; // struct stat?
virtual int read(coll_t cid, const pobject_t& oid, __u64 offset, size_t len, bufferlist& bl) = 0;
bufferlist snaps; // only for clone entries
Entry() : op(0) {}
- Entry(int _op, sobject_t _soid,
+ Entry(int _op, const sobject_t& _soid,
const eversion_t& v, const eversion_t& pv,
const osd_reqid_t& rid, const utime_t& mt) :
op(_op), soid(_soid), version(v),
last_requested = sobject_t();
}
- bool logged_object(sobject_t oid) const {
+ bool logged_object(const sobject_t& oid) const {
return objects.count(oid);
}
bool logged_req(const osd_reqid_t &r) const {
// accessors
- Entry *is_updated(sobject_t oid) {
+ Entry *is_updated(const sobject_t& oid) {
if (objects.count(oid) && objects[oid]->is_update()) return objects[oid];
return 0;
}
- Entry *is_deleted(sobject_t oid) {
+ Entry *is_deleted(const sobject_t& oid) {
if (objects.count(oid) && objects[oid]->is_delete()) return objects[oid];
return 0;
}
rmissing.swap(o.rmissing);
}
- bool is_missing(sobject_t oid) {
+ bool is_missing(const sobject_t& oid) {
return missing.count(oid);
}
- bool is_missing(sobject_t oid, eversion_t v) {
+ bool is_missing(const sobject_t& oid, eversion_t v) {
return missing.count(oid) && missing[oid].need <= v;
}
- eversion_t have_old(sobject_t oid) {
+ eversion_t have_old(const sobject_t& oid) {
return missing.count(oid) ? missing[oid].have : eversion_t();
}
rmissing[need] = oid;
}
- void add(sobject_t oid, eversion_t need, eversion_t have) {
+ void add(const sobject_t& oid, eversion_t need, eversion_t have) {
missing[oid] = item(need, have);
rmissing[need] = oid;
}
- void rm(sobject_t oid, eversion_t when) {
+ void rm(const sobject_t& oid, eversion_t when) {
if (missing.count(oid) && missing[oid].need < when) {
rmissing.erase(missing[oid].need);
missing.erase(oid);
}
}
- void got(sobject_t oid, eversion_t v) {
+ void got(const sobject_t& oid, eversion_t v) {
assert(missing.count(oid));
assert(missing[oid].need <= v);
rmissing.erase(missing[oid].need);
virtual bool same_for_rep_modify_since(epoch_t e) = 0;
virtual bool is_write_in_progress() = 0;
- virtual bool is_missing_object(sobject_t oid) = 0;
- virtual void wait_for_missing_object(sobject_t oid, Message *op) = 0;
+ virtual bool is_missing_object(const sobject_t& oid) = 0;
+ virtual void wait_for_missing_object(const sobject_t& oid, Message *op) = 0;
virtual void on_osd_failure(int osd) = 0;
virtual void on_role_change() = 0;
// ====================
// missing objects
-bool ReplicatedPG::is_missing_object(sobject_t soid)
+bool ReplicatedPG::is_missing_object(const sobject_t& soid)
{
return missing.missing.count(soid);
}
-void ReplicatedPG::wait_for_missing_object(sobject_t soid, Message *m)
+void ReplicatedPG::wait_for_missing_object(const sobject_t& soid, Message *m)
{
assert(is_missing_object(soid));
case CEPH_OSD_OP_PGLS:
{
- vector<pobject_t> pobjects;
+ vector<sobject_t> pobjects;
// ???
vector<object_t> objects;
// ???
is_active()) {
snapid_t sn = *info.dead_snaps.begin();
coll_t c = info.pgid.to_snap_coll(sn);
- vector<pobject_t> ls;
+ vector<sobject_t> ls;
osd->store->collection_list(c, ls);
if (ls.size() != info.stats.num_objects)
dout(10) << " WARNING: " << ls.size() << " != num_objects " << info.stats.num_objects << dendl;
dout(10) << "snap_trimmer collection " << c << " has " << ls.size() << " items" << dendl;
- for (vector<pobject_t>::iterator p = ls.begin(); p != ls.end(); p++) {
- sobject_t coid = *p;
+ for (vector<sobject_t>::iterator p = ls.begin(); p != ls.end(); p++) {
+ const sobject_t& coid = *p;
ObjectStore::Transaction t;
void ReplicatedPG::_make_clone(ObjectStore::Transaction& t,
- sobject_t head, pobject_t coid,
+ const sobject_t& head, const sobject_t& coid,
object_info_t *poi)
{
bufferlist bv;
}
-int ReplicatedPG::find_object_context(object_t oid, snapid_t snapid,
+int ReplicatedPG::find_object_context(const object_t& oid, snapid_t snapid,
ObjectContext **pobc,
bool can_create)
{
void ReplicatedPG::sub_op_modify(MOSDSubOp *op)
{
- sobject_t soid = op->poid;
+ const sobject_t& soid = op->poid;
const char *opname;
if (op->noop)
// ===========================================================
-void ReplicatedPG::calc_head_subsets(SnapSet& snapset, pobject_t head,
+void ReplicatedPG::calc_head_subsets(SnapSet& snapset, const sobject_t& head,
Missing& missing,
interval_set<__u64>& data_subset,
- map<pobject_t, interval_set<__u64> >& clone_subsets)
+ map<sobject_t, interval_set<__u64> >& clone_subsets)
{
dout(10) << "calc_head_subsets " << head
<< " clone_overlap " << snapset.clone_overlap << dendl;
prev.insert(0, st.st_size);
for (int j=snapset.clones.size()-1; j>=0; j--) {
- pobject_t c = head;
+ sobject_t c = head;
c.snap = snapset.clones[j];
prev.intersection_of(snapset.clone_overlap[snapset.clones[j]]);
if (!missing.is_missing(c)) {
<< " clone_subsets " << clone_subsets << dendl;
}
-void ReplicatedPG::calc_clone_subsets(SnapSet& snapset, sobject_t soid,
+void ReplicatedPG::calc_clone_subsets(SnapSet& snapset, const sobject_t& soid,
Missing& missing,
interval_set<__u64>& data_subset,
- map<pobject_t, interval_set<__u64> >& clone_subsets)
+ map<sobject_t, interval_set<__u64> >& clone_subsets)
{
dout(10) << "calc_clone_subsets " << soid
<< " clone_overlap " << snapset.clone_overlap << dendl;
if (size)
next.insert(0, size);
for (unsigned j=i+1; j<snapset.clones.size(); j++) {
- pobject_t c = soid;
+ sobject_t c = soid;
c.snap = snapset.clones[j];
next.intersection_of(snapset.clone_overlap[snapset.clones[j-1]]);
if (!missing.is_missing(c)) {
/** pull - request object from a peer
*/
-bool ReplicatedPG::pull(sobject_t soid)
+bool ReplicatedPG::pull(const sobject_t& soid)
{
eversion_t v = missing.missing[soid].need;
if (fromosd < 0)
return false;
- map<pobject_t, interval_set<__u64> > clone_subsets;
+ map<sobject_t, interval_set<__u64> > clone_subsets;
interval_set<__u64> data_subset;
// is this a snapped object? if so, consult the snapset.. we may not need the entire object!
if (soid.snap && soid.snap < CEPH_NOSNAP) {
- pobject_t head = soid;
+ sobject_t head = soid;
head.snap = CEPH_NOSNAP;
// do we have the head?
* intelligently push an object to a replica. make use of existing
* clones/heads and dup data ranges where possible.
*/
-void ReplicatedPG::push_to_replica(sobject_t soid, int peer)
+void ReplicatedPG::push_to_replica(const sobject_t& soid, int peer)
{
dout(10) << "push_to_replica " << soid << " osd" << peer << dendl;
int r = osd->store->stat(info.pgid.to_coll(), soid, &st);
assert(r == 0);
- map<pobject_t, interval_set<__u64> > clone_subsets;
+ map<sobject_t, interval_set<__u64> > clone_subsets;
interval_set<__u64> data_subset;
bufferlist bv;
// are we doing a clone on the replica?
if (soid.snap && soid.snap < CEPH_NOSNAP) {
- pobject_t head = soid;
+ sobject_t head = soid;
head.snap = CEPH_NOSNAP;
if (peer_missing[peer].is_missing(head) &&
peer_missing[peer].have_old(head) == oi.prior_version) {
<< " v" << oi.prior_version
<< ", pushing " << soid << " attrs as a clone op" << dendl;
interval_set<__u64> data_subset;
- map<pobject_t, interval_set<__u64> > clone_subsets;
+ map<sobject_t, interval_set<__u64> > clone_subsets;
clone_subsets[head].insert(0, st.st_size);
push(soid, peer, data_subset, clone_subsets);
return;
/*
* push - send object to a peer
*/
-void ReplicatedPG::push(sobject_t soid, int peer)
+void ReplicatedPG::push(const sobject_t& soid, int peer)
{
interval_set<__u64> subset;
- map<pobject_t, interval_set<__u64> > clone_subsets;
+ map<sobject_t, interval_set<__u64> > clone_subsets;
push(soid, peer, subset, clone_subsets);
}
-void ReplicatedPG::push(sobject_t soid, int peer,
+void ReplicatedPG::push(const sobject_t& soid, int peer,
interval_set<__u64> &data_subset,
- map<pobject_t, interval_set<__u64> >& clone_subsets)
+ map<sobject_t, interval_set<__u64> >& clone_subsets)
{
// read data+attrs
bufferlist bl;
dout(10) << "sub_op_push_reply from " << reply->get_source() << " " << *reply << dendl;
int peer = reply->get_source().num();
- sobject_t soid = reply->get_poid();
+ const sobject_t& soid = reply->get_poid();
if (pushing.count(soid) &&
pushing[soid].count(peer)) {
*/
void ReplicatedPG::sub_op_pull(MOSDSubOp *op)
{
- const pobject_t soid = op->poid;
+ const sobject_t soid = op->poid;
const eversion_t v = op->version;
dout(7) << "op_pull " << soid << " v " << op->version
*/
void ReplicatedPG::sub_op_push(MOSDSubOp *op)
{
- sobject_t soid = op->poid;
+ const sobject_t& soid = op->poid;
eversion_t v = op->version;
ceph_osd_op& push = op->ops[0];
<< dendl;
interval_set<__u64> data_subset;
- map<pobject_t, interval_set<__u64> > clone_subsets;
+ map<sobject_t, interval_set<__u64> > clone_subsets;
// are we missing (this specific version)?
// (if version is wrong, it is either old (we don't want it) or
if (is_primary()) {
if (soid.snap && soid.snap < CEPH_NOSNAP) {
// clone. make sure we have enough data.
- pobject_t head = soid;
+ sobject_t head = soid;
head.snap = CEPH_NOSNAP;
assert(!missing.is_missing(head));
t.remove(info.pgid.to_coll(), soid); // in case old version exists
__u64 boff = 0;
- for (map<pobject_t, interval_set<__u64> >::iterator p = clone_subsets.begin();
+ for (map<sobject_t, interval_set<__u64> >::iterator p = clone_subsets.begin();
p != clone_subsets.end();
p++)
for (map<__u64,__u64>::iterator q = p->second.m.begin();
latest = log.objects[p->first];
assert(latest);
- sobject_t soid(latest->soid);
+ const sobject_t& soid(latest->soid);
sobject_t head = soid;
head.snap = CEPH_NOSNAP;
continue;
// oldest first!
- sobject_t soid = peer_missing[peer].rmissing.begin()->second;
+ const sobject_t& soid = peer_missing[peer].rmissing.begin()->second;
eversion_t v = peer_missing[peer].rmissing.begin()->first;
push_to_replica(soid, peer);
// FIXME: sloppy pobject vs object conversions abound! ***
// be thorough.
- vector<pobject_t> ls;
+ vector<sobject_t> ls;
osd->store->collection_list(info.pgid.to_coll(), ls);
if (ls.size() != info.stats.num_objects)
dout(10) << " WARNING: " << ls.size() << " != num_objects " << info.stats.num_objects << dendl;
set<sobject_t> s;
- for (vector<pobject_t>::iterator i = ls.begin();
+ for (vector<sobject_t>::iterator i = ls.begin();
i != ls.end();
i++)
s.insert(*i);
for (vector<ScrubMap::object>::reverse_iterator p = scrubmap.objects.rbegin();
p != scrubmap.objects.rend();
p++) {
- sobject_t soid = p->poid;
+ const sobject_t& soid = p->poid;
stat.num_objects++;
// basic checks.
}
}
void put_object_context(ObjectContext *obc);
- int find_object_context(object_t oid, snapid_t snapid, ObjectContext **pobc, bool can_create);
+ int find_object_context(const object_t& oid, snapid_t snapid, ObjectContext **pobc, bool can_create);
bool is_write_in_progress() {
return !object_contexts.empty();
map<sobject_t, pair<eversion_t, int> > pulling; // which objects are currently being pulled, and from where
map<sobject_t, set<int> > pushing;
- void calc_head_subsets(SnapSet& snapset, sobject_t head,
+ void calc_head_subsets(SnapSet& snapset, const sobject_t& head,
Missing& missing,
interval_set<__u64>& data_subset,
map<sobject_t, interval_set<__u64> >& clone_subsets);
- void calc_clone_subsets(SnapSet& snapset, sobject_t poid, Missing& missing,
+ void calc_clone_subsets(SnapSet& snapset, const sobject_t& poid, Missing& missing,
interval_set<__u64>& data_subset,
map<sobject_t, interval_set<__u64> >& clone_subsets);
- void push_to_replica(sobject_t oid, int dest);
- void push(sobject_t oid, int dest);
- void push(sobject_t oid, int dest, interval_set<__u64>& data_subset,
+ void push_to_replica(const sobject_t& oid, int dest);
+ void push(const sobject_t& oid, int dest);
+ void push(const sobject_t& oid, int dest, interval_set<__u64>& data_subset,
map<sobject_t, interval_set<__u64> >& clone_subsets);
- bool pull(sobject_t oid);
+ bool pull(const sobject_t& oid);
// low level ops
void op_ondisk(RepGather *repop);
void _make_clone(ObjectStore::Transaction& t,
- sobject_t head, sobject_t coid,
+ const sobject_t& head, const sobject_t& coid,
object_info_t *poi);
void make_writeable(OpContext *ctx);
void log_op_stats(const sobject_t &soid, OpContext *ctx);
bool same_for_modify_since(epoch_t e);
bool same_for_rep_modify_since(epoch_t e);
- bool is_missing_object(sobject_t oid);
- void wait_for_missing_object(sobject_t oid, Message *op);
+ bool is_missing_object(const sobject_t& oid);
+ void wait_for_missing_object(const sobject_t& oid, Message *op);
void on_osd_failure(int o);
void on_acker_change();