--- /dev/null
+#ifndef __LIBRADOS_HPP
+#define __LIBRADOS_HPP
+
+#include <stdbool.h>
+#include <linux/types.h>
+#include <string>
+#include <list>
+#include <map>
+#include <vector>
+#include "buffer.h"
+
+namespace librados {
+
+ using ceph::bufferlist;
+
+ typedef void *list_ctx_t;
+ typedef void *pool_t;
+ typedef __u64 snap_t;
+ typedef __u64 auid_t;
+
+ struct statfs_t {
+ __u64 kb, kb_used, kb_avail;
+ __u64 num_objects;
+ };
+
+ struct pool_stat_t {
+ __u64 num_bytes; // in bytes
+ __u64 num_kb; // in KB
+ __u64 num_objects;
+ __u64 num_object_clones;
+ __u64 num_object_copies; // num_objects * num_replicas
+ __u64 num_objects_missing_on_primary;
+ __u64 num_objects_degraded;
+ __u64 num_rd, num_rd_kb, num_wr, num_wr_kb;
+ };
+
+ typedef void *completion_t;
+ typedef void (*callback_t)(completion_t cb, void *arg);
+
+
+class Rados
+{
+ void *client;
+public:
+ Rados();
+ ~Rados();
+ int initialize(int argc, const char *argv[]);
+ void shutdown();
+
+ int open_pool(const char *name, pool_t *pool);
+ int close_pool(pool_t pool);
+
+ void set_snap(pool_t pool, snap_t seq);
+
+ int create(pool_t pool, const std::string& oid, bool exclusive);
+
+ int write(pool_t pool, const std::string& oid, off_t off, bufferlist& bl, size_t len);
+ int write_full(pool_t pool, const std::string& oid, bufferlist& bl);
+ int read(pool_t pool, const std::string& oid, off_t off, bufferlist& bl, size_t len);
+ int remove(pool_t pool, const std::string& oid);
+
+ int getxattr(pool_t pool, const std::string& oid, const char *name, bufferlist& bl);
+ int setxattr(pool_t pool, const std::string& oid, const char *name, bufferlist& bl);
+ int getxattrs(pool_t pool, const std::string& oid, std::map<std::string, bufferlist>& attrset);
+ int stat(pool_t pool, const std::string& oid, __u64 *psize, time_t *pmtime);
+
+ int tmap_update(pool_t pool, const std::string& oid, bufferlist& cmdbl);
+
+ int exec(pool_t pool, const std::string& oid, const char *cls, const char *method,
+ bufferlist& inbl, bufferlist& outbl);
+
+ struct ListCtx {
+ void *ctx;
+ ListCtx() : ctx(NULL) {}
+ };
+
+ int list(pool_t pool, int max, std::list<std::string>& entries, Rados::ListCtx& ctx);
+ int list_pools(std::list<std::string>& v);
+ int get_pool_stats(std::list<std::string>& v,
+ std::map<std::string,pool_stat_t>& stats);
+ int get_fs_stats(statfs_t& result);
+
+ int create_pool(const char *name, __u64 auid=0);
+ int delete_pool(const pool_t& pool);
+ int change_pool_auid(const pool_t& pool, __u64 auid);
+
+ int snap_create(const pool_t pool, const char *snapname);
+ int snap_remove(const pool_t pool, const char *snapname);
+ int snap_list(pool_t pool, std::vector<snap_t> *snaps);
+ int snap_get_name(pool_t pool, snap_t snap, std::string *name);
+ int snap_get_stamp(pool_t pool, snap_t snap, time_t *t);
+ int snap_lookup(pool_t, const char *snapname, snap_t *snapid);
+
+ // -- aio --
+ struct AioCompletion {
+ void *pc;
+ AioCompletion(void *_pc) : pc(_pc) {}
+ int set_callback(callback_t cb, void *cba);
+ int wait_for_complete();
+ int wait_for_safe();
+ bool is_complete();
+ bool is_safe();
+ int get_return_value();
+ void release();
+ };
+
+ int aio_read(pool_t pool, const std::string& oid, off_t off, bufferlist *pbl, size_t len,
+ AioCompletion **pc);
+ int aio_write(pool_t pool, const std::string& oid, off_t off, const bufferlist& bl, size_t len,
+ AioCompletion **pc);
+
+};
+
+}
+
+#endif
+
#include "osdc/Objecter.h"
#include "include/librados.h"
+#include "include/librados.hpp"
#define RADOS_LIST_MAX_ENTRIES 1024
#define DOUT_SUBSYS rados
}
// snaps
- int snap_list(PoolCtx *pool, vector<rados_snap_t> *snaps);
- int snap_lookup(PoolCtx *pool, const char *name, rados_snap_t *snapid);
- int snap_get_name(PoolCtx *pool, rados_snap_t snapid, std::string *s);
- int snap_get_stamp(PoolCtx *pool, rados_snap_t snapid, time_t *t);
+ int snap_list(PoolCtx *pool, vector<__u64> *snaps);
+ int snap_lookup(PoolCtx *pool, const char *name, __u64 *snapid);
+ int snap_get_name(PoolCtx *pool, __u64 snapid, std::string *s);
+ int snap_get_stamp(PoolCtx *pool, __u64 snapid, time_t *t);
int snap_create(const rados_pool_t pool, const char* snapname);
int snap_remove(const rados_pool_t pool, const char* snapname);
int setxattr(PoolCtx& pool, const object_t& oid, const char *name, bufferlist& bl);
int getxattrs(PoolCtx& pool, const object_t& oid, map<string, bufferlist>& attrset);
- int list_pools(std::vector<string>& ls);
- int get_pool_stats(std::vector<string>& ls, map<string,rados_pool_stat_t>& result);
- int get_fs_stats( rados_statfs_t& result );
+ int list_pools(std::list<string>& ls);
+ int get_pool_stats(std::list<string>& ls, map<string,pool_stat_t>& result);
+ int get_fs_stats(ceph_statfs& result);
- int create_pool(string& name, __u64 auid=0);
+ int create_pool(string& name, unsigned long long auid=0);
int delete_pool(const rados_pool_t& pool);
- int change_pool_auid(const rados_pool_t& pool, __u64 auid);
+ int change_pool_auid(const rados_pool_t& pool, unsigned long long auid);
int list(PoolCtx& pool, int max_entries, std::list<object_t>& entries,
Objecter::ListContext *context);
return true;
}
-int RadosClient::list_pools(std::vector<string>& v)
+int RadosClient::list_pools(std::list<string>& v)
{
Mutex::Locker l(lock);
for (map<int,pg_pool_t>::const_iterator p = osdmap.get_pools().begin();
return 0;
}
-int RadosClient::get_pool_stats(std::vector<string>& pools, map<string,rados_pool_stat_t>& result)
+int RadosClient::get_pool_stats(std::list<string>& pools, map<string,pool_stat_t>& result)
{
map<string,pool_stat_t> r;
Mutex mylock("RadosClient::get_pool_stats::mylock");
cond.Wait(mylock);
mylock.Unlock();
- for (map<string,pool_stat_t>::iterator p = r.begin();
- p != r.end();
- p++) {
- rados_pool_stat_t& v = result[p->first];
- v.num_kb = p->second.num_kb;
- v.num_bytes = p->second.num_bytes;
- v.num_objects = p->second.num_objects;
- v.num_object_clones = p->second.num_object_clones;
- v.num_object_copies = p->second.num_object_copies;
- v.num_objects_missing_on_primary = p->second.num_objects_missing_on_primary;
- v.num_objects_degraded = p->second.num_objects_degraded;
- v.num_rd = p->second.num_rd;
- v.num_rd_kb = p->second.num_rd_kb;
- v.num_wr = p->second.num_wr;
- v.num_wr_kb = p->second.num_wr_kb;
- }
-
return 0;
}
-int RadosClient::get_fs_stats( rados_statfs_t& result ) {
- ceph_statfs stats;
-
+int RadosClient::get_fs_stats(ceph_statfs& stats)
+{
Mutex mylock ("RadosClient::get_fs_stats::mylock");
Cond cond;
bool done;
while (!done) cond.Wait(mylock);
mylock.Unlock();
- result.kb = stats.kb;
- result.kb_used = stats.kb_used;
- result.kb_avail = stats.kb_avail;
- result.num_objects = stats.num_objects;
return 0;
}
return reply;
}
-int RadosClient::create_pool(string& name, __u64 auid)
+int RadosClient::create_pool(string& name, unsigned long long auid)
{
int reply;
* auid: the auid you wish the pool to have.
* Returns: 0 on success, or -ERROR# on failure.
*/
-int RadosClient::change_pool_auid(const rados_pool_t& pool, __u64 auid)
+int RadosClient::change_pool_auid(const rados_pool_t& pool, unsigned long long auid)
{
int reply;
return reply;
}
-int RadosClient::snap_list(PoolCtx *pool, vector<rados_snap_t> *snaps)
+int RadosClient::snap_list(PoolCtx *pool, vector<__u64> *snaps)
{
Mutex::Locker l(lock);
const pg_pool_t *pi = objecter->osdmap->get_pg_pool(pool->poolid);
return 0;
}
-int RadosClient::snap_lookup(PoolCtx *pool, const char *name, rados_snap_t *snapid)
+int RadosClient::snap_lookup(PoolCtx *pool, const char *name, __u64 *snapid)
{
Mutex::Locker l(lock);
const pg_pool_t *pi = objecter->osdmap->get_pg_pool(pool->poolid);
return -ENOENT;
}
-int RadosClient::snap_get_name(PoolCtx *pool, rados_snap_t snapid, std::string *s)
+int RadosClient::snap_get_name(PoolCtx *pool, __u64 snapid, std::string *s)
{
Mutex::Locker l(lock);
const pg_pool_t *pi = objecter->osdmap->get_pg_pool(pool->poolid);
return 0;
}
-int RadosClient::snap_get_stamp(PoolCtx *pool, rados_snap_t snapid, time_t *t)
+int RadosClient::snap_get_stamp(PoolCtx *pool, __u64 snapid, time_t *t)
{
Mutex::Locker l(lock);
const pg_pool_t *pi = objecter->osdmap->get_pg_pool(pool->poolid);
// ---------------------------------------------
+namespace librados {
+
Rados::Rados() : client(NULL)
{
}
Rados::~Rados()
{
if (client)
- delete client;
+ delete (RadosClient *)client;
client = NULL;
}
if (g_conf.clock_tare) g_clock.tare();
client = new RadosClient();
- return client->init() ? 0 : -1;
+ return ((RadosClient *)client)->init() ? 0 : -1;
}
void Rados::shutdown()
{
- client->shutdown();
+ ((RadosClient *)client)->shutdown();
}
-int Rados::list_pools(std::vector<string>& v)
+int Rados::list_pools(std::list<string>& v)
{
if (!client)
return -EINVAL;
- return client->list_pools(v);
+ return ((RadosClient *)client)->list_pools(v);
}
-int Rados::get_pool_stats(std::vector<string>& v, std::map<string,rados_pool_stat_t>& result)
+int Rados::get_pool_stats(std::list<string>& v, std::map<string,pool_stat_t>& result)
{
if (!client)
return -EINVAL;
- return client->get_pool_stats(v, result);
+ map<string,::pool_stat_t> rawresult;
+ int r = ((RadosClient *)client)->get_pool_stats(v, rawresult);
+ for (map<string,::pool_stat_t>::iterator p = rawresult.begin();
+ p != rawresult.end();
+ p++) {
+ pool_stat_t& v = result[p->first];
+ v.num_kb = p->second.num_kb;
+ v.num_bytes = p->second.num_bytes;
+ v.num_objects = p->second.num_objects;
+ v.num_object_clones = p->second.num_object_clones;
+ v.num_object_copies = p->second.num_object_copies;
+ v.num_objects_missing_on_primary = p->second.num_objects_missing_on_primary;
+ v.num_objects_degraded = p->second.num_objects_degraded;
+ v.num_rd = p->second.num_rd;
+ v.num_rd_kb = p->second.num_rd_kb;
+ v.num_wr = p->second.num_wr;
+ v.num_wr_kb = p->second.num_wr_kb;
+ }
+ return r;
}
int Rados::create_pool(const char *name, __u64 auid)
string str(name);
if (!client)
return -EINVAL;
- return client->create_pool(str, auid);
+ return ((RadosClient *)client)->create_pool(str, auid);
}
int Rados::delete_pool(const rados_pool_t& pool)
{
if (!client) return -EINVAL;
- return client->delete_pool(pool);
+ return ((RadosClient *)client)->delete_pool(pool);
}
int Rados::change_pool_auid(const rados_pool_t& pool, __u64 auid)
{
if (!client) return -EINVAL;
- return client->change_pool_auid(pool, auid);
+ return ((RadosClient *)client)->change_pool_auid(pool, auid);
}
-int Rados::get_fs_stats(rados_statfs_t& result) {
- if(!client) return -EINVAL;
- return client->get_fs_stats(result);
+int Rados::get_fs_stats(statfs_t& result)
+{
+ if (!client)
+ return -EINVAL;
+ ceph_statfs stats;
+ int r = ((RadosClient *)client)->get_fs_stats(stats);
+ result.kb = stats.kb;
+ result.kb_used = stats.kb_used;
+ result.kb_avail = stats.kb_avail;
+ result.num_objects = stats.num_objects;
+ return r;
}
int Rados::list(rados_pool_t pool, int max, std::list<string>& entries, Rados::ListCtx& ctx)
op = (Objecter::ListContext *) ctx.ctx;
std::list<object_t> e;
- int r = client->list(*(RadosClient::PoolCtx *)pool, max, e, op);
+ int r = ((RadosClient *)client)->list(*(RadosClient::PoolCtx *)pool, max, e, op);
while (!e.empty()) {
entries.push_back(e.front().name.c_str());
e.pop_front();
if (!client)
return -EINVAL;
object_t oid(o);
- return client->create(*(RadosClient::PoolCtx *)pool, oid, exclusive);
+ return ((RadosClient *)client)->create(*(RadosClient::PoolCtx *)pool, oid, exclusive);
}
int Rados::write(rados_pool_t pool, const string& o, off_t off, bufferlist& bl, size_t len)
if (!client)
return -EINVAL;
object_t oid(o);
- return client->write(*(RadosClient::PoolCtx *)pool, oid, off, bl, len);
+ return ((RadosClient *)client)->write(*(RadosClient::PoolCtx *)pool, oid, off, bl, len);
}
int Rados::write_full(rados_pool_t pool, const string& o, bufferlist& bl)
if (!client)
return -EINVAL;
object_t oid(o);
- return client->write_full(*(RadosClient::PoolCtx *)pool, oid, bl);
+ return ((RadosClient *)client)->write_full(*(RadosClient::PoolCtx *)pool, oid, bl);
}
int Rados::remove(rados_pool_t pool, const string& o)
if (!client)
return -EINVAL;
object_t oid(o);
- return client->remove(*(RadosClient::PoolCtx *)pool, oid);
+ return ((RadosClient *)client)->remove(*(RadosClient::PoolCtx *)pool, oid);
}
int Rados::read(rados_pool_t pool, const string& o, off_t off, bufferlist& bl, size_t len)
if (!client)
return -EINVAL;
object_t oid(o);
- return client->read(*(RadosClient::PoolCtx *)pool, oid, off, bl, len);
+ return ((RadosClient *)client)->read(*(RadosClient::PoolCtx *)pool, oid, off, bl, len);
}
int Rados::getxattr(rados_pool_t pool, const string& o, const char *name, bufferlist& bl)
if (!client)
return -EINVAL;
object_t oid(o);
- return client->getxattr(*(RadosClient::PoolCtx *)pool, oid, name, bl);
+ return ((RadosClient *)client)->getxattr(*(RadosClient::PoolCtx *)pool, oid, name, bl);
}
int Rados::getxattrs(rados_pool_t pool, const string& o, map<std::string, bufferlist>& attrset)
if (!client)
return -EINVAL;
object_t oid(o);
- return client->getxattrs(*(RadosClient::PoolCtx *)pool, oid, attrset);
+ return ((RadosClient *)client)->getxattrs(*(RadosClient::PoolCtx *)pool, oid, attrset);
}
int Rados::setxattr(rados_pool_t pool, const string& o, const char *name, bufferlist& bl)
if (!client)
return -EINVAL;
object_t oid(o);
- return client->setxattr(*(RadosClient::PoolCtx *)pool, oid, name, bl);
+ return ((RadosClient *)client)->setxattr(*(RadosClient::PoolCtx *)pool, oid, name, bl);
}
int Rados::stat(rados_pool_t pool, const string& o, __u64 *psize, time_t *pmtime)
if (!client)
return -EINVAL;
object_t oid(o);
- return client->stat(*(RadosClient::PoolCtx *)pool, oid, psize, pmtime);
+ return ((RadosClient *)client)->stat(*(RadosClient::PoolCtx *)pool, oid, psize, pmtime);
}
int Rados::tmap_update(rados_pool_t pool, const string& o, bufferlist& cmdbl)
if (!client)
return -EINVAL;
object_t oid(o);
- return client->tmap_update(*(RadosClient::PoolCtx *)pool, oid, cmdbl);
+ return ((RadosClient *)client)->tmap_update(*(RadosClient::PoolCtx *)pool, oid, cmdbl);
}
int Rados::exec(rados_pool_t pool, const string& o, const char *cls, const char *method,
bufferlist& inbl, bufferlist& outbl)
if (!client)
return -EINVAL;
object_t oid(o);
- return client->exec(*(RadosClient::PoolCtx *)pool, oid, cls, method, inbl, outbl);
+ return ((RadosClient *)client)->exec(*(RadosClient::PoolCtx *)pool, oid, cls, method, inbl, outbl);
}
int Rados::open_pool(const char *name, rados_pool_t *pool)
{
- int poolid = client->lookup_pool(name);
+ int poolid = ((RadosClient *)client)->lookup_pool(name);
if (poolid >= 0) {
RadosClient::PoolCtx *ctx = new RadosClient::PoolCtx(poolid, CEPH_NOSNAP);
if (!ctx)
int Rados::snap_create(const rados_pool_t pool, const char *snapname) {
if (!client) return -EINVAL;
- return client->snap_create(pool, snapname);
+ return ((RadosClient *)client)->snap_create(pool, snapname);
}
int Rados::snap_remove(const rados_pool_t pool, const char *snapname) {
if (!client) return -EINVAL;
- return client->snap_remove(pool, snapname);
+ return ((RadosClient *)client)->snap_remove(pool, snapname);
}
-void Rados::set_snap(rados_pool_t pool, __u64 seq)
+void Rados::set_snap(rados_pool_t pool, snap_t seq)
{
if (!client)
return;
ctx->set_snap(seq);
}
-int Rados::snap_list(rados_pool_t pool, vector<rados_snap_t> *snaps)
+int Rados::snap_list(rados_pool_t pool, vector<snap_t> *snaps)
{
if (!client)
return -EINVAL;
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
- return client->snap_list(ctx, snaps);
+ return ((RadosClient *)client)->snap_list(ctx, snaps);
}
-int Rados::snap_lookup(rados_pool_t pool, const char *name, rados_snap_t *snapid)
+int Rados::snap_lookup(rados_pool_t pool, const char *name, snap_t *snapid)
{
if (!client)
return -EINVAL;
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
- return client->snap_lookup(ctx, name, snapid);
+ return ((RadosClient *)client)->snap_lookup(ctx, name, snapid);
}
-int Rados::snap_get_name(rados_pool_t pool, rados_snap_t snapid, std::string *s)
+int Rados::snap_get_name(rados_pool_t pool, snap_t snapid, std::string *s)
{
if (!client)
return -EINVAL;
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
- return client->snap_get_name(ctx, snapid, s);
+ return ((RadosClient *)client)->snap_get_name(ctx, snapid, s);
}
-int Rados::snap_get_stamp(rados_pool_t pool, rados_snap_t snapid, time_t *t)
+int Rados::snap_get_stamp(rados_pool_t pool, snap_t snapid, time_t *t)
{
if (!client)
return -EINVAL;
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
- return client->snap_get_stamp(ctx, snapid, t);
+ return ((RadosClient *)client)->snap_get_stamp(ctx, snapid, t);
}
// AIO
{
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
RadosClient::AioCompletion *c;
- int r = client->aio_read(*ctx, oid, off, pbl, len, &c);
+ int r = ((RadosClient *)client)->aio_read(*ctx, oid, off, pbl, len, &c);
if (r >= 0) {
*pc = new AioCompletion((void *)c);
}
{
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
RadosClient::AioCompletion *c;
- int r = client->aio_write(*ctx, oid, off, bl, len, &c);
+ int r = ((RadosClient *)client)->aio_write(*ctx, oid, off, bl, len, &c);
if (r >= 0) {
*pc = new AioCompletion((void *)c);
}
c->put();
}
+}
+
// ---------------------------------------------
static void __rados_init(int argc, const char *argv[])
extern "C" int rados_snap_list(rados_pool_t pool, rados_snap_t *snaps, int maxlen)
{
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
- vector<rados_snap_t> snapvec;
+ vector<__u64> snapvec;
int r = radosp->snap_list(ctx, &snapvec);
if (r < 0)
return r;
extern "C" int rados_snap_lookup(rados_pool_t pool, const char *name, rados_snap_t *id)
{
RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool;
- return radosp->snap_lookup(ctx, name, id);
+ return radosp->snap_lookup(ctx, name, (__u64 *)id);
}
extern "C" int rados_snap_get_name(rados_pool_t pool, rados_snap_t id, char *name, int maxlen)
bl.append(buf, len);
return radosp->aio_write(*ctx, oid, off, bl, len, (RadosClient::AioCompletion**)completion);
}
+