]> git.proxmox.com Git - ceph.git/blame - ceph/src/test/librbd/test_ObjectMap.cc
update sources to v12.1.0
[ceph.git] / ceph / src / test / librbd / test_ObjectMap.cc
CommitLineData
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
13void register_test_object_map() {
14}
15
16class TestObjectMap : public TestFixture {
17public:
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
27TEST_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
53TEST_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
80TEST_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
110TEST_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