1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "journal/JournalRecorder.h"
5 #include "journal/Entry.h"
6 #include "journal/JournalMetadata.h"
7 #include "test/journal/RadosTestFixture.h"
11 class TestJournalRecorder : public RadosTestFixture {
14 void TearDown() override {
15 for (std::list<journal::JournalRecorder*>::iterator it = m_recorders.begin();
16 it != m_recorders.end(); ++it) {
19 RadosTestFixture::TearDown();
22 journal::JournalRecorder *create_recorder(const std::string &oid,
23 const journal::JournalMetadataPtr &metadata) {
24 journal::JournalRecorder *recorder(new journal::JournalRecorder(
25 m_ioctx, oid + ".", metadata, 0, std::numeric_limits<uint32_t>::max(), 0));
26 m_recorders.push_back(recorder);
30 std::list<journal::JournalRecorder*> m_recorders;
34 TEST_F(TestJournalRecorder, Append) {
35 std::string oid = get_temp_oid();
36 ASSERT_EQ(0, create(oid, 12, 2));
37 ASSERT_EQ(0, client_register(oid));
39 journal::JournalMetadataPtr metadata = create_metadata(oid);
40 ASSERT_EQ(0, init_metadata(metadata));
42 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
44 journal::Future future1 = recorder->append(123, create_payload("payload"));
48 ASSERT_EQ(0, cond.wait());
51 TEST_F(TestJournalRecorder, AppendKnownOverflow) {
52 std::string oid = get_temp_oid();
53 ASSERT_EQ(0, create(oid, 12, 2));
54 ASSERT_EQ(0, client_register(oid));
56 journal::JournalMetadataPtr metadata = create_metadata(oid);
57 ASSERT_EQ(0, init_metadata(metadata));
58 ASSERT_EQ(0U, metadata->get_active_set());
60 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
62 recorder->append(123, create_payload(std::string(metadata->get_object_size() -
63 journal::Entry::get_fixed_size(), '1')));
64 journal::Future future2 = recorder->append(123, create_payload(std::string(1, '2')));
68 ASSERT_EQ(0, cond.wait());
70 ASSERT_EQ(1U, metadata->get_active_set());
73 TEST_F(TestJournalRecorder, AppendDelayedOverflow) {
74 std::string oid = get_temp_oid();
75 ASSERT_EQ(0, create(oid, 12, 2));
76 ASSERT_EQ(0, client_register(oid));
78 journal::JournalMetadataPtr metadata = create_metadata(oid);
79 ASSERT_EQ(0, init_metadata(metadata));
80 ASSERT_EQ(0U, metadata->get_active_set());
82 journal::JournalRecorder *recorder1 = create_recorder(oid, metadata);
83 journal::JournalRecorder *recorder2 = create_recorder(oid, metadata);
85 recorder1->append(234, create_payload(std::string(1, '1')));
86 recorder2->append(123, create_payload(std::string(metadata->get_object_size() -
87 journal::Entry::get_fixed_size(), '2')));
89 journal::Future future = recorder2->append(123, create_payload(std::string(1, '3')));
93 ASSERT_EQ(0, cond.wait());
95 ASSERT_EQ(1U, metadata->get_active_set());
98 TEST_F(TestJournalRecorder, FutureFlush) {
99 std::string oid = get_temp_oid();
100 ASSERT_EQ(0, create(oid, 12, 2));
101 ASSERT_EQ(0, client_register(oid));
103 journal::JournalMetadataPtr metadata = create_metadata(oid);
104 ASSERT_EQ(0, init_metadata(metadata));
106 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
108 journal::Future future1 = recorder->append(123, create_payload("payload1"));
109 journal::Future future2 = recorder->append(123, create_payload("payload2"));
112 future2.flush(&cond);
113 ASSERT_EQ(0, cond.wait());
114 ASSERT_TRUE(future1.is_complete());
115 ASSERT_TRUE(future2.is_complete());
118 TEST_F(TestJournalRecorder, Flush) {
119 std::string oid = get_temp_oid();
120 ASSERT_EQ(0, create(oid, 12, 2));
121 ASSERT_EQ(0, client_register(oid));
123 journal::JournalMetadataPtr metadata = create_metadata(oid);
124 ASSERT_EQ(0, init_metadata(metadata));
126 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
128 journal::Future future1 = recorder->append(123, create_payload("payload1"));
129 journal::Future future2 = recorder->append(123, create_payload("payload2"));
132 recorder->flush(&cond1);
133 ASSERT_EQ(0, cond1.wait());
136 future2.wait(&cond2);
137 ASSERT_EQ(0, cond2.wait());
138 ASSERT_TRUE(future1.is_complete());
139 ASSERT_TRUE(future2.is_complete());
142 TEST_F(TestJournalRecorder, OverflowCommitObjectNumber) {
143 std::string oid = get_temp_oid();
144 ASSERT_EQ(0, create(oid, 12, 2));
145 ASSERT_EQ(0, client_register(oid));
147 journal::JournalMetadataPtr metadata = create_metadata(oid);
148 ASSERT_EQ(0, init_metadata(metadata));
149 ASSERT_EQ(0U, metadata->get_active_set());
151 journal::JournalRecorder *recorder = create_recorder(oid, metadata);
153 recorder->append(123, create_payload(std::string(metadata->get_object_size() -
154 journal::Entry::get_fixed_size(), '1')));
155 journal::Future future2 = recorder->append(124, create_payload(std::string(1, '2')));
158 future2.flush(&cond);
159 ASSERT_EQ(0, cond.wait());
161 ASSERT_EQ(1U, metadata->get_active_set());
166 metadata->get_commit_entry(1, &object_num, &tag_tid, &entry_tid);
167 ASSERT_EQ(0U, object_num);
168 ASSERT_EQ(123U, tag_tid);
169 ASSERT_EQ(0U, entry_tid);
171 metadata->get_commit_entry(2, &object_num, &tag_tid, &entry_tid);
172 ASSERT_EQ(2U, object_num);
173 ASSERT_EQ(124U, tag_tid);
174 ASSERT_EQ(0U, entry_tid);