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(
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(),
27 m_recorders
.push_back(recorder
);
31 std::list
<journal::JournalRecorder
*> m_recorders
;
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
));
40 journal::JournalMetadataPtr metadata
= create_metadata(oid
);
41 ASSERT_EQ(0, init_metadata(metadata
));
43 journal::JournalRecorder
*recorder
= create_recorder(oid
, metadata
);
45 journal::Future future1
= recorder
->append(123, create_payload("payload"));
49 ASSERT_EQ(0, cond
.wait());
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
));
57 journal::JournalMetadataPtr metadata
= create_metadata(oid
);
58 ASSERT_EQ(0, init_metadata(metadata
));
59 ASSERT_EQ(0U, metadata
->get_active_set());
61 journal::JournalRecorder
*recorder
= create_recorder(oid
, metadata
);
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')));
69 ASSERT_EQ(0, cond
.wait());
71 ASSERT_EQ(1U, metadata
->get_active_set());
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
));
79 journal::JournalMetadataPtr metadata
= create_metadata(oid
);
80 ASSERT_EQ(0, init_metadata(metadata
));
81 ASSERT_EQ(0U, metadata
->get_active_set());
83 journal::JournalRecorder
*recorder1
= create_recorder(oid
, metadata
);
84 journal::JournalRecorder
*recorder2
= create_recorder(oid
, metadata
);
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')));
90 journal::Future future
= recorder2
->append(123, create_payload(std::string(1, '3')));
94 ASSERT_EQ(0, cond
.wait());
96 ASSERT_EQ(1U, metadata
->get_active_set());
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
));
104 journal::JournalMetadataPtr metadata
= create_metadata(oid
);
105 ASSERT_EQ(0, init_metadata(metadata
));
107 journal::JournalRecorder
*recorder
= create_recorder(oid
, metadata
);
109 journal::Future future1
= recorder
->append(123, create_payload("payload1"));
110 journal::Future future2
= recorder
->append(123, create_payload("payload2"));
113 future2
.flush(&cond
);
114 ASSERT_EQ(0, cond
.wait());
115 ASSERT_TRUE(future1
.is_complete());
116 ASSERT_TRUE(future2
.is_complete());
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
));
124 journal::JournalMetadataPtr metadata
= create_metadata(oid
);
125 ASSERT_EQ(0, init_metadata(metadata
));
127 journal::JournalRecorder
*recorder
= create_recorder(oid
, metadata
);
129 journal::Future future1
= recorder
->append(123, create_payload("payload1"));
130 journal::Future future2
= recorder
->append(123, create_payload("payload2"));
133 recorder
->flush(&cond1
);
134 ASSERT_EQ(0, cond1
.wait());
137 future2
.wait(&cond2
);
138 ASSERT_EQ(0, cond2
.wait());
139 ASSERT_TRUE(future1
.is_complete());
140 ASSERT_TRUE(future2
.is_complete());
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
));
148 journal::JournalMetadataPtr metadata
= create_metadata(oid
);
149 ASSERT_EQ(0, init_metadata(metadata
));
150 ASSERT_EQ(0U, metadata
->get_active_set());
152 journal::JournalRecorder
*recorder
= create_recorder(oid
, metadata
);
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')));
159 future2
.flush(&cond
);
160 ASSERT_EQ(0, cond
.wait());
162 ASSERT_EQ(1U, metadata
->get_active_set());
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
);
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
);