Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / 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   bool flags_set;
33   ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set));
34   ASSERT_FALSE(flags_set);
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));
49   ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set));
50   ASSERT_TRUE(flags_set);
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));
58   bool flags_set;
59   ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set));
60   ASSERT_FALSE(flags_set);
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));
76   ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set));
77   ASSERT_TRUE(flags_set);
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));
85   bool flags_set;
86   ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set));
87   ASSERT_FALSE(flags_set);
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));
102   ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set));
103   ASSERT_TRUE(flags_set);
104
105   ASSERT_EQ(0, open_image(m_image_name, &ictx));
106   ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set));
107   ASSERT_TRUE(flags_set);
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));
115   bool flags_set;
116   ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set));
117   ASSERT_FALSE(flags_set);
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));
128   ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set));
129   ASSERT_TRUE(flags_set);
130
131   ASSERT_EQ(0, ictx->md_ctx.write_full(oid, valid_bl));
132   ASSERT_EQ(0, open_image(m_image_name, &ictx));
133   ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set));
134   ASSERT_FALSE(flags_set);
135 }
136