#define __LIBRADOS_H
#ifdef __cplusplus
+
+#include "include/types.h"
+
extern "C" {
#endif
int rados_close_pool(rados_pool_t pool);
/* read/write objects */
-int rados_write(rados_pool_t pool, struct ceph_object *oid, const char *buf, off_t off, size_t len);
-int rados_read(rados_pool_t pool, struct ceph_object *oid, char *buf, off_t off, size_t len);
+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_exec(rados_pool_t pool, struct ceph_object *o, const char *cls, const char *method,
const char *in_buf, size_t in_len, char *buf, size_t out_len);
#ifdef __cplusplus
}
+
+class RadosClient;
+
+class Rados
+{
+ RadosClient *client;
+public:
+ Rados();
+ ~Rados();
+ bool initialize(int argc, const char *argv[]);
+
+ int open_pool(const char *name, rados_pool_t *pool);
+ int close_pool(rados_pool_t pool);
+
+ int write(rados_pool_t pool, object_t& oid, off_t off, bufferlist& bl, size_t len);
+ int read(rados_pool_t pool, object_t& oid, off_t off, bufferlist& bl, size_t len);
+
+ int exec(rados_pool_t pool, object_t& oid, const char *cls, const char *method,
+ bufferlist& inbl, size_t in_len, bufferlist& outbl, size_t out_len);
+};
#endif
#endif
#include "messages/MClientMount.h"
#include "messages/MClientMountAck.h"
+#include "include/librados.h"
+
class RadosClient : public Dispatcher
{
Cond cond;
public:
- RadosClient() : messenger(NULL), mc(NULL), lock("c3") {}
+ RadosClient() : messenger(NULL), mc(NULL), lock("radosclient") {}
~RadosClient();
bool init();
return osdmap.lookup_pg_pool_name(name);
}
- int write(int pool, object_t& oid, const char *buf, off_t off, size_t len);
- int read(int pool, object_t& oid, char *buf, off_t off, size_t len);
+ int write(int pool, object_t& oid, off_t off, bufferlist& bl, size_t len);
+ int read(int pool, object_t& oid, off_t off, bufferlist& bl, size_t len);
- int exec(int pool, object_t& oid, const char *cls, const char *method, const char *inbuf, size_t in_len, char *buf, size_t out_len);
+ int exec(int pool, object_t& oid, const char *cls, const char *method, bufferlist& inbl, size_t in_len, bufferlist& outbl, size_t out_len);
};
bool RadosClient::init()
return false;
rank.bind();
- cout << "starting c3." << g_conf.id
+ cout << "starting radosclient." << g_conf.id
<< " at " << rank.get_rank_addr()
<< " fsid " << monmap.get_fsid()
<< std::endl;
return true;
}
-int RadosClient::write(int pool, object_t& oid, const char *buf, off_t off, size_t len)
+int RadosClient::write(int pool, object_t& oid, off_t off, bufferlist& bl, size_t len)
{
SnapContext snapc;
- bufferlist bl;
utime_t ut = g_clock.now();
Mutex lock("RadosClient::write");
bool done;
int r;
Context *onack = new C_SafeCond(&lock, &cond, &done, &r);
-
+#if 0
bl.append(&buf[off], len);
-
+#endif
ceph_object_layout layout = objecter->osdmap->make_object_layout(oid, pool);
dout(0) << "going to write" << dendl;
return len;
}
-int RadosClient::exec(int pool, object_t& oid, const char *cls, const char *method, const char *inbuf, size_t in_len, char *buf, size_t out_len)
+int RadosClient::exec(int pool, object_t& oid, const char *cls, const char *method, bufferlist& inbl, size_t in_len, bufferlist& outbl, size_t out_len)
{
SnapContext snapc;
utime_t ut = g_clock.now();
lock.Lock();
ObjectRead rd;
- bufferlist inbl, outbl;
- inbl.append(inbuf, in_len);
rd.rdcall(cls, method, inbl);
objecter->read(oid, layout, rd, CEPH_NOSNAP, &outbl, 0, onack);
if (outbl.length() < out_len)
out_len = outbl.length();
- if (out_len)
- memcpy(buf, outbl.c_str(), out_len);
-
return out_len;
}
-int RadosClient::read(int pool, object_t& oid, char *buf, off_t off, size_t len)
+int RadosClient::read(int pool, object_t& oid, off_t off, bufferlist& bl, size_t len)
{
SnapContext snapc;
- bufferlist bl;
Mutex lock("RadosClient::rdcall");
Cond cond;
if (bl.length() < len)
len = bl.length();
- if (len)
- memcpy(buf, bl.c_str(), len);
-
return len;
}
+Rados::Rados() : client(NULL)
+{
+}
+
+Rados::~Rados()
+{
+ if (client)
+ delete client;
+ client = NULL;
+}
+
+bool Rados::initialize(int argc, const char *argv[])
+{
+ vector<const char*> args;
+
+ if (argc && argv) {
+ argv_to_vec(argc, argv, args);
+ env_to_vec(args);
+ }
+ common_init(args, "librados", false);
+
+ if (g_conf.clock_tare) g_clock.tare();
+
+ client = new RadosClient();
+ return client->init();
+}
+
+int Rados::write(rados_pool_t pool, object_t& oid, off_t off, bufferlist& bl, size_t len)
+{
+ if (!client)
+ return -EINVAL;
+
+ return client->write(pool, oid, off, bl, len);
+}
+
+int Rados::read(rados_pool_t pool, object_t& oid, off_t off, bufferlist& bl, size_t len)
+{
+ if (!client)
+ return -EINVAL;
+
+ return client->read(pool, oid, off, bl, len);
+}
+
+int Rados::exec(rados_pool_t pool, object_t& oid, const char *cls, const char *method,
+ bufferlist& inbl, size_t in_len, bufferlist& outbl, size_t out_len)
+{
+ if (!client)
+ return -EINVAL;
+
+ return client->exec(pool, oid, cls, method, inbl, in_len, outbl, out_len);
+}
+
+int Rados::open_pool(const char *name, rados_pool_t *pool)
+{
+ int poolid = client->lookup_pool(name);
+ if (poolid >= 0) {
+ *pool = poolid;
+ return 0;
+ }
+ return poolid;
+}
+
+int Rados::close_pool(rados_pool_t pool)
+{
+ return 0;
+}
// ---------------------------------------------
return 0;
}
-extern "C" int rados_write(rados_pool_t pool, ceph_object *o, const char *buf, off_t off, size_t len)
+extern "C" int rados_write(rados_pool_t pool, ceph_object *o, off_t off, const char *buf, size_t len)
{
object_t oid(*o);
- return radosp->write(pool, oid, buf, off, len);
+ bufferlist bl;
+ bl.append(buf, len);
+ return radosp->write(pool, oid, off, bl, len);
}
-extern "C" int rados_read(rados_pool_t pool, ceph_object *o, char *buf, off_t off, size_t len)
+extern "C" int rados_read(rados_pool_t pool, ceph_object *o, off_t off, char *buf, size_t len)
{
+ int ret;
object_t oid(*o);
- return radosp->read(pool, oid, buf, off, len);
+ bufferlist bl;
+ ret = radosp->read(pool, oid, off, bl, len);
+ if (ret > 0)
+ memcpy(buf, bl.c_str(), ret);
+
+ return ret;
}
extern "C" int rados_exec(rados_pool_t pool, ceph_object *o, const char *cls, const char *method,
const char *inbuf, size_t in_len, char *buf, size_t out_len)
{
object_t oid(*o);
- return radosp->exec(pool, oid, cls, method, inbuf, in_len, buf, out_len);
+ bufferlist inbl, outbl;
+ int ret;
+ inbl.append(inbuf, in_len);
+ ret = radosp->exec(pool, oid, cls, method, inbl, in_len, outbl, out_len);
+ if (ret > 0)
+ memcpy(buf, outbl.c_str(), ret);
+
+ return ret;
}
--- /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.
+ *
+ */
+
+#include "include/librados.h"
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <time.h>
+
+int main(int argc, const char **argv)
+{
+ Rados rados;
+ if (!rados.initialize(0, NULL)) {
+ cerr << "couldn't initialize rados!" << std::endl;
+ exit(1);
+ }
+
+ time_t tm;
+ bufferlist bl, bl2;
+ char buf[128];
+
+ time(&tm);
+ snprintf(buf, 128, "%s", ctime(&tm));
+ bl.append(buf, strlen(buf) + 1);
+
+ object_t oid;
+ memset(&oid, 0, sizeof(oid));
+ oid.ino = 0x2010;
+
+ 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, bl, bl.length());
+ rados.exec(pool, oid, "test", "foo", bl, bl.length(), bl2, 1024);
+ printf("exec result=%s\n", bl2.c_str());
+ int size = rados.read(pool, oid, 0, bl2, 128);
+
+ rados.close_pool(pool);
+
+ cout << "read result=" << bl2.c_str() << std::endl;
+ cout << "size=" << size << std::endl;
+
+ return 0;
+}
+