]> git.proxmox.com Git - ceph.git/blame - ceph/src/test/librbd/object_map/test_mock_InvalidateRequest.cc
update sources to v12.1.0
[ceph.git] / ceph / src / test / librbd / object_map / test_mock_InvalidateRequest.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
4#include "test/librbd/test_mock_fixture.h"
5#include "test/librbd/test_support.h"
6#include "test/librados_test_stub/MockTestMemIoCtxImpl.h"
7#include "librbd/internal.h"
8#include "librbd/object_map/InvalidateRequest.h"
9#include "gmock/gmock.h"
10#include "gtest/gtest.h"
11
12namespace librbd {
13namespace object_map {
14
15using ::testing::_;
16using ::testing::DoDefault;
17using ::testing::Return;
18using ::testing::StrEq;
19
20class TestMockObjectMapInvalidateRequest : public TestMockFixture {
21public:
22};
23
24TEST_F(TestMockObjectMapInvalidateRequest, UpdatesInMemoryFlag) {
25 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP);
26
27 librbd::ImageCtx *ictx;
28 ASSERT_EQ(0, open_image(m_image_name, &ictx));
31f18b77
FG
29 bool flags_set;
30 ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set));
31 ASSERT_FALSE(flags_set);
7c673cae
FG
32
33 C_SaferCond cond_ctx;
34 AsyncRequest<> *request = new InvalidateRequest<>(*ictx, CEPH_NOSNAP, false, &cond_ctx);
35
36 EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
37 exec(ictx->header_oid, _, StrEq("rbd"), StrEq("set_flags"), _, _, _))
38 .Times(0);
39
40 {
41 RWLock::RLocker owner_locker(ictx->owner_lock);
42 RWLock::WLocker snap_locker(ictx->snap_lock);
43 request->send();
44 }
45 ASSERT_EQ(0, cond_ctx.wait());
46
31f18b77
FG
47 ASSERT_EQ(0, ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID, &flags_set));
48 ASSERT_TRUE(flags_set);
7c673cae
FG
49}
50
51TEST_F(TestMockObjectMapInvalidateRequest, UpdatesHeadOnDiskFlag) {
52 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP);
53
54 librbd::ImageCtx *ictx;
55 ASSERT_EQ(0, open_image(m_image_name, &ictx));
56 ASSERT_EQ(0, acquire_exclusive_lock(*ictx));
57
58 C_SaferCond cond_ctx;
59 AsyncRequest<> *request = new InvalidateRequest<>(*ictx, CEPH_NOSNAP, false, &cond_ctx);
60
61 EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
62 exec(ictx->header_oid, _, StrEq("rbd"), StrEq("set_flags"), _, _, _))
63 .WillOnce(DoDefault());
64
65 {
66 RWLock::RLocker owner_locker(ictx->owner_lock);
67 RWLock::WLocker snap_locker(ictx->snap_lock);
68 request->send();
69 }
70 ASSERT_EQ(0, cond_ctx.wait());
71
72 expect_unlock_exclusive_lock(*ictx);
73}
74
75TEST_F(TestMockObjectMapInvalidateRequest, UpdatesSnapOnDiskFlag) {
76 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP);
77
78 librbd::ImageCtx *ictx;
79 ASSERT_EQ(0, open_image(m_image_name, &ictx));
80
81 ASSERT_EQ(0, snap_create(*ictx, "snap1"));
82 ASSERT_EQ(0, librbd::snap_set(ictx,
83 cls::rbd::UserSnapshotNamespace(),
84 "snap1"));
85
86 C_SaferCond cond_ctx;
87 AsyncRequest<> *request = new InvalidateRequest<>(*ictx, ictx->snap_id, false,
88 &cond_ctx);
89
90 EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
91 exec(ictx->header_oid, _, StrEq("rbd"), StrEq("set_flags"), _, _, _))
92 .WillOnce(DoDefault());
93
94 {
95 RWLock::RLocker owner_locker(ictx->owner_lock);
96 RWLock::WLocker snap_locker(ictx->snap_lock);
97 request->send();
98 }
99 ASSERT_EQ(0, cond_ctx.wait());
100}
101
102TEST_F(TestMockObjectMapInvalidateRequest, SkipOnDiskUpdateWithoutLock) {
103 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP);
104
105 librbd::ImageCtx *ictx;
106 ASSERT_EQ(0, open_image(m_image_name, &ictx));
107
108 C_SaferCond cond_ctx;
109 AsyncRequest<> *request = new InvalidateRequest<>(*ictx, CEPH_NOSNAP, false, &cond_ctx);
110
111 EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
112 exec(ictx->header_oid, _, StrEq("rbd"), StrEq("set_flags"), _, _, _))
113 .Times(0);
114
115 {
116 RWLock::RLocker owner_locker(ictx->owner_lock);
117 RWLock::WLocker snap_locker(ictx->snap_lock);
118 request->send();
119 }
120 ASSERT_EQ(0, cond_ctx.wait());
121
122 expect_unlock_exclusive_lock(*ictx);
123}
124
125TEST_F(TestMockObjectMapInvalidateRequest, IgnoresOnDiskUpdateFailure) {
126 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP);
127
128 librbd::ImageCtx *ictx;
129 ASSERT_EQ(0, open_image(m_image_name, &ictx));
130 ASSERT_EQ(0, acquire_exclusive_lock(*ictx));
131
132 C_SaferCond cond_ctx;
133 AsyncRequest<> *request = new InvalidateRequest<>(*ictx, CEPH_NOSNAP, false, &cond_ctx);
134
135 EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
136 exec(ictx->header_oid, _, StrEq("rbd"), StrEq("set_flags"), _, _, _))
137 .WillOnce(Return(-EINVAL));
138
139 {
140 RWLock::RLocker owner_locker(ictx->owner_lock);
141 RWLock::WLocker snap_locker(ictx->snap_lock);
142 request->send();
143 }
144 ASSERT_EQ(0, cond_ctx.wait());
145
146 expect_unlock_exclusive_lock(*ictx);
147}
148
149} // namespace object_map
150} // namespace librbd