// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
-#include "cls/rbd/cls_rbd_types.h"
#include "test/librbd/test_fixture.h"
#include "test/librbd/test_support.h"
#include "cls/rbd/cls_rbd_types.h"
#include "librbd/Journal.h"
#include "librbd/Operations.h"
#include "librbd/io/AioCompletion.h"
+#include "librbd/io/ImageDispatchSpec.h"
#include "librbd/io/ImageRequest.h"
#include "librbd/io/ImageRequestWQ.h"
#include "librbd/io/ReadResult.h"
void inject_into_journal(librbd::ImageCtx *ictx, T event) {
C_SaferCond ctx;
librbd::journal::EventEntry event_entry(event);
- librbd::Journal<>::IOObjectRequests requests;
{
RWLock::RLocker owner_locker(ictx->owner_lock);
- uint64_t tid = ictx->journal->append_io_event(std::move(event_entry),
- requests, 0, 0, true, 0);
+ uint64_t tid = ictx->journal->append_io_event(std::move(event_entry),0, 0,
+ true, 0);
ictx->journal->wait_event(tid, &ctx);
}
ASSERT_EQ(0, ctx.wait());
// inject a discard operation into the journal
inject_into_journal(ictx,
- librbd::journal::AioDiscardEvent(0, payload.size(),
- ictx->skip_partial_discard));
+ librbd::journal::AioDiscardEvent(
+ 0, payload.size(), ictx->discard_granularity_bytes));
close_image(ictx);
// re-open the journal so that it replays the new entry
librbd::io::ReadResult{read_result}, 0);
ASSERT_EQ(0, aio_comp->wait_for_complete());
aio_comp->release();
- if (ictx->skip_partial_discard) {
+ if (ictx->discard_granularity_bytes > 0) {
ASSERT_EQ(payload, read_payload);
} else {
ASSERT_EQ(std::string(read_payload.size(), '\0'), read_payload);
// replay several envents and check the commit position
inject_into_journal(ictx,
- librbd::journal::AioDiscardEvent(0, payload.size(),
- ictx->skip_partial_discard));
+ librbd::journal::AioDiscardEvent(
+ 0, payload.size(), ictx->discard_granularity_bytes));
inject_into_journal(ictx,
- librbd::journal::AioDiscardEvent(0, payload.size(),
- ictx->skip_partial_discard));
+ librbd::journal::AioDiscardEvent(
+ 0, payload.size(), ictx->discard_granularity_bytes));
close_image(ictx);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
// verify lock ordering constraints
aio_comp = new librbd::io::AioCompletion();
ictx->io_work_queue->aio_discard(aio_comp, 0, read_payload.size(),
- ictx->skip_partial_discard);
+ ictx->discard_granularity_bytes);
ASSERT_EQ(0, aio_comp->wait_for_complete());
aio_comp->release();
}
ASSERT_EQ(initial_tag + 1, current_tag);
ASSERT_EQ(1, current_entry);
- ASSERT_EQ(9876, ictx->mirroring_replay_delay);
+ ASSERT_EQ(9876U, ictx->mirroring_replay_delay);
std::string value;
ASSERT_EQ(0, librbd::metadata_get(ictx, "conf_rbd_mirroring_replay_delay",
get_journal_commit_position(ictx, ¤t_tag, ¤t_entry);
ASSERT_EQ(initial_tag, current_tag);
ASSERT_EQ(initial_entry + 2, current_entry);
- ASSERT_EQ(0, ictx->mirroring_replay_delay);
+ ASSERT_EQ(0U, ictx->mirroring_replay_delay);
std::string value;
ASSERT_EQ(-ENOENT,
ASSERT_EQ(0, aio_comp->wait_for_complete());
aio_comp->release();
- {
- // user flush requests are ignored when journaling + cache are enabled
- RWLock::RLocker owner_lock(ictx->owner_lock);
- ictx->flush();
- }
+ // user flush requests are ignored when journaling + cache are enabled
+ C_SaferCond flush_ctx;
+ aio_comp = librbd::io::AioCompletion::create(
+ &flush_ctx, ictx, librbd::io::AIO_TYPE_FLUSH);
+ auto req = librbd::io::ImageDispatchSpec<>::create_flush_request(
+ *ictx, aio_comp, librbd::io::FLUSH_SOURCE_INTERNAL, {});
+ req->send();
+ delete req;
+ ASSERT_EQ(0, flush_ctx.wait());
// check the commit position updated
get_journal_commit_position(ictx, ¤t_tag, ¤t_entry);