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));
26 recorder
->set_append_batch_options(0, std::numeric_limits
<uint32_t>::max(),
28 m_recorders
.push_back(recorder
);
32 std::list
<journal::JournalRecorder
*> m_recorders
;
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
));
41 journal::JournalMetadataPtr metadata
= create_metadata(oid
);
42 ASSERT_EQ(0, init_metadata(metadata
));
44 journal::JournalRecorder
*recorder
= create_recorder(oid
, metadata
);
46 journal::Future future1
= recorder
->append(123, create_payload("payload"));
50 ASSERT_EQ(0, cond
.wait());
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
));
58 journal::JournalMetadataPtr metadata
= create_metadata(oid
);
59 ASSERT_EQ(0, init_metadata(metadata
));
60 ASSERT_EQ(0U, metadata
->get_active_set());
62 journal::JournalRecorder
*recorder
= create_recorder(oid
, metadata
);
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')));
70 ASSERT_EQ(0, cond
.wait());
72 ASSERT_EQ(1U, metadata
->get_active_set());
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
));
80 journal::JournalMetadataPtr metadata
= create_metadata(oid
);
81 ASSERT_EQ(0, init_metadata(metadata
));
82 ASSERT_EQ(0U, metadata
->get_active_set());
84 journal::JournalRecorder
*recorder1
= create_recorder(oid
, metadata
);
85 journal::JournalRecorder
*recorder2
= create_recorder(oid
, metadata
);
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')));
91 journal::Future future
= recorder2
->append(123, create_payload(std::string(1, '3')));
95 ASSERT_EQ(0, cond
.wait());
97 ASSERT_EQ(1U, metadata
->get_active_set());
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
));
105 journal::JournalMetadataPtr metadata
= create_metadata(oid
);
106 ASSERT_EQ(0, init_metadata(metadata
));
108 journal::JournalRecorder
*recorder
= create_recorder(oid
, metadata
);
110 journal::Future future1
= recorder
->append(123, create_payload("payload1"));
111 journal::Future future2
= recorder
->append(123, create_payload("payload2"));
114 future2
.flush(&cond
);
115 ASSERT_EQ(0, cond
.wait());
116 ASSERT_TRUE(future1
.is_complete());
117 ASSERT_TRUE(future2
.is_complete());
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
));
125 journal::JournalMetadataPtr metadata
= create_metadata(oid
);
126 ASSERT_EQ(0, init_metadata(metadata
));
128 journal::JournalRecorder
*recorder
= create_recorder(oid
, metadata
);
130 journal::Future future1
= recorder
->append(123, create_payload("payload1"));
131 journal::Future future2
= recorder
->append(123, create_payload("payload2"));
134 recorder
->flush(&cond1
);
135 ASSERT_EQ(0, cond1
.wait());
138 future2
.wait(&cond2
);
139 ASSERT_EQ(0, cond2
.wait());
140 ASSERT_TRUE(future1
.is_complete());
141 ASSERT_TRUE(future2
.is_complete());
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
));
149 journal::JournalMetadataPtr metadata
= create_metadata(oid
);
150 ASSERT_EQ(0, init_metadata(metadata
));
151 ASSERT_EQ(0U, metadata
->get_active_set());
153 journal::JournalRecorder
*recorder
= create_recorder(oid
, metadata
);
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')));
160 future2
.flush(&cond
);
161 ASSERT_EQ(0, cond
.wait());
163 ASSERT_EQ(1U, metadata
->get_active_set());
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
);
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
);