Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / test / journal / test_JournalTrimmer.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/JournalTrimmer.h"
5 #include "journal/JournalMetadata.h"
6 #include "include/stringify.h"
7 #include "test/journal/RadosTestFixture.h"
8 #include <limits>
9 #include <list>
10
11 class TestJournalTrimmer : public RadosTestFixture {
12 public:
13
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);
18     }
19     m_metadata_list.clear();
20
21     for (std::list<journal::JournalTrimmer*>::iterator it = m_trimmers.begin();
22          it != m_trimmers.end(); ++it) {
23       C_SaferCond ctx;
24       (*it)->shut_down(&ctx);
25       ASSERT_EQ(0, ctx.wait());
26       delete *it;
27     }
28     RadosTestFixture::TearDown();
29   }
30
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) {
37       *commit_tid = tid;
38     }
39     return r;
40   }
41
42   journal::JournalMetadataPtr create_metadata(const std::string &oid) {
43     journal::JournalMetadataPtr metadata = RadosTestFixture::create_metadata(
44       oid);
45     m_metadata_list.push_back(metadata);
46     metadata->add_listener(&m_listener);
47     return metadata;
48   }
49
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);
55     return trimmer;
56   }
57
58   int assert_exists(const std::string &oid) {
59     librados::ObjectWriteOperation op;
60     op.assert_exists();
61     return m_ioctx.operate(oid, &op);
62   }
63
64   typedef std::list<journal::JournalMetadataPtr> MetadataList;
65   MetadataList m_metadata_list;
66   std::list<journal::JournalTrimmer*> m_trimmers;
67 };
68
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));
73
74   journal::JournalMetadataPtr metadata = create_metadata(oid);
75   ASSERT_EQ(0, init_metadata(metadata));
76   ASSERT_TRUE(wait_for_update(metadata));
77
78   ASSERT_EQ(0, metadata->set_active_set(10));
79   ASSERT_TRUE(wait_for_update(metadata));
80
81   uint64_t commit_tid1;
82   uint64_t commit_tid2;
83   uint64_t commit_tid3;
84   uint64_t commit_tid4;
85   uint64_t commit_tid5;
86   uint64_t commit_tid6;
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));
93
94   journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata);
95
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));
104   }
105
106   ASSERT_EQ(-ENOENT, assert_exists(oid + ".0"));
107   ASSERT_EQ(-ENOENT, assert_exists(oid + ".2"));
108   ASSERT_EQ(0, assert_exists(oid + ".5"));
109 }
110
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"));
116
117   journal::JournalMetadataPtr metadata = create_metadata(oid);
118   ASSERT_EQ(0, init_metadata(metadata));
119   ASSERT_TRUE(wait_for_update(metadata));
120
121   ASSERT_EQ(0, metadata->set_active_set(10));
122   ASSERT_TRUE(wait_for_update(metadata));
123
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));
132
133   journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata);
134
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));
140
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"));
145 }
146
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));
151
152   journal::JournalMetadataPtr metadata = create_metadata(oid);
153   ASSERT_EQ(0, init_metadata(metadata));
154   ASSERT_TRUE(wait_for_update(metadata));
155
156   ASSERT_EQ(0, metadata->set_active_set(10));
157   ASSERT_TRUE(wait_for_update(metadata));
158
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")));
163
164   journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata);
165
166   C_SaferCond cond;
167   trimmer->remove_objects(false, &cond);
168   ASSERT_EQ(0, cond.wait());
169
170   ASSERT_TRUE(wait_for_update(metadata));
171
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"));
176 }
177
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"));
183
184   journal::JournalMetadataPtr metadata = create_metadata(oid);
185   ASSERT_EQ(0, init_metadata(metadata));
186   ASSERT_TRUE(wait_for_update(metadata));
187
188   journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata);
189
190   C_SaferCond ctx1;
191   trimmer->remove_objects(false, &ctx1);
192   ASSERT_EQ(-EBUSY, ctx1.wait());
193
194   C_SaferCond ctx2;
195   trimmer->remove_objects(true, &ctx2);
196   ASSERT_EQ(0, ctx2.wait());
197 }
198