This is an automated email from the ASF dual-hosted git repository. xxyu pushed a commit to branch kylin5 in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 116718225ba01ad239ba0924e507503bdeb2e562 Author: lixiang <447399...@qq.com> AuthorDate: Tue Mar 14 10:55:48 2023 +0800 KYLIN-5556 Add a new meothod to load tables with a threshold --- .../kylin/rest/controller/NAdminController.java | 1 + .../kylin/rest/response/LoadTableResponse.java | 3 + .../org/apache/kylin/common/KylinConfigBase.java | 4 + .../common/exception/code/ErrorCodeServer.java | 1 + .../src/main/resources/kylin-defaults0.properties | 3 + .../resources/kylin_error_msg_conf_cn.properties | 1 + .../resources/kylin_error_msg_conf_en.properties | 1 + .../main/resources/kylin_errorcode_conf.properties | 1 + .../apache/kylin/rest/service/TableExtService.java | 109 ++++++++++++++++++++- .../kylin/rest/service/TableExtServiceTest.java | 45 +++++++++ .../kylin/rest/controller/NTableController.java | 22 +---- .../rest/controller/NTableControllerTest.java | 18 ++-- 12 files changed, 178 insertions(+), 31 deletions(-) diff --git a/src/common-server/src/main/java/org/apache/kylin/rest/controller/NAdminController.java b/src/common-server/src/main/java/org/apache/kylin/rest/controller/NAdminController.java index c2f26bd8aa..421fe1b009 100644 --- a/src/common-server/src/main/java/org/apache/kylin/rest/controller/NAdminController.java +++ b/src/common-server/src/main/java/org/apache/kylin/rest/controller/NAdminController.java @@ -78,6 +78,7 @@ public class NAdminController extends NBasicController { propertyKeys.add("kylin.source.ddl.hive.enabled"); propertyKeys.add("kylin.source.ddl.logical-view.database"); propertyKeys.add("kylin.storage.check-quota-enabled"); + propertyKeys.add("kylin.table.load-threshold-enabled"); // add second storage if (StringUtils.isNotEmpty(KylinConfig.getInstanceFromEnv().getSecondStorage())) { diff --git a/src/common-service/src/main/java/org/apache/kylin/rest/response/LoadTableResponse.java b/src/common-service/src/main/java/org/apache/kylin/rest/response/LoadTableResponse.java index fcf5a8b069..a59720f1cf 100644 --- a/src/common-service/src/main/java/org/apache/kylin/rest/response/LoadTableResponse.java +++ b/src/common-service/src/main/java/org/apache/kylin/rest/response/LoadTableResponse.java @@ -22,6 +22,7 @@ import java.io.Serializable; import java.util.HashSet; import java.util.Set; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; @@ -35,5 +36,7 @@ public class LoadTableResponse implements Serializable { private Set<String> loaded = new HashSet<>(); @JsonProperty("failed") private Set<String> failed = new HashSet<>(); + @JsonIgnore + private Set<String> needRealSampling = new HashSet<>(); } diff --git a/src/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java b/src/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java index f887fbd30a..0c5465d87b 100644 --- a/src/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java +++ b/src/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java @@ -3894,4 +3894,8 @@ public abstract class KylinConfigBase implements Serializable { public int getJobHLLMaxReducerNumber() { return Integer.parseInt(getOptional("kylin.index.costbased.hll-max-reducer-number", "1")); } + + public boolean isTableLoadThresholdEnabled() { + return Boolean.parseBoolean(getOptional("kylin.table.load-threshold-enabled", TRUE)); + } } diff --git a/src/core-common/src/main/java/org/apache/kylin/common/exception/code/ErrorCodeServer.java b/src/core-common/src/main/java/org/apache/kylin/common/exception/code/ErrorCodeServer.java index 67cf57afed..5fab5c855c 100644 --- a/src/core-common/src/main/java/org/apache/kylin/common/exception/code/ErrorCodeServer.java +++ b/src/core-common/src/main/java/org/apache/kylin/common/exception/code/ErrorCodeServer.java @@ -63,6 +63,7 @@ public enum ErrorCodeServer implements ErrorCodeProducer { TABLE_RELOAD_MODEL_RETRY("KE-010007204"), TABLE_RELOAD_HAVING_NOT_FINAL_JOB("KE-010007208"), EXCLUDED_TABLE_REQUEST_NOT_ALLOWED("KE-010007301"), + ONCE_LOAD_TABLE_LIMIT("KE-010007011"), // 10032XXX add job result JOB_CREATE_CHECK_MULTI_PARTITION_EMPTY("KE-010032201"), diff --git a/src/core-common/src/main/resources/kylin-defaults0.properties b/src/core-common/src/main/resources/kylin-defaults0.properties index 9aee2acdda..f60a75a2df 100644 --- a/src/core-common/src/main/resources/kylin-defaults0.properties +++ b/src/core-common/src/main/resources/kylin-defaults0.properties @@ -434,6 +434,9 @@ kylin.security.user-password-encoder=org.apache.kylin.rest.security.CachedBCrypt kylin.model.recommendation-page-size=500 kylin.model.dimension-measure-name.max-length=300 +# table +kylin.table.load-threshold-enabled=true + # recommend kylin.model.suggest-model-sql-limit=200 diff --git a/src/core-common/src/main/resources/kylin_error_msg_conf_cn.properties b/src/core-common/src/main/resources/kylin_error_msg_conf_cn.properties index 11f10b5af9..0314410ab1 100644 --- a/src/core-common/src/main/resources/kylin_error_msg_conf_cn.properties +++ b/src/core-common/src/main/resources/kylin_error_msg_conf_cn.properties @@ -64,6 +64,7 @@ KE-010022219=当前 Segments 所包含的分区不一致,请先构建分区并 KE-010007204=源表 %1$s 中列 %2$s 的数据类型发生变更。请从模型 %3$s 中删除该列,或修改该列的数据类型。 KE-010007208=当前暂不可重载表。存在运行中的任务,任务对象为: %s。请等任务完成后再重载,或手动终止任务。 KE-010007301=获取屏蔽列设置失败,项目 %s 没有打开屏蔽列开关。 +KE-010007011=一次最多可加载 1000 张表,请修改后重新提交。 ## 100322XX job KE-010032201=无法添加任务,子分区值为空。请检查后重试。 diff --git a/src/core-common/src/main/resources/kylin_error_msg_conf_en.properties b/src/core-common/src/main/resources/kylin_error_msg_conf_en.properties index 028f593bce..df7ed31b2a 100644 --- a/src/core-common/src/main/resources/kylin_error_msg_conf_en.properties +++ b/src/core-common/src/main/resources/kylin_error_msg_conf_en.properties @@ -63,6 +63,7 @@ KE-010022219=The partitions included in the selected segments are not consistent KE-010007204=The data type of column %2$s from the source table %1$s has changed. Please remove the column from model %3$s, or modify the data type. KE-010007208=The table metadata can't be reloaded now. There are ongoing jobs with the following target subjects(s): %s. Please try reloading until all the jobs are completed, or manually discard the jobs. KE-010007301=Fail to fetch setting of excluded columns, because project %s is not enable excluded columns. +KE-010007011=Up to 1000 tables could be loaded per time, please modify and resubmit. ## 100322XX job KE-010032201=Can't add the job, as the subpartition value is empty. Please check and try again. diff --git a/src/core-common/src/main/resources/kylin_errorcode_conf.properties b/src/core-common/src/main/resources/kylin_errorcode_conf.properties index 091be9bf2b..170a66723f 100644 --- a/src/core-common/src/main/resources/kylin_errorcode_conf.properties +++ b/src/core-common/src/main/resources/kylin_errorcode_conf.properties @@ -62,6 +62,7 @@ KE-010022217 KE-010007204 KE-010007208 KE-010007301 +KE-010007011 ## 100322XX job KE-010032201 diff --git a/src/datasource-service/src/main/java/org/apache/kylin/rest/service/TableExtService.java b/src/datasource-service/src/main/java/org/apache/kylin/rest/service/TableExtService.java index cb13bf5944..8765c10247 100644 --- a/src/datasource-service/src/main/java/org/apache/kylin/rest/service/TableExtService.java +++ b/src/datasource-service/src/main/java/org/apache/kylin/rest/service/TableExtService.java @@ -20,6 +20,7 @@ package org.apache.kylin.rest.service; import static org.apache.kylin.common.exception.ServerErrorCode.INVALID_TABLE_NAME; import static org.apache.kylin.common.exception.code.ErrorCodeServer.EXCLUDED_TABLE_REQUEST_NOT_ALLOWED; +import static org.apache.kylin.common.exception.code.ErrorCodeServer.ONCE_LOAD_TABLE_LIMIT; import java.io.IOException; import java.security.PrivilegedExceptionAction; @@ -34,6 +35,7 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.security.UserGroupInformation; import org.apache.kylin.common.KylinConfig; @@ -41,6 +43,7 @@ import org.apache.kylin.common.exception.KylinException; import org.apache.kylin.common.msg.MsgPicker; import org.apache.kylin.common.util.HadoopUtil; import org.apache.kylin.common.util.Pair; +import org.apache.kylin.common.util.StringHelper; import org.apache.kylin.metadata.model.ColumnDesc; import org.apache.kylin.metadata.model.ISourceAware; import org.apache.kylin.metadata.model.NTableMetadataManager; @@ -54,12 +57,14 @@ import org.apache.kylin.metadata.view.LogicalViewManager; import org.apache.kylin.rest.aspect.Transaction; import org.apache.kylin.rest.request.S3TableExtInfo; import org.apache.kylin.rest.request.TableExclusionRequest; +import org.apache.kylin.rest.request.TableLoadRequest; import org.apache.kylin.rest.request.UpdateAWSTableExtDescRequest; import org.apache.kylin.rest.response.DataResult; import org.apache.kylin.rest.response.ExcludedColumnResponse; import org.apache.kylin.rest.response.ExcludedTableDetailResponse; import org.apache.kylin.rest.response.ExcludedTableResponse; import org.apache.kylin.rest.response.LoadTableResponse; +import org.apache.kylin.rest.response.TableNameResponse; import org.apache.kylin.rest.response.UpdateAWSTableExtDescResponse; import org.apache.kylin.rest.security.KerberosLoginManager; import org.apache.kylin.rest.util.AclEvaluate; @@ -82,6 +87,8 @@ public class TableExtService extends BasicService { public static final int DEFAULT_EXCLUDED_COLUMN_SIZE = 15; + public static final int ONCE_LOAD_TABLE_LIMIT_COUNT = 1000; + @Autowired @Qualifier("tableService") private TableService tableService; @@ -89,13 +96,79 @@ public class TableExtService extends BasicService { @Autowired private AclEvaluate aclEvaluate; - public LoadTableResponse loadDbTables(String[] dbTables, String project, boolean isDb) throws Exception { + public LoadTableResponse loadTablesWithShortCircuit(TableLoadRequest request) throws Exception { + String project = request.getProject(); aclEvaluate.checkProjectWritePermission(project); - Map<String, Set<String>> dbTableMap = classifyDbTables(dbTables, isDb); Set<String> existDbs = Sets.newHashSet(tableService.getSourceDbNames(project)); - LoadTableResponse tableResponse = new LoadTableResponse(); + int count = 0; + int dbSize = ArrayUtils.isNotEmpty(request.getDatabases()) ? request.getDatabases().length : 0; + int tableSize = ArrayUtils.isNotEmpty(request.getTables()) ? request.getTables().length : 0; + KylinConfig kylinConfig = KylinConfig.getInstanceFromEnv(); + boolean thresholdEnabled = kylinConfig.isTableLoadThresholdEnabled(); + checkThreshold(thresholdEnabled, tableSize); + + LoadTableResponse tableResponseFromDB = null; + List<Pair<TableDesc, TableExtDesc>> canLoadTablesFromDB = null; + Map<String, Set<String>> dbs = new HashMap<>(); + if (dbSize > 0) { + tableResponseFromDB = new LoadTableResponse(); + StringHelper.toUpperCaseArray(request.getDatabases(), request.getDatabases()); + dbs = classifyDbTables(request.getDatabases(), true); + Pair<List<Pair<TableDesc, TableExtDesc>>, Integer> pair = findCanLoadTables(dbs, project, + true, tableResponseFromDB, existDbs); + canLoadTablesFromDB = pair.getFirst(); + count = pair.getSecond(); + checkThreshold(thresholdEnabled, count); + } + + LoadTableResponse tableResponse = null; + List<Pair<TableDesc, TableExtDesc>> canLoadTables = null; + if (tableSize > 0) { + StringHelper.toUpperCaseArray(request.getTables(), request.getTables()); + Map<String, Set<String>> tables = classifyDbTables(request.getTables(), false); + excludeTableFromFormalDB(dbs, tables); + tableResponse = new LoadTableResponse(); + Pair<List<Pair<TableDesc, TableExtDesc>>, Integer> pair = findCanLoadTables(tables, project, + false, tableResponse, existDbs); + canLoadTables = pair.getFirst(); + count = pair.getSecond() + count; + checkThreshold(thresholdEnabled, count); + } + + LoadTableResponse loadTableResponse = new LoadTableResponse(); + if (tableResponseFromDB != null && !canLoadTablesFromDB.isEmpty()) { + innerLoadTables(project, tableResponseFromDB, canLoadTablesFromDB); + loadTableResponse.getFailed().addAll(tableResponseFromDB.getFailed()); + loadTableResponse.getLoaded().addAll(tableResponseFromDB.getLoaded()); + loadTableResponse.getNeedRealSampling().addAll(tableResponseFromDB.getNeedRealSampling()); + } + + if (tableResponse != null && !canLoadTables.isEmpty()) { + innerLoadTables(project, tableResponse, canLoadTables); + loadTableResponse.getFailed().addAll(tableResponse.getFailed()); + loadTableResponse.getLoaded().addAll(tableResponse.getLoaded()); + loadTableResponse.getNeedRealSampling().addAll(tableResponse.getNeedRealSampling()); + } + return loadTableResponse; + } + + private void checkThreshold(boolean thresholdEnabled, int count) { + if (thresholdEnabled && count > ONCE_LOAD_TABLE_LIMIT_COUNT) { + throw new KylinException(ONCE_LOAD_TABLE_LIMIT); + } + } + + private void excludeTableFromFormalDB(Map<String, Set<String>> dbs, Map<String, Set<String>> tables) { + if (dbs.size() > 0) { + tables.entrySet().removeIf(entry -> dbs.containsKey(entry.getKey())); + } + } + + public Pair<List<Pair<TableDesc, TableExtDesc>>, Integer> findCanLoadTables(Map<String, Set<String>> dbTables, String project, + boolean isDb, LoadTableResponse tableResponse, Set<String> existDbs) throws Exception { List<Pair<TableDesc, TableExtDesc>> canLoadTables = Lists.newArrayList(); - for (Map.Entry<String, Set<String>> entry : dbTableMap.entrySet()) { + List<TableNameResponse> responseAll = Lists.newArrayList(); + for (Map.Entry<String, Set<String>> entry : dbTables.entrySet()) { String db = entry.getKey(); Set<String> tableSet = entry.getValue(); if (!existDbs.contains(db)) { @@ -117,10 +190,31 @@ public class TableExtService extends BasicService { } String[] tables = existTables.stream().map(table -> db + "." + table).toArray(String[]::new); - if (tables.length > 0){ + if (tables.length > 0) { filterAccessTables(tables, canLoadTables, tableResponse, project); } + + List<TableNameResponse> response = tableService.getHiveTableNameResponses(project, db, ""); + response.forEach(t -> t.setTableName(db + "." + t.getTableName())); + responseAll.addAll(response); } + return new Pair<>(canLoadTables, getTableCount(responseAll, canLoadTables)); + } + + private int getTableCount(List<TableNameResponse> responseAll, + List<Pair<TableDesc, TableExtDesc>> canLoadTables) { + List<String> loaded = responseAll.stream().filter(TableNameResponse::isLoaded) + .map(TableNameResponse::getTableName).collect(Collectors.toList()); + return (int) canLoadTables.stream().filter(t -> !loaded.contains(t.getFirst().getIdentity())).count(); + } + + public LoadTableResponse loadDbTables(String[] dbTables, String project, boolean isDb) throws Exception { + aclEvaluate.checkProjectWritePermission(project); + Set<String> existDbs = Sets.newHashSet(tableService.getSourceDbNames(project)); + LoadTableResponse tableResponse = new LoadTableResponse(); + Map<String, Set<String>> tables = classifyDbTables(dbTables, isDb); + List<Pair<TableDesc, TableExtDesc>> canLoadTables = findCanLoadTables(tables, project, isDb, tableResponse, + existDbs).getFirst(); if (!canLoadTables.isEmpty()) { return innerLoadTables(project, tableResponse, canLoadTables); } @@ -260,7 +354,9 @@ public class TableExtService extends BasicService { loadTables.forEach(pair -> { String tableName = pair.getFirst().getIdentity(); boolean success = true; + boolean realLoaded = false; if (tableManager.getTableDesc(tableName) == null) { + realLoaded = true; try { loadTable(pair.getFirst(), pair.getSecond(), project); } catch (Exception ex) { @@ -270,6 +366,9 @@ public class TableExtService extends BasicService { } Set<String> targetSet = success ? tableResponse.getLoaded() : tableResponse.getFailed(); targetSet.add(tableName); + if (success && realLoaded) { + tableResponse.getNeedRealSampling().add(tableName); + } }); return tableResponse; }, project, 1); diff --git a/src/datasource-service/src/test/java/org/apache/kylin/rest/service/TableExtServiceTest.java b/src/datasource-service/src/test/java/org/apache/kylin/rest/service/TableExtServiceTest.java index 5d7dfa889e..8b0440b854 100644 --- a/src/datasource-service/src/test/java/org/apache/kylin/rest/service/TableExtServiceTest.java +++ b/src/datasource-service/src/test/java/org/apache/kylin/rest/service/TableExtServiceTest.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.IntStream; import org.apache.kylin.common.KylinConfig; import org.apache.kylin.common.exception.KylinException; @@ -36,6 +37,7 @@ import org.apache.kylin.metadata.model.TableExtDesc; import org.apache.kylin.rest.constant.Constant; import org.apache.kylin.rest.request.S3TableExtInfo; import org.apache.kylin.rest.request.TableExclusionRequest; +import org.apache.kylin.rest.request.TableLoadRequest; import org.apache.kylin.rest.request.UpdateAWSTableExtDescRequest; import org.apache.kylin.rest.response.ExcludedColumnResponse; import org.apache.kylin.rest.response.ExcludedTableDetailResponse; @@ -539,6 +541,49 @@ public class TableExtServiceTest extends NLocalFileMetadataTestCase { } } + @Test + public void testLoadTablesWithShortCircuit() throws Exception { + List<Pair<TableDesc, TableExtDesc>> lt1000 = mockTablePair(8, "TB"); + Mockito.doReturn(lt1000).when(tableService).extractTableMeta(Mockito.any(), Mockito.any()); + TableLoadRequest request = new TableLoadRequest(); + request.setDatabases(new String[]{"DEFAULT"}); + request.setProject("default"); + LoadTableResponse lt1000response = tableExtService.loadTablesWithShortCircuit(request); + Assert.assertEquals(8, lt1000response.getFailed().size()); + + List<Pair<TableDesc, TableExtDesc>> gt1000 = mockTablePair(1001, "TB"); + Mockito.doReturn(gt1000).when(tableService).extractTableMeta(Mockito.any(), Mockito.any()); + Assert.assertThrows(KylinException.class, () -> tableExtService.loadTablesWithShortCircuit(request)); + + request.setTables(mockInputDBOrTable()); + Assert.assertThrows(KylinException.class, () -> tableExtService.loadTablesWithShortCircuit(request)); + + request.setTables(new String[]{"TEST_KYLIN_FACT"}); + Assert.assertThrows(KylinException.class, () -> tableExtService.loadTablesWithShortCircuit(request)); + + request.setDatabases(null); + gt1000.forEach(t -> Mockito.doNothing().when(tableExtService).loadTable(t.getFirst(), t.getSecond(), + "default")); + Mockito.doReturn(gt1000).when(tableService).extractTableMeta(Mockito.any(), Mockito.any()); + Assert.assertThrows(KylinException.class, () -> tableExtService.loadTablesWithShortCircuit(request)); + + request.setDatabases(null); + request.setTables(new String[]{"TEST_KYLIN_FACT"}); + List<Pair<TableDesc, TableExtDesc>> table8 = mockTablePair(8, "TB"); + Mockito.doReturn(table8).when(tableService).extractTableMeta(Mockito.any(), Mockito.any()); + LoadTableResponse response1 = tableExtService.loadTablesWithShortCircuit(request); + Assert.assertEquals(8, response1.getFailed().size()); + + request.setDatabases(new String[]{"DEFAULT"}); + request.setTables(new String[]{"TEST_KYLIN_FACT"}); + LoadTableResponse response2 = tableExtService.loadTablesWithShortCircuit(request); + Assert.assertEquals(8, response2.getFailed().size()); + } + + private String[] mockInputDBOrTable() { + return IntStream.range(0, 1000).mapToObj(t -> "TB" + t).toArray(String[]::new); + } + private List<Pair<TableDesc, TableExtDesc>> mockTablePair(int size, String tableName) { List<Pair<TableDesc, TableExtDesc>> result = new ArrayList<>(); for (int i = 0; i < size; i++) { diff --git a/src/metadata-server/src/main/java/org/apache/kylin/rest/controller/NTableController.java b/src/metadata-server/src/main/java/org/apache/kylin/rest/controller/NTableController.java index b685328a42..ff35be5737 100644 --- a/src/metadata-server/src/main/java/org/apache/kylin/rest/controller/NTableController.java +++ b/src/metadata-server/src/main/java/org/apache/kylin/rest/controller/NTableController.java @@ -42,7 +42,6 @@ import org.apache.kylin.common.KylinConfig; import org.apache.kylin.common.exception.KylinException; import org.apache.kylin.common.msg.MsgPicker; import org.apache.kylin.common.util.Pair; -import org.apache.kylin.common.util.StringHelper; import org.apache.kylin.metadata.model.TableDesc; import org.apache.kylin.metadata.project.NProjectManager; import org.apache.kylin.rest.request.AWSTableLoadRequest; @@ -230,26 +229,11 @@ public class NTableController extends NBasicController { throw new KylinException(EMPTY_PARAMETER, "You should select at least one table or database to load!!"); } - LoadTableResponse loadTableResponse = new LoadTableResponse(); - if (ArrayUtils.isNotEmpty(tableLoadRequest.getTables())) { - StringHelper.toUpperCaseArray(tableLoadRequest.getTables(), tableLoadRequest.getTables()); - LoadTableResponse loadByTable = tableExtService.loadDbTables(tableLoadRequest.getTables(), - tableLoadRequest.getProject(), false); - loadTableResponse.getFailed().addAll(loadByTable.getFailed()); - loadTableResponse.getLoaded().addAll(loadByTable.getLoaded()); - } - - if (ArrayUtils.isNotEmpty(tableLoadRequest.getDatabases())) { - StringHelper.toUpperCaseArray(tableLoadRequest.getDatabases(), tableLoadRequest.getDatabases()); - LoadTableResponse loadByDb = tableExtService.loadDbTables(tableLoadRequest.getDatabases(), - tableLoadRequest.getProject(), true); - loadTableResponse.getFailed().addAll(loadByDb.getFailed()); - loadTableResponse.getLoaded().addAll(loadByDb.getLoaded()); - } + LoadTableResponse loadTableResponse = tableExtService.loadTablesWithShortCircuit(tableLoadRequest); - if (!loadTableResponse.getLoaded().isEmpty() && Boolean.TRUE.equals(tableLoadRequest.getNeedSampling())) { + if (!loadTableResponse.getNeedRealSampling().isEmpty() && Boolean.TRUE.equals(tableLoadRequest.getNeedSampling())) { TableSamplingService.checkSamplingRows(tableLoadRequest.getSamplingRows()); - tableSamplingService.sampling(loadTableResponse.getLoaded(), tableLoadRequest.getProject(), + tableSamplingService.sampling(loadTableResponse.getNeedRealSampling(), tableLoadRequest.getProject(), tableLoadRequest.getSamplingRows(), tableLoadRequest.getPriority(), tableLoadRequest.getYarnQueue(), tableLoadRequest.getTag()); } diff --git a/src/metadata-server/src/test/java/org/apache/kylin/rest/controller/NTableControllerTest.java b/src/metadata-server/src/test/java/org/apache/kylin/rest/controller/NTableControllerTest.java index a1f41efe75..34e87639cc 100644 --- a/src/metadata-server/src/test/java/org/apache/kylin/rest/controller/NTableControllerTest.java +++ b/src/metadata-server/src/test/java/org/apache/kylin/rest/controller/NTableControllerTest.java @@ -300,6 +300,8 @@ public class NTableControllerTest extends NLocalFileMetadataTestCase { .thenReturn(loadTableResponse); Mockito.when(tableExtService.loadDbTables(tableLoadRequest.getDatabases(), "default", true)) .thenReturn(loadTableResponse); + Mockito.when(tableExtService.loadTablesWithShortCircuit(tableLoadRequest)) + .thenReturn(loadTableResponse); } @Test @@ -313,6 +315,8 @@ public class NTableControllerTest extends NLocalFileMetadataTestCase { { final TableLoadRequest tableLoadRequest = mockLoadTableRequest(); initMockito(loadTableResponse, tableLoadRequest); + tableLoadRequest.setNeedSampling(false); + tableLoadRequest.setSamplingRows(0); mockMvc.perform(MockMvcRequestBuilders.post("/api/tables") // .contentType(MediaType.APPLICATION_JSON) // .content(JsonUtil.writeValueAsString(tableLoadRequest)) // @@ -333,9 +337,10 @@ public class NTableControllerTest extends NLocalFileMetadataTestCase { TableLoadRequest request = new TableLoadRequest(); request.setDatabases(databasesUppercase); request.setTables(tablesUppercase); - request.setNeedSampling(false); request.setProject(project); initMockito(loadTableResponse, request); + request.setNeedSampling(false); + request.setSamplingRows(0); request.setDatabases(databasesMixTure); request.setTables(tablesMixTure); @@ -344,8 +349,7 @@ public class NTableControllerTest extends NLocalFileMetadataTestCase { .content(JsonUtil.writeValueAsString(request)) // .accept(MediaType.parseMediaType(APPLICATION_JSON))) .andExpect(MockMvcResultMatchers.status().isOk()); - Mockito.verify(tableExtService, Mockito.times(1)).loadDbTables(tablesUppercase, project, false); - Mockito.verify(tableExtService, Mockito.times(1)).loadDbTables(databasesUppercase, project, true); + Mockito.verify(tableExtService, Mockito.times(1)).loadTablesWithShortCircuit(request); request.setDatabases(databasesLowercase); request.setTables(tablesLowercase); @@ -354,8 +358,7 @@ public class NTableControllerTest extends NLocalFileMetadataTestCase { .content(JsonUtil.writeValueAsString(request)) // .accept(MediaType.parseMediaType(APPLICATION_JSON))) .andExpect(MockMvcResultMatchers.status().isOk()); - Mockito.verify(tableExtService, Mockito.times(2)).loadDbTables(tablesUppercase, project, false); - Mockito.verify(tableExtService, Mockito.times(2)).loadDbTables(databasesUppercase, project, true); + Mockito.verify(tableExtService, Mockito.times(1)).loadTablesWithShortCircuit(request); request.setDatabases(databasesUppercase); request.setTables(tablesUppercase); @@ -364,8 +367,7 @@ public class NTableControllerTest extends NLocalFileMetadataTestCase { .content(JsonUtil.writeValueAsString(request)) // .accept(MediaType.parseMediaType(APPLICATION_JSON))) .andExpect(MockMvcResultMatchers.status().isOk()); - Mockito.verify(tableExtService, Mockito.times(3)).loadDbTables(tablesUppercase, project, false); - Mockito.verify(tableExtService, Mockito.times(3)).loadDbTables(databasesUppercase, project, true); + Mockito.verify(tableExtService, Mockito.times(1)).loadTablesWithShortCircuit(request); } } @@ -649,6 +651,7 @@ public class NTableControllerTest extends NLocalFileMetadataTestCase { Set<String> loaded = Sets.newHashSet("default.test_kylin_fact"); LoadTableResponse loadTableResponse = new LoadTableResponse(); loadTableResponse.setLoaded(loaded); + loadTableResponse.setNeedRealSampling(loaded); final TableLoadRequest tableLoadRequest = mockLoadTableRequest(); tableLoadRequest.setNeedSampling(true); tableLoadRequest.setSamplingRows(200); @@ -670,6 +673,7 @@ public class NTableControllerTest extends NLocalFileMetadataTestCase { Set<String> loaded = Sets.newHashSet("default.test_kylin_fact"); LoadTableResponse loadTableResponse = new LoadTableResponse(); loadTableResponse.setLoaded(loaded); + loadTableResponse.setNeedRealSampling(loaded); final TableLoadRequest tableLoadRequest = mockLoadTableRequest(); tableLoadRequest.setNeedSampling(true); tableLoadRequest.setSamplingRows(30_000_000);