object_extents);
}
- journaling = (m_image_ctx.journal != NULL &&
- !m_image_ctx.journal->is_journal_replaying());
+ journaling = (m_image_ctx.journal != nullptr &&
+ m_image_ctx.journal->is_journal_appending());
}
prune_object_extents(object_extents);
bool journaling = false;
{
RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
- journaling = (m_image_ctx.journal != NULL &&
- !m_image_ctx.journal->is_journal_replaying());
+ journaling = (m_image_ctx.journal != nullptr &&
+ m_image_ctx.journal->is_journal_appending());
}
if (journaling) {
#include "librbd/Utils.h"
#include "cls/journal/cls_journal_types.h"
#include "journal/Journaler.h"
+#include "journal/Policy.h"
#include "journal/ReplayEntry.h"
#include "journal/Settings.h"
#include "common/errno.h"
m_state == STATE_RESTARTING_REPLAY);
}
+template <typename I>
+bool Journal<I>::is_journal_appending() const {
+ assert(m_image_ctx.snap_lock.is_locked());
+ Mutex::Locker locker(m_lock);
+ return (m_state == STATE_READY &&
+ !m_image_ctx.get_journal_policy()->append_disabled());
+}
+
template <typename I>
void Journal<I>::wait_for_journal_ready(Context *on_ready) {
on_ready = create_async_context_callback(m_image_ctx, on_ready);
bool is_journal_ready() const;
bool is_journal_replaying() const;
+ bool is_journal_appending() const;
void wait_for_journal_ready(Context *on_ready);
assert(image_ctx.owner_lock.is_locked());
RWLock::RLocker snap_locker(image_ctx.snap_lock);
- if (image_ctx.journal != NULL &&
- !image_ctx.journal->is_journal_replaying()) {
+ if (image_ctx.journal != nullptr &&
+ image_ctx.journal->is_journal_appending()) {
append_op_event(util::create_context_callback<
Request<I>, &Request<I>::handle_op_event_safe>(this));
return true;
assert(!m_committed_op_event);
m_committed_op_event = true;
- if (image_ctx.journal != NULL &&
- !image_ctx.journal->is_journal_replaying()) {
+ if (image_ctx.journal != nullptr &&
+ image_ctx.journal->is_journal_appending()) {
CephContext *cct = image_ctx.cct;
ldout(cct, 10) << this << " " << __func__ << ": r=" << r << dendl;
assert(can_affect_io());
RWLock::RLocker owner_locker(image_ctx.owner_lock);
RWLock::RLocker snap_locker(image_ctx.snap_lock);
- if (image_ctx.journal != NULL) {
- Context *ctx = util::create_context_callback<T, MF>(request);
+ if (image_ctx.journal != nullptr) {
if (image_ctx.journal->is_journal_replaying()) {
+ Context *ctx = util::create_context_callback<T, MF>(request);
replay_op_ready(ctx);
- } else {
+ return true;
+ } else if (image_ctx.journal->is_journal_appending()) {
+ Context *ctx = util::create_context_callback<T, MF>(request);
append_op_event(ctx);
+ return true;
}
- return true;
}
return false;
}
MOCK_CONST_METHOD0(is_journal_ready, bool());
MOCK_CONST_METHOD0(is_journal_replaying, bool());
+ MOCK_CONST_METHOD0(is_journal_appending, bool());
MOCK_METHOD1(wait_for_journal_ready, void(Context *));
InSequence seq;
expect_block_writes(mock_image_ctx, 0);
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, true, 0);
expect_unblock_writes(mock_image_ctx);
expect_commit_op_event(mock_image_ctx, 0);
ASSERT_EQ(0, when_resize(mock_image_ctx, ictx->size, 0, false));
InSequence seq;
expect_block_writes(mock_image_ctx, 0);
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, true, 0);
expect_unblock_writes(mock_image_ctx);
expect_grow_object_map(mock_image_ctx);
expect_block_writes(mock_image_ctx, 0);
InSequence seq;
expect_block_writes(mock_image_ctx, 0);
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, true, 0);
expect_unblock_writes(mock_image_ctx);
MockTrimRequest mock_trim_request;
InSequence seq;
expect_block_writes(mock_image_ctx, 0);
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, true, 0);
expect_unblock_writes(mock_image_ctx);
MockTrimRequest mock_trim_request;
InSequence seq;
expect_block_writes(mock_image_ctx, 0);
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, true, 0);
expect_unblock_writes(mock_image_ctx);
MockTrimRequest mock_trim_request;
InSequence seq;
expect_block_writes(mock_image_ctx, 0);
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, true, 0);
expect_unblock_writes(mock_image_ctx);
expect_grow_object_map(mock_image_ctx);
expect_block_writes(mock_image_ctx, -EINVAL);
InSequence seq;
expect_block_writes(mock_image_ctx, 0);
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, true, 0);
expect_unblock_writes(mock_image_ctx);
expect_grow_object_map(mock_image_ctx);
expect_block_writes(mock_image_ctx, 0);
InSequence seq;
expect_block_writes(mock_image_ctx, 0);
- expect_append_op_event(mock_image_ctx, -EINVAL);
+ expect_append_op_event(mock_image_ctx, true, -EINVAL);
expect_unblock_writes(mock_image_ctx);
ASSERT_EQ(-EINVAL, when_resize(mock_image_ctx, ictx->size, 0, false));
}
InSequence seq;
MockResizeRequest mock_resize_request;
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, false, 0);
expect_block_writes(mock_image_ctx, 0);
expect_resize(mock_image_ctx, mock_resize_request, 0);
expect_rollback_object_map(mock_image_ctx, *mock_object_map);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, false, 0);
expect_block_writes(mock_image_ctx, -EINVAL);
expect_commit_op_event(mock_image_ctx, -EINVAL);
expect_unblock_writes(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, false, 0);
expect_block_writes(mock_image_ctx, 0);
expect_get_image_size(mock_image_ctx, 345);
expect_rollback_object_map(mock_image_ctx, *mock_object_map);
InSequence seq;
MockResizeRequest mock_resize_request;
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, false, 0);
expect_block_writes(mock_image_ctx, 0);
expect_resize(mock_image_ctx, mock_resize_request, -EINVAL);
expect_commit_op_event(mock_image_ctx, -EINVAL);
InSequence seq;
MockResizeRequest mock_resize_request;
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, false, 0);
expect_block_writes(mock_image_ctx, 0);
expect_resize(mock_image_ctx, mock_resize_request, 0);
expect_rollback_object_map(mock_image_ctx, mock_object_map);
InSequence seq;
MockResizeRequest mock_resize_request;
- expect_append_op_event(mock_image_ctx, 0);
+ expect_append_op_event(mock_image_ctx, false, 0);
expect_block_writes(mock_image_ctx, 0);
expect_resize(mock_image_ctx, mock_resize_request, 0);
expect_rollback_object_map(mock_image_ctx, *mock_object_map);
}
}
+void TestMockFixture::expect_is_journal_appending(librbd::MockJournal &mock_journal,
+ bool appending) {
+ EXPECT_CALL(mock_journal, is_journal_appending()).WillOnce(Return(appending));
+}
+
void TestMockFixture::expect_is_journal_replaying(librbd::MockJournal &mock_journal) {
EXPECT_CALL(mock_journal, is_journal_replaying()).WillOnce(Return(false));
}
}
}
-void TestMockFixture::expect_append_op_event(librbd::MockImageCtx &mock_image_ctx, int r) {
+void TestMockFixture::expect_append_op_event(librbd::MockImageCtx &mock_image_ctx,
+ bool can_affect_io, int r) {
if (mock_image_ctx.journal != nullptr) {
- expect_is_journal_replaying(*mock_image_ctx.journal);
+ if (can_affect_io) {
+ expect_is_journal_replaying(*mock_image_ctx.journal);
+ }
+ expect_is_journal_appending(*mock_image_ctx.journal, true);
expect_allocate_op_tid(mock_image_ctx);
EXPECT_CALL(*mock_image_ctx.journal, append_op_event_mock(_, _, _))
.WillOnce(WithArg<2>(CompleteContext(r, mock_image_ctx.image_ctx->op_work_queue)));
void TestMockFixture::expect_commit_op_event(librbd::MockImageCtx &mock_image_ctx, int r) {
if (mock_image_ctx.journal != nullptr) {
- expect_is_journal_replaying(*mock_image_ctx.journal);
+ expect_is_journal_appending(*mock_image_ctx.journal, true);
expect_is_journal_ready(*mock_image_ctx.journal);
EXPECT_CALL(*mock_image_ctx.journal, commit_op_event(1U, r, _))
.WillOnce(WithArg<2>(CompleteContext(r, mock_image_ctx.image_ctx->op_work_queue)));
librbd::MockJournal &mock_journal,
librbd::MockObjectMap &mock_object_map);
+ void expect_is_journal_appending(librbd::MockJournal &mock_journal,
+ bool appending);
void expect_is_journal_replaying(librbd::MockJournal &mock_journal);
void expect_is_journal_ready(librbd::MockJournal &mock_journal);
void expect_allocate_op_tid(librbd::MockImageCtx &mock_image_ctx);
- void expect_append_op_event(librbd::MockImageCtx &mock_image_ctx, int r);
+ void expect_append_op_event(librbd::MockImageCtx &mock_image_ctx,
+ bool can_affect_io, int r);
void expect_commit_op_event(librbd::MockImageCtx &mock_image_ctx, int r);
private: