]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | #include "test/librbd/test_fixture.h" | |
4 | #include "test/librbd/test_support.h" | |
5 | #include "librbd/ExclusiveLock.h" | |
6 | #include "librbd/ImageCtx.h" | |
7 | #include "librbd/ImageWatcher.h" | |
8 | #include "librbd/internal.h" | |
9 | #include "librbd/ObjectMap.h" | |
10 | #include "cls/rbd/cls_rbd_client.h" | |
11 | #include <list> | |
12 | ||
13 | void register_test_object_map() { | |
14 | } | |
15 | ||
16 | class TestObjectMap : public TestFixture { | |
17 | public: | |
18 | ||
19 | int when_open_object_map(librbd::ImageCtx *ictx) { | |
20 | C_SaferCond ctx; | |
21 | librbd::ObjectMap<> object_map(*ictx, ictx->snap_id); | |
22 | object_map.open(&ctx); | |
23 | return ctx.wait(); | |
24 | } | |
25 | }; | |
26 | ||
27 | TEST_F(TestObjectMap, RefreshInvalidatesWhenCorrupt) { | |
28 | REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP); | |
29 | ||
30 | librbd::ImageCtx *ictx; | |
31 | ASSERT_EQ(0, open_image(m_image_name, &ictx)); | |
31f18b77 FG |
32 | bool flags_set; |
33 | ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set)); | |
34 | ASSERT_FALSE(flags_set); | |
7c673cae FG |
35 | |
36 | C_SaferCond lock_ctx; | |
37 | { | |
38 | RWLock::WLocker owner_locker(ictx->owner_lock); | |
39 | ictx->exclusive_lock->try_acquire_lock(&lock_ctx); | |
40 | } | |
41 | ASSERT_EQ(0, lock_ctx.wait()); | |
42 | ||
43 | std::string oid = librbd::ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP); | |
44 | bufferlist bl; | |
45 | bl.append("corrupt"); | |
46 | ASSERT_EQ(0, ictx->md_ctx.write_full(oid, bl)); | |
47 | ||
48 | ASSERT_EQ(0, when_open_object_map(ictx)); | |
31f18b77 FG |
49 | ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set)); |
50 | ASSERT_TRUE(flags_set); | |
7c673cae FG |
51 | } |
52 | ||
53 | TEST_F(TestObjectMap, RefreshInvalidatesWhenTooSmall) { | |
54 | REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP); | |
55 | ||
56 | librbd::ImageCtx *ictx; | |
57 | ASSERT_EQ(0, open_image(m_image_name, &ictx)); | |
31f18b77 FG |
58 | bool flags_set; |
59 | ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set)); | |
60 | ASSERT_FALSE(flags_set); | |
7c673cae FG |
61 | |
62 | C_SaferCond lock_ctx; | |
63 | { | |
64 | RWLock::WLocker owner_locker(ictx->owner_lock); | |
65 | ictx->exclusive_lock->try_acquire_lock(&lock_ctx); | |
66 | } | |
67 | ASSERT_EQ(0, lock_ctx.wait()); | |
68 | ||
69 | librados::ObjectWriteOperation op; | |
70 | librbd::cls_client::object_map_resize(&op, 0, OBJECT_NONEXISTENT); | |
71 | ||
72 | std::string oid = librbd::ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP); | |
73 | ASSERT_EQ(0, ictx->md_ctx.operate(oid, &op)); | |
74 | ||
75 | ASSERT_EQ(0, when_open_object_map(ictx)); | |
31f18b77 FG |
76 | ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set)); |
77 | ASSERT_TRUE(flags_set); | |
7c673cae FG |
78 | } |
79 | ||
80 | TEST_F(TestObjectMap, InvalidateFlagOnDisk) { | |
81 | REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP); | |
82 | ||
83 | librbd::ImageCtx *ictx; | |
84 | ASSERT_EQ(0, open_image(m_image_name, &ictx)); | |
31f18b77 FG |
85 | bool flags_set; |
86 | ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set)); | |
87 | ASSERT_FALSE(flags_set); | |
7c673cae FG |
88 | |
89 | C_SaferCond lock_ctx; | |
90 | { | |
91 | RWLock::WLocker owner_locker(ictx->owner_lock); | |
92 | ictx->exclusive_lock->try_acquire_lock(&lock_ctx); | |
93 | } | |
94 | ASSERT_EQ(0, lock_ctx.wait()); | |
95 | ||
96 | std::string oid = librbd::ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP); | |
97 | bufferlist bl; | |
98 | bl.append("corrupt"); | |
99 | ASSERT_EQ(0, ictx->md_ctx.write_full(oid, bl)); | |
100 | ||
101 | ASSERT_EQ(0, when_open_object_map(ictx)); | |
31f18b77 FG |
102 | ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set)); |
103 | ASSERT_TRUE(flags_set); | |
7c673cae FG |
104 | |
105 | ASSERT_EQ(0, open_image(m_image_name, &ictx)); | |
31f18b77 FG |
106 | ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set)); |
107 | ASSERT_TRUE(flags_set); | |
7c673cae FG |
108 | } |
109 | ||
110 | TEST_F(TestObjectMap, InvalidateFlagInMemoryOnly) { | |
111 | REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP); | |
112 | ||
113 | librbd::ImageCtx *ictx; | |
114 | ASSERT_EQ(0, open_image(m_image_name, &ictx)); | |
31f18b77 FG |
115 | bool flags_set; |
116 | ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set)); | |
117 | ASSERT_FALSE(flags_set); | |
7c673cae FG |
118 | |
119 | std::string oid = librbd::ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP); | |
120 | bufferlist valid_bl; | |
121 | ASSERT_LT(0, ictx->md_ctx.read(oid, valid_bl, 0, 0)); | |
122 | ||
123 | bufferlist corrupt_bl; | |
124 | corrupt_bl.append("corrupt"); | |
125 | ASSERT_EQ(0, ictx->md_ctx.write_full(oid, corrupt_bl)); | |
126 | ||
127 | ASSERT_EQ(0, when_open_object_map(ictx)); | |
31f18b77 FG |
128 | ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set)); |
129 | ASSERT_TRUE(flags_set); | |
7c673cae FG |
130 | |
131 | ASSERT_EQ(0, ictx->md_ctx.write_full(oid, valid_bl)); | |
132 | ASSERT_EQ(0, open_image(m_image_name, &ictx)); | |
31f18b77 FG |
133 | ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set)); |
134 | ASSERT_FALSE(flags_set); | |
7c673cae FG |
135 | } |
136 |