librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, librbd::snap_set(ictx, "snap1"));
C_SaferCond cond_ctx;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, librbd::snap_set(ictx, "snap1"));
uint64_t snap_id = ictx->snap_id;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
uint64_t snap_id = ictx->snap_info.rbegin()->first;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
uint64_t snap_id = ictx->snap_info.rbegin()->first;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
uint64_t snap_id = ictx->snap_info.rbegin()->first;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
uint64_t snap_id = ictx->snap_info.rbegin()->first;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
uint64_t snap_id = ictx->snap_info.rbegin()->first;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
uint64_t snap_id = ictx->snap_info.rbegin()->first;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
uint64_t snap_id = ictx->snap_info.rbegin()->first;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
uint64_t snap_id = ictx->snap_info.rbegin()->first;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
uint64_t snap_id = ictx->snap_info.rbegin()->first;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
uint64_t snap_id = ictx->snap_info.rbegin()->first;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, librbd::snap_set(ictx, "snap1"));
uint64_t snap_id = ictx->snap_id;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
ASSERT_EQ(CEPH_NOSNAP, ictx->snap_id);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
return r;
}
- r = librbd::snap_create(ictx, snap_name);
+ r = snap_create(*ictx, snap_name);
if (r < 0) {
return r;
}
- r = librbd::snap_protect(ictx, snap_name);
- if (r < 0) {
+ r = snap_protect(*ictx, snap_name);
+ if (r < 0) {
return r;
}
close_image(ictx);
TEST_F(TestMockOperationSnapshotRemoveRequest, Success) {
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(clone_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
librbd::NoOpProgressContext prog_ctx;
- ASSERT_EQ(0, librbd::flatten(ictx, prog_ctx));
+ ASSERT_EQ(0, flatten(*ictx, prog_ctx));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
TEST_F(TestMockOperationSnapshotRemoveRequest, RemoveChildParentError) {
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
return SUCCEED();
}
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
librbd::NoOpProgressContext prog_ctx;
- ASSERT_EQ(0, librbd::flatten(ictx, prog_ctx));
+ ASSERT_EQ(0, flatten(*ictx, prog_ctx));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
TEST_F(TestMockOperationSnapshotRemoveRequest, RemoveSnapError) {
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());
MockImageCtx mock_image_ctx(*ictx);
#include "librbd/ExclusiveLock.h"
#include "librbd/ImageState.h"
#include "librbd/ImageWatcher.h"
+#include "librbd/Operations.h"
#include "cls/lock/cls_lock_client.h"
#include "cls/lock/cls_lock_types.h"
#include "librbd/internal.h"
return (*ictx)->state->open();
}
+int TestFixture::snap_create(librbd::ImageCtx &ictx,
+ const std::string &snap_name) {
+ return ictx.operations->snap_create(snap_name.c_str());
+}
+
+int TestFixture::snap_protect(librbd::ImageCtx &ictx,
+ const std::string &snap_name) {
+ return ictx.operations->snap_protect(snap_name.c_str());
+}
+
+int TestFixture::flatten(librbd::ImageCtx &ictx,
+ librbd::ProgressContext &prog_ctx) {
+ return ictx.operations->flatten(prog_ctx);
+}
+
void TestFixture::close_image(librbd::ImageCtx *ictx) {
m_ictxs.erase(ictx);
int open_image(const std::string &image_name, librbd::ImageCtx **ictx);
void close_image(librbd::ImageCtx *ictx);
+ int snap_create(librbd::ImageCtx &ictx, const std::string &snap_name);
+ int snap_protect(librbd::ImageCtx &ictx, const std::string &snap_name);
+
+ int flatten(librbd::ImageCtx &ictx, librbd::ProgressContext &prog_ctx);
+
int lock_image(librbd::ImageCtx &ictx, ClsLockType lock_type,
const std::string &cookie);
int unlock_image();
#include "librbd/ImageWatcher.h"
#include "librbd/internal.h"
#include "librbd/ObjectMap.h"
+#include "librbd/Operations.h"
#include <boost/scope_exit.hpp>
#include <boost/assign/list_of.hpp>
#include <utility>
librbd::ImageCtx *ictx;
EXPECT_EQ(0, open_image(m_image_name, &ictx));
if (iter->second) {
- EXPECT_EQ(0, librbd::snap_unprotect(ictx, iter->first.c_str()));
+ EXPECT_EQ(0, ictx->operations->snap_unprotect(iter->first.c_str()));
}
- EXPECT_EQ(0, librbd::snap_remove(ictx, iter->first.c_str()));
+ EXPECT_EQ(0, ictx->operations->snap_remove(iter->first.c_str()));
}
TestFixture::TearDown();
return r;
}
- r = librbd::snap_create(ictx, snap_name);
+ r = snap_create(*ictx, snap_name);
if (r < 0) {
return r;
}
m_snaps.push_back(std::make_pair(snap_name, snap_protect));
if (snap_protect) {
- r = librbd::snap_protect(ictx, snap_name);
+ r = ictx->operations->snap_protect(snap_name);
if (r < 0) {
return r;
}
ASSERT_EQ(0, open_image(m_image_name, &ictx));
librbd::NoOpProgressContext no_op;
- ASSERT_EQ(0, librbd::resize(ictx, m_image_size >> 1, no_op));
+ ASSERT_EQ(0, ictx->operations->resize(m_image_size >> 1, no_op));
bool is_owner;
ASSERT_EQ(0, librbd::is_exclusive_lock_owner(ictx, &is_owner));
ASSERT_EQ(0, lock_image(*ictx, LOCK_EXCLUSIVE, "manually locked"));
librbd::NoOpProgressContext no_op;
- ASSERT_EQ(-EROFS, librbd::resize(ictx, m_image_size >> 1, no_op));
+ ASSERT_EQ(-EROFS, ictx->operations->resize(m_image_size >> 1, no_op));
}
TEST_F(TestInternal, SnapCreateLocksImage) {
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
BOOST_SCOPE_EXIT( (ictx) ) {
- ASSERT_EQ(0, librbd::snap_remove(ictx, "snap1"));
+ ASSERT_EQ(0, ictx->operations->snap_remove("snap1"));
} BOOST_SCOPE_EXIT_END;
bool is_owner;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
ASSERT_EQ(0, lock_image(*ictx, LOCK_EXCLUSIVE, "manually locked"));
- ASSERT_EQ(-EROFS, librbd::snap_create(ictx, "snap1"));
+ ASSERT_EQ(-EROFS, snap_create(*ictx, "snap1"));
}
TEST_F(TestInternal, SnapRollbackLocksImage) {
ASSERT_EQ(0, open_image(m_image_name, &ictx));
librbd::NoOpProgressContext no_op;
- ASSERT_EQ(0, librbd::snap_rollback(ictx, "snap1", no_op));
+ ASSERT_EQ(0, ictx->operations->snap_rollback("snap1", no_op));
bool is_owner;
ASSERT_EQ(0, librbd::is_exclusive_lock_owner(ictx, &is_owner));
ASSERT_EQ(0, lock_image(*ictx, LOCK_EXCLUSIVE, "manually locked"));
librbd::NoOpProgressContext no_op;
- ASSERT_EQ(-EROFS, librbd::snap_rollback(ictx, "snap1", no_op));
+ ASSERT_EQ(-EROFS, ictx->operations->snap_rollback("snap1", no_op));
}
TEST_F(TestInternal, SnapSetReleasesLock) {
ASSERT_EQ(0, open_image(clone_name, &ictx2));
librbd::NoOpProgressContext no_op;
- ASSERT_EQ(0, librbd::flatten(ictx2, no_op));
+ ASSERT_EQ(0, ictx2->operations->flatten(no_op));
bool is_owner;
ASSERT_EQ(0, librbd::is_exclusive_lock_owner(ictx2, &is_owner));
ASSERT_EQ(0, lock_image(*ictx2, LOCK_EXCLUSIVE, "manually locked"));
librbd::NoOpProgressContext no_op;
- ASSERT_EQ(-EROFS, librbd::flatten(ictx2, no_op));
+ ASSERT_EQ(-EROFS, ictx2->operations->flatten(no_op));
}
TEST_F(TestInternal, AioWriteRequestsLock) {
size -= MIN(size, 1<<18);
{
RWLock::RLocker l(ictx->owner_lock);
- librbd::async_resize(ictx, &ctx, size, prog_ctx);
+ ictx->operations->resize(size, prog_ctx, &ctx);
}
// try to interrupt the in-progress resize
RWLock::RLocker l(ictx->owner_lock);
contexts.push_back(new C_SaferCond());
- librbd::async_resize(ictx, contexts.back(), new_size, prog_ctx);
+ ictx->operations->resize(new_size, prog_ctx, contexts.back());
}
for (uint32_t i = 0; i < contexts.size(); ++i) {
bl.append(std::string(256, '1'));
ASSERT_EQ(256, ictx->aio_work_queue->write(0, bl.length(), bl.c_str(), 0));
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
- ASSERT_EQ(0, librbd::snap_protect(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
+ ASSERT_EQ(0, ictx->operations->snap_protect("snap1"));
uint64_t features;
ASSERT_EQ(0, librbd::get_features(ictx, &features));
librbd::ImageCtx *ictx2;
ASSERT_EQ(0, open_image(clone_name, &ictx2));
- ASSERT_EQ(0, librbd::snap_create(ictx2, "snap1"));
- ASSERT_EQ(0, librbd::snap_create(ictx2, "snap2"));
+ ASSERT_EQ(0, snap_create(*ictx2, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx2, "snap2"));
ASSERT_EQ(256, ictx2->aio_work_queue->write(256, bl.length(), bl.c_str(), 0));
bl.c_str(), 0));
}
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
- ASSERT_EQ(0, librbd::snap_protect(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
+ ASSERT_EQ(0, ictx->operations->snap_protect("snap1"));
std::string clone_name = get_temp_image_name();
ASSERT_EQ(0, librbd::clone(m_ioctx, m_image_name.c_str(), "snap1", m_ioctx,
librbd::ImageCtx *ictx2;
ASSERT_EQ(0, open_image(clone_name, &ictx2));
- ASSERT_EQ(0, librbd::snap_create(ictx2, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx2, "snap1"));
bufferptr read_ptr(bl.length());
bufferlist read_bl;
// verify full / partial object removal properly copyup
librbd::NoOpProgressContext no_op;
- ASSERT_EQ(0, librbd::resize(ictx2, m_image_size - (1 << order) - 32, no_op));
+ ASSERT_EQ(0, ictx2->operations->resize(m_image_size - (1 << order) - 32, no_op));
ASSERT_EQ(0, librbd::snap_set(ictx2, "snap1"));
{
bl.c_str(), 0));
}
- ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
- ASSERT_EQ(0, librbd::snap_protect(ictx, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx, "snap1"));
+ ASSERT_EQ(0, ictx->operations->snap_protect("snap1"));
std::string clone_name = get_temp_image_name();
ASSERT_EQ(0, librbd::clone(m_ioctx, m_image_name.c_str(), "snap1", m_ioctx,
librbd::ImageCtx *ictx2;
ASSERT_EQ(0, open_image(clone_name, &ictx2));
- ASSERT_EQ(0, librbd::snap_create(ictx2, "snap1"));
+ ASSERT_EQ(0, snap_create(*ictx2, "snap1"));
bufferptr read_ptr(bl.length());
bufferlist read_bl;
ictx->aio_work_queue->aio_write(c, 0, buffer.size(), buffer.c_str(), 0);
librbd::NoOpProgressContext no_op;
- ASSERT_EQ(0, librbd::resize(ictx, m_image_size >> 1, no_op));
+ ASSERT_EQ(0, ictx->operations->resize(m_image_size >> 1, no_op));
ASSERT_TRUE(c->is_complete());
ASSERT_EQ(0, c->wait_for_complete());
ASSERT_EQ(0, open_image(m_image_name, &ictx));
librbd::NoOpProgressContext no_op;
- ASSERT_EQ(0, librbd::resize(ictx, 1 << ictx->order, no_op));
+ ASSERT_EQ(0, ictx->operations->resize(1 << ictx->order, no_op));
bufferlist bl;
bl.append(std::string(1 << ictx->order, '1'));
librbd::ImageCtx *ictx2 = NULL;
BOOST_SCOPE_EXIT( (&m_ioctx) (clone_name) (parent) (&ictx2) ) {
if (ictx2 != NULL) {
- librbd::snap_remove(ictx2, "snap1");
+ ictx2->operations->snap_remove("snap1");
parent->close_image(ictx2);
}
} BOOST_SCOPE_EXIT_END;
ASSERT_EQ(0, open_image(clone_name, &ictx2));
- ASSERT_EQ(0, librbd::snap_create(ictx2, "snap1"));
+ ASSERT_EQ(0, ictx2->operations->snap_create("snap1"));
bufferlist write_full_bl;
write_full_bl.append(std::string(1 << ictx2->order, '2'));
ictx2->aio_work_queue->write(0, write_full_bl.length(),
write_full_bl.c_str(), 0));
- ASSERT_EQ(0, librbd::flatten(ictx2, no_op));
+ ASSERT_EQ(0, ictx2->operations->flatten(no_op));
bufferptr read_ptr(bl.length());
bufferlist read_bl;