]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/journal/test_JournalRecorder.cc
update sources to ceph Nautilus 14.2.1
[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, std::numeric_limits<uint32_t>::max(),
26 0, 0));
27 m_recorders.push_back(recorder);
28 return recorder;
29 }
30
31 std::list<journal::JournalRecorder*> m_recorders;
32
33 };
34
35 TEST_F(TestJournalRecorder, Append) {
36 std::string oid = get_temp_oid();
37 ASSERT_EQ(0, create(oid, 12, 2));
38 ASSERT_EQ(0, client_register(oid));
39
40 journal::JournalMetadataPtr metadata = create_metadata(oid);
41 ASSERT_EQ(0, init_metadata(metadata));
42
43 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
44
45 journal::Future future1 = recorder->append(123, create_payload("payload"));
46
47 C_SaferCond cond;
48 future1.flush(&cond);
49 ASSERT_EQ(0, cond.wait());
50 }
51
52 TEST_F(TestJournalRecorder, AppendKnownOverflow) {
53 std::string oid = get_temp_oid();
54 ASSERT_EQ(0, create(oid, 12, 2));
55 ASSERT_EQ(0, client_register(oid));
56
57 journal::JournalMetadataPtr metadata = create_metadata(oid);
58 ASSERT_EQ(0, init_metadata(metadata));
59 ASSERT_EQ(0U, metadata->get_active_set());
60
61 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
62
63 recorder->append(123, create_payload(std::string(metadata->get_object_size() -
64 journal::Entry::get_fixed_size(), '1')));
65 journal::Future future2 = recorder->append(123, create_payload(std::string(1, '2')));
66
67 C_SaferCond cond;
68 future2.flush(&cond);
69 ASSERT_EQ(0, cond.wait());
70
71 ASSERT_EQ(1U, metadata->get_active_set());
72 }
73
74 TEST_F(TestJournalRecorder, AppendDelayedOverflow) {
75 std::string oid = get_temp_oid();
76 ASSERT_EQ(0, create(oid, 12, 2));
77 ASSERT_EQ(0, client_register(oid));
78
79 journal::JournalMetadataPtr metadata = create_metadata(oid);
80 ASSERT_EQ(0, init_metadata(metadata));
81 ASSERT_EQ(0U, metadata->get_active_set());
82
83 journal::JournalRecorder *recorder1 = create_recorder(oid, metadata);
84 journal::JournalRecorder *recorder2 = create_recorder(oid, metadata);
85
86 recorder1->append(234, create_payload(std::string(1, '1')));
87 recorder2->append(123, create_payload(std::string(metadata->get_object_size() -
88 journal::Entry::get_fixed_size(), '2')));
89
90 journal::Future future = recorder2->append(123, create_payload(std::string(1, '3')));
91
92 C_SaferCond cond;
93 future.flush(&cond);
94 ASSERT_EQ(0, cond.wait());
95
96 ASSERT_EQ(1U, metadata->get_active_set());
97 }
98
99 TEST_F(TestJournalRecorder, FutureFlush) {
100 std::string oid = get_temp_oid();
101 ASSERT_EQ(0, create(oid, 12, 2));
102 ASSERT_EQ(0, client_register(oid));
103
104 journal::JournalMetadataPtr metadata = create_metadata(oid);
105 ASSERT_EQ(0, init_metadata(metadata));
106
107 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
108
109 journal::Future future1 = recorder->append(123, create_payload("payload1"));
110 journal::Future future2 = recorder->append(123, create_payload("payload2"));
111
112 C_SaferCond cond;
113 future2.flush(&cond);
114 ASSERT_EQ(0, cond.wait());
115 ASSERT_TRUE(future1.is_complete());
116 ASSERT_TRUE(future2.is_complete());
117 }
118
119 TEST_F(TestJournalRecorder, Flush) {
120 std::string oid = get_temp_oid();
121 ASSERT_EQ(0, create(oid, 12, 2));
122 ASSERT_EQ(0, client_register(oid));
123
124 journal::JournalMetadataPtr metadata = create_metadata(oid);
125 ASSERT_EQ(0, init_metadata(metadata));
126
127 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
128
129 journal::Future future1 = recorder->append(123, create_payload("payload1"));
130 journal::Future future2 = recorder->append(123, create_payload("payload2"));
131
132 C_SaferCond cond1;
133 recorder->flush(&cond1);
134 ASSERT_EQ(0, cond1.wait());
135
136 C_SaferCond cond2;
137 future2.wait(&cond2);
138 ASSERT_EQ(0, cond2.wait());
139 ASSERT_TRUE(future1.is_complete());
140 ASSERT_TRUE(future2.is_complete());
141 }
142
143 TEST_F(TestJournalRecorder, OverflowCommitObjectNumber) {
144 std::string oid = get_temp_oid();
145 ASSERT_EQ(0, create(oid, 12, 2));
146 ASSERT_EQ(0, client_register(oid));
147
148 journal::JournalMetadataPtr metadata = create_metadata(oid);
149 ASSERT_EQ(0, init_metadata(metadata));
150 ASSERT_EQ(0U, metadata->get_active_set());
151
152 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
153
154 recorder->append(123, create_payload(std::string(metadata->get_object_size() -
155 journal::Entry::get_fixed_size(), '1')));
156 journal::Future future2 = recorder->append(124, create_payload(std::string(1, '2')));
157
158 C_SaferCond cond;
159 future2.flush(&cond);
160 ASSERT_EQ(0, cond.wait());
161
162 ASSERT_EQ(1U, metadata->get_active_set());
163
164 uint64_t object_num;
165 uint64_t tag_tid;
166 uint64_t entry_tid;
167 metadata->get_commit_entry(1, &object_num, &tag_tid, &entry_tid);
168 ASSERT_EQ(0U, object_num);
169 ASSERT_EQ(123U, tag_tid);
170 ASSERT_EQ(0U, entry_tid);
171
172 metadata->get_commit_entry(2, &object_num, &tag_tid, &entry_tid);
173 ASSERT_EQ(2U, object_num);
174 ASSERT_EQ(124U, tag_tid);
175 ASSERT_EQ(0U, entry_tid);
176 }
177