From e609c8ac54aade8b8afdfe9f0ad80308b9c89c2e Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 22 Oct 2012 17:51:11 -0700 Subject: [PATCH] librados: add assert_exists guard operation Add a guard operation for writes that asserts that the object already exists. To avoid requiring new functionality on the OSD side, implement this by including a STAT operation, and discard the results on the client side. Signed-off-by: Sage Weil --- src/include/rados/librados.hpp | 5 +++++ src/librados/librados.cc | 6 ++++++ src/test/rados-api/misc.cc | 24 ++++++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index e50acdb218444..3df4c86e576ca 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -143,6 +143,11 @@ namespace librados */ void assert_version(uint64_t ver); + /** + * Guard operatation with a check that the object already exists + */ + void assert_exists(); + /** * get key/value paris for specified keys * diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 274119c1b2807..c31b82ae34b6d 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -109,6 +109,12 @@ void librados::ObjectOperation::assert_version(uint64_t ver) o->assert_version(ver); } +void librados::ObjectOperation::assert_exists() +{ + ::ObjectOperation *o = (::ObjectOperation *)impl; + o->stat(NULL, (utime_t*)NULL, NULL); +} + void librados::ObjectOperation::exec(const char *cls, const char *method, bufferlist& inbl) { ::ObjectOperation *o = (::ObjectOperation *)impl; diff --git a/src/test/rados-api/misc.cc b/src/test/rados-api/misc.cc index 0821ec0778482..5f0545adb60db 100644 --- a/src/test/rados-api/misc.cc +++ b/src/test/rados-api/misc.cc @@ -338,3 +338,27 @@ TEST(LibRadosMisc, CloneRange) { rados_ioctx_destroy(ioctx); ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); } + +TEST(LibRadosMisc, AssertExistsPP) { + Rados cluster; + std::string pool_name = get_temp_pool_name(); + ASSERT_EQ("", create_one_pool_pp(pool_name, cluster)); + IoCtx ioctx; + ASSERT_EQ(0, cluster.ioctx_create(pool_name.c_str(), ioctx)); + + char buf[64]; + memset(buf, 0xcc, sizeof(buf)); + bufferlist bl; + bl.append(buf, sizeof(buf)); + + ObjectWriteOperation op; + op.assert_exists(); + op.write(0, bl); + ASSERT_EQ(-ENOENT, ioctx.operate("asdffoo", &op)); + ASSERT_EQ(0, ioctx.create("asdffoo", true)); + ASSERT_EQ(0, ioctx.operate("asdffoo", &op)); + ASSERT_EQ(-EEXIST, ioctx.create("asdffoo", true)); + + ioctx.close(); + ASSERT_EQ(0, destroy_one_pool_pp(pool_name, cluster)); +} -- 2.39.5