From 73ac6f31a80e2bbb1ee839ce6da729548641f8d3 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 10 Jun 2009 12:48:41 -0700 Subject: [PATCH] radostool: select snaps, rm objects --- src/TODO | 7 ++-- src/include/librados.h | 1 + src/librados.cc | 72 ++++++++++++++++++++++++++++++++++++------ src/radostool.cc | 39 +++++++++++++++++++++++ src/testrados.c | 2 +- 5 files changed, 108 insertions(+), 13 deletions(-) diff --git a/src/TODO b/src/TODO index cc52b74315832..2987f22a0158c 100644 --- a/src/TODO +++ b/src/TODO @@ -17,10 +17,11 @@ v0.9 - move pg iteration into Objecter (RadosClietn should be a minimal wrapper) - perl swig wrapper - radostool - - fetch/store/remove object +/ - --snap N +/ - fetch/store/remove object - call method - - list objects - - list pools +/ - list objects +/ - list pools /- object classes - optionally separate osd interfaces (ips) for clients and osds (replication, peering, etc.) diff --git a/src/include/librados.h b/src/include/librados.h index 3b478bbad1526..50a02a7aa53f3 100644 --- a/src/include/librados.h +++ b/src/include/librados.h @@ -97,6 +97,7 @@ public: int snap_remove(rados_pool_t pool, const char *snapname); int snap_list(rados_pool_t pool, vector& snaps); int snap_get_name(rados_pool_t pool, rados_snap_t snap, std::string *name); + int snap_lookup(rados_pool_t, const char *snapname, rados_snap_t *snapid); // -- aio -- struct AioCompletion { diff --git a/src/librados.cc b/src/librados.cc index c4757fafae829..f0718782ad6ff 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -84,6 +84,11 @@ public: return osdmap.lookup_pg_pool_name(name); } + // 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); + + // io int write(PoolCtx& pool, const object_t& oid, off_t off, bufferlist& bl, size_t len); int read(PoolCtx& pool, const object_t& oid, off_t off, bufferlist& bl, size_t len); int remove(PoolCtx& pool, const object_t& oid); @@ -372,6 +377,37 @@ int RadosClient::list_pools(std::vector& v) return 0; } +// SNAPS + +int RadosClient::snap_lookup(PoolCtx *pool, const char *name, rados_snap_t *snapid) +{ + Mutex::Locker l(lock); + const pg_pool_t& pi = objecter->osdmap->get_pg_pool(pool->poolid); + for (map::const_iterator p = pi.snaps.begin(); + p != pi.snaps.end(); + p++) { + if (p->second.name == name) { + *snapid = p->first; + return 0; + } + } + return -ENOENT; +} + +int RadosClient::snap_get_name(PoolCtx *pool, rados_snap_t snapid, std::string *s) +{ + Mutex::Locker l(lock); + const pg_pool_t& pi = objecter->osdmap->get_pg_pool(pool->poolid); + map::const_iterator p = pi.snaps.find(snapid); + if (p == pi.snaps.end()) + return -ENOENT; + *s = p->second.name.c_str(); + return 0; +} + + +// IO + int RadosClient::list(PoolCtx& pool, int max_entries, std::list& entries, RadosClient::PGLSOp& op) { utime_t ut = g_clock.now(); @@ -667,15 +703,6 @@ int Rados::initialize(int argc, const char *argv[]) return client->init() ? 0 : -1; } -void Rados::set_snap(rados_pool_t pool, snapid_t seq) -{ - if (!client) - return; - - RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool; - ctx->set_snap(seq); -} - int Rados::list_pools(std::vector& v) { if (!client) @@ -754,6 +781,33 @@ int Rados::close_pool(rados_pool_t pool) return 0; } +// SNAPS + +void Rados::set_snap(rados_pool_t pool, snapid_t seq) +{ + if (!client) + return; + RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool; + ctx->set_snap(seq); +} + +int Rados::snap_lookup(rados_pool_t pool, const char *name, rados_snap_t *snapid) +{ + if (!client) + return -EINVAL; + RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool; + return client->snap_lookup(ctx, name, snapid); +} + +int Rados::snap_get_name(rados_pool_t pool, rados_snap_t snapid, std::string *s) +{ + if (!client) + return -EINVAL; + RadosClient::PoolCtx *ctx = (RadosClient::PoolCtx *)pool; + return client->snap_get_name(ctx, snapid, s); +} + +// AIO int Rados::aio_read(rados_pool_t pool, const object_t& oid, off_t off, bufferlist *pbl, size_t len, Rados::AioCompletion **pc) { diff --git a/src/radostool.cc b/src/radostool.cc index 1e1a75a6e3974..a1300188736ed 100644 --- a/src/radostool.cc +++ b/src/radostool.cc @@ -37,12 +37,16 @@ void usage() cerr << " get objname -- fetch object\n"; cerr << " put objname -- write object\n"; + cerr << " rm objname -- remove object\n"; cerr << " ls -- list objects in pool\n\n"; cerr << " bench [-c concurrentwrites] [-b writesize] [verify] [sync]\n"; cerr << " default is 16 concurrent IOs and 1 MB writes size\n\n"; cerr << "Options:\n"; + cerr << " -s name\n"; + cerr << " --snap name\n"; + cerr << " select given snap name for (read) IO\n"; cerr << " -i infile\n"; cerr << " -o outfile\n"; cerr << " specify input or output file (for certain commands)\n"; @@ -206,6 +210,8 @@ int main(int argc, const char **argv) int concurrent_ios = 16; int write_size = 1 << 20; + const char *snapname = 0; + rados_snap_t snapid = CEPH_NOSNAP; FOR_EACH_ARG(args) { if (CONF_ARG_EQ("out_file", 'o')) { @@ -222,6 +228,10 @@ int main(int argc, const char **argv) } } else if (CONF_ARG_EQ("pool", 'p')) { CONF_SAFE_SET_ARG_VAL(&pool, OPT_STR); + } else if (CONF_ARG_EQ("snapid", 'S')) { + CONF_SAFE_SET_ARG_VAL(&snapid, OPT_LONGLONG); + } else if (CONF_ARG_EQ("snap", 's')) { + CONF_SAFE_SET_ARG_VAL(&snapname, OPT_STR); } else if (CONF_ARG_EQ("help", 'h')) { usage(); } else if (CONF_ARG_EQ("concurrent-ios", 'c')) { @@ -255,6 +265,25 @@ int main(int argc, const char **argv) } } + // snapname? + if (snapname) { + int r = rados.snap_lookup(p, snapname, &snapid); + if (r < 0) { + cerr << "error looking up snap '" << snapname << "': " << strerror(-r) << std::endl; + exit(1); + } + } + if (snapid != CEPH_NOSNAP) { + string name; + int r = rados.snap_get_name(p, snapid, &name); + if (r < 0) { + cerr << "snapid " << snapid << " doesn't exist in pool " << pool << std::endl; + exit(1); + } + rados.set_snap(p, snapid); + cout << "selected snap " << snapid << " '" << snapname << "'" << std::endl; + } + // list pools? if (strcmp(nargs[0], "lspools") == 0) { vector vec; @@ -306,6 +335,16 @@ int main(int argc, const char **argv) exit(0); } + } else if (strcmp(nargs[0], "rm") == 0) { + if (!pool || nargs.size() < 2) + usage(); + object_t oid(nargs[1]); + int r = rados.remove(p, oid); + if (r < 0) { + cerr << "error removing " << oid << " from pool " << pool << ": " << strerror(-r) << std::endl; + exit(0); + } + } else if (strcmp(nargs[0], "bench") == 0) { if (nargs.size() < 2) usage(); diff --git a/src/testrados.c b/src/testrados.c index 7d76f8f491c94..2d0fb2690784b 100644 --- a/src/testrados.c +++ b/src/testrados.c @@ -35,7 +35,7 @@ int main(int argc, const char **argv) rados_pool_t pool; int r = rados_open_pool("data", &pool); - printf("open pool result = %d, pool = %d\n", r, pool); + printf("open pool result = %d, pool = %p\n", r, pool); rados_write(pool, oid, 0, buf, strlen(buf) + 1); rados_exec(pool, oid, "test", "foo", buf, strlen(buf) + 1, buf, 128); -- 2.39.5