From c64383610ae5dbfc7ce1957302d08a99128af6b8 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 4 Nov 2009 12:24:39 -0800 Subject: [PATCH] osd: kill int <-> pg_t conversions These are messy and asking for trouble. And a cleaner coll_t paves the way for real named coll_t's down the line. --- src/TODO | 2 ++ src/osd/Ager.cc | 4 ++-- src/osd/OSD.cc | 36 ++++++++++++++++++------------------ src/osd/PG.cc | 10 +++++----- src/osd/PG.h | 6 +++--- src/osd/osd_types.h | 40 ++++++++++++++++++++++++++++++---------- src/streamtest.cc | 4 ++-- 7 files changed, 62 insertions(+), 40 deletions(-) diff --git a/src/TODO b/src/TODO index c9d09e91420d8..4beb239d53b47 100644 --- a/src/TODO +++ b/src/TODO @@ -45,6 +45,8 @@ v0.17 v0.18 - basic ENOSPC handling +- big endian fix + - qa - osd: rebuild pg log diff --git a/src/osd/Ager.cc b/src/osd/Ager.cc index c52c93b3e1eb3..7e4502962525d 100644 --- a/src/osd/Ager.cc +++ b/src/osd/Ager.cc @@ -118,7 +118,7 @@ uint64_t Ager::age_fill(float pc, utime_t until) { sbl.substr_of(bl, 0, t); ObjectStore::Transaction tr; sobject_t oid(poid, 0); - tr.write(0, oid, off, t, sbl); + tr.write(coll_t(), oid, off, t, sbl); store->apply_transaction(tr); off += t; s -= t; @@ -162,7 +162,7 @@ void Ager::age_empty(float pc) { ObjectStore::Transaction t; sobject_t oid(poid, 0); - t.remove(0, oid); + t.remove(coll_t(), oid); store->apply_transaction(t); age_free_oids.push_back(poid); } diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index ba208fe62285a..7b35605cae9d7 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -161,7 +161,7 @@ int OSD::mkfs(const char *dev, const char *jdev, ceph_fsid_t fsid, int whoami) object_t oid("disk_bw_test"); for (int i=0; i<1000; i++) { ObjectStore::Transaction t; - t.write(0, sobject_t(oid, 0), i*bl.length(), bl.length(), bl); + t.write(meta_coll, sobject_t(oid, 0), i*bl.length(), bl.length(), bl); store->apply_transaction(t); } store->sync(); @@ -169,7 +169,7 @@ int OSD::mkfs(const char *dev, const char *jdev, ceph_fsid_t fsid, int whoami) end -= start; cout << "measured " << (1000.0 / (double)end) << " mb/sec" << std::endl; ObjectStore::Transaction tr; - tr.remove(0, sobject_t(oid, 0)); + tr.remove(meta_coll, sobject_t(oid, 0)); store->apply_transaction(tr); // set osd weight @@ -180,8 +180,8 @@ int OSD::mkfs(const char *dev, const char *jdev, ceph_fsid_t fsid, int whoami) ::encode(sb, bl); ObjectStore::Transaction t; - t.create_collection(0); - t.write(0, OSD_SUPERBLOCK_POBJECT, 0, bl.length(), bl); + t.create_collection(meta_coll); + t.write(meta_coll, OSD_SUPERBLOCK_POBJECT, 0, bl.length(), bl); int r = store->apply_transaction(t); store->umount(); delete store; @@ -199,7 +199,7 @@ int OSD::peek_super(const char *dev, nstring& magic, ceph_fsid_t& fsid, int& who OSDSuperblock sb; bufferlist bl; - err = store->read(0, OSD_SUPERBLOCK_POBJECT, 0, 0, bl); + err = store->read(meta_coll, OSD_SUPERBLOCK_POBJECT, 0, 0, bl); store->umount(); delete store; @@ -556,13 +556,13 @@ void OSD::write_superblock(ObjectStore::Transaction& t) bufferlist bl; ::encode(superblock, bl); - t.write(0, OSD_SUPERBLOCK_POBJECT, 0, bl.length(), bl); + t.write(meta_coll, OSD_SUPERBLOCK_POBJECT, 0, bl.length(), bl); } int OSD::read_superblock() { bufferlist bl; - int r = store->read(0, OSD_SUPERBLOCK_POBJECT, 0, 0, bl); + int r = store->read(meta_coll, OSD_SUPERBLOCK_POBJECT, 0, 0, bl); if (r < 0) return r; @@ -732,7 +732,7 @@ void OSD::load_pgs() for (vector::iterator it = ls.begin(); it != ls.end(); it++) { - if (*it == 0) + if (*it == meta_coll) continue; if (it->snap != CEPH_NOSNAP) continue; @@ -1760,7 +1760,7 @@ void OSD::handle_osd_map(MOSDMap *m) p != m->maps.end(); p++) { sobject_t poid = get_osdmap_pobject_name(p->first); - if (store->exists(0, poid)) { + if (store->exists(meta_coll, poid)) { dout(10) << "handle_osd_map already had full map epoch " << p->first << dendl; logger->inc(l_osd_mapfdup); bufferlist bl; @@ -1771,7 +1771,7 @@ void OSD::handle_osd_map(MOSDMap *m) dout(10) << "handle_osd_map got full map epoch " << p->first << dendl; ObjectStore::Transaction ft; - ft.write(0, poid, 0, p->second.length(), p->second); // store _outside_ transaction; activate_map reads it. + ft.write(meta_coll, poid, 0, p->second.length(), p->second); // store _outside_ transaction; activate_map reads it. int r = store->apply_transaction(ft); if (r) { char buf[80]; @@ -1792,7 +1792,7 @@ void OSD::handle_osd_map(MOSDMap *m) p != m->incremental_maps.end(); p++) { sobject_t poid = get_inc_osdmap_pobject_name(p->first); - if (store->exists(0, poid)) { + if (store->exists(meta_coll, poid)) { dout(10) << "handle_osd_map already had incremental map epoch " << p->first << dendl; logger->inc(l_osd_mapidup); bufferlist bl; @@ -1803,7 +1803,7 @@ void OSD::handle_osd_map(MOSDMap *m) dout(10) << "handle_osd_map got incremental map epoch " << p->first << dendl; ObjectStore::Transaction ft; - ft.write(0, poid, 0, p->second.length(), p->second); // store _outside_ transaction; activate_map reads it. + ft.write(meta_coll, poid, 0, p->second.length(), p->second); // store _outside_ transaction; activate_map reads it. int r = store->apply_transaction(ft); if (r) { char buf[80]; @@ -1831,7 +1831,7 @@ void OSD::handle_osd_map(MOSDMap *m) OSDMap::Incremental inc; if (m->incremental_maps.count(cur+1) || - store->exists(0, get_inc_osdmap_pobject_name(cur+1))) { + store->exists(meta_coll, get_inc_osdmap_pobject_name(cur+1))) { dout(10) << "handle_osd_map decoding inc map epoch " << cur+1 << dendl; bufferlist bl; @@ -1851,7 +1851,7 @@ void OSD::handle_osd_map(MOSDMap *m) bl.clear(); osdmap->encode(bl); ObjectStore::Transaction ft; - ft.write(0, get_osdmap_pobject_name(cur+1), 0, bl.length(), bl); + ft.write(meta_coll, get_osdmap_pobject_name(cur+1), 0, bl.length(), bl); int r = store->apply_transaction(ft); if (r) { char buf[80]; @@ -1876,7 +1876,7 @@ void OSD::handle_osd_map(MOSDMap *m) } } else if (m->maps.count(cur+1) || - store->exists(0, get_osdmap_pobject_name(cur+1))) { + store->exists(meta_coll, get_osdmap_pobject_name(cur+1))) { dout(10) << "handle_osd_map decoding full map epoch " << cur+1 << dendl; bufferlist bl; if (m->maps.count(cur+1)) @@ -2310,12 +2310,12 @@ void OSD::send_incremental_map(epoch_t since, const entity_inst_t& inst, bool fu bool OSD::get_map_bl(epoch_t e, bufferlist& bl) { - return store->read(0, get_osdmap_pobject_name(e), 0, 0, bl) >= 0; + return store->read(meta_coll, get_osdmap_pobject_name(e), 0, 0, bl) >= 0; } bool OSD::get_inc_map_bl(epoch_t e, bufferlist& bl) { - return store->read(0, get_inc_osdmap_pobject_name(e), 0, 0, bl) >= 0; + return store->read(meta_coll, get_inc_osdmap_pobject_name(e), 0, 0, bl) >= 0; } OSDMap *OSD::get_map(epoch_t epoch) @@ -3270,7 +3270,7 @@ void OSD::_remove_pg(PG *pg) { ObjectStore::Transaction t; pg->write_info(t); - t.remove(0, pg->log_oid); + t.remove(meta_coll, pg->log_oid); int tr = store->apply_transaction(t); assert(tr == 0); } diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 6a969382fe3e3..b890f28e9d5c5 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -1842,8 +1842,8 @@ void PG::write_log(ObjectStore::Transaction& t) ondisklog.head = bl.length(); // write it - t.remove(0, log_oid ); - t.write(0, log_oid , 0, bl.length(), bl); + t.remove(meta_coll, log_oid ); + t.write(meta_coll, log_oid , 0, bl.length(), bl); bufferlist blb(sizeof(ondisklog)); ::encode(ondisklog, blb); @@ -1900,7 +1900,7 @@ void PG::trim_ondisklog_to(ObjectStore::Transaction& t, eversion_t v) t.collection_setattr(coll_t::build_pg_coll(info.pgid), "ondisklog", blb); if (!g_conf.osd_preserve_trimmed_log) - t.zero(0, log_oid, 0, ondisklog.tail & ~4095); + t.zero(meta_coll, log_oid, 0, ondisklog.tail & ~4095); } void PG::trim_peers() @@ -1943,7 +1943,7 @@ void PG::append_log(ObjectStore::Transaction &t, bufferlist& bl, if (ondisklog.head % 4096 < (ondisklog.head + bl.length()) % 4096) ondisklog.block_map[ondisklog.head] = log_version; // log_version is last event in prev. block - t.write(0, log_oid, ondisklog.head, bl.length(), bl ); + t.write(meta_coll, log_oid, ondisklog.head, bl.length(), bl ); ondisklog.head += bl.length(); @@ -1971,7 +1971,7 @@ void PG::read_log(ObjectStore *store) if (ondisklog.head > 0) { // read bufferlist bl; - store->read(0, log_oid, ondisklog.tail, ondisklog.length(), bl); + store->read(meta_coll, log_oid, ondisklog.tail, ondisklog.length(), bl); if (bl.length() < ondisklog.length()) { dout(0) << "read_log got " << bl.length() << " bytes, expected " << ondisklog.head << "-" << ondisklog.tail << "=" diff --git a/src/osd/PG.h b/src/osd/PG.h index a85fdcc142d77..81baeebc3d1d7 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -133,9 +133,9 @@ public: } } history; - Info(pg_t p=0) : pgid(p), - log_backlog(false) - { } + Info() : log_backlog(false) {} + Info(pg_t p) : pgid(p), log_backlog(false) { } + bool is_uptodate() const { return last_update == last_complete; } bool is_empty() const { return last_update.version == 0; } bool dne() const { return history.epoch_created == 0; } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 5c6757dc4b092..d49ae0a7931a5 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -118,17 +118,14 @@ struct pg_t { v.pool = pool; v.preferred = pref; // hack: avoid negative. } - pg_t(uint64_t n) { *(__le64*)&v = n; } pg_t(const ceph_pg& cpg) { v = cpg; } - ps_t ps() { return v.ps; } - int pool() { return v.pool; } - int preferred() { return (__s16)v.preferred; } // hack: avoid negative. + ps_t ps() const { return v.ps; } + int pool() const { return v.pool; } + int preferred() const { return (__s16)v.preferred; } // hack: avoid negative. - operator uint64_t() const { return *(__le64*)&v; } - /*coll_t to_coll() const { return coll_t(u.pg64, 0); } @@ -160,6 +157,26 @@ struct pg_t { } __attribute__ ((packed)); +inline bool operator<(const pg_t& l, const pg_t& r) { + return memcmp(&l, &r, sizeof(l)) < 0; +} +inline bool operator<=(const pg_t& l, const pg_t& r) { + return memcmp(&l, &r, sizeof(l)) <= 0; +} +inline bool operator==(const pg_t& l, const pg_t& r) { + return memcmp(&l, &r, sizeof(l)) == 0; +} +inline bool operator!=(const pg_t& l, const pg_t& r) { + return memcmp(&l, &r, sizeof(l)) != 0; +} +inline bool operator>(const pg_t& l, const pg_t& r) { + return memcmp(&l, &r, sizeof(l)) > 0; +} +inline bool operator>=(const pg_t& l, const pg_t& r) { + return memcmp(&l, &r, sizeof(l)) >= 0; +} + + inline void encode(pg_t pgid, bufferlist& bl) { encode_raw(pgid.v, bl); } inline void decode(pg_t &pgid, bufferlist::iterator& p) { decode_raw(pgid.v, p); @@ -183,8 +200,8 @@ namespace __gnu_cxx { { size_t operator()( const pg_t& x ) const { - static rjhash H; - return H(x); + static hash H; + return H(x.pool() ^ x.ps() ^ x.preferred()); } }; } @@ -196,7 +213,8 @@ struct coll_t { pg_t pgid; snapid_t snap; - coll_t(__u64 p=0, snapid_t s=0) : pgid(p), snap(s) {} + coll_t() : snap(0) {} + coll_t(pg_t p, snapid_t s) : pgid(p), snap(s) {} static coll_t build_pg_coll(pg_t p) { return coll_t(p, CEPH_NOSNAP); @@ -271,7 +289,7 @@ inline bool operator>=(const coll_t& l, const coll_t& r) { namespace __gnu_cxx { template<> struct hash { size_t operator()(const coll_t &c) const { - static rjhash H; + static hash H; static rjhash I; return H(c.pgid) ^ I(c.snap); } @@ -279,6 +297,8 @@ namespace __gnu_cxx { } +const coll_t meta_coll; + inline ostream& operator<<(ostream& out, const ceph_object_layout &ol) diff --git a/src/streamtest.cc b/src/streamtest.cc index a8b76e4a1eeb3..81da54ef98024 100644 --- a/src/streamtest.cc +++ b/src/streamtest.cc @@ -107,7 +107,7 @@ int main(int argc, const char **argv) } ObjectStore::Transaction ft; - ft.create_collection(0); + ft.create_collection(coll_t()); fs->apply_transaction(ft); utime_t now = g_clock.now(); @@ -121,7 +121,7 @@ int main(int argc, const char **argv) utime_t start = now; set_start(pos, now); ObjectStore::Transaction t; - t.write(0, poid, pos, bytes, bl); + t.write(coll_t(), poid, pos, bytes, bl); fs->apply_transaction(t, new C_Commit(pos)); now = g_clock.now(); set_ack(pos, now); -- 2.39.5