]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/librbd/test_ObjectMap.cc
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / test / librbd / test_ObjectMap.cc
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));
32 ASSERT_FALSE(ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID));
33
34 C_SaferCond lock_ctx;
35 {
36 RWLock::WLocker owner_locker(ictx->owner_lock);
37 ictx->exclusive_lock->try_acquire_lock(&lock_ctx);
38 }
39 ASSERT_EQ(0, lock_ctx.wait());
40
41 std::string oid = librbd::ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP);
42 bufferlist bl;
43 bl.append("corrupt");
44 ASSERT_EQ(0, ictx->md_ctx.write_full(oid, bl));
45
46 ASSERT_EQ(0, when_open_object_map(ictx));
47 ASSERT_TRUE(ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID));
48 }
49
50 TEST_F(TestObjectMap, RefreshInvalidatesWhenTooSmall) {
51 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP);
52
53 librbd::ImageCtx *ictx;
54 ASSERT_EQ(0, open_image(m_image_name, &ictx));
55 ASSERT_FALSE(ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID));
56
57 C_SaferCond lock_ctx;
58 {
59 RWLock::WLocker owner_locker(ictx->owner_lock);
60 ictx->exclusive_lock->try_acquire_lock(&lock_ctx);
61 }
62 ASSERT_EQ(0, lock_ctx.wait());
63
64 librados::ObjectWriteOperation op;
65 librbd::cls_client::object_map_resize(&op, 0, OBJECT_NONEXISTENT);
66
67 std::string oid = librbd::ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP);
68 ASSERT_EQ(0, ictx->md_ctx.operate(oid, &op));
69
70 ASSERT_EQ(0, when_open_object_map(ictx));
71 ASSERT_TRUE(ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID));
72 }
73
74 TEST_F(TestObjectMap, InvalidateFlagOnDisk) {
75 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP);
76
77 librbd::ImageCtx *ictx;
78 ASSERT_EQ(0, open_image(m_image_name, &ictx));
79 ASSERT_FALSE(ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID));
80
81 C_SaferCond lock_ctx;
82 {
83 RWLock::WLocker owner_locker(ictx->owner_lock);
84 ictx->exclusive_lock->try_acquire_lock(&lock_ctx);
85 }
86 ASSERT_EQ(0, lock_ctx.wait());
87
88 std::string oid = librbd::ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP);
89 bufferlist bl;
90 bl.append("corrupt");
91 ASSERT_EQ(0, ictx->md_ctx.write_full(oid, bl));
92
93 ASSERT_EQ(0, when_open_object_map(ictx));
94 ASSERT_TRUE(ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID));
95
96 ASSERT_EQ(0, open_image(m_image_name, &ictx));
97 ASSERT_TRUE(ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID));
98 }
99
100 TEST_F(TestObjectMap, InvalidateFlagInMemoryOnly) {
101 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP);
102
103 librbd::ImageCtx *ictx;
104 ASSERT_EQ(0, open_image(m_image_name, &ictx));
105 ASSERT_FALSE(ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID));
106
107 std::string oid = librbd::ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP);
108 bufferlist valid_bl;
109 ASSERT_LT(0, ictx->md_ctx.read(oid, valid_bl, 0, 0));
110
111 bufferlist corrupt_bl;
112 corrupt_bl.append("corrupt");
113 ASSERT_EQ(0, ictx->md_ctx.write_full(oid, corrupt_bl));
114
115 ASSERT_EQ(0, when_open_object_map(ictx));
116 ASSERT_TRUE(ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID));
117
118 ASSERT_EQ(0, ictx->md_ctx.write_full(oid, valid_bl));
119 ASSERT_EQ(0, open_image(m_image_name, &ictx));
120 ASSERT_FALSE(ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID));
121 }
122