mirror of
https://github.com/ceph/ceph
synced 2025-02-20 09:27:35 +00:00
rados: add cache-flush, cache-evict, cache-flush-evict-all commands
Signed-off-by: Sage Weil <sage@inktank.com>
This commit is contained in:
parent
ad3b46665f
commit
71cd4a2278
@ -131,6 +131,13 @@ void usage(ostream& out)
|
||||
" --lock-duration Lock duration (in seconds)\n"
|
||||
" --lock-type Lock type (shared, exclusive)\n"
|
||||
"\n"
|
||||
"CACHE POOLS: (for testing/development only)\n"
|
||||
" cache-flush <obj-name> flush cache pool object (blocking)\n"
|
||||
" cache-try-flush <obj-name> flush cache pool object (non-blocking)\n"
|
||||
" cache-evict <obj-name> evict cache pool object\n"
|
||||
" cache-flush-evict-all flush+evict all objects\n"
|
||||
" cache-try-flush-evict-all try-flush+evict all objects\n"
|
||||
"\n"
|
||||
"GLOBAL OPTIONS:\n"
|
||||
" --object_locator object_locator\n"
|
||||
" set object_locator for operation\n"
|
||||
@ -169,8 +176,8 @@ void usage(ostream& out)
|
||||
" --max-backlog max backlog (in MB)\n"
|
||||
" --percent percent of operations that are read\n"
|
||||
" --target-throughput target throughput (in MB)\n"
|
||||
" --run-length total time (in seconds)\n";
|
||||
|
||||
" --run-length total time (in seconds)\n"
|
||||
;
|
||||
}
|
||||
|
||||
static void usage_exit()
|
||||
@ -1041,6 +1048,93 @@ static int do_lock_cmd(std::vector<const char*> &nargs,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_cache_flush(IoCtx& io_ctx, string oid)
|
||||
{
|
||||
ObjectWriteOperation op;
|
||||
op.cache_flush();
|
||||
librados::AioCompletion *completion =
|
||||
librados::Rados::aio_create_completion();
|
||||
io_ctx.aio_operate(oid.c_str(), completion, &op,
|
||||
librados::OPERATION_IGNORE_CACHE |
|
||||
librados::OPERATION_IGNORE_OVERLAY);
|
||||
completion->wait_for_safe();
|
||||
int r = completion->get_return_value();
|
||||
completion->release();
|
||||
return r;
|
||||
}
|
||||
|
||||
static int do_cache_try_flush(IoCtx& io_ctx, string oid)
|
||||
{
|
||||
ObjectWriteOperation op;
|
||||
op.cache_try_flush();
|
||||
librados::AioCompletion *completion =
|
||||
librados::Rados::aio_create_completion();
|
||||
io_ctx.aio_operate(oid.c_str(), completion, &op,
|
||||
librados::OPERATION_IGNORE_CACHE |
|
||||
librados::OPERATION_IGNORE_OVERLAY |
|
||||
librados::OPERATION_SKIPRWLOCKS);
|
||||
completion->wait_for_safe();
|
||||
int r = completion->get_return_value();
|
||||
completion->release();
|
||||
return r;
|
||||
}
|
||||
|
||||
static int do_cache_evict(IoCtx& io_ctx, string oid)
|
||||
{
|
||||
ObjectWriteOperation op;
|
||||
op.cache_evict();
|
||||
librados::AioCompletion *completion =
|
||||
librados::Rados::aio_create_completion();
|
||||
io_ctx.aio_operate(oid.c_str(), completion, &op,
|
||||
librados::OPERATION_IGNORE_CACHE |
|
||||
librados::OPERATION_IGNORE_OVERLAY |
|
||||
librados::OPERATION_SKIPRWLOCKS);
|
||||
completion->wait_for_safe();
|
||||
int r = completion->get_return_value();
|
||||
completion->release();
|
||||
return r;
|
||||
}
|
||||
|
||||
static int do_cache_flush_evict_all(IoCtx& io_ctx, bool blocking)
|
||||
{
|
||||
int r;
|
||||
int errors = 0;
|
||||
try {
|
||||
librados::ObjectIterator i = io_ctx.objects_begin();
|
||||
librados::ObjectIterator i_end = io_ctx.objects_end();
|
||||
for (; i != i_end; ++i) {
|
||||
cout << i->first << "\t" << i->second << std::endl;
|
||||
if (i->second.size()) {
|
||||
io_ctx.locator_set_key(i->second);
|
||||
} else {
|
||||
io_ctx.locator_set_key(string());
|
||||
}
|
||||
if (blocking)
|
||||
r = do_cache_flush(io_ctx, i->first);
|
||||
else
|
||||
r = do_cache_try_flush(io_ctx, i->first);
|
||||
if (r < 0) {
|
||||
cerr << "failed to flush " << i->first << ": "
|
||||
<< cpp_strerror(r) << std::endl;
|
||||
++errors;
|
||||
continue;
|
||||
}
|
||||
r = do_cache_evict(io_ctx, i->first);
|
||||
if (r < 0) {
|
||||
cerr << "failed to evict " << i->first << ": "
|
||||
<< cpp_strerror(r) << std::endl;
|
||||
++errors;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (const std::runtime_error& e) {
|
||||
cerr << e.what() << std::endl;
|
||||
return -1;
|
||||
}
|
||||
return errors ? -1 : 0;
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
|
||||
**********************************************/
|
||||
@ -2286,6 +2380,54 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts,
|
||||
cout << std::endl;
|
||||
}
|
||||
|
||||
} else if (strcmp(nargs[0], "cache-flush") == 0) {
|
||||
if (!pool_name || nargs.size() < 2)
|
||||
usage_exit();
|
||||
string oid(nargs[1]);
|
||||
ret = do_cache_flush(io_ctx, oid);
|
||||
if (ret < 0) {
|
||||
cerr << "error from cache-flush " << oid << ": "
|
||||
<< cpp_strerror(ret) << std::endl;
|
||||
goto out;
|
||||
}
|
||||
} else if (strcmp(nargs[0], "cache-try-flush") == 0) {
|
||||
if (!pool_name || nargs.size() < 2)
|
||||
usage_exit();
|
||||
string oid(nargs[1]);
|
||||
ret = do_cache_try_flush(io_ctx, oid);
|
||||
if (ret < 0) {
|
||||
cerr << "error from cache-try-flush " << oid << ": "
|
||||
<< cpp_strerror(ret) << std::endl;
|
||||
goto out;
|
||||
}
|
||||
} else if (strcmp(nargs[0], "cache-evict") == 0) {
|
||||
if (!pool_name || nargs.size() < 2)
|
||||
usage_exit();
|
||||
string oid(nargs[1]);
|
||||
ret = do_cache_evict(io_ctx, oid);
|
||||
if (ret < 0) {
|
||||
cerr << "error from cache-evict " << oid << ": "
|
||||
<< cpp_strerror(ret) << std::endl;
|
||||
goto out;
|
||||
}
|
||||
} else if (strcmp(nargs[0], "cache-flush-evict-all") == 0) {
|
||||
if (!pool_name)
|
||||
usage_exit();
|
||||
ret = do_cache_flush_evict_all(io_ctx, true);
|
||||
if (ret < 0) {
|
||||
cerr << "error from cache-flush-evict-all: "
|
||||
<< cpp_strerror(ret) << std::endl;
|
||||
goto out;
|
||||
}
|
||||
} else if (strcmp(nargs[0], "cache-try-flush-evict-all") == 0) {
|
||||
if (!pool_name)
|
||||
usage_exit();
|
||||
ret = do_cache_flush_evict_all(io_ctx, false);
|
||||
if (ret < 0) {
|
||||
cerr << "error from cache-try-flush-evict-all: "
|
||||
<< cpp_strerror(ret) << std::endl;
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
cerr << "unrecognized command " << nargs[0] << "; -h or --help for usage" << std::endl;
|
||||
ret = -EINVAL;
|
||||
|
Loading…
Reference in New Issue
Block a user