mon/MonCaps.cc \
mon/MonClient.cc \
mon/MonMap.cc \
+ os/hobject.cc \
osd/OSDMap.cc \
osd/osd_types.cc \
mds/MDSMap.cc \
obsync/obsync\
obsync/boto_tool\
os/btrfs_ioctl.h\
+ os/hobject.h \
os/CollectionIndex.h\
os/Fake.h\
os/FileJournal.h\
};
}
-typedef uint64_t filestore_hobject_key_t;
-struct hobject_t {
- object_t oid;
- snapid_t snap;
- uint32_t hash;
- bool max;
-
-private:
- string key;
-
-public:
- const string &get_key() const {
- return key;
- }
-
- hobject_t() : snap(0), hash(0), max(false) {}
-
- hobject_t(object_t oid, const string& key, snapid_t snap, uint64_t hash) :
- oid(oid), snap(snap), hash(hash), max(false),
- key(oid.name == key ? string() : key) {}
-
- hobject_t(const sobject_t &soid, const string &key, uint32_t hash) :
- oid(soid.oid), snap(soid.snap), hash(hash), max(false),
- key(soid.oid.name == key ? string() : key) {}
-
- /* Do not use when a particular hash function is needed */
- explicit hobject_t(const sobject_t &o) :
- oid(o.oid), snap(o.snap), max(false) {
- hash = __gnu_cxx::hash<sobject_t>()(o);
- }
-
- // maximum sorted value.
- static hobject_t get_max() {
- hobject_t h;
- h.max = true;
- return h;
- }
- bool is_max() const {
- return max;
- }
-
- static uint32_t _reverse_nibbles(uint32_t retval) {
- // reverse nibbles
- retval = ((retval & 0x0f0f0f0f) << 4) | ((retval & 0xf0f0f0f0) >> 4);
- retval = ((retval & 0x00ff00ff) << 8) | ((retval & 0xff00ff00) >> 8);
- retval = ((retval & 0x0000ffff) << 16) | ((retval & 0xffff0000) >> 16);
- return retval;
- }
-
- filestore_hobject_key_t get_filestore_key() const {
- if (max)
- return 0x100000000ull;
- else
- return _reverse_nibbles(hash);
- }
- void set_filestore_key(uint32_t v) {
- hash = _reverse_nibbles(v);
- }
-
- const string& get_effective_key() const {
- if (key.length())
- return key;
- return oid.name;
- }
-
- /**
- * back up hobject_t to beginning of hash bucket, if i am partway through one.
- */
- void back_up_to_bounding_key() {
- if (key.length()) {
- oid.clear();
- } else {
- key = oid.name;
- oid.clear();
- }
- snap = 0;
- }
-
- void swap(hobject_t &o) {
- hobject_t temp(o);
- o.oid = oid;
- o.key = key;
- o.snap = snap;
- o.hash = hash;
- oid = temp.oid;
- key = temp.key;
- snap = temp.snap;
- hash = temp.hash;
- }
-
- void encode(bufferlist& bl) const {
- __u8 version = 2;
- ::encode(version, bl);
- ::encode(key, bl);
- ::encode(oid, bl);
- ::encode(snap, bl);
- ::encode(hash, bl);
- ::encode(max, bl);
- }
- void decode(bufferlist::iterator& bl) {
- __u8 version;
- ::decode(version, bl);
- if (version >= 1)
- ::decode(key, bl);
- ::decode(oid, bl);
- ::decode(snap, bl);
- ::decode(hash, bl);
- if (version >= 2)
- ::decode(max, bl);
- else
- max = false;
- }
-};
-WRITE_CLASS_ENCODER(hobject_t)
-
-namespace __gnu_cxx {
- template<> struct hash<hobject_t> {
- size_t operator()(const hobject_t &r) const {
- static hash<object_t> H;
- static rjhash<uint64_t> I;
- return H(r.oid) ^ I(r.snap);
- }
- };
-}
-
-inline ostream& operator<<(ostream& out, const hobject_t& o)
-{
- if (o.is_max())
- return out << "MAX";
- out << std::hex << o.hash << std::dec;
- if (o.get_key().length())
- out << "." << o.get_key();
- out << "/" << o.oid << "/" << o.snap;
- return out;
-}
-
-WRITE_EQ_OPERATORS_5(hobject_t, oid, get_key(), snap, hash, max)
-// sort hobject_t's by <max, get_filestore_key(hash), key, oid, snapid>
-WRITE_CMP_OPERATORS_5(hobject_t, max, get_filestore_key(), get_effective_key(), oid, snap)
-
-
-// ---------------------------
-
#endif
}
-typedef hobject_t collection_list_handle_t;
-
// dentries
#define MAX_DENTRY_LEN 255
--- /dev/null
+
+#include "include/types.h"
+#include "hobject.h"
+#include "common/Formatter.h"
+
+void hobject_t::encode(bufferlist& bl) const
+{
+ __u8 version = 2;
+ ::encode(version, bl);
+ ::encode(key, bl);
+ ::encode(oid, bl);
+ ::encode(snap, bl);
+ ::encode(hash, bl);
+ ::encode(max, bl);
+}
+
+void hobject_t::decode(bufferlist::iterator& bl)
+{
+ __u8 version;
+ ::decode(version, bl);
+ if (version >= 1)
+ ::decode(key, bl);
+ ::decode(oid, bl);
+ ::decode(snap, bl);
+ ::decode(hash, bl);
+ if (version >= 2)
+ ::decode(max, bl);
+ else
+ max = false;
+}
+
+void hobject_t::dump(Formatter *f) const
+{
+ f->dump_string("oid", oid.name);
+ f->dump_string("key", key);
+ f->dump_int("snapid", snap);
+ f->dump_int("hash", hash);
+ f->dump_int("max", (int)max);
+}
+
+void hobject_t::generate_test_instances(list<hobject_t*>& o)
+{
+ o.push_back(new hobject_t);
+ o.push_back(new hobject_t);
+ o.back()->max = true;
+ o.push_back(new hobject_t(object_t("oname"), string(), 1, 234));
+ o.push_back(new hobject_t(object_t("oname2"), string("okey"), CEPH_NOSNAP, 67));
+ o.push_back(new hobject_t(object_t("oname3"), string("oname3"), CEPH_SNAPDIR, 910));
+}
+
+ostream& operator<<(ostream& out, const hobject_t& o)
+{
+ if (o.is_max())
+ return out << "MAX";
+ out << std::hex << o.hash << std::dec;
+ if (o.get_key().length())
+ out << "." << o.get_key();
+ out << "/" << o.oid << "/" << o.snap;
+ return out;
+}
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+#ifndef __CEPH_OS_HOBJECT_H
+#define __CEPH_OS_HOBJECT_H
+
+#include "include/object.h"
+#include "include/cmp.h"
+
+typedef uint64_t filestore_hobject_key_t;
+
+namespace ceph {
+ class Formatter;
+}
+
+struct hobject_t {
+ object_t oid;
+ snapid_t snap;
+ uint32_t hash;
+ bool max;
+
+private:
+ string key;
+
+public:
+ const string &get_key() const {
+ return key;
+ }
+
+ hobject_t() : snap(0), hash(0), max(false) {}
+
+ hobject_t(object_t oid, const string& key, snapid_t snap, uint64_t hash) :
+ oid(oid), snap(snap), hash(hash), max(false),
+ key(oid.name == key ? string() : key) {}
+
+ hobject_t(const sobject_t &soid, const string &key, uint32_t hash) :
+ oid(soid.oid), snap(soid.snap), hash(hash), max(false),
+ key(soid.oid.name == key ? string() : key) {}
+
+ /* Do not use when a particular hash function is needed */
+ explicit hobject_t(const sobject_t &o) :
+ oid(o.oid), snap(o.snap), max(false) {
+ hash = __gnu_cxx::hash<sobject_t>()(o);
+ }
+
+ // maximum sorted value.
+ static hobject_t get_max() {
+ hobject_t h;
+ h.max = true;
+ return h;
+ }
+ bool is_max() const {
+ return max;
+ }
+
+ static uint32_t _reverse_nibbles(uint32_t retval) {
+ // reverse nibbles
+ retval = ((retval & 0x0f0f0f0f) << 4) | ((retval & 0xf0f0f0f0) >> 4);
+ retval = ((retval & 0x00ff00ff) << 8) | ((retval & 0xff00ff00) >> 8);
+ retval = ((retval & 0x0000ffff) << 16) | ((retval & 0xffff0000) >> 16);
+ return retval;
+ }
+
+ filestore_hobject_key_t get_filestore_key() const {
+ if (max)
+ return 0x100000000ull;
+ else
+ return _reverse_nibbles(hash);
+ }
+ void set_filestore_key(uint32_t v) {
+ hash = _reverse_nibbles(v);
+ }
+
+ const string& get_effective_key() const {
+ if (key.length())
+ return key;
+ return oid.name;
+ }
+
+ /**
+ * back up hobject_t to beginning of hash bucket, if i am partway through one.
+ */
+ void back_up_to_bounding_key() {
+ if (key.length()) {
+ oid.clear();
+ } else {
+ key = oid.name;
+ oid.clear();
+ }
+ snap = 0;
+ }
+
+ void swap(hobject_t &o) {
+ hobject_t temp(o);
+ o.oid = oid;
+ o.key = key;
+ o.snap = snap;
+ o.hash = hash;
+ oid = temp.oid;
+ key = temp.key;
+ snap = temp.snap;
+ hash = temp.hash;
+ }
+
+ void encode(bufferlist& bl) const;
+ void decode(bufferlist::iterator& bl);
+ void dump(Formatter *f) const;
+ static void generate_test_instances(list<hobject_t*>& o);
+};
+WRITE_CLASS_ENCODER(hobject_t)
+
+namespace __gnu_cxx {
+ template<> struct hash<hobject_t> {
+ size_t operator()(const hobject_t &r) const {
+ static hash<object_t> H;
+ static rjhash<uint64_t> I;
+ return H(r.oid) ^ I(r.snap);
+ }
+ };
+}
+
+ostream& operator<<(ostream& out, const hobject_t& o);
+
+WRITE_EQ_OPERATORS_5(hobject_t, oid, get_key(), snap, hash, max)
+// sort hobject_t's by <max, get_filestore_key(hash), key, oid, snapid>
+WRITE_CMP_OPERATORS_5(hobject_t, max, get_filestore_key(), get_effective_key(), oid, snap)
+
+
+#endif
#include "include/interval_set.h"
#include "common/snap_types.h"
#include "common/Formatter.h"
-
+#include "os/hobject.h"
#define CEPH_OSD_ONDISK_MAGIC "ceph osd volume v026"
#define CEPH_OSD_FEATURE_INCOMPAT_CATEGORIES CompatSet::Feature(5, "categories")
-/* osdreqid_t - caller name + incarnation# + tid to unique identify this request
- * use for metadata and osd ops.
+typedef hobject_t collection_list_handle_t;
+
+
+/**
+ * osd request identifier
+ *
+ * caller name + incarnation# + tid to unique identify this request.
*/
struct osd_reqid_t {
entity_name_t name; // who
#include "os/ObjectStore.h"
TYPE(ObjectStore::Transaction)
+#include "os/hobject.h"
+TYPE(hobject_t)
+
#include "mon/PGMap.h"
TYPE(PGMap::Incremental)
TYPE(PGMap)