|
17 | 17 |
|
18 | 18 | package org.apache.doris.clone; |
19 | 19 |
|
| 20 | +import org.apache.doris.catalog.Database; |
20 | 21 | import org.apache.doris.catalog.DiskInfo; |
21 | 22 | import org.apache.doris.catalog.Env; |
22 | 23 | import org.apache.doris.catalog.LocalTabletInvertedIndex; |
| 24 | +import org.apache.doris.catalog.MaterializedIndex; |
| 25 | +import org.apache.doris.catalog.OlapTable; |
| 26 | +import org.apache.doris.catalog.Partition; |
23 | 27 | import org.apache.doris.catalog.Replica; |
| 28 | +import org.apache.doris.catalog.Tablet; |
24 | 29 | import org.apache.doris.catalog.TabletInvertedIndex; |
25 | 30 | import org.apache.doris.common.Config; |
26 | 31 | import org.apache.doris.common.ExceptionChecker; |
@@ -163,6 +168,98 @@ private static void updateReplicaVersionCount() { |
163 | 168 | Assert.assertTrue(result.get(11).get(1).contains("version count is too high")); |
164 | 169 | } |
165 | 170 |
|
| 171 | + private static String getDiagnosisInfo(List<List<String>> rows, String item) { |
| 172 | + for (List<String> row : rows) { |
| 173 | + if (item.equals(row.get(0))) { |
| 174 | + return row.get(1); |
| 175 | + } |
| 176 | + } |
| 177 | + return ""; |
| 178 | + } |
| 179 | + |
| 180 | + private static Map<String, TDisk> copyBackendDisks(Backend backend) { |
| 181 | + Map<String, TDisk> disks = Maps.newHashMap(); |
| 182 | + for (DiskInfo diskInfo : backend.getDisks().values()) { |
| 183 | + TDisk tDisk = new TDisk(); |
| 184 | + tDisk.setRootPath(diskInfo.getRootPath()); |
| 185 | + tDisk.setDiskTotalCapacity(diskInfo.getTotalCapacityB()); |
| 186 | + tDisk.setDataUsedCapacity(diskInfo.getDataUsedCapacityB()); |
| 187 | + tDisk.setTrashUsedCapacity(diskInfo.getTrashUsedCapacityB()); |
| 188 | + tDisk.setDiskAvailableCapacity(diskInfo.getAvailableCapacityB()); |
| 189 | + tDisk.setUsed(diskInfo.getState() == DiskInfo.DiskState.ONLINE); |
| 190 | + tDisk.setPathHash(diskInfo.getPathHash()); |
| 191 | + tDisk.setStorageMedium(diskInfo.getStorageMedium()); |
| 192 | + disks.put(tDisk.getRootPath(), tDisk); |
| 193 | + } |
| 194 | + return disks; |
| 195 | + } |
| 196 | + |
| 197 | + private static Map<String, TDisk> buildExceedLimitDisks(Backend backend) { |
| 198 | + Map<String, TDisk> disks = Maps.newHashMap(); |
| 199 | + for (DiskInfo diskInfo : backend.getDisks().values()) { |
| 200 | + TDisk tDisk = new TDisk(); |
| 201 | + tDisk.setRootPath(diskInfo.getRootPath()); |
| 202 | + tDisk.setDiskTotalCapacity(1L); |
| 203 | + tDisk.setDataUsedCapacity(1L); |
| 204 | + tDisk.setTrashUsedCapacity(0L); |
| 205 | + tDisk.setDiskAvailableCapacity(0L); |
| 206 | + tDisk.setUsed(true); |
| 207 | + tDisk.setPathHash(diskInfo.getPathHash()); |
| 208 | + tDisk.setStorageMedium(diskInfo.getStorageMedium()); |
| 209 | + disks.put(tDisk.getRootPath(), tDisk); |
| 210 | + } |
| 211 | + return disks; |
| 212 | + } |
| 213 | + |
| 214 | + @Test |
| 215 | + public void testDiagnoseTabletCloudModeSkipDiskAndVersionCheck() throws Exception { |
| 216 | + String tableName = "tbl_diag_cloud_" + Math.abs(random.nextInt()); |
| 217 | + String createStr = "create table test." + tableName + "\n" |
| 218 | + + "(k1 date, k2 int)\n" |
| 219 | + + "distributed by hash(k2) buckets 1\n" |
| 220 | + + "properties\n" |
| 221 | + + "(\n" |
| 222 | + + " \"replication_num\" = \"3\"\n" |
| 223 | + + ")"; |
| 224 | + ExceptionChecker.expectThrowsNoException(() -> createTable(createStr)); |
| 225 | + |
| 226 | + Database db = Env.getCurrentInternalCatalog().getDbNullable("test"); |
| 227 | + Assert.assertNotNull(db); |
| 228 | + OlapTable table = (OlapTable) db.getTableNullable(tableName); |
| 229 | + Assert.assertNotNull(table); |
| 230 | + Partition partition = table.getAllPartitions().iterator().next(); |
| 231 | + MaterializedIndex index = partition.getBaseIndex(); |
| 232 | + Tablet tablet = index.getTablets().get(0); |
| 233 | + Replica replica = tablet.getReplicas().get(0); |
| 234 | + long tabletId = tablet.getId(); |
| 235 | + long visibleVersion = partition.getCachedVisibleVersion(); |
| 236 | + Backend backend = Env.getCurrentSystemInfo().getBackend(replica.getBackendIdWithoutException()); |
| 237 | + Assert.assertNotNull(backend); |
| 238 | + |
| 239 | + Map<String, TDisk> originalDisks = copyBackendDisks(backend); |
| 240 | + String originCloudUniqueId = Config.cloud_unique_id; |
| 241 | + long originalVersion = replica.getVersion(); |
| 242 | + |
| 243 | + try { |
| 244 | + backend.updateDisks(buildExceedLimitDisks(backend)); |
| 245 | + long mismatchVersion = visibleVersion == Long.MAX_VALUE ? visibleVersion - 1 : visibleVersion + 1; |
| 246 | + replica.adminUpdateVersionInfo(mismatchVersion, null, null, System.currentTimeMillis()); |
| 247 | + |
| 248 | + List<List<String>> localResult = Diagnoser.diagnoseTablet(tabletId); |
| 249 | + Assert.assertTrue(getDiagnosisInfo(localResult, "ReplicaBackendStatus").contains("has no space left")); |
| 250 | + Assert.assertTrue(getDiagnosisInfo(localResult, "ReplicaVersionStatus").contains("does not equal")); |
| 251 | + |
| 252 | + Config.cloud_unique_id = "diagnose-tablet-cloud-mode-ut"; |
| 253 | + List<List<String>> cloudResult = Diagnoser.diagnoseTablet(tabletId); |
| 254 | + Assert.assertEquals("OK", getDiagnosisInfo(cloudResult, "ReplicaBackendStatus")); |
| 255 | + Assert.assertEquals("OK", getDiagnosisInfo(cloudResult, "ReplicaVersionStatus")); |
| 256 | + } finally { |
| 257 | + Config.cloud_unique_id = originCloudUniqueId; |
| 258 | + backend.updateDisks(originalDisks); |
| 259 | + replica.adminUpdateVersionInfo(originalVersion, null, null, System.currentTimeMillis()); |
| 260 | + } |
| 261 | + } |
| 262 | + |
166 | 263 | @Test |
167 | 264 | public void test() throws Exception { |
168 | 265 | // test colocate tablet repair |
|
0 commit comments