]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/test_pageset.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 #include "gtest/gtest.h"
5 #include "os/memstore/PageSet.h"
8 bool is_aligned(T
* ptr
) {
9 const auto align_mask
= alignof(T
) - 1;
10 return (reinterpret_cast<uintptr_t>(ptr
) & align_mask
) == 0;
13 TEST(PageSet
, AllocAligned
)
16 PageSet::page_vector range
;
18 pages
.alloc_range(0, 4, range
);
19 ASSERT_EQ(4u, range
.size());
20 ASSERT_EQ(0u, range
[0]->offset
);
21 ASSERT_EQ(1u, range
[1]->offset
);
22 ASSERT_EQ(2u, range
[2]->offset
);
23 ASSERT_EQ(3u, range
[3]->offset
);
25 // verify that the Page pointers are properly aligned
26 ASSERT_TRUE(is_aligned(range
[0].get()));
27 ASSERT_TRUE(is_aligned(range
[1].get()));
28 ASSERT_TRUE(is_aligned(range
[2].get()));
29 ASSERT_TRUE(is_aligned(range
[3].get()));
32 TEST(PageSet
, AllocUnaligned
)
35 PageSet::page_vector range
;
37 // front of first page
38 pages
.alloc_range(0, 1, range
);
39 ASSERT_EQ(1u, range
.size());
40 ASSERT_EQ(0u, range
[0]->offset
);
44 pages
.alloc_range(1, 1, range
);
45 ASSERT_EQ(1u, range
.size());
46 ASSERT_EQ(0u, range
[0]->offset
);
49 // back of first page and front of second
50 pages
.alloc_range(1, 2, range
);
51 ASSERT_EQ(2u, range
.size());
52 ASSERT_EQ(0u, range
[0]->offset
);
53 ASSERT_EQ(2u, range
[1]->offset
);
56 // back of first page and all of second
57 pages
.alloc_range(1, 3, range
);
58 ASSERT_EQ(2u, range
.size());
59 ASSERT_EQ(0u, range
[0]->offset
);
60 ASSERT_EQ(2u, range
[1]->offset
);
63 // back of first page, all of second, and front of third
64 pages
.alloc_range(1, 4, range
);
65 ASSERT_EQ(3u, range
.size());
66 ASSERT_EQ(0u, range
[0]->offset
);
67 ASSERT_EQ(2u, range
[1]->offset
);
68 ASSERT_EQ(4u, range
[2]->offset
);
71 TEST(PageSet
, GetAligned
)
75 PageSet::page_vector range
;
76 pages
.alloc_range(0, 4, range
);
80 pages
.get_range(0, 1, range
);
81 ASSERT_EQ(1u, range
.size());
82 ASSERT_EQ(0u, range
[0]->offset
);
85 // get second and third pages
86 pages
.get_range(1, 2, range
);
87 ASSERT_EQ(2u, range
.size());
88 ASSERT_EQ(1u, range
[0]->offset
);
89 ASSERT_EQ(2u, range
[1]->offset
);
93 pages
.get_range(0, 4, range
);
94 ASSERT_EQ(4u, range
.size());
95 ASSERT_EQ(0u, range
[0]->offset
);
96 ASSERT_EQ(1u, range
[1]->offset
);
97 ASSERT_EQ(2u, range
[2]->offset
);
98 ASSERT_EQ(3u, range
[3]->offset
);
102 TEST(PageSet
, GetUnaligned
)
106 PageSet::page_vector range
;
107 pages
.alloc_range(0, 6, range
);
110 // front of first page
111 pages
.get_range(0, 1, range
);
112 ASSERT_EQ(1u, range
.size());
113 ASSERT_EQ(0u, range
[0]->offset
);
116 // back of first page
117 pages
.get_range(1, 1, range
);
118 ASSERT_EQ(1u, range
.size());
119 ASSERT_EQ(0u, range
[0]->offset
);
122 // back of first page and front of second
123 pages
.get_range(1, 2, range
);
124 ASSERT_EQ(2u, range
.size());
125 ASSERT_EQ(0u, range
[0]->offset
);
126 ASSERT_EQ(2u, range
[1]->offset
);
129 // back of first page and all of second
130 pages
.get_range(1, 3, range
);
131 ASSERT_EQ(2u, range
.size());
132 ASSERT_EQ(0u, range
[0]->offset
);
133 ASSERT_EQ(2u, range
[1]->offset
);
136 // back of first page, all of second, and front of third
137 pages
.get_range(1, 4, range
);
138 ASSERT_EQ(3u, range
.size());
139 ASSERT_EQ(0u, range
[0]->offset
);
140 ASSERT_EQ(2u, range
[1]->offset
);
141 ASSERT_EQ(4u, range
[2]->offset
);
144 // back of third page with nothing beyond
145 pages
.get_range(5, 999, range
);
146 ASSERT_EQ(1u, range
.size());
147 ASSERT_EQ(4u, range
[0]->offset
);
151 TEST(PageSet
, GetHoles
)
153 // allocate pages at offsets 1, 2, 5, and 7
155 PageSet::page_vector range
;
156 for (uint64_t i
: {1, 2, 5, 7})
157 pages
.alloc_range(i
, 1, range
);
160 // nothing at offset 0, page at offset 1
161 pages
.get_range(0, 2, range
);
162 ASSERT_EQ(1u, range
.size());
163 ASSERT_EQ(1u, range
[0]->offset
);
166 // nothing at offset 0, pages at offset 1 and 2, nothing at offset 3
167 pages
.get_range(0, 4, range
);
168 ASSERT_EQ(2u, range
.size());
169 ASSERT_EQ(1u, range
[0]->offset
);
170 ASSERT_EQ(2u, range
[1]->offset
);
173 // page at offset 2, nothing at offset 3 or 4
174 pages
.get_range(2, 3, range
);
175 ASSERT_EQ(1u, range
.size());
176 ASSERT_EQ(2u, range
[0]->offset
);
179 // get the full range
180 pages
.get_range(0, 999, range
);
181 ASSERT_EQ(4u, range
.size());
182 ASSERT_EQ(1u, range
[0]->offset
);
183 ASSERT_EQ(2u, range
[1]->offset
);
184 ASSERT_EQ(5u, range
[2]->offset
);
185 ASSERT_EQ(7u, range
[3]->offset
);
189 TEST(PageSet
, FreeAligned
)
193 PageSet::page_vector range
;
194 pages
.alloc_range(0, 4, range
);
197 // get the full range
198 pages
.get_range(0, 4, range
);
199 ASSERT_EQ(4u, range
.size());
202 // free after offset 4 has no effect
203 pages
.free_pages_after(4);
204 pages
.get_range(0, 4, range
);
205 ASSERT_EQ(4u, range
.size());
209 pages
.free_pages_after(3);
210 pages
.get_range(0, 4, range
);
211 ASSERT_EQ(3u, range
.size());
214 // free pages 2 and 3
215 pages
.free_pages_after(1);
216 pages
.get_range(0, 4, range
);
217 ASSERT_EQ(1u, range
.size());
221 TEST(PageSet
, FreeUnaligned
)
225 PageSet::page_vector range
;
226 pages
.alloc_range(0, 8, range
);
229 // get the full range
230 pages
.get_range(0, 8, range
);
231 ASSERT_EQ(4u, range
.size());
234 // free after offset 7 has no effect
235 pages
.free_pages_after(7);
236 pages
.get_range(0, 8, range
);
237 ASSERT_EQ(4u, range
.size());
241 pages
.free_pages_after(5);
242 pages
.get_range(0, 8, range
);
243 ASSERT_EQ(3u, range
.size());
246 // free pages 2 and 3
247 pages
.free_pages_after(1);
248 pages
.get_range(0, 8, range
);
249 ASSERT_EQ(1u, range
.size());
253 TEST(PageSet
, FreeHoles
)
255 // allocate pages at offsets 1, 2, 5, and 7
257 PageSet::page_vector range
;
258 for (uint64_t i
: {1, 2, 5, 7})
259 pages
.alloc_range(i
, 1, range
);
262 // get the full range
263 pages
.get_range(0, 8, range
);
264 ASSERT_EQ(4u, range
.size());
268 pages
.free_pages_after(6);
269 pages
.get_range(0, 8, range
);
270 ASSERT_EQ(3u, range
.size());
274 pages
.free_pages_after(3);
275 pages
.get_range(0, 8, range
);
276 ASSERT_EQ(2u, range
.size());
279 // free pages 1 and 2
280 pages
.free_pages_after(0);
281 pages
.get_range(0, 8, range
);
282 ASSERT_EQ(0u, range
.size());