]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/journal/test_JournalRecorder.cc
import 14.2.4 nautilus point release
[ceph.git] / ceph / src / test / journal / test_JournalRecorder.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #include "journal/JournalRecorder.h"
5 #include "journal/Entry.h"
6 #include "journal/JournalMetadata.h"
7 #include "test/journal/RadosTestFixture.h"
8 #include <limits>
9 #include <list>
10
11 class TestJournalRecorder : public RadosTestFixture {
12 public:
13
14 void TearDown() override {
15 for (std::list<journal::JournalRecorder*>::iterator it = m_recorders.begin();
16 it != m_recorders.end(); ++it) {
17 delete *it;
18 }
19 RadosTestFixture::TearDown();
20 }
21
22 journal::JournalRecorder *create_recorder(
23 const std::string &oid, const journal::JournalMetadataPtr &metadata) {
24 journal::JournalRecorder *recorder(new journal::JournalRecorder(
25 m_ioctx, oid + ".", metadata, 0));
26 recorder->set_append_batch_options(0, std::numeric_limits<uint32_t>::max(),
27 0);
28 m_recorders.push_back(recorder);
29 return recorder;
30 }
31
32 std::list<journal::JournalRecorder*> m_recorders;
33
34 };
35
36 TEST_F(TestJournalRecorder, Append) {
37 std::string oid = get_temp_oid();
38 ASSERT_EQ(0, create(oid, 12, 2));
39 ASSERT_EQ(0, client_register(oid));
40
41 journal::JournalMetadataPtr metadata = create_metadata(oid);
42 ASSERT_EQ(0, init_metadata(metadata));
43
44 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
45
46 journal::Future future1 = recorder->append(123, create_payload("payload"));
47
48 C_SaferCond cond;
49 future1.flush(&cond);
50 ASSERT_EQ(0, cond.wait());
51 }
52
53 TEST_F(TestJournalRecorder, AppendKnownOverflow) {
54 std::string oid = get_temp_oid();
55 ASSERT_EQ(0, create(oid, 12, 2));
56 ASSERT_EQ(0, client_register(oid));
57
58 journal::JournalMetadataPtr metadata = create_metadata(oid);
59 ASSERT_EQ(0, init_metadata(metadata));
60 ASSERT_EQ(0U, metadata->get_active_set());
61
62 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
63
64 recorder->append(123, create_payload(std::string(metadata->get_object_size() -
65 journal::Entry::get_fixed_size(), '1')));
66 journal::Future future2 = recorder->append(123, create_payload(std::string(1, '2')));
67
68 C_SaferCond cond;
69 future2.flush(&cond);
70 ASSERT_EQ(0, cond.wait());
71
72 ASSERT_EQ(1U, metadata->get_active_set());
73 }
74
75 TEST_F(TestJournalRecorder, AppendDelayedOverflow) {
76 std::string oid = get_temp_oid();
77 ASSERT_EQ(0, create(oid, 12, 2));
78 ASSERT_EQ(0, client_register(oid));
79
80 journal::JournalMetadataPtr metadata = create_metadata(oid);
81 ASSERT_EQ(0, init_metadata(metadata));
82 ASSERT_EQ(0U, metadata->get_active_set());
83
84 journal::JournalRecorder *recorder1 = create_recorder(oid, metadata);
85 journal::JournalRecorder *recorder2 = create_recorder(oid, metadata);
86
87 recorder1->append(234, create_payload(std::string(1, '1')));
88 recorder2->append(123, create_payload(std::string(metadata->get_object_size() -
89 journal::Entry::get_fixed_size(), '2')));
90
91 journal::Future future = recorder2->append(123, create_payload(std::string(1, '3')));
92
93 C_SaferCond cond;
94 future.flush(&cond);
95 ASSERT_EQ(0, cond.wait());
96
97 ASSERT_EQ(1U, metadata->get_active_set());
98 }
99
100 TEST_F(TestJournalRecorder, FutureFlush) {
101 std::string oid = get_temp_oid();
102 ASSERT_EQ(0, create(oid, 12, 2));
103 ASSERT_EQ(0, client_register(oid));
104
105 journal::JournalMetadataPtr metadata = create_metadata(oid);
106 ASSERT_EQ(0, init_metadata(metadata));
107
108 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
109
110 journal::Future future1 = recorder->append(123, create_payload("payload1"));
111 journal::Future future2 = recorder->append(123, create_payload("payload2"));
112
113 C_SaferCond cond;
114 future2.flush(&cond);
115 ASSERT_EQ(0, cond.wait());
116 ASSERT_TRUE(future1.is_complete());
117 ASSERT_TRUE(future2.is_complete());
118 }
119
120 TEST_F(TestJournalRecorder, Flush) {
121 std::string oid = get_temp_oid();
122 ASSERT_EQ(0, create(oid, 12, 2));
123 ASSERT_EQ(0, client_register(oid));
124
125 journal::JournalMetadataPtr metadata = create_metadata(oid);
126 ASSERT_EQ(0, init_metadata(metadata));
127
128 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
129
130 journal::Future future1 = recorder->append(123, create_payload("payload1"));
131 journal::Future future2 = recorder->append(123, create_payload("payload2"));
132
133 C_SaferCond cond1;
134 recorder->flush(&cond1);
135 ASSERT_EQ(0, cond1.wait());
136
137 C_SaferCond cond2;
138 future2.wait(&cond2);
139 ASSERT_EQ(0, cond2.wait());
140 ASSERT_TRUE(future1.is_complete());
141 ASSERT_TRUE(future2.is_complete());
142 }
143
144 TEST_F(TestJournalRecorder, OverflowCommitObjectNumber) {
145 std::string oid = get_temp_oid();
146 ASSERT_EQ(0, create(oid, 12, 2));
147 ASSERT_EQ(0, client_register(oid));
148
149 journal::JournalMetadataPtr metadata = create_metadata(oid);
150 ASSERT_EQ(0, init_metadata(metadata));
151 ASSERT_EQ(0U, metadata->get_active_set());
152
153 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
154
155 recorder->append(123, create_payload(std::string(metadata->get_object_size() -
156 journal::Entry::get_fixed_size(), '1')));
157 journal::Future future2 = recorder->append(124, create_payload(std::string(1, '2')));
158
159 C_SaferCond cond;
160 future2.flush(&cond);
161 ASSERT_EQ(0, cond.wait());
162
163 ASSERT_EQ(1U, metadata->get_active_set());
164
165 uint64_t object_num;
166 uint64_t tag_tid;
167 uint64_t entry_tid;
168 metadata->get_commit_entry(1, &object_num, &tag_tid, &entry_tid);
169 ASSERT_EQ(0U, object_num);
170 ASSERT_EQ(123U, tag_tid);
171 ASSERT_EQ(0U, entry_tid);
172
173 metadata->get_commit_entry(2, &object_num, &tag_tid, &entry_tid);
174 ASSERT_EQ(2U, object_num);
175 ASSERT_EQ(124U, tag_tid);
176 ASSERT_EQ(0U, entry_tid);
177 }
178