else if (strcmp(op, "o_stat") == 0) {
int64_t oh = t.get_int();
int64_t ol = t.get_int();
- object_t oid(oh, ol);
+ object_t oid = file_object_t(oh, ol);
lock.Lock();
ceph_object_layout layout = client->osdmap->make_object_layout(oid, CEPH_CASDATA_RULE);
__u64 size;
int64_t ol = t.get_int();
int64_t off = t.get_int();
int64_t len = t.get_int();
- object_t oid(oh, ol);
+ object_t oid = file_object_t(oh, ol);
lock.Lock();
ceph_object_layout layout = client->osdmap->make_object_layout(oid, CEPH_CASDATA_RULE);
bufferlist bl;
int64_t ol = t.get_int();
int64_t off = t.get_int();
int64_t len = t.get_int();
- object_t oid(oh, ol);
+ object_t oid = file_object_t(oh, ol);
lock.Lock();
ceph_object_layout layout = client->osdmap->make_object_layout(oid, CEPH_CASDATA_RULE);
bufferptr bp(len);
int64_t ol = t.get_int();
int64_t off = t.get_int();
int64_t len = t.get_int();
- object_t oid(oh, ol);
+ object_t oid = file_object_t(oh, ol);
lock.Lock();
ceph_object_layout layout = client->osdmap->make_object_layout(oid, CEPH_CASDATA_RULE);
SnapContext snapc;
for (int i=start; i<end; i += inc) {
if (time_to_stop()) break;
- object_t oid(0x1000, i);
+ object_t oid = file_object_t(999, i);
ceph_object_layout layout = client->osdmap->make_object_layout(oid, CEPH_CASDATA_RULE);
SnapContext snapc;
} else {
o = (long)trunc(pow(r, rskew) * (double)nobj); // exponentially skew towards 0
}
- object_t oid(0x1000, o);
+ object_t oid = file_object_t(999, o);
ceph_object_layout layout = client->osdmap->make_object_layout(oid, CEPH_CASDATA_RULE);
SnapContext snapc;
* is stored with a null terminator, providing an efficient c_str()
* method.
*/
+
+#include "buffer.h"
+#include "encoding.h"
+
class cstring {
private:
int _len;
int rados_close_pool(rados_pool_t pool);
/* read/write objects */
-int rados_write(rados_pool_t pool, struct ceph_object *oid, off_t off, const char *buf, size_t len);
-int rados_read(rados_pool_t pool, struct ceph_object *oid, off_t off, char *buf, size_t len);
-int rados_remove(rados_pool_t pool, struct ceph_object *oid);
-int rados_exec(rados_pool_t pool, struct ceph_object *o, const char *cls, const char *method,
+int rados_write(rados_pool_t pool, const char *oid, off_t off, const char *buf, size_t len);
+int rados_read(rados_pool_t pool, const char *oid, off_t off, char *buf, size_t len);
+int rados_remove(rados_pool_t pool, const char *oid);
+int rados_exec(rados_pool_t pool, const char *o, const char *cls, const char *method,
const char *in_buf, size_t in_len, char *buf, size_t out_len);
/* async io */
int rados_aio_get_return_value(rados_completion_t c);
void rados_aio_release(rados_completion_t c);
-int rados_aio_write(rados_pool_t pool, struct ceph_object *oid, off_t off, const char *buf, size_t len, rados_completion_t *completion);
-int rados_aio_read(rados_pool_t pool, struct ceph_object *oid, off_t off, char *buf, size_t len, rados_completion_t *completion);
+int rados_aio_write(rados_pool_t pool, const char *oid, off_t off, const char *buf, size_t len, rados_completion_t *completion);
+int rados_aio_read(rados_pool_t pool, const char *oid, off_t off, char *buf, size_t len, rados_completion_t *completion);
#ifdef __cplusplus
}
using namespace __gnu_cxx;
#include "hash.h"
-
+#include "nstring.h"
#include "encoding.h"
-
struct object_t {
- union {
- __u8 raw[20];
- struct {
- uint64_t ino; // "file" identifier
- uint32_t bno; // "block" in that "file"
- uint64_t pad;
- } __attribute__ ((packed));
- } __attribute__ ((packed));
-
- object_t() : ino(0), bno(0), pad(0) {}
- object_t(uint64_t i, uint32_t b) : ino(i), bno(b), pad(0) {}
-
- // IMPORTANT: make this match struct ceph_object ****
- object_t(const ceph_object& co) {
- ino = co.ino;
- bno = co.bno;
- pad = co.pad;
- }
- operator ceph_object() {
- ceph_object oid;
- oid.ino = ino;
- oid.bno = bno;
- oid.pad = pad;
- return oid;
- }
+ nstring name;
+
+ object_t(const char *s = 0) : name(s) {}
+
void encode(bufferlist &bl) const {
- ::encode(ino, bl);
- ::encode(bno, bl);
- ::encode(pad, bl);
+ ::encode(name, bl);
}
void decode(bufferlist::iterator &bl) {
- __u64 i, r;
- __u32 b;
- ::decode(i, bl);
- ::decode(b, bl);
- ::decode(r, bl);
- ino = i;
- bno = b;
- pad = r;
+ ::decode(name, bl);
}
-} __attribute__ ((packed));
+};
WRITE_CLASS_ENCODER(object_t)
inline bool operator==(const object_t l, const object_t r) {
- return memcmp(&l, &r, sizeof(l)) == 0;
+ return l.name == r.name;
}
inline bool operator!=(const object_t l, const object_t r) {
- return memcmp(&l, &r, sizeof(l)) != 0;
+ return l.name != r.name;
}
inline bool operator>(const object_t l, const object_t r) {
- return memcmp(&l, &r, sizeof(l)) > 0;
+ return l.name > r.name;
}
inline bool operator<(const object_t l, const object_t r) {
- return memcmp(&l, &r, sizeof(l)) < 0;
+ return l.name < r.name;
}
inline bool operator>=(const object_t l, const object_t r) {
- return memcmp(&l, &r, sizeof(l)) >= 0;
+ return l.name >= r.name;
}
inline bool operator<=(const object_t l, const object_t r) {
- return memcmp(&l, &r, sizeof(l)) <= 0;
+ return l.name <= r.name;
}
inline ostream& operator<<(ostream& out, const object_t o) {
- out << hex;
- out << o.ino << '.';
- out.setf(ios::right);
- out.fill('0');
- out << setw(8) << o.bno;
- out.unsetf(ios::right);
- out << dec;
- return out;
+ return out << o.name;
}
namespace __gnu_cxx {
template<> struct hash<object_t> {
size_t operator()(const object_t &r) const {
- static rjhash<uint64_t> H;
- static rjhash<uint32_t> I;
- return H(r.ino) ^ I(r.bno) ^ H(r.pad);
+ static hash<nstring> H;
+ return H(r.name);
}
};
}
+struct file_object_t {
+ __u64 ino, bno;
+ mutable char buf[33];
+
+ file_object_t(__u64 i=0, __u64 b=0) : ino(i), bno(b) {
+ buf[0] = 0;
+ }
+
+ const char *c_str() const {
+ if (!buf[0])
+ sprintf(buf, "%llx.%08llx", (long long unsigned)ino, (long long unsigned)bno);
+ return buf;
+ }
+
+ operator object_t() {
+ return object_t(c_str());
+ }
+};
+
+
+
// ---------------------------
// snaps
#define CEPH_SNAPDIR ((__u64)(-1))
#define CEPH_NOSNAP ((__u64)(-2))
-struct ceph_object {
- union {
- __u8 raw[20]; /* fits a sha1 hash */
- struct {
- __le64 ino; /* inode "file" identifier */
- __le32 bno; /* "block" (object) in that "file" */
- __le64 pad;
- } __attribute__ ((packed));
- };
-} __attribute__ ((packed));
-
struct ceph_timespec {
__le32 tv_sec;
__le32 tv_nsec;
struct ceph_osd_request_head {
__le64 tid;
__le32 client_inc;
- struct ceph_object oid;
struct ceph_object_layout layout;
__le32 osdmap_epoch;
struct ceph_timespec mtime;
struct ceph_eversion reassert_version;
+ __le32 object_len;
__le32 ticket_len;
__le64 snapid;
__le32 num_snaps;
__le16 num_ops;
- struct ceph_osd_op ops[]; /* followed by ticket, snaps */
+ struct ceph_osd_op ops[]; /* followed by ops[], object, ticket, snaps */
} __attribute__ ((packed));
struct ceph_osd_reply_head {
__le64 tid;
__le32 client_inc;
__le32 flags;
- struct ceph_object oid;
struct ceph_object_layout layout;
__le32 osdmap_epoch;
struct ceph_eversion reassert_version;
__le32 result;
+ __le32 object_len;
__le32 num_ops;
- struct ceph_osd_op ops[0];
+ struct ceph_osd_op ops[0]; /* ops[], object */
} __attribute__ ((packed));
return 0;
}
-extern "C" int rados_write(rados_pool_t pool, ceph_object *o, off_t off, const char *buf, size_t len)
+extern "C" int rados_write(rados_pool_t pool, const char *o, off_t off, const char *buf, size_t len)
{
- object_t oid(*o);
+ object_t oid(o);
bufferlist bl;
bl.append(buf, len);
return radosp->write(pool, oid, off, bl, len);
}
-extern "C" int rados_remove(rados_pool_t pool, ceph_object *o)
+extern "C" int rados_remove(rados_pool_t pool, const char *o)
{
- object_t oid(*o);
+ object_t oid(o);
return radosp->remove(pool, oid);
}
-extern "C" int rados_read(rados_pool_t pool, ceph_object *o, off_t off, char *buf, size_t len)
+extern "C" int rados_read(rados_pool_t pool, const char *o, off_t off, char *buf, size_t len)
{
int ret;
- object_t oid(*o);
+ object_t oid(o);
bufferlist bl;
ret = radosp->read(pool, oid, off, bl, len);
if (ret >= 0) {
return ret;
}
-extern "C" int rados_exec(rados_pool_t pool, ceph_object *o, const char *cls, const char *method,
+extern "C" int rados_exec(rados_pool_t pool, const char *o, const char *cls, const char *method,
const char *inbuf, size_t in_len, char *buf, size_t out_len)
{
- object_t oid(*o);
+ object_t oid(o);
bufferlist inbl, outbl;
int ret;
inbl.append(inbuf, in_len);
((RadosClient::AioCompletion *)c)->put();
}
-extern "C" int rados_aio_read(rados_pool_t pool, struct ceph_object *o,
+extern "C" int rados_aio_read(rados_pool_t pool, const char *o,
off_t off, char *buf, size_t len,
rados_completion_t *completion)
{
- object_t oid(*o);
+ object_t oid(o);
return radosp->aio_read(pool, oid, off, buf, len, (RadosClient::AioCompletion**)completion);
}
-extern "C" int rados_aio_write(rados_pool_t pool, struct ceph_object *o,
+extern "C" int rados_aio_write(rados_pool_t pool, const char *o,
off_t off, const char *buf, size_t len,
rados_completion_t *completion)
{
- object_t oid(*o);
+ object_t oid(o);
bufferlist bl;
bl.append(buf, len);
return radosp->aio_write(pool, oid, off, bl, len, (RadosClient::AioCompletion**)completion);
}
// -- fetch --
- object_t get_ondisk_object() { return object_t(ino(), frag); }
+ object_t get_ondisk_object() {
+ return file_object_t(ino(), frag);
+ }
void fetch(Context *c, bool ignore_authpinnability=false);
void _fetched(bufferlist &bl);
m.mtime = g_clock.now();
m.setxattr("inode", bl);
- object_t oid(ino(), frag_t());
+ char n[30];
+ sprintf(n, "%llx.%08llx", (long long unsigned)ino(), (long long unsigned)frag_t());
+ object_t oid(n);
OSDMap *osdmap = mdcache->mds->objecter->osdmap;
ceph_object_layout ol = osdmap->make_object_layout(oid,
mdcache->mds->mdsmap->get_metadata_pg_pool());
dout(10) << "fetch" << dendl;
C_Inode_Fetched *c = new C_Inode_Fetched(this, fin);
- object_t oid(ino(), frag_t());
+ char n[30];
+ sprintf(n, "%llx.%08llx", (long long unsigned)ino(), (long long unsigned)frag_t());
+ object_t oid(n);
ObjectRead rd;
rd.getxattr("inode");
void MDCache::purge_prealloc_ino(inodeno_t ino, Context *fin)
{
- object_t oid(ino, 0);
+ char n[30];
+ sprintf(n, "%llx.%08llx", (long long unsigned)ino, 0ull);
+ object_t oid(n);
dout(10) << "purge_prealloc_ino " << ino << " oid " << oid << dendl;
ceph_object_layout ol = mds->osdmap->make_object_layout(oid,
mds->mdsmap->get_metadata_pg_pool());
// write (async)
SnapContext snapc;
- object_t oid(ino, 0);
+ char n[30];
+ sprintf(n, "mdstable_%s", table_name);
+ object_t oid(n);
OSDMap *osdmap = mds->objecter->osdmap;
ceph_object_layout ol = osdmap->make_object_layout(oid,
mds->mdsmap->get_metadata_pg_pool());
state = STATE_OPENING;
C_MT_Load *c = new C_MT_Load(this, onfinish);
- object_t oid(ino, 0);
+ char n[30];
+ sprintf(n, "mdstable_%s", table_name);
+ object_t oid(n);
OSDMap *osdmap = mds->objecter->osdmap;
ceph_object_layout ol = osdmap->make_object_layout(oid,
mds->mdsmap->get_metadata_pg_pool());
waiting_for_load.push_back(onload);
C_SM_Load *c = new C_SM_Load(this);
- object_t oid(ino, 0);
+ object_t oid("sessionmap");
OSDMap *osdmap = mds->objecter->osdmap;
ceph_object_layout ol = osdmap->make_object_layout(oid,
mds->mdsmap->get_metadata_pg_pool());
encode(bl);
committing = version;
SnapContext snapc;
- object_t oid(ino, 0);
+ object_t oid("sessionmap");
OSDMap *osdmap = mds->objecter->osdmap;
ceph_object_layout ol = osdmap->make_object_layout(oid,
mds->mdsmap->get_metadata_pg_pool());
private:
ceph_osd_request_head head;
public:
+ object_t oid;
vector<ceph_osd_op> ops;
bufferlist ticket;
vector<snapid_t> snaps;
int get_client_inc() { return head.client_inc; }
tid_t get_client_tid() { return head.tid; }
- object_t get_oid() { return object_t(head.oid); }
+ object_t& get_oid() { return oid; }
pg_t get_pg() { return pg_t(head.layout.ol_pgid); }
ceph_object_layout get_layout() { return head.layout; }
epoch_t get_map_epoch() { return head.osdmap_epoch; }
MOSDOp(const bufferlist& tkt, int inc, long tid,
- object_t oid, ceph_object_layout ol, epoch_t mapepoch,
+ object_t& _oid, ceph_object_layout ol, epoch_t mapepoch,
int flags) :
Message(CEPH_MSG_OSD_OP),
+ oid(_oid),
ticket(tkt) {
memset(&head, 0, sizeof(head));
head.tid = tid;
head.client_inc = inc;
- head.oid = oid;
head.layout = ol;
head.osdmap_epoch = mapepoch;
head.flags = flags;
// marshalling
virtual void encode_payload() {
+ head.object_len = oid.name.length();
head.num_snaps = snaps.size();
head.num_ops = ops.size();
head.ticket_len = ticket.length();
::encode(head, payload);
::encode_nohead(ops, payload);
+ ::encode_nohead(oid.name, payload);
::encode_nohead(ticket, payload);
::encode_nohead(snaps, payload);
if (head.flags & CEPH_OSD_FLAG_PEERSTAT)
bufferlist::iterator p = payload.begin();
::decode(head, p);
decode_nohead(head.num_ops, ops, p);
+ decode_nohead(head.object_len, oid.name, p);
decode_nohead(head.ticket_len, ticket, p);
decode_nohead(head.num_snaps, snaps, p);
if (head.flags & CEPH_OSD_FLAG_PEERSTAT)
const char *get_type_name() { return "osd_op"; }
void print(ostream& out) {
out << "osd_op(" << get_reqid();
- out << " " << head.oid;
+ out << " " << oid;
out << " ";
if (may_read())
class MOSDOpReply : public Message {
ceph_osd_reply_head head;
public:
+ object_t oid;
vector<ceph_osd_op> ops;
long get_tid() { return head.tid; }
- object_t get_oid() { return head.oid; }
+ object_t get_oid() { return oid; }
pg_t get_pg() { return pg_t(head.layout.ol_pgid); }
int get_flags() { return head.flags; }
head.result = result;
head.flags =
(req->head.flags & ~(CEPH_OSD_FLAG_ONDISK|CEPH_OSD_FLAG_ONNVRAM|CEPH_OSD_FLAG_ACK)) | acktype;
- head.oid = req->head.oid;
+ oid = req->oid;
head.layout = req->head.layout;
head.osdmap_epoch = e;
head.reassert_version = req->head.reassert_version;
bufferlist::iterator p = payload.begin();
::decode(head, p);
::decode_nohead(head.num_ops, ops, p);
+ ::decode_nohead(head.object_len, oid.name, p);
}
virtual void encode_payload() {
head.num_ops = ops.size();
+ head.object_len = oid.name.length();
::encode(head, payload);
::encode_nohead(ops, payload);
+ ::encode_nohead(oid.name, payload);
}
const char *get_type_name() { return "osd_op_reply"; }
void print(ostream& out) {
out << "osd_op_reply(" << get_reqid()
- << " " << head.oid << " " << ops;
+ << " " << oid << " " << ops;
if (may_write()) {
if (is_ondisk())
out << " ondisk";
{
//assert(sizeof(oid) == 28);
char *t = s + strlen(s);
-#ifdef __LP64__
- sprintf(t, "/%016lx.%08x.%lx_%lx",
- oid.oid.ino, oid.oid.bno, oid.oid.pad, (__u64)oid.snap);
-#else
- sprintf(t, "/%08x_%016llx.%08x.%llx_%llx",
- oid.oid.ino, oid.oid.bno, oid.oid.pad, (__u64)oid.snap);
-#endif
+ sprintf(t, "/%s_%llx", oid.oid.name.c_str(), (long long unsigned)oid.snap);
//parse_object(t+1);
}
bool FileStore::parse_object(char *s, pobject_t& o)
{
- //assert(sizeof(o) == 28);
- if (strlen(s) < 29 ||
- s[16] != '.' ||
- s[25] != '.')
- return false;
- o.oid.ino = strtoull(s, &s, 16);
- o.oid.bno = strtoull(s+1, &s, 16);
- o.oid.pad = strtoull(s+1, &s, 16);
- o.snap = strtoull(s+1, &s, 16);
- return true;
+ char *bar = s + strlen(s) - 1;
+ while (*bar != '_' &&
+ bar > s)
+ bar--;
+ if (*bar == '_') {
+ o.oid.name = nstring(bar-s, s);
+ o.snap = strtoull(bar+1, &s, 16);
+ return true;
+ }
+ return false;
}
// 11111111112222222222333
#endif
}
-void FileStore::get_coname(coll_t cid, pobject_t oid, char *s)
+void FileStore::get_coname(coll_t cid, const pobject_t& oid, char *s)
{
get_cdir(cid, s);
append_oname(oid, s);
// --------------------
// objects
-bool FileStore::exists(coll_t cid, pobject_t oid)
+bool FileStore::exists(coll_t cid, const pobject_t& oid)
{
struct stat st;
if (stat(cid, oid, &st) == 0)
return false;
}
-int FileStore::stat(coll_t cid, pobject_t oid, struct stat *st)
+int FileStore::stat(coll_t cid, const pobject_t& oid, struct stat *st)
{
char fn[PATH_MAX];
get_coname(cid, oid, fn);
return r < 0 ? -errno:r;
}
-int FileStore::read(coll_t cid, pobject_t oid,
+int FileStore::read(coll_t cid, const pobject_t& oid,
__u64 offset, size_t len,
bufferlist& bl) {
char fn[PATH_MAX];
-int FileStore::_remove(coll_t cid, pobject_t oid)
+int FileStore::_remove(coll_t cid, const pobject_t& oid)
{
char fn[PATH_MAX];
get_coname(cid, oid, fn);
return r;
}
-int FileStore::_truncate(coll_t cid, pobject_t oid, __u64 size)
+int FileStore::_truncate(coll_t cid, const pobject_t& oid, __u64 size)
{
char fn[PATH_MAX];
get_coname(cid, oid, fn);
}
-int FileStore::_touch(coll_t cid, pobject_t oid)
+int FileStore::_touch(coll_t cid, const pobject_t& oid)
{
char fn[PATH_MAX];
get_coname(cid, oid, fn);
return r;
}
-int FileStore::_write(coll_t cid, pobject_t oid,
+int FileStore::_write(coll_t cid, const pobject_t& oid,
__u64 offset, size_t len,
const bufferlist& bl)
{
return r;
}
-int FileStore::_zero(coll_t cid, pobject_t oid, __u64 offset, size_t len)
+int FileStore::_zero(coll_t cid, const pobject_t& oid, __u64 offset, size_t len)
{
// write zeros.. yuck!
bufferptr bp(len);
// objects
-int FileStore::getattr(coll_t cid, pobject_t oid, const char *name,
+int FileStore::getattr(coll_t cid, const pobject_t& oid, const char *name,
void *value, size_t size)
{
if (fake_attrs) return attrs.getattr(cid, oid, name, value, size);
return r;
}
-int FileStore::getattr(coll_t cid, pobject_t oid, const char *name, bufferptr &bp)
+int FileStore::getattr(coll_t cid, const pobject_t& oid, const char *name, bufferptr &bp)
{
if (fake_attrs) return attrs.getattr(cid, oid, name, bp);
return r;
}
-int FileStore::getattrs(coll_t cid, pobject_t oid, map<nstring,bufferptr>& aset)
+int FileStore::getattrs(coll_t cid, const pobject_t& oid, map<nstring,bufferptr>& aset)
{
if (fake_attrs) return attrs.getattrs(cid, oid, aset);
-int FileStore::_setattr(coll_t cid, pobject_t oid, const char *name,
+int FileStore::_setattr(coll_t cid, const pobject_t& oid, const char *name,
const void *value, size_t size)
{
if (fake_attrs) return attrs.setattr(cid, oid, name, value, size);
return r;
}
-int FileStore::_setattrs(coll_t cid, pobject_t oid, map<nstring,bufferptr>& aset)
+int FileStore::_setattrs(coll_t cid, const pobject_t& oid, map<nstring,bufferptr>& aset)
{
if (fake_attrs) return attrs.setattrs(cid, oid, aset);
}
-int FileStore::_rmattr(coll_t cid, pobject_t oid, const char *name)
+int FileStore::_rmattr(coll_t cid, const pobject_t& oid, const char *name)
{
if (fake_attrs) return attrs.rmattr(cid, oid, name);
void append_oname(const pobject_t &oid, char *s);
//void get_oname(pobject_t oid, char *s);
void get_cdir(coll_t cid, char *s);
- void get_coname(coll_t cid, pobject_t oid, char *s);
+ void get_coname(coll_t cid, const pobject_t& oid, char *s);
bool parse_object(char *s, pobject_t& o);
bool parse_coll(char *s, coll_t& c);
int pick_object_revision_lt(pobject_t& oid) {
return 0;
}
- bool exists(coll_t cid, pobject_t oid);
- int stat(coll_t cid, pobject_t oid, struct stat *st);
- int read(coll_t cid, pobject_t oid, __u64 offset, size_t len, bufferlist& bl);
-
- int _touch(coll_t cid, pobject_t oid);
- int _write(coll_t cid, pobject_t oid, __u64 offset, size_t len, const bufferlist& bl);
- int _zero(coll_t cid, pobject_t oid, __u64 offset, size_t len);
- int _truncate(coll_t cid, pobject_t oid, __u64 size);
+ bool exists(coll_t cid, const pobject_t& oid);
+ int stat(coll_t cid, const pobject_t& oid, struct stat *st);
+ int read(coll_t cid, const pobject_t& oid, __u64 offset, size_t len, bufferlist& bl);
+
+ int _touch(coll_t cid, const pobject_t& oid);
+ 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 _do_clone_range(int from, int to, __u64 off, __u64 len);
- int _remove(coll_t cid, pobject_t oid);
+ int _remove(coll_t cid, const pobject_t& oid);
void _start_sync();
void sync(Context *onsafe);
// attrs
- int getattr(coll_t cid, pobject_t oid, const char *name, void *value, size_t size);
- int getattr(coll_t cid, pobject_t oid, const char *name, bufferptr &bp);
- int getattrs(coll_t cid, pobject_t oid, map<nstring,bufferptr>& aset);
+ int getattr(coll_t cid, const pobject_t& oid, const char *name, void *value, size_t size);
+ int getattr(coll_t cid, const pobject_t& oid, const char *name, bufferptr &bp);
+ int getattrs(coll_t cid, const pobject_t& oid, map<nstring,bufferptr>& aset);
int _getattr(const char *fn, const char *name, bufferptr& bp);
int _getattrs(const char *fn, map<nstring,bufferptr>& aset);
- int _setattr(coll_t cid, pobject_t oid, const char *name, const void *value, size_t size);
- int _setattrs(coll_t cid, pobject_t oid, map<nstring,bufferptr>& aset);
- int _rmattr(coll_t cid, pobject_t oid, const char *name);
+ int _setattr(coll_t cid, const pobject_t& oid, const char *name, const void *value, size_t size);
+ int _setattrs(coll_t cid, const pobject_t& oid, map<nstring,bufferptr>& aset);
+ int _rmattr(coll_t cid, const pobject_t& oid, const char *name);
int collection_getattr(coll_t c, const char *name, void *value, size_t size);
int collection_getattr(coll_t c, const char *name, bufferlist& bl);
int _collection_remove(coll_t c, pobject_t o);
int pick_object_revision_lt(coll_t cid, pobject_t& oid) { return -1; }
- void trim_from_cache(coll_t cid, pobject_t oid, __u64 offset, size_t len) {}
- int is_cached(coll_t cid, pobject_t oid, __u64 offset, size_t len) { 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; }
};
#endif
int op = OP_STARTSYNC;
ops.push_back(op);
}
- void touch(coll_t cid, pobject_t oid) {
+ void touch(coll_t cid, const pobject_t& oid) {
int op = OP_TOUCH;
ops.push_back(op);
cids.push_back(cid);
//len++;
//blen += 3;
}
- void write(coll_t cid, pobject_t oid, __u64 off, size_t len, const bufferlist& bl) {
+ void write(coll_t cid, const pobject_t& oid, __u64 off, size_t len, const bufferlist& bl) {
int op = OP_WRITE;
ops.push_back(op);
cids.push_back(cid);
//len++;
//blen += 3 + bl.buffers().size();
}
- void zero(coll_t cid, pobject_t oid, __u64 off, size_t len) {
+ void zero(coll_t cid, const pobject_t& oid, __u64 off, size_t len) {
int op = OP_ZERO;
ops.push_back(op);
cids.push_back(cid);
//len++;
//blen += 3 + 1;
}
- void trim_from_cache(coll_t cid, pobject_t oid, __u64 off, size_t len) {
+ void trim_from_cache(coll_t cid, const pobject_t& oid, __u64 off, size_t len) {
int op = OP_TRIMCACHE;
ops.push_back(op);
cids.push_back(cid);
lengths.push_back(len);
//len++;
}
- void truncate(coll_t cid, pobject_t oid, __u64 off) {
+ void truncate(coll_t cid, const pobject_t& oid, __u64 off) {
int op = OP_TRUNCATE;
ops.push_back(op);
cids.push_back(cid);
//len++;
//blen++;
}
- void remove(coll_t cid, pobject_t oid) {
+ void remove(coll_t cid, const pobject_t& oid) {
int op = OP_REMOVE;
ops.push_back(op);
cids.push_back(cid);
//len++;
//blen++;
}
- void setattr(coll_t cid, pobject_t oid, const char* name, const void* val, int len) {
+ void setattr(coll_t cid, const pobject_t& oid, const char* name, const void* val, int len) {
bufferlist bl;
bl.append((char*)val, len);
setattr(cid, oid, name, bl);
}
- void setattr(coll_t cid, pobject_t oid, nstring& s, bufferlist& val) {
+ void setattr(coll_t cid, const pobject_t& oid, nstring& s, bufferlist& val) {
attrnames2.push_back(nstring());
attrnames2.back().swap(s);
setattr(cid, oid, attrnames2.back().c_str(), val);
}
- void setattr(coll_t cid, pobject_t oid, const char* name, bufferlist& val) {
+ void setattr(coll_t cid, const pobject_t& oid, const char* name, bufferlist& val) {
int op = OP_SETATTR;
ops.push_back(op);
cids.push_back(cid);
//len++;
//blen++;
}
- void setattrs(coll_t cid, pobject_t oid, map<nstring,bufferptr>& attrset) {
+ void setattrs(coll_t cid, const pobject_t& oid, map<nstring,bufferptr>& attrset) {
map<nstring,bufferptr> empty;
int op = OP_SETATTRS;
ops.push_back(op);
//len++;
//blen += 5 + attrset.size(); // HACK allowance for removing old attrs
}
- void rmattr(coll_t cid, pobject_t oid, nstring& s) {
+ void rmattr(coll_t cid, const pobject_t& oid, nstring& s) {
attrnames2.push_back(nstring());
attrnames2.back().swap(s);
rmattr(cid, oid, attrnames2.back().c_str());
}
- void rmattr(coll_t cid, pobject_t oid, const char* name) {
+ void rmattr(coll_t cid, const pobject_t& oid, const char* name) {
int op = OP_RMATTR;
ops.push_back(op);
cids.push_back(cid);
//len++;
//blen++;
}
- void clone(coll_t cid, pobject_t oid, pobject_t noid) {
+ void clone(coll_t cid, const pobject_t& oid, pobject_t noid) {
int op = OP_CLONE;
ops.push_back(op);
cids.push_back(cid);
//len++;
//blen += 5;
}
- void clone_range(coll_t cid, pobject_t oid, pobject_t noid, __u64 off, __u64 len) {
+ void clone_range(coll_t cid, const pobject_t& oid, pobject_t noid, __u64 off, __u64 len) {
int op = OP_CLONERANGE;
ops.push_back(op);
cids.push_back(cid);
//len++;
//blen++;
}
- void collection_add(coll_t cid, coll_t ocid, pobject_t oid) {
+ void collection_add(coll_t cid, coll_t ocid, const pobject_t& oid) {
int op = OP_COLL_ADD;
ops.push_back(op);
cids.push_back(cid);
//len++;
//blen++;
}
- void collection_remove(coll_t cid, pobject_t oid) {
+ void collection_remove(coll_t cid, const pobject_t& oid) {
int op = OP_COLL_REMOVE;
ops.push_back(op);
cids.push_back(cid);
// objects
virtual int pick_object_revision_lt(coll_t cid, pobject_t& oid) = 0;
- virtual bool exists(coll_t cid, pobject_t oid) = 0; // useful?
- virtual int stat(coll_t cid, pobject_t oid, struct stat *st) = 0; // struct stat?
- virtual int read(coll_t cid, pobject_t oid, __u64 offset, size_t len, bufferlist& bl) = 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;
/*
virtual int _remove(coll_t cid, pobject_t oid) = 0;
}
*/
- virtual void trim_from_cache(coll_t cid, pobject_t oid, __u64 offset, size_t len) = 0; //{ }
- virtual int is_cached(coll_t cid, pobject_t oid, __u64 offset, size_t len) = 0; //{ return -1; }
+ virtual void trim_from_cache(coll_t cid, const pobject_t& oid, __u64 offset, size_t len) = 0; //{ }
+ virtual int is_cached(coll_t cid, const pobject_t& oid, __u64 offset, size_t len) = 0; //{ return -1; }
- virtual int getattr(coll_t cid, pobject_t oid, const char *name, void *value, size_t size) = 0;
- virtual int getattr(coll_t cid, pobject_t oid, const char *name, bufferptr& value) = 0;
- int getattr(coll_t cid, pobject_t oid, const char *name, bufferlist& value) {
+ virtual int getattr(coll_t cid, const pobject_t& oid, const char *name, void *value, size_t size) = 0;
+ virtual int getattr(coll_t cid, const pobject_t& oid, const char *name, bufferptr& value) = 0;
+ int getattr(coll_t cid, const pobject_t& oid, const char *name, bufferlist& value) {
bufferptr bp;
int r = getattr(cid, oid, name, bp);
if (bp.length())
value.push_back(bp);
return r;
}
- virtual int getattrs(coll_t cid, pobject_t oid, map<nstring,bufferptr>& aset) {return 0;};
+ virtual int getattrs(coll_t cid, const pobject_t& oid, map<nstring,bufferptr>& aset) {return 0;};
/*
virtual int _setattr(coll_t cid, pobject_t oid, const char *name, const void *value, size_t size) = 0;
}
-pobject_t Ager::age_get_oid() {
+file_object_t Ager::age_get_oid() {
if (!age_free_oids.empty()) {
- pobject_t o = age_free_oids.front();
+ file_object_t o = age_free_oids.front();
age_free_oids.pop_front();
return o;
}
- pobject_t last = age_cur_oid;
- ++age_cur_oid.oid.bno;
+ file_object_t last = age_cur_oid;
+ ++age_cur_oid.bno;
return last;
}
avail - free > .02)
store->sync();
- pobject_t poid = age_get_oid();
+ file_object_t poid = age_get_oid();
int b = myrand() % 10;
age_objects[b].push_back(poid);
bufferlist sbl;
sbl.substr_of(bl, 0, t);
ObjectStore::Transaction tr;
- tr.write(0, poid, off, t, sbl);
+ pobject_t oid(poid, 0);
+ tr.write(0, oid, off, t, sbl);
store->apply_transaction(tr);
off += t;
s -= t;
}
- poid.oid.bno++;
+ poid.bno++;
}
return wrote*4; // KB
n = nper;
continue;
}
- pobject_t poid = age_objects[b].front();
+ file_object_t poid = age_objects[b].front();
age_objects[b].pop_front();
generic_dout(2) << "age_empty at " << free << " / " << avail << " / " << pc << " removing " << hex << poid << dec << dendl;
ObjectStore::Transaction t;
- t.remove(0, poid);
+ pobject_t oid(poid, 0);
+ t.remove(0, oid);
store->apply_transaction(t);
age_free_oids.push_back(poid);
}
utime_t nextfl = start;
nextfl.sec_ref() += freelist_inc;
- while (age_objects.size() < 10) age_objects.push_back( list<pobject_t>() );
+ while (age_objects.size() < 10) age_objects.push_back( list<file_object_t>() );
if (fake_size_mb) {
int fake_bl = fake_size_mb * 256;
// init size distn (once)
if (!did_distn) {
did_distn = true;
- age_cur_oid = pobject_t(object_t(0,1), 0);
+ age_cur_oid = file_object_t(888, 0);
file_size_distn.add(1, 19.0758125+0.65434375);
file_size_distn.add(512, 35.6566);
file_size_distn.add(1024, 27.7271875);
ObjectStore *store;
private:
- list<pobject_t> age_free_oids;
- pobject_t age_cur_oid;
- vector< list<pobject_t> > age_objects;
+ list<file_object_t> age_free_oids;
+ file_object_t age_cur_oid;
+ vector< list<file_object_t> > age_objects;
Distribution file_size_distn; //kb
bool did_distn;
void age_empty(float pc);
uint64_t age_fill(float pc, utime_t until);
ssize_t age_pick_size();
- pobject_t age_get_oid();
+ file_object_t age_get_oid();
public:
Ager(ObjectStore *s) : store(s), did_distn(false) {}
bl.push_back(bp);
cout << "testing disk bandwidth..." << std::endl;
utime_t start = g_clock.now();
+ object_t oid("disk_bw_test");
for (int i=0; i<1000; i++) {
ObjectStore::Transaction t;
- t.write(0, pobject_t(object_t(999,i), 0), 0, bl.length(), bl);
+ t.write(0, pobject_t(oid, 0), i*bl.length(), bl.length(), bl);
store->apply_transaction(t);
}
store->sync();
end -= start;
cout << "measured " << (1000.0 / (double)end) << " mb/sec" << std::endl;
ObjectStore::Transaction tr;
- for (int i=0; i<1000; i++)
- tr.remove(0, pobject_t(object_t(999,i), 0));
+ tr.remove(0, pobject_t(oid, 0));
store->apply_transaction(tr);
// set osd weight
int get_nodeid() { return whoami; }
static pobject_t get_osdmap_pobject_name(epoch_t epoch) {
- return pobject_t(object_t(0, epoch << 1), 0);
+ char foo[20];
+ sprintf(foo, "osdmap.%d", epoch);
+ return pobject_t(object_t(foo), 0);
}
static pobject_t get_inc_osdmap_pobject_name(epoch_t epoch) {
- return pobject_t(object_t(0, (epoch << 1) + 1), 0);
+ char foo[20];
+ sprintf(foo, "inc_osdmap.%d", epoch);
+ return pobject_t(object_t(foo), 0);
}
ceph_object_layout make_object_layout(object_t oid, int pg_pool, int preferred=-1, int object_stripe_unit = 0) {
// calculate ps (placement seed)
+ static hash<object_t> H;
+ ps_t ps = H(oid);
+ /*
ps_t ps; // NOTE: keep full precision, here!
switch (g_conf.osd_object_layout) {
case CEPH_OBJECT_LAYOUT_LINEAR:
default:
assert(0);
- }
+ }*/
+
//cout << "preferred " << preferred << " num " << num << " mask " << num_mask << " ps " << ps << endl;
//#define CEPH_POOL(poolset, size) (((poolset) << 8) + (size))
-#define OSD_SUPERBLOCK_POBJECT sobject_t(object_t(0,0), 0)
+#define OSD_SUPERBLOCK_POBJECT sobject_t(object_t("osd_superblock"), 0)
// placement group id
struct pg_t {
operator uint64_t() const { return u.pg64; }
pobject_t to_log_pobject() const {
- return pobject_t(object_t(u.pg64, 0), CEPH_NOSNAP);
+ char foo[20];
+ sprintf(foo, "pg_log_%llx", (long long unsigned)u.pg64);
+ return pobject_t(object_t(foo), CEPH_NOSNAP);
}
coll_t to_coll() const {
// find oid, extent
ObjectExtent *ex = 0;
- object_t oid( ino, objectno );
+ object_t oid = file_object_t(ino, objectno);
if (object_extents.count(oid))
ex = &object_extents[oid];
else {
class OSDMap;
+
/**** Filer interface ***/
class Filer {
C_ReadHead *fin = new C_ReadHead(this);
vector<snapid_t> snaps;
- object_t oid(ino, 0);
+ object_t oid = file_object_t(ino, 0);
ceph_object_layout ol = objecter->osdmap->make_object_layout(oid, pg_pool);
objecter->read_full(oid, ol, CEPH_NOSNAP, &fin->bl, 0, fin);
}
::encode(last_written, bl);
SnapContext snapc;
- object_t oid(ino, 0);
+ object_t oid = file_object_t(ino, 0);
ceph_object_layout ol = objecter->osdmap->make_object_layout(oid, pg_pool);
objecter->write_full(oid, ol, snapc, bl, g_clock.now(), 0,
NULL,
//cout << "stop at " << end << std::endl;
cout << "# offset\tack\tcommit" << std::endl;
while (now < end) {
- pobject_t poid(object_t(1, 1), 0);
+ pobject_t poid(object_t("streamtest"), 0);
utime_t start = now;
set_start(pos, now);
ObjectStore::Transaction t;
time(&tm);
snprintf(buf, 128, "%s", ctime(&tm));
- struct ceph_object oid;
- memset(&oid, 0, sizeof(oid));
- oid.ino = 0x2010;
+ const char *oid = "foo";
rados_pool_t pool;
int r = rados_open_pool("data", &pool);
printf("open pool result = %d, pool = %d\n", r, pool);
- rados_write(pool, &oid, 0, buf, strlen(buf) + 1);
- rados_exec(pool, &oid, "test", "foo", buf, strlen(buf) + 1, buf, 128);
+ rados_write(pool, oid, 0, buf, strlen(buf) + 1);
+ rados_exec(pool, oid, "test", "foo", buf, strlen(buf) + 1, buf, 128);
printf("exec result=%s\n", buf);
- int size = rados_read(pool, &oid, 0, buf2, 128);
+ int size = rados_read(pool, oid, 0, buf2, 128);
printf("read result=%s\n", buf2);
printf("size=%d\n", size);
// test aio
rados_completion_t a, b;
- oid.bno = 1;
- rados_aio_write(pool, &oid, 0, buf, 100, &a);
- oid.bno = 2;
- rados_aio_write(pool, &oid, 0, buf, 100, &b);
+ rados_aio_write(pool, "a", 0, buf, 100, &a);
+ rados_aio_write(pool, "b", 0, buf, 100, &b);
rados_aio_wait_for_safe(a);
printf("a safe\n");
rados_aio_wait_for_safe(b);
snprintf(buf, 128, "%s", ctime(&tm));
bl.append(buf, strlen(buf));
- object_t oid;
- memset(&oid, 0, sizeof(oid));
- oid.ino = 0x2010;
+ object_t oid("foo");
rados_pool_t pool;
int r = rados.open_pool("data", &pool);