event.op_tid);
}
+ void execute(const journal::SnapRemoveEvent &_) {
+ image_ctx.operations->snap_remove(event.snap_name.c_str(), on_op_complete);
+ }
+
+ void execute(const journal::SnapRenameEvent &_) {
+ image_ctx.operations->snap_rename(event.snap_id, event.snap_name.c_str(),
+ on_op_complete);
+ }
+
+ void execute(const journal::SnapProtectEvent &_) {
+ image_ctx.operations->snap_protect(event.snap_name.c_str(), on_op_complete);
+ }
+
+ void execute(const journal::SnapUnprotectEvent &_) {
+ image_ctx.operations->snap_unprotect(event.snap_name.c_str(),
+ on_op_complete);
+ }
+
+ void execute(const journal::SnapRollbackEvent &_) {
+ image_ctx.operations->snap_rollback(event.snap_name.c_str(),
+ no_op_progress_callback,
+ on_op_complete);
+ }
+
+ void execute(const journal::RenameEvent &_) {
+ image_ctx.operations->rename(event.image_name.c_str(), on_op_complete);
+ }
+
void execute(const journal::ResizeEvent &_) {
image_ctx.operations->resize(event.size, no_op_progress_callback,
on_op_complete, event.op_tid);
}
+ void execute(const journal::FlattenEvent &_) {
+ image_ctx.operations->flatten(no_op_progress_callback, on_op_complete);
+ }
+
virtual void finish(int r) override {
RWLock::RLocker owner_locker(image_ctx.owner_lock);
execute(event);
return;
}
- on_finish->complete(0);
+ image_ctx.op_work_queue->queue(on_finish, 0);
}
};
Context *on_op_complete = create_op_context_callback(event.op_tid, on_safe,
&op_event);
op_event->on_op_finish_event = new C_RefreshIfRequired<I>(
- m_image_ctx, new FunctionContext(
- [this, event, on_op_complete](int r) {
- m_image_ctx.operations->snap_remove(event.snap_name.c_str(),
- on_op_complete);
- }));
+ m_image_ctx, new ExecuteOp<I, journal::SnapRemoveEvent>(m_image_ctx, event,
+ on_op_complete));
// ignore errors caused due to replay
op_event->ignore_error_codes = {-ENOENT};
Context *on_op_complete = create_op_context_callback(event.op_tid, on_safe,
&op_event);
op_event->on_op_finish_event = new C_RefreshIfRequired<I>(
- m_image_ctx, new FunctionContext(
- [this, event, on_op_complete](int r) {
- m_image_ctx.operations->snap_rename(event.snap_id,
- event.snap_name.c_str(),
- on_op_complete);
- }));
+ m_image_ctx, new ExecuteOp<I, journal::SnapRenameEvent>(m_image_ctx, event,
+ on_op_complete));
// ignore errors caused due to replay
op_event->ignore_error_codes = {-EEXIST};
Context *on_op_complete = create_op_context_callback(event.op_tid, on_safe,
&op_event);
op_event->on_op_finish_event = new C_RefreshIfRequired<I>(
- m_image_ctx, new FunctionContext(
- [this, event, on_op_complete](int r) {
- m_image_ctx.operations->snap_protect(event.snap_name.c_str(),
- on_op_complete);
- }));
+ m_image_ctx, new ExecuteOp<I, journal::SnapProtectEvent>(m_image_ctx, event,
+ on_op_complete));
// ignore errors caused due to replay
op_event->ignore_error_codes = {-EBUSY};
Context *on_op_complete = create_op_context_callback(event.op_tid, on_safe,
&op_event);
op_event->on_op_finish_event = new C_RefreshIfRequired<I>(
- m_image_ctx, new FunctionContext(
- [this, event, on_op_complete](int r) {
- m_image_ctx.operations->snap_unprotect(event.snap_name.c_str(),
- on_op_complete);
- }));
+ m_image_ctx, new ExecuteOp<I, journal::SnapUnprotectEvent>(m_image_ctx,
+ event,
+ on_op_complete));
// ignore errors caused due to replay
op_event->ignore_error_codes = {-EINVAL};
Context *on_op_complete = create_op_context_callback(event.op_tid, on_safe,
&op_event);
op_event->on_op_finish_event = new C_RefreshIfRequired<I>(
- m_image_ctx, new FunctionContext(
- [this, event, on_op_complete](int r) {
- m_image_ctx.operations->snap_rollback(event.snap_name.c_str(),
- no_op_progress_callback,
- on_op_complete);
- }));
+ m_image_ctx, new ExecuteOp<I, journal::SnapRollbackEvent>(m_image_ctx,
+ event,
+ on_op_complete));
on_ready->complete(0);
}
Context *on_op_complete = create_op_context_callback(event.op_tid, on_safe,
&op_event);
op_event->on_op_finish_event = new C_RefreshIfRequired<I>(
- m_image_ctx, new FunctionContext(
- [this, event, on_op_complete](int r) {
- m_image_ctx.operations->rename(event.image_name.c_str(),
- on_op_complete);
- }));
+ m_image_ctx, new ExecuteOp<I, journal::RenameEvent>(m_image_ctx, event,
+ on_op_complete));
// ignore errors caused due to replay
op_event->ignore_error_codes = {-EEXIST};
Context *on_op_complete = create_op_context_callback(event.op_tid, on_safe,
&op_event);
op_event->on_op_finish_event = new C_RefreshIfRequired<I>(
- m_image_ctx, new FunctionContext(
- [this, event, on_op_complete](int r) {
- m_image_ctx.operations->flatten(no_op_progress_callback,
- on_op_complete);
- }));
+ m_image_ctx, new ExecuteOp<I, journal::FlattenEvent>(m_image_ctx, event,
+ on_op_complete));
// ignore errors caused due to replay
op_event->ignore_error_codes = {-EINVAL};
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_create(mock_image_ctx, &on_finish, "snap", 123);
&on_finish_ready, &on_finish_safe);
ASSERT_EQ(-EBADMSG, on_resume.wait());
- on_finish->complete(-ESTALE);
+ wait_for_op_invoked(&on_finish, -ESTALE);
ASSERT_EQ(-ESTALE, on_start_safe.wait());
ASSERT_EQ(-ESTALE, on_finish_safe.wait());
MockJournalReplay mock_journal_replay(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ EXPECT_CALL(*mock_image_ctx.state, is_refresh_required())
+ .WillRepeatedly(Return(false));
+
InSequence seq;
Context *on_snap_create_finish = nullptr;
- expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_create(mock_image_ctx, &on_snap_create_finish, "snap", 123);
Context *on_snap_remove_finish = nullptr;
- expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_remove(mock_image_ctx, &on_snap_remove_finish, "snap");
C_SaferCond on_snap_remove_ready;
when_replay_op_ready(mock_journal_replay, 123, &on_snap_create_resume);
ASSERT_EQ(0, on_snap_create_resume.wait());
- on_snap_create_finish->complete(0);
+ wait_for_op_invoked(&on_snap_create_finish, 0);
ASSERT_EQ(0, on_snap_create_ready.wait());
ASSERT_EQ(0, on_snap_create_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_remove(mock_image_ctx, &on_finish, "snap");
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(-EINVAL);
+ wait_for_op_invoked(&on_finish, -EINVAL);
ASSERT_EQ(-EINVAL, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(-EINVAL, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_create(mock_image_ctx, &on_finish, "snap", 123);
&on_finish_ready, &on_finish_safe);
ASSERT_EQ(0, on_resume.wait());
- on_finish->complete(0);
+ wait_for_op_invoked(&on_finish, 0);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_remove(mock_image_ctx, &on_finish, "snap");
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(0);
+ wait_for_op_invoked(&on_finish, 0);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_remove(mock_image_ctx, &on_finish, "snap");
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(-ENOENT);
+ wait_for_op_invoked(&on_finish, -ENOENT);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_rename(mock_image_ctx, &on_finish, 234, "snap");
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(0);
+ wait_for_op_invoked(&on_finish, 0);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_rename(mock_image_ctx, &on_finish, 234, "snap");
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(-EEXIST);
+ wait_for_op_invoked(&on_finish, -EEXIST);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_protect(mock_image_ctx, &on_finish, "snap");
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(0);
+ wait_for_op_invoked(&on_finish, 0);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_protect(mock_image_ctx, &on_finish, "snap");
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(-EBUSY);
+ wait_for_op_invoked(&on_finish, -EBUSY);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_unprotect(mock_image_ctx, &on_finish, "snap");
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(0);
+ wait_for_op_invoked(&on_finish, 0);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_unprotect(mock_image_ctx, &on_finish, "snap");
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(-EINVAL);
+ wait_for_op_invoked(&on_finish, -EINVAL);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_snap_rollback(mock_image_ctx, &on_finish, "snap");
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(0);
+ wait_for_op_invoked(&on_finish, 0);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_rename(mock_image_ctx, &on_finish, "image");
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(0);
+ wait_for_op_invoked(&on_finish, 0);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_rename(mock_image_ctx, &on_finish, "image");
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(-EEXIST);
+ wait_for_op_invoked(&on_finish, -EEXIST);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_resize(mock_image_ctx, &on_finish, 234, 123);
&on_finish_ready, &on_finish_safe);
ASSERT_EQ(0, on_resume.wait());
- on_finish->complete(0);
+ wait_for_op_invoked(&on_finish, 0);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_flatten(mock_image_ctx, &on_finish);
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(0);
+ wait_for_op_invoked(&on_finish, 0);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, false, 0);
expect_flatten(mock_image_ctx, &on_finish);
when_process(mock_journal_replay, EventEntry{OpFinishEvent(123, 0)},
&on_finish_ready, &on_finish_safe);
- on_finish->complete(-EINVAL);
+ wait_for_op_invoked(&on_finish, -EINVAL);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());
ASSERT_EQ(0, on_finish_safe.wait());
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- Context *on_finish;
+ Context *on_finish = nullptr;
expect_refresh_image(mock_image_ctx, true, 0);
expect_resize(mock_image_ctx, &on_finish, 234, 123);
&on_finish_ready, &on_finish_safe);
ASSERT_EQ(0, on_resume.wait());
- on_finish->complete(0);
+ wait_for_op_invoked(&on_finish, 0);
ASSERT_EQ(0, on_start_safe.wait());
ASSERT_EQ(0, on_finish_ready.wait());