/Users/deen/code/yugabyte-db/ent/src/yb/tserver/backup_service-test.cc
Line | Count | Source |
1 | | // Copyright (c) YugaByte, Inc. |
2 | | // |
3 | | // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except |
4 | | // in compliance with the License. You may obtain a copy of the License at |
5 | | // |
6 | | // http://www.apache.org/licenses/LICENSE-2.0 |
7 | | // |
8 | | // Unless required by applicable law or agreed to in writing, software distributed under the License |
9 | | // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
10 | | // or implied. See the License for the specific language governing permissions and limitations |
11 | | // under the License. |
12 | | |
13 | | #include "yb/common/wire_protocol.h" |
14 | | #include "yb/common/wire_protocol-test-util.h" |
15 | | |
16 | | #include "yb/rpc/messenger.h" |
17 | | #include "yb/rpc/rpc_controller.h" |
18 | | |
19 | | #include "yb/tablet/tablet.h" |
20 | | #include "yb/tablet/tablet_metadata.h" |
21 | | #include "yb/tablet/tablet_peer.h" |
22 | | #include "yb/tablet/tablet_snapshots.h" |
23 | | |
24 | | #include "yb/tserver/backup.proxy.h" |
25 | | #include "yb/tserver/mini_tablet_server.h" |
26 | | #include "yb/tserver/tablet_server.h" |
27 | | #include "yb/tserver/tablet_server-test-base.h" |
28 | | #include "yb/tserver/ts_tablet_manager.h" |
29 | | #include "yb/tserver/tserver.pb.h" |
30 | | #include "yb/tserver/tserver_service.proxy.h" |
31 | | |
32 | | namespace yb { |
33 | | namespace tserver { |
34 | | |
35 | | using std::string; |
36 | | |
37 | | using yb::rpc::RpcController; |
38 | | using yb::tablet::TabletPeer; |
39 | | using yb::tablet::Tablet; |
40 | | |
41 | | class BackupServiceTest : public TabletServerTestBase { |
42 | | public: |
43 | 2 | BackupServiceTest() : TabletServerTestBase(TableType::YQL_TABLE_TYPE) {} |
44 | | |
45 | | protected: |
46 | 2 | void SetUp() override { |
47 | 2 | TabletServerTestBase::SetUp(); |
48 | 2 | StartTabletServer(); |
49 | | |
50 | 2 | backup_proxy_.reset( |
51 | 2 | new TabletServerBackupServiceProxy( |
52 | 2 | proxy_cache_.get(), HostPort::FromBoundEndpoint(mini_server_->bound_rpc_addr()))); |
53 | 2 | } |
54 | | |
55 | | std::unique_ptr<TabletServerBackupServiceProxy> backup_proxy_; |
56 | | }; |
57 | | |
58 | 1 | TEST_F(BackupServiceTest, TestCreateTabletSnapshot) { |
59 | | // Verify that the tablet exists. |
60 | 1 | std::shared_ptr<TabletPeer> tablet; |
61 | 1 | ASSERT_TRUE(mini_server_->server()->tablet_manager()->LookupTablet(kTabletId, &tablet)); |
62 | 1 | FsManager* const fs = tablet->tablet_metadata()->fs_manager(); |
63 | | |
64 | 1 | const string snapshot_id = "00000000000000000000000000000000"; |
65 | 1 | const string rocksdb_dir = tablet->tablet_metadata()->rocksdb_dir(); |
66 | 1 | const string top_snapshots_dir = tablet->tablet_metadata()->snapshots_dir(); |
67 | 1 | const string snapshot_dir = JoinPathSegments(top_snapshots_dir, snapshot_id); |
68 | | |
69 | 1 | TabletSnapshotOpRequestPB req; |
70 | 1 | TabletSnapshotOpResponsePB resp; |
71 | | |
72 | 1 | req.set_operation(TabletSnapshotOpRequestPB::CREATE_ON_TABLET); |
73 | 1 | req.set_dest_uuid(mini_server_->server()->fs_manager()->uuid()); |
74 | 1 | req.set_snapshot_id(snapshot_id); |
75 | | |
76 | | // Test empty tablet list - expected error. |
77 | | // Send the call. |
78 | 1 | { |
79 | 1 | RpcController rpc; |
80 | 1 | SCOPED_TRACE(req.DebugString()); |
81 | 1 | ASSERT_OK(backup_proxy_->TabletSnapshotOp(req, &resp, &rpc)); |
82 | 1 | ASSERT_NOK(StatusFromPB(resp.error().status())); |
83 | 1 | } |
84 | | |
85 | 1 | req.add_tablet_id(kTabletId); |
86 | | |
87 | 1 | ASSERT_TRUE(fs->Exists(rocksdb_dir)); |
88 | 1 | ASSERT_TRUE(fs->Exists(top_snapshots_dir)); |
89 | | |
90 | | // Send the call. |
91 | 1 | { |
92 | 1 | RpcController rpc; |
93 | 1 | SCOPED_TRACE(req.DebugString()); |
94 | 1 | ASSERT_OK(backup_proxy_->TabletSnapshotOp(req, &resp, &rpc)); |
95 | 1 | SCOPED_TRACE(resp.DebugString()); |
96 | 1 | ASSERT_FALSE(resp.has_error()); |
97 | 1 | } |
98 | | |
99 | 1 | ASSERT_TRUE(fs->Exists(rocksdb_dir)); |
100 | 1 | ASSERT_TRUE(fs->Exists(top_snapshots_dir)); |
101 | 1 | ASSERT_TRUE(fs->Exists(snapshot_dir)); |
102 | | // Check existence of snapshot files: |
103 | 1 | ASSERT_TRUE(fs->Exists(JoinPathSegments(snapshot_dir, "CURRENT"))); |
104 | 1 | ASSERT_TRUE(fs->Exists(JoinPathSegments(snapshot_dir, "MANIFEST-000001"))); |
105 | 1 | } |
106 | | |
107 | 1 | TEST_F(BackupServiceTest, TestSnapshotData) { |
108 | | // Verify that the tablet exists. |
109 | 1 | std::shared_ptr<TabletPeer> tablet; |
110 | 1 | ASSERT_TRUE(mini_server_->server()->tablet_manager()->LookupTablet(kTabletId, &tablet)); |
111 | 1 | tablet.reset(); |
112 | | |
113 | 1 | WriteRequestPB write_req; |
114 | 1 | WriteResponsePB write_resp; |
115 | 1 | write_req.set_tablet_id(kTabletId); |
116 | | |
117 | | // Send an actual row insert. |
118 | 1 | { |
119 | 1 | AddTestRowInsert(1, 11, "key1", &write_req); |
120 | | |
121 | 1 | RpcController rpc; |
122 | 1 | SCOPED_TRACE(write_req.DebugString()); |
123 | 1 | ASSERT_OK(proxy_->Write(write_req, &write_resp, &rpc)); |
124 | 1 | SCOPED_TRACE(write_resp.DebugString()); |
125 | 1 | ASSERT_FALSE(write_resp.has_error()); |
126 | 1 | } |
127 | | |
128 | 1 | VerifyRows(schema_, { KeyValue(1, 11) }); |
129 | | |
130 | 1 | const string snapshot_id = "00000000000000000000000000000000"; |
131 | | |
132 | 1 | TabletSnapshotOpRequestPB req; |
133 | 1 | TabletSnapshotOpResponsePB resp; |
134 | | |
135 | | // Send the create snapshot request. |
136 | 1 | req.set_operation(TabletSnapshotOpRequestPB::CREATE_ON_TABLET); |
137 | 1 | req.set_dest_uuid(mini_server_->server()->fs_manager()->uuid()); |
138 | 1 | req.set_snapshot_id(snapshot_id); |
139 | 1 | req.add_tablet_id(kTabletId); |
140 | 1 | { |
141 | 1 | RpcController rpc; |
142 | 1 | SCOPED_TRACE(req.DebugString()); |
143 | 1 | ASSERT_OK(backup_proxy_->TabletSnapshotOp(req, &resp, &rpc)); |
144 | 1 | SCOPED_TRACE(resp.DebugString()); |
145 | 1 | ASSERT_FALSE(resp.has_error()); |
146 | 1 | } |
147 | | |
148 | 1 | SleepFor(MonoDelta::FromMilliseconds(500)); |
149 | 1 | LOG(INFO) << "CREATED SNAPSHOT. UPDATING THE TABLET DATA.."; |
150 | | |
151 | | // Send the second row. |
152 | 1 | { |
153 | 1 | AddTestRowInsert(2, 22, "key1", &write_req); |
154 | | |
155 | 1 | RpcController rpc; |
156 | 1 | SCOPED_TRACE(write_req.DebugString()); |
157 | 1 | ASSERT_OK(proxy_->Write(write_req, &write_resp, &rpc)); |
158 | 1 | SCOPED_TRACE(write_resp.DebugString()); |
159 | 1 | ASSERT_FALSE(write_resp.has_error()); |
160 | 1 | } |
161 | | |
162 | 1 | VerifyRows(schema_, { KeyValue(1, 11), KeyValue(2, 22) }); |
163 | | |
164 | | // Send the restore snapshot request. |
165 | 1 | req.set_operation(TabletSnapshotOpRequestPB::RESTORE_ON_TABLET); |
166 | 1 | { |
167 | 1 | RpcController rpc; |
168 | 1 | SCOPED_TRACE(req.DebugString()); |
169 | 1 | ASSERT_OK(backup_proxy_->TabletSnapshotOp(req, &resp, &rpc)); |
170 | 1 | SCOPED_TRACE(resp.DebugString()); |
171 | 1 | ASSERT_FALSE(resp.has_error()); |
172 | 1 | } |
173 | | |
174 | 1 | SleepFor(MonoDelta::FromMilliseconds(500)); |
175 | 1 | LOG(INFO) << "RESTORED SNAPSHOT. CHECKING THE TABLET DATA.."; |
176 | | |
177 | | // Expected the first row only from the snapshot. |
178 | | // FIXME: Current implementation of VerifyRows() can fail due to RocksDB reset in |
179 | | // RestoreSnapshot(). VerifyRows() must be fixed. |
180 | | // VerifyRows(schema_, { KeyValue(1, 11) }); |
181 | | |
182 | 1 | LOG(INFO) << "THE TABLET DATA IS VALID. Test TestSnapshotData finished."; |
183 | 1 | } |
184 | | |
185 | | } // namespace tserver |
186 | | } // namespace yb |