]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/journal/test_Journaler.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "journal/Journaler.h"
5 #include "journal/Settings.h"
6 #include "include/stringify.h"
7 #include "gtest/gtest.h"
8 #include "test/librados/test.h"
9 #include "test/journal/RadosTestFixture.h"
10 #include "include/stringify.h"
12 class TestJournaler
: public RadosTestFixture
{
15 static const std::string CLIENT_ID
;
17 static std::string
get_temp_journal_id() {
18 return stringify(++_journal_id
);
21 void SetUp() override
{
22 RadosTestFixture::SetUp();
23 m_journal_id
= get_temp_journal_id();
24 m_journaler
= new journal::Journaler(m_work_queue
, m_timer
, &m_timer_lock
,
25 m_ioctx
, m_journal_id
, CLIENT_ID
, {});
28 void TearDown() override
{
30 RadosTestFixture::TearDown();
33 int create_journal(uint8_t order
, uint8_t splay_width
) {
35 m_journaler
->create(order
, splay_width
, -1, &cond
);
39 int init_journaler() {
41 m_journaler
->init(&cond
);
45 int shut_down_journaler() {
47 m_journaler
->shut_down(&ctx
);
51 int register_client(const std::string
&client_id
, const std::string
&desc
) {
52 journal::Journaler
journaler(m_work_queue
, m_timer
, &m_timer_lock
,
53 m_ioctx
, m_journal_id
, client_id
, {});
57 journaler
.register_client(data
, &cond
);
61 int update_client(const std::string
&client_id
, const std::string
&desc
) {
62 journal::Journaler
journaler(m_work_queue
, m_timer
, &m_timer_lock
,
63 m_ioctx
, m_journal_id
, client_id
, {});
67 journaler
.update_client(data
, &cond
);
71 int unregister_client(const std::string
&client_id
) {
72 journal::Journaler
journaler(m_work_queue
, m_timer
, &m_timer_lock
,
73 m_ioctx
, m_journal_id
, client_id
, {});
75 journaler
.unregister_client(&cond
);
79 static uint64_t _journal_id
;
81 std::string m_journal_id
;
82 journal::Journaler
*m_journaler
;
85 const std::string
TestJournaler::CLIENT_ID
= "client1";
86 uint64_t TestJournaler::_journal_id
= 0;
88 TEST_F(TestJournaler
, Create
) {
89 ASSERT_EQ(0, create_journal(12, 8));
92 TEST_F(TestJournaler
, CreateDuplicate
) {
93 ASSERT_EQ(0, create_journal(12, 8));
94 ASSERT_EQ(-EEXIST
, create_journal(12, 8));
97 TEST_F(TestJournaler
, CreateInvalidParams
) {
98 ASSERT_EQ(-EDOM
, create_journal(1, 8));
99 ASSERT_EQ(-EDOM
, create_journal(123, 8));
100 ASSERT_EQ(-EINVAL
, create_journal(12, 0));
103 TEST_F(TestJournaler
, Init
) {
104 ASSERT_EQ(0, create_journal(12, 8));
105 ASSERT_EQ(0, register_client(CLIENT_ID
, "foo"));
106 ASSERT_EQ(0, init_journaler());
107 ASSERT_EQ(0, shut_down_journaler());
110 TEST_F(TestJournaler
, InitDNE
) {
111 ASSERT_EQ(-ENOENT
, init_journaler());
112 ASSERT_EQ(0, shut_down_journaler());
115 TEST_F(TestJournaler
, RegisterClientDuplicate
) {
116 ASSERT_EQ(0, create_journal(12, 8));
117 ASSERT_EQ(0, register_client(CLIENT_ID
, "foo"));
118 ASSERT_EQ(-EEXIST
, register_client(CLIENT_ID
, "foo2"));
121 TEST_F(TestJournaler
, UpdateClient
) {
122 ASSERT_EQ(0, create_journal(12, 8));
123 ASSERT_EQ(0, register_client(CLIENT_ID
, "foo"));
124 ASSERT_EQ(0, update_client(CLIENT_ID
, "foo2"));
127 TEST_F(TestJournaler
, UpdateClientDNE
) {
128 ASSERT_EQ(0, create_journal(12, 8));
129 ASSERT_EQ(-ENOENT
, update_client(CLIENT_ID
, "foo"));
132 TEST_F(TestJournaler
, UnregisterClient
) {
133 ASSERT_EQ(0, create_journal(12, 8));
134 ASSERT_EQ(0, register_client(CLIENT_ID
, "foo"));
135 ASSERT_EQ(0, unregister_client(CLIENT_ID
));
136 // Test it does not exist and can be registered again
137 ASSERT_EQ(-ENOENT
, update_client(CLIENT_ID
, "foo"));
138 ASSERT_EQ(0, register_client(CLIENT_ID
, "foo"));
141 TEST_F(TestJournaler
, UnregisterClientDNE
) {
142 ASSERT_EQ(0, create_journal(12, 8));
143 ASSERT_EQ(-ENOENT
, unregister_client(CLIENT_ID
));
146 TEST_F(TestJournaler
, AllocateTag
) {
147 ASSERT_EQ(0, create_journal(12, 8));
149 cls::journal::Tag tag
;
152 data
.append(std::string(128, '1'));
154 // allocate a new tag class
156 m_journaler
->allocate_tag(data
, &tag
, &ctx1
);
157 ASSERT_EQ(0, ctx1
.wait());
158 ASSERT_EQ(cls::journal::Tag(0, 0, data
), tag
);
160 // re-use an existing tag class
162 m_journaler
->allocate_tag(tag
.tag_class
, bufferlist(), &tag
, &ctx2
);
163 ASSERT_EQ(0, ctx2
.wait());
164 ASSERT_EQ(cls::journal::Tag(1, 0, bufferlist()), tag
);
167 TEST_F(TestJournaler
, GetTags
) {
168 ASSERT_EQ(0, create_journal(12, 8));
169 ASSERT_EQ(0, register_client(CLIENT_ID
, "foo"));
171 std::list
<cls::journal::Tag
> expected_tags
;
172 for (size_t i
= 0; i
< 256; ++i
) {
174 cls::journal::Tag tag
;
176 m_journaler
->allocate_tag(bufferlist(), &tag
, &ctx
);
178 m_journaler
->allocate_tag(i
% 2, bufferlist(), &tag
, &ctx
);
180 ASSERT_EQ(0, ctx
.wait());
183 expected_tags
.push_back(tag
);
187 std::list
<cls::journal::Tag
> tags
;
189 m_journaler
->get_tags(0, &tags
, &ctx
);
190 ASSERT_EQ(0, ctx
.wait());
191 ASSERT_EQ(expected_tags
, tags
);