1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "journal/JournalTrimmer.h"
5 #include "journal/JournalMetadata.h"
6 #include "include/stringify.h"
7 #include "test/journal/RadosTestFixture.h"
11 class TestJournalTrimmer : public RadosTestFixture {
14 void TearDown() override {
15 for (MetadataList::iterator it = m_metadata_list.begin();
16 it != m_metadata_list.end(); ++it) {
17 (*it)->remove_listener(&m_listener);
19 m_metadata_list.clear();
21 for (std::list<journal::JournalTrimmer*>::iterator it = m_trimmers.begin();
22 it != m_trimmers.end(); ++it) {
24 (*it)->shut_down(&ctx);
25 ASSERT_EQ(0, ctx.wait());
28 RadosTestFixture::TearDown();
31 int append_payload(journal::JournalMetadataPtr metadata,
32 const std::string &oid, uint64_t object_num,
33 const std::string &payload, uint64_t *commit_tid) {
34 int r = append(oid + "." + stringify(object_num), create_payload(payload));
35 uint64_t tid = metadata->allocate_commit_tid(object_num, 234, 123);
36 if (commit_tid != NULL) {
42 journal::JournalMetadataPtr create_metadata(const std::string &oid) {
43 journal::JournalMetadataPtr metadata = RadosTestFixture::create_metadata(
45 m_metadata_list.push_back(metadata);
46 metadata->add_listener(&m_listener);
50 journal::JournalTrimmer *create_trimmer(const std::string &oid,
51 const journal::JournalMetadataPtr &metadata) {
52 journal::JournalTrimmer *trimmer(new journal::JournalTrimmer(
53 m_ioctx, oid + ".", metadata));
54 m_trimmers.push_back(trimmer);
58 int assert_exists(const std::string &oid) {
59 librados::ObjectWriteOperation op;
61 return m_ioctx.operate(oid, &op);
64 typedef std::list<journal::JournalMetadataPtr> MetadataList;
65 MetadataList m_metadata_list;
66 std::list<journal::JournalTrimmer*> m_trimmers;
69 TEST_F(TestJournalTrimmer, Committed) {
70 std::string oid = get_temp_oid();
71 ASSERT_EQ(0, create(oid, 12, 2));
72 ASSERT_EQ(0, client_register(oid));
74 journal::JournalMetadataPtr metadata = create_metadata(oid);
75 ASSERT_EQ(0, init_metadata(metadata));
76 ASSERT_TRUE(wait_for_update(metadata));
78 ASSERT_EQ(0, metadata->set_active_set(10));
79 ASSERT_TRUE(wait_for_update(metadata));
87 ASSERT_EQ(0, append_payload(metadata, oid, 0, "payload", &commit_tid1));
88 ASSERT_EQ(0, append_payload(metadata, oid, 4, "payload", &commit_tid2));
89 ASSERT_EQ(0, append_payload(metadata, oid, 5, "payload", &commit_tid3));
90 ASSERT_EQ(0, append_payload(metadata, oid, 0, "payload", &commit_tid4));
91 ASSERT_EQ(0, append_payload(metadata, oid, 4, "payload", &commit_tid5));
92 ASSERT_EQ(0, append_payload(metadata, oid, 5, "payload", &commit_tid6));
94 journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata);
96 trimmer->committed(commit_tid4);
97 trimmer->committed(commit_tid6);
98 trimmer->committed(commit_tid2);
99 trimmer->committed(commit_tid5);
100 trimmer->committed(commit_tid3);
101 trimmer->committed(commit_tid1);
102 while (metadata->get_minimum_set() != 2U) {
103 ASSERT_TRUE(wait_for_update(metadata));
106 ASSERT_EQ(-ENOENT, assert_exists(oid + ".0"));
107 ASSERT_EQ(-ENOENT, assert_exists(oid + ".2"));
108 ASSERT_EQ(0, assert_exists(oid + ".5"));
111 TEST_F(TestJournalTrimmer, CommittedWithOtherClient) {
112 std::string oid = get_temp_oid();
113 ASSERT_EQ(0, create(oid, 12, 2));
114 ASSERT_EQ(0, client_register(oid));
115 ASSERT_EQ(0, client_register(oid, "client2", "slow client"));
117 journal::JournalMetadataPtr metadata = create_metadata(oid);
118 ASSERT_EQ(0, init_metadata(metadata));
119 ASSERT_TRUE(wait_for_update(metadata));
121 ASSERT_EQ(0, metadata->set_active_set(10));
122 ASSERT_TRUE(wait_for_update(metadata));
124 uint64_t commit_tid1;
125 uint64_t commit_tid2;
126 uint64_t commit_tid3;
127 uint64_t commit_tid4;
128 ASSERT_EQ(0, append_payload(metadata, oid, 0, "payload", &commit_tid1));
129 ASSERT_EQ(0, append_payload(metadata, oid, 2, "payload", &commit_tid2));
130 ASSERT_EQ(0, append_payload(metadata, oid, 3, "payload", &commit_tid3));
131 ASSERT_EQ(0, append_payload(metadata, oid, 5, "payload", &commit_tid4));
133 journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata);
135 trimmer->committed(commit_tid1);
136 trimmer->committed(commit_tid2);
137 trimmer->committed(commit_tid3);
138 trimmer->committed(commit_tid4);
139 ASSERT_TRUE(wait_for_update(metadata));
141 ASSERT_EQ(0, assert_exists(oid + ".0"));
142 ASSERT_EQ(0, assert_exists(oid + ".2"));
143 ASSERT_EQ(0, assert_exists(oid + ".3"));
144 ASSERT_EQ(0, assert_exists(oid + ".5"));
147 TEST_F(TestJournalTrimmer, RemoveObjects) {
148 std::string oid = get_temp_oid();
149 ASSERT_EQ(0, create(oid, 12, 2));
150 ASSERT_EQ(0, client_register(oid));
152 journal::JournalMetadataPtr metadata = create_metadata(oid);
153 ASSERT_EQ(0, init_metadata(metadata));
154 ASSERT_TRUE(wait_for_update(metadata));
156 ASSERT_EQ(0, metadata->set_active_set(10));
157 ASSERT_TRUE(wait_for_update(metadata));
159 ASSERT_EQ(0, append(oid + ".0", create_payload("payload")));
160 ASSERT_EQ(0, append(oid + ".2", create_payload("payload")));
161 ASSERT_EQ(0, append(oid + ".3", create_payload("payload")));
162 ASSERT_EQ(0, append(oid + ".5", create_payload("payload")));
164 journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata);
167 trimmer->remove_objects(false, &cond);
168 ASSERT_EQ(0, cond.wait());
170 ASSERT_TRUE(wait_for_update(metadata));
172 ASSERT_EQ(-ENOENT, assert_exists(oid + ".0"));
173 ASSERT_EQ(-ENOENT, assert_exists(oid + ".2"));
174 ASSERT_EQ(-ENOENT, assert_exists(oid + ".3"));
175 ASSERT_EQ(-ENOENT, assert_exists(oid + ".5"));
178 TEST_F(TestJournalTrimmer, RemoveObjectsWithOtherClient) {
179 std::string oid = get_temp_oid();
180 ASSERT_EQ(0, create(oid, 12, 2));
181 ASSERT_EQ(0, client_register(oid));
182 ASSERT_EQ(0, client_register(oid, "client2", "other client"));
184 journal::JournalMetadataPtr metadata = create_metadata(oid);
185 ASSERT_EQ(0, init_metadata(metadata));
186 ASSERT_TRUE(wait_for_update(metadata));
188 journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata);
191 trimmer->remove_objects(false, &ctx1);
192 ASSERT_EQ(-EBUSY, ctx1.wait());
195 trimmer->remove_objects(true, &ctx2);
196 ASSERT_EQ(0, ctx2.wait());