diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/AmoroServiceContainer.java b/amoro-ams/src/main/java/org/apache/amoro/server/AmoroServiceContainer.java index f2880ebf6f..6eeb765486 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/AmoroServiceContainer.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/AmoroServiceContainer.java @@ -252,12 +252,7 @@ private void startThriftServer(TServer server, String threadName) { private void initHttpService() { DashboardServer dashboardServer = new DashboardServer( - serviceConfig, - catalogManager, - tableManager, - optimizingService, - terminalManager, - tableService); + serviceConfig, catalogManager, tableManager, optimizingService, terminalManager); RestCatalogService restCatalogService = new RestCatalogService(catalogManager, tableManager); httpServer = diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/DefaultOptimizingService.java b/amoro-ams/src/main/java/org/apache/amoro/server/DefaultOptimizingService.java index 9e940bf3da..49fad34912 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/DefaultOptimizingService.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/DefaultOptimizingService.java @@ -38,11 +38,14 @@ import org.apache.amoro.resource.Resource; import org.apache.amoro.resource.ResourceGroup; import org.apache.amoro.server.catalog.CatalogManager; +import org.apache.amoro.server.optimizing.OptimizingProcess; +import org.apache.amoro.server.optimizing.OptimizingProcessMeta; import org.apache.amoro.server.optimizing.OptimizingQueue; import org.apache.amoro.server.optimizing.OptimizingStatus; import org.apache.amoro.server.optimizing.TaskRuntime; import org.apache.amoro.server.persistence.StatedPersistentBase; import org.apache.amoro.server.persistence.mapper.OptimizerMapper; +import org.apache.amoro.server.persistence.mapper.OptimizingMapper; import org.apache.amoro.server.persistence.mapper.ResourceMapper; import org.apache.amoro.server.resource.OptimizerInstance; import org.apache.amoro.server.resource.OptimizerManager; @@ -55,6 +58,7 @@ import org.apache.amoro.shade.guava32.com.google.common.base.Preconditions; import org.apache.amoro.shade.guava32.com.google.common.collect.ImmutableList; import org.apache.amoro.shade.guava32.com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.apache.amoro.shade.thrift.org.apache.thrift.TException; import org.apache.amoro.table.TableProperties; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; @@ -269,6 +273,26 @@ public String authenticate(OptimizerRegisterInfo registerInfo) { return optimizer.getToken(); } + @Override + public boolean cancelProcess(long processId) throws TException { + OptimizingProcessMeta processMeta = + getAs(OptimizingMapper.class, m -> m.getOptimizingProcess(processId)); + if (processMeta == null) { + return false; + } + long tableId = processMeta.getTableId(); + TableRuntime tableRuntime = tableService.getRuntime(tableId); + if (tableRuntime == null) { + return false; + } + OptimizingProcess process = tableRuntime.getOptimizingProcess(); + if (process == null || process.getProcessId() != processId) { + return false; + } + process.close(); + return true; + } + /** * Get optimizing queue. * diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/DashboardServer.java b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/DashboardServer.java index 4fb925c33d..d21c838135 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/DashboardServer.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/DashboardServer.java @@ -52,7 +52,6 @@ import org.apache.amoro.server.dashboard.response.ErrorResponse; import org.apache.amoro.server.dashboard.utils.ParamSignatureCalculator; import org.apache.amoro.server.table.TableManager; -import org.apache.amoro.server.table.TableService; import org.apache.amoro.server.terminal.TerminalManager; import org.apache.amoro.shade.guava32.com.google.common.base.Preconditions; import org.apache.commons.lang3.StringUtils; @@ -101,15 +100,13 @@ public DashboardServer( CatalogManager catalogManager, TableManager tableManager, DefaultOptimizingService optimizerManager, - TerminalManager terminalManager, - TableService tableService) { + TerminalManager terminalManager) { PlatformFileManager platformFileManager = new PlatformFileManager(); this.catalogController = new CatalogController(catalogManager, platformFileManager); this.healthCheckController = new HealthCheckController(); this.loginController = new LoginController(serviceConfig); // TODO: remove table service from OptimizerGroupController - this.optimizerGroupController = - new OptimizerGroupController(tableManager, tableService, optimizerManager); + this.optimizerGroupController = new OptimizerGroupController(tableManager, optimizerManager); this.optimizerController = new OptimizerController(optimizerManager); this.platformFileInfoController = new PlatformFileInfoController(platformFileManager); this.settingController = new SettingController(serviceConfig, optimizerManager); @@ -117,8 +114,7 @@ public DashboardServer( new ServerTableDescriptor(catalogManager, tableManager, serviceConfig); // TODO: remove table service from TableController this.tableController = - new TableController( - catalogManager, tableManager, tableService, tableDescriptor, serviceConfig); + new TableController(catalogManager, tableManager, tableDescriptor, serviceConfig); this.terminalController = new TerminalController(terminalManager); this.versionController = new VersionController(); this.overviewController = new OverviewController(); diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerGroupController.java b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerGroupController.java index ddaca1399c..e8b3a6d5a2 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerGroupController.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerGroupController.java @@ -28,15 +28,11 @@ import org.apache.amoro.server.dashboard.model.TableOptimizingInfo; import org.apache.amoro.server.dashboard.response.OkResponse; import org.apache.amoro.server.dashboard.response.PageResult; -import org.apache.amoro.server.dashboard.utils.OptimizingUtil; import org.apache.amoro.server.optimizing.OptimizingStatus; -import org.apache.amoro.server.persistence.TableRuntimeMeta; import org.apache.amoro.server.resource.ContainerMetadata; import org.apache.amoro.server.resource.OptimizerInstance; import org.apache.amoro.server.resource.ResourceContainers; import org.apache.amoro.server.table.TableManager; -import org.apache.amoro.server.table.TableRuntime; -import org.apache.amoro.server.table.TableService; import org.apache.amoro.shade.guava32.com.google.common.base.Preconditions; import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; @@ -60,15 +56,11 @@ public class OptimizerGroupController { private static final String ALL_GROUP = "all"; private final TableManager tableManager; - private final TableService tableService; private final DefaultOptimizingService optimizerManager; public OptimizerGroupController( - TableManager tableManager, - TableService tableService, - DefaultOptimizingService optimizerManager) { + TableManager tableManager, DefaultOptimizingService optimizerManager) { this.tableManager = tableManager; - this.tableService = tableService; this.optimizerManager = optimizerManager; } @@ -106,26 +98,16 @@ public void getOptimizerTables(Context ctx) { if (statusCodes.isEmpty()) { statusCodes = null; } - Pair, Integer> tableRuntimeBeans = - tableManager.queryTableRuntimeMetas( + Pair, Integer> tableRuntimeBeans = + tableManager.queryTableOptimizingInfo( optimizerGroupUsedInDbFilter, dbFilterStr, tableFilterStr, statusCodes, pageSize, offset); - - List tableRuntimes = - tableRuntimeBeans.getLeft().stream() - .map(meta -> tableService.getRuntime(meta.getTableId())) - .collect(Collectors.toList()); - PageResult amsPageResult = - PageResult.of( - tableRuntimes.stream() - .map(OptimizingUtil::buildTableOptimizeInfo) - .collect(Collectors.toList()), - tableRuntimeBeans.getRight()); + PageResult.of(tableRuntimeBeans.getLeft(), tableRuntimeBeans.getRight()); ctx.json(OkResponse.of(amsPageResult)); } diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/TableController.java b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/TableController.java index f6c19de327..de8b1fcbc1 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/TableController.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/TableController.java @@ -25,6 +25,8 @@ import org.apache.amoro.ServerTableIdentifier; import org.apache.amoro.TableFormat; import org.apache.amoro.api.CatalogMeta; +import org.apache.amoro.api.OptimizingService; +import org.apache.amoro.client.OptimizingClientPools; import org.apache.amoro.config.Configurations; import org.apache.amoro.hive.CachedHiveClientPool; import org.apache.amoro.hive.HMSClientPool; @@ -51,12 +53,12 @@ import org.apache.amoro.server.dashboard.utils.AmsUtil; import org.apache.amoro.server.dashboard.utils.CommonUtil; import org.apache.amoro.server.optimizing.OptimizingStatus; +import org.apache.amoro.server.persistence.TableRuntimeMeta; import org.apache.amoro.server.table.TableManager; -import org.apache.amoro.server.table.TableRuntime; -import org.apache.amoro.server.table.TableService; import org.apache.amoro.shade.guava32.com.google.common.base.Function; import org.apache.amoro.shade.guava32.com.google.common.base.Preconditions; import org.apache.amoro.shade.guava32.com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.apache.amoro.shade.thrift.org.apache.thrift.TException; import org.apache.amoro.table.TableIdentifier; import org.apache.amoro.table.TableMetaStore; import org.apache.amoro.table.TableProperties; @@ -103,7 +105,6 @@ public class TableController { private final CatalogManager catalogManager; private final TableManager tableManager; - private final TableService tableService; private final ServerTableDescriptor tableDescriptor; private final Configurations serviceConfig; private final ConcurrentHashMap upgradeRunningInfo = @@ -113,12 +114,10 @@ public class TableController { public TableController( CatalogManager catalogManager, TableManager tableManager, - TableService tableService, ServerTableDescriptor tableDescriptor, Configurations serviceConfig) { this.catalogManager = catalogManager; this.tableManager = tableManager; - this.tableService = tableService; this.tableDescriptor = tableDescriptor; this.serviceConfig = serviceConfig; this.tableUpgradeExecutor = @@ -157,11 +156,12 @@ public void getTableDetail(Context ctx) { tableManager.getServerTableIdentifier( TableIdentifier.of(catalog, database, tableName).buildTableIdentifier())); if (serverTableIdentifier.isPresent()) { - TableRuntime tableRuntime = tableService.getRuntime(serverTableIdentifier.get().getId()); - if (tableRuntime != null) { - tableSummary.setOptimizingStatus(tableRuntime.getOptimizingStatus().name()); + TableRuntimeMeta tableRuntimeMeta = + tableManager.getTableRuntimeMata(serverTableIdentifier.get()); + if (tableRuntimeMeta != null) { + tableSummary.setOptimizingStatus(tableRuntimeMeta.getTableStatus().name()); AbstractOptimizingEvaluator.PendingInput tableRuntimeSummary = - tableRuntime.getTableSummary(); + tableRuntimeMeta.getTableSummary(); if (tableRuntimeSummary != null) { tableSummary.setHealthScore(tableRuntimeSummary.getHealthScore()); } @@ -674,31 +674,31 @@ public void cancelOptimizingProcess(Context ctx) { String catalog = ctx.pathParam("catalog"); String db = ctx.pathParam("db"); String table = ctx.pathParam("table"); - String processId = ctx.pathParam("processId"); + String processIds = ctx.pathParam("processId"); Preconditions.checkArgument( StringUtils.isNotBlank(catalog) && StringUtils.isNotBlank(db) && StringUtils.isNotBlank(table), "catalog.database.tableName can not be empty in any element"); Preconditions.checkState(catalogManager.catalogExist(catalog), "invalid catalog!"); - + long processId = Long.parseLong(processIds); ServerTableIdentifier serverTableIdentifier = tableManager.getServerTableIdentifier( TableIdentifier.of(catalog, db, table).buildTableIdentifier()); - TableRuntime tableRuntime = - serverTableIdentifier != null - ? tableService.getRuntime(serverTableIdentifier.getId()) - : null; + TableRuntimeMeta meta = tableManager.getTableRuntimeMata(serverTableIdentifier); + if (meta == null || meta.getOptimizingProcessId() != processId) { + throw new IllegalArgumentException( + String.format("Can't cancel optimizing process %s", processId)); + } - Preconditions.checkArgument( - tableRuntime != null - && tableRuntime.getOptimizingProcess() != null - && Objects.equals( - tableRuntime.getOptimizingProcess().getProcessId(), Long.parseLong(processId)), - "Can't cancel optimizing process %s", - processId); - - tableRuntime.getOptimizingProcess().close(); + OptimizingService.Iface client = + OptimizingClientPools.getClient( + AmsUtil.getAMSThriftAddress(serviceConfig, Constants.THRIFT_OPTIMIZING_SERVICE_NAME)); + try { + client.cancelProcess(processId); + } catch (TException e) { + throw new IllegalStateException("Failed to cancel optimizing process:" + e.getMessage()); + } ctx.json(OkResponse.ok()); } diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/utils/OptimizingUtil.java b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/utils/OptimizingUtil.java index d618eb789b..a3b042a012 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/utils/OptimizingUtil.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/utils/OptimizingUtil.java @@ -18,15 +18,21 @@ package org.apache.amoro.server.dashboard.utils; +import org.apache.amoro.ServerTableIdentifier; +import org.apache.amoro.config.OptimizingConfig; import org.apache.amoro.optimizing.MetricsSummary; import org.apache.amoro.optimizing.plan.AbstractOptimizingEvaluator; import org.apache.amoro.server.dashboard.model.TableOptimizingInfo; -import org.apache.amoro.server.optimizing.OptimizingProcess; import org.apache.amoro.server.optimizing.OptimizingStatus; -import org.apache.amoro.server.table.TableRuntime; +import org.apache.amoro.server.optimizing.OptimizingTaskMeta; +import org.apache.amoro.server.optimizing.TaskRuntime; +import org.apache.amoro.server.persistence.TableRuntimeMeta; import org.apache.amoro.table.descriptor.FilesStatistics; import org.apache.iceberg.ContentFile; +import java.util.List; +import java.util.stream.Collectors; + public class OptimizingUtil { /** @@ -34,20 +40,44 @@ public class OptimizingUtil { * * @return TableOptimizeInfo */ - public static TableOptimizingInfo buildTableOptimizeInfo(TableRuntime optimizingTableRuntime) { - OptimizingProcess process = optimizingTableRuntime.getOptimizingProcess(); - TableOptimizingInfo tableOptimizeInfo = - new TableOptimizingInfo(optimizingTableRuntime.getTableIdentifier()); - tableOptimizeInfo.setOptimizeStatus( - optimizingTableRuntime.getOptimizingStatus().displayValue()); + public static TableOptimizingInfo buildTableOptimizeInfo( + TableRuntimeMeta optimizingTableRuntime, + List processTasks, + List quotas) { + ServerTableIdentifier identifier = + ServerTableIdentifier.of( + optimizingTableRuntime.getTableId(), + optimizingTableRuntime.getCatalogName(), + optimizingTableRuntime.getDbName(), + optimizingTableRuntime.getTableName(), + optimizingTableRuntime.getFormat()); + TableOptimizingInfo tableOptimizeInfo = new TableOptimizingInfo(identifier); + OptimizingStatus optimizingStatus = optimizingTableRuntime.getTableStatus(); + tableOptimizeInfo.setOptimizeStatus(optimizingStatus.displayValue()); tableOptimizeInfo.setDuration( System.currentTimeMillis() - optimizingTableRuntime.getCurrentStatusStartTime()); - tableOptimizeInfo.setQuota(optimizingTableRuntime.getTargetQuota()); - tableOptimizeInfo.setQuotaOccupation(optimizingTableRuntime.calculateQuotaOccupy()); + OptimizingConfig optimizingConfig = + optimizingTableRuntime.getTableConfig().getOptimizingConfig(); + tableOptimizeInfo.setQuota(optimizingConfig.getTargetQuota()); + double quotaOccupy = + calculateQuotaOccupy( + processTasks, + quotas, + optimizingTableRuntime.getCurrentStatusStartTime(), + System.currentTimeMillis()); + tableOptimizeInfo.setQuotaOccupation(quotaOccupy); FilesStatistics optimizeFileInfo; - if (optimizingTableRuntime.getOptimizingStatus().isProcessing()) { - optimizeFileInfo = collectOptimizingFileInfo(process == null ? null : process.getSummary()); - } else if (optimizingTableRuntime.getOptimizingStatus() == OptimizingStatus.PENDING) { + if (optimizingStatus.isProcessing()) { + MetricsSummary summary = null; + if (processTasks != null && !processTasks.isEmpty()) { + List taskSummary = + processTasks.stream() + .map(OptimizingTaskMeta::getMetricsSummary) + .collect(Collectors.toList()); + summary = new MetricsSummary(taskSummary); + } + optimizeFileInfo = collectOptimizingFileInfo(summary); + } else if (optimizingStatus == OptimizingStatus.PENDING) { optimizeFileInfo = collectPendingFileInfo(optimizingTableRuntime.getPendingInput()); } else { optimizeFileInfo = null; @@ -60,6 +90,28 @@ public static TableOptimizingInfo buildTableOptimizeInfo(TableRuntime optimizing return tableOptimizeInfo; } + private static double calculateQuotaOccupy( + List processTasks, + List quotas, + long startTime, + long endTime) { + double finishedOccupy = 0; + if (quotas != null) { + finishedOccupy = quotas.stream().mapToDouble(q -> q.getQuotaTime(startTime)).sum(); + } + double runningOccupy = 0; + if (processTasks != null) { + runningOccupy = + processTasks.stream() + .mapToDouble( + t -> + TaskRuntime.taskRunningQuotaTime( + startTime, endTime, t.getStartTime(), t.getCostTime())) + .sum(); + } + return finishedOccupy + runningOccupy; + } + private static FilesStatistics collectPendingFileInfo( AbstractOptimizingEvaluator.PendingInput pendingInput) { if (pendingInput == null) { diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/optimizing/TaskRuntime.java b/amoro-ams/src/main/java/org/apache/amoro/server/optimizing/TaskRuntime.java index 59339dece6..9f7071c91a 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/optimizing/TaskRuntime.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/optimizing/TaskRuntime.java @@ -52,6 +52,20 @@ public class TaskRuntime> extends Stated @StateField private int threadId = -1; @StateField private String failReason; + public static long taskRunningQuotaTime( + long calculatingStartTime, long calculatingEndTime, long taskStartTime, long taskCostTime) { + if (taskStartTime == AmoroServiceConstants.INVALID_TIME) { + return 0; + } + calculatingStartTime = Math.max(taskStartTime, calculatingStartTime); + calculatingEndTime = + taskCostTime == AmoroServiceConstants.INVALID_TIME + ? calculatingEndTime + : taskCostTime + taskStartTime; + long lastingTime = calculatingEndTime - calculatingStartTime; + return Math.max(0, lastingTime); + } + private TaskRuntime() {} public TaskRuntime(OptimizingTaskId taskId, T taskDescriptor) { @@ -204,14 +218,7 @@ public long getEndTime() { } public long getQuotaTime(long calculatingStartTime, long calculatingEndTime) { - if (startTime == AmoroServiceConstants.INVALID_TIME) { - return 0; - } - calculatingStartTime = Math.max(startTime, calculatingStartTime); - calculatingEndTime = - costTime == AmoroServiceConstants.INVALID_TIME ? calculatingEndTime : costTime + startTime; - long lastingTime = calculatingEndTime - calculatingStartTime; - return Math.max(0, lastingTime); + return taskRunningQuotaTime(calculatingStartTime, calculatingEndTime, startTime, costTime); } public void setStatus(Status status) { diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/persistence/extension/InListExtendedLanguageDriver.java b/amoro-ams/src/main/java/org/apache/amoro/server/persistence/extension/InListExtendedLanguageDriver.java new file mode 100644 index 0000000000..8879af25ec --- /dev/null +++ b/amoro-ams/src/main/java/org/apache/amoro/server/persistence/extension/InListExtendedLanguageDriver.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.amoro.server.persistence.extension; + +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.scripting.LanguageDriver; +import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; +import org.apache.ibatis.session.Configuration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Mybatis language extensions, this diver will replace sql script like + * + *
+ *  select * from tbl where id in (#{ids::number[]})
+ * 
+ * + * to + * + *
+ * 
+ * 
+ * + *

or replace sql script like + * + *

+ *  select * from tbl where id in (#{ids::string[]})
+ * 
+ * + * to + * + *
+ * 
+ * 
+ */ +public class InListExtendedLanguageDriver extends XMLLanguageDriver implements LanguageDriver { + + private static final Logger LOG = LoggerFactory.getLogger(InListExtendedLanguageDriver.class); + + private final Pattern inNumberPattern = Pattern.compile("\\(#\\{(\\w+)::number\\[]}\\)"); + + private final Pattern inStringPattern = Pattern.compile("\\(#\\{(\\w+)::string\\[]}\\)"); + + @Override + public SqlSource createSqlSource( + Configuration configuration, String script, Class parameterType) { + Matcher matcher = inNumberPattern.matcher(script); + if (matcher.find()) { + String newScript = inNumber(matcher); + LOG.info("REPLACE IN_NUMBER_LIST original script:{}, new script:{}", script, newScript); + return super.createSqlSource(configuration, newScript, parameterType); + } + + matcher = inStringPattern.matcher(script); + if (matcher.find()) { + String newScript = inString(matcher); + LOG.info("REPLACE IN_NUMBER_LIST original script:{}, new script:{}", script, newScript); + return super.createSqlSource(configuration, newScript, parameterType); + } + + return super.createSqlSource(configuration, script, parameterType); + } + + private String inNumber(Matcher matcher) { + final String replacement = + "(#{__item})"; + String script = matcher.replaceAll(replacement); + return ""; + } + + private String inString(Matcher matcher) { + final String replacement = + "(\"#{__item}\")"; + String script = matcher.replaceAll(replacement); + return ""; + } +} diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/persistence/mapper/OptimizingMapper.java b/amoro-ams/src/main/java/org/apache/amoro/server/persistence/mapper/OptimizingMapper.java index 99c5a26451..81f22b15eb 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/persistence/mapper/OptimizingMapper.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/persistence/mapper/OptimizingMapper.java @@ -34,15 +34,19 @@ import org.apache.amoro.server.persistence.converter.MapLong2StringConverter; import org.apache.amoro.server.persistence.converter.Object2ByteArrayConvert; import org.apache.amoro.server.persistence.converter.TaskDescriptorTypeConverter; +import org.apache.amoro.server.persistence.extension.InListExtendedLanguageDriver; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Lang; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.ResultMap; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import org.apache.ibatis.type.JdbcType; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -102,29 +106,31 @@ void updateOptimizingProcess( + " AND a.status = #{optimizingStatus}" + " ORDER BY process_id desc" + "") - @Results({ - @Result(property = "processId", column = "process_id"), - @Result(property = "tableId", column = "table_id"), - @Result(property = "catalogName", column = "catalog_name"), - @Result(property = "dbName", column = "db_name"), - @Result(property = "tableName", column = "table_name"), - @Result(property = "targetSnapshotId", column = "target_snapshot_id"), - @Result(property = "targetChangeSnapshotId", column = "target_change_snapshot_id"), - @Result(property = "status", column = "status"), - @Result(property = "optimizingType", column = "optimizing_type"), - @Result(property = "planTime", column = "plan_time", typeHandler = Long2TsConverter.class), - @Result(property = "endTime", column = "end_time", typeHandler = Long2TsConverter.class), - @Result(property = "failReason", column = "fail_reason"), - @Result(property = "summary", column = "summary", typeHandler = JsonObjectConverter.class), - @Result( - property = "fromSequence", - column = "from_sequence", - typeHandler = MapLong2StringConverter.class), - @Result( - property = "toSequence", - column = "to_sequence", - typeHandler = MapLong2StringConverter.class) - }) + @Results( + id = "processMeta", + value = { + @Result(property = "processId", column = "process_id"), + @Result(property = "tableId", column = "table_id"), + @Result(property = "catalogName", column = "catalog_name"), + @Result(property = "dbName", column = "db_name"), + @Result(property = "tableName", column = "table_name"), + @Result(property = "targetSnapshotId", column = "target_snapshot_id"), + @Result(property = "targetChangeSnapshotId", column = "target_change_snapshot_id"), + @Result(property = "status", column = "status"), + @Result(property = "optimizingType", column = "optimizing_type"), + @Result(property = "planTime", column = "plan_time", typeHandler = Long2TsConverter.class), + @Result(property = "endTime", column = "end_time", typeHandler = Long2TsConverter.class), + @Result(property = "failReason", column = "fail_reason"), + @Result(property = "summary", column = "summary", typeHandler = JsonObjectConverter.class), + @Result( + property = "fromSequence", + column = "from_sequence", + typeHandler = MapLong2StringConverter.class), + @Result( + property = "toSequence", + column = "to_sequence", + typeHandler = MapLong2StringConverter.class) + }) List selectOptimizingProcesses( @Param("catalogName") String catalogName, @Param("dbName") String dbName, @@ -132,6 +138,14 @@ List selectOptimizingProcesses( @Param("optimizingType") String optimizingType, @Param("optimizingStatus") ProcessStatus optimizingStatus); + @Select( + "SELECT a.process_id, a.table_id, a.catalog_name, a.db_name, a.table_name, a.target_snapshot_id," + + " a.target_change_snapshot_id, a.status, a.optimizing_type, a.plan_time, a.end_time," + + " a.fail_reason, a.summary, a.from_sequence, a.to_sequence FROM table_optimizing_process a " + + " WHERE a.process_id = #{processId}") + @ResultMap("processMeta") + OptimizingProcessMeta getOptimizingProcess(@Param("processId") long processId); + /** Optimizing TaskRuntime operation below */ @Insert({ "") - @Results({ - @Result(property = "tableId", column = "table_id"), - @Result(property = "catalogName", column = "catalog_name"), - @Result(property = "dbName", column = "db_name"), - @Result(property = "tableName", column = "table_name"), - @Result(property = "currentSnapshotId", column = "current_snapshot_id"), - @Result(property = "currentChangeSnapshotId", column = "current_change_snapshotId"), - @Result(property = "lastOptimizedSnapshotId", column = "last_optimized_snapshotId"), - @Result( - property = "lastOptimizedChangeSnapshotId", - column = "last_optimized_change_snapshotId"), - @Result( - property = "lastMajorOptimizingTime", - column = "last_major_optimizing_time", - typeHandler = Long2TsConverter.class), - @Result( - property = "lastMinorOptimizingTime", - column = "last_minor_optimizing_time", - typeHandler = Long2TsConverter.class), - @Result( - property = "lastFullOptimizingTime", - column = "last_full_optimizing_time", - typeHandler = Long2TsConverter.class), - @Result( - property = "tableStatus", - column = "optimizing_status_code", - typeHandler = OptimizingStatusConverter.class), - @Result( - property = "currentStatusStartTime", - column = "optimizing_status_start_time", - typeHandler = Long2TsConverter.class), - @Result(property = "optimizingProcessId", column = "optimizing_process_id"), - @Result(property = "optimizerGroup", column = "optimizer_group"), - @Result( - property = "pendingInput", - column = "pending_input", - typeHandler = JsonObjectConverter.class), - @Result( - property = "tableSummary", - column = "table_summary", - typeHandler = JsonObjectConverter.class), - @Result( - property = "tableConfig", - column = "table_config", - typeHandler = JsonObjectConverter.class), - }) + @ResultMap("tableRuntimeMeta") List selectTableRuntimesForOptimizerGroup( @Param("optimizerGroup") String optimizerGroup, @Param("fuzzyDbName") String fuzzyDbName, diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/table/DefaultTableManager.java b/amoro-ams/src/main/java/org/apache/amoro/server/table/DefaultTableManager.java index be63b0406e..3051e56d1d 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/table/DefaultTableManager.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/table/DefaultTableManager.java @@ -32,14 +32,22 @@ import org.apache.amoro.exception.ObjectNotExistsException; import org.apache.amoro.exception.PersistenceException; import org.apache.amoro.server.AmoroManagementConf; +import org.apache.amoro.server.AmoroServiceConstants; import org.apache.amoro.server.catalog.CatalogManager; import org.apache.amoro.server.catalog.InternalCatalog; +import org.apache.amoro.server.dashboard.model.TableOptimizingInfo; +import org.apache.amoro.server.dashboard.utils.OptimizingUtil; +import org.apache.amoro.server.optimizing.OptimizingTaskMeta; +import org.apache.amoro.server.optimizing.TaskRuntime; import org.apache.amoro.server.persistence.PersistentBase; import org.apache.amoro.server.persistence.TableRuntimeMeta; +import org.apache.amoro.server.persistence.mapper.OptimizingMapper; import org.apache.amoro.server.persistence.mapper.TableBlockerMapper; import org.apache.amoro.server.persistence.mapper.TableMetaMapper; import org.apache.amoro.server.table.blocker.TableBlocker; import org.apache.amoro.shade.guava32.com.google.common.base.Preconditions; +import org.apache.amoro.shade.guava32.com.google.common.collect.Lists; +import org.apache.amoro.shade.guava32.com.google.common.collect.Maps; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; @@ -222,7 +230,12 @@ public ServerTableIdentifier getServerTableIdentifier(TableIdentifier id) { } @Override - public Pair, Integer> queryTableRuntimeMetas( + public TableRuntimeMeta getTableRuntimeMata(ServerTableIdentifier id) { + return getAs(TableMetaMapper.class, mapper -> mapper.getTableRuntimeMeta(id.getId())); + } + + @Override + public Pair, Integer> queryTableOptimizingInfo( String optimizerGroup, @Nullable String fuzzyDbName, @Nullable String fuzzyTableName, @@ -232,10 +245,10 @@ public Pair, Integer> queryTableRuntimeMetas( // page helper is 1-based int pageNumber = (offset / limit) + 1; - + int total = 0; + List ret; try (Page ignore = PageHelper.startPage(pageNumber, limit, true)) { - int total = 0; - List ret = + ret = getAs( TableMetaMapper.class, mapper -> @@ -243,7 +256,57 @@ public Pair, Integer> queryTableRuntimeMetas( optimizerGroup, fuzzyDbName, fuzzyTableName, statusCodeFilters)); PageInfo pageInfo = new PageInfo<>(ret); total = (int) pageInfo.getTotal(); - return Pair.of(ret, total); } + List processIds = + ret.stream() + .map(TableRuntimeMeta::getOptimizingProcessId) + .filter(i -> i != -1) + .collect(Collectors.toList()); + List tableIds = + ret.stream().map(TableRuntimeMeta::getTableId).collect(Collectors.toList()); + + List taskMetas = + getAs( + OptimizingMapper.class, + m -> { + if (processIds.isEmpty()) { + return Lists.newArrayList(); + } else { + return m.selectOptimizeTaskMetas(processIds); + } + }); + Map> tableTaskMetaMap = + taskMetas.stream() + .collect(Collectors.groupingBy(OptimizingTaskMeta::getTableId, Collectors.toList())); + + // load quota info + Map> tableQuotaMap = getQuotaTime(tableIds); + + List infos = + ret.stream() + .map( + meta -> { + List tasks = tableTaskMetaMap.get(meta.getTableId()); + List quotas = tableQuotaMap.get(meta.getTableId()); + return OptimizingUtil.buildTableOptimizeInfo(meta, tasks, quotas); + }) + .collect(Collectors.toList()); + return Pair.of(infos, total); + } + + private Map> getQuotaTime(List tableIds) { + if (tableIds == null || tableIds.isEmpty()) { + return Maps.newHashMap(); + } + long calculatingEndTime = System.currentTimeMillis(); + long calculatingStartTime = calculatingEndTime - AmoroServiceConstants.QUOTA_LOOK_BACK_TIME; + + List quotas = + getAs( + OptimizingMapper.class, + mapper -> mapper.selectTableQuotas(tableIds, calculatingStartTime)); + + return quotas.stream() + .collect(Collectors.groupingBy(TaskRuntime.TaskQuota::getTableId, Collectors.toList())); } } diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/table/MaintainedTableManager.java b/amoro-ams/src/main/java/org/apache/amoro/server/table/MaintainedTableManager.java index f4acbcfc28..53df0a8270 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/table/MaintainedTableManager.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/table/MaintainedTableManager.java @@ -20,6 +20,7 @@ import org.apache.amoro.ServerTableIdentifier; import org.apache.amoro.api.TableIdentifier; +import org.apache.amoro.server.dashboard.model.TableOptimizingInfo; import org.apache.amoro.server.persistence.TableRuntimeMeta; import org.apache.commons.lang3.tuple.Pair; @@ -44,6 +45,9 @@ public interface MaintainedTableManager { */ ServerTableIdentifier getServerTableIdentifier(TableIdentifier id); + /** Get the table runtime meta. */ + TableRuntimeMeta getTableRuntimeMata(ServerTableIdentifier id); + /** * Get the table info from database for given parameters. * @@ -59,7 +63,7 @@ public interface MaintainedTableManager { * @return A pair with the first entry is the actual list under the filters with the offset and * limit, and second value will be the number of total entries under the filters. */ - Pair, Integer> queryTableRuntimeMetas( + Pair, Integer> queryTableOptimizingInfo( String optimizerGroup, @Nullable String fuzzyDbName, @Nullable String fuzzyTableName, diff --git a/amoro-ams/src/test/java/org/apache/amoro/server/TestDefaultOptimizingService.java b/amoro-ams/src/test/java/org/apache/amoro/server/TestDefaultOptimizingService.java index b68660a9cb..a97738ae8a 100644 --- a/amoro-ams/src/test/java/org/apache/amoro/server/TestDefaultOptimizingService.java +++ b/amoro-ams/src/test/java/org/apache/amoro/server/TestDefaultOptimizingService.java @@ -40,10 +40,10 @@ import org.apache.amoro.optimizing.TableOptimizing; import org.apache.amoro.optimizing.plan.AbstractOptimizingEvaluator; import org.apache.amoro.process.ProcessStatus; +import org.apache.amoro.server.dashboard.model.TableOptimizingInfo; import org.apache.amoro.server.optimizing.OptimizingProcess; import org.apache.amoro.server.optimizing.OptimizingStatus; import org.apache.amoro.server.optimizing.TaskRuntime; -import org.apache.amoro.server.persistence.TableRuntimeMeta; import org.apache.amoro.server.resource.OptimizerInstance; import org.apache.amoro.server.table.AMSTableTestBase; import org.apache.amoro.server.table.TableManager; @@ -363,7 +363,7 @@ public void testReloadFailedTask() { } /** - * Test the logic for {@link TableManager#queryTableRuntimeMetas(String, String, String, List, + * Test the logic for {@link TableManager#queryTableOptimizingInfo(String, String, String, List, * int, int)}. */ @Test @@ -562,9 +562,9 @@ public void testGetRuntimes() { // 2 test and assert the result // 2.1 only optimize group filter set - Pair, Integer> res = + Pair, Integer> res = tableManager() - .queryTableRuntimeMetas(optimizerGroup1, null, null, Collections.emptyList(), 10, 0); + .queryTableOptimizingInfo(optimizerGroup1, null, null, Collections.emptyList(), 10, 0); Integer expectedTotalinGroup1 = 14; Assert.assertEquals(expectedTotalinGroup1, res.getRight()); Assert.assertEquals(10, res.getLeft().size()); @@ -572,7 +572,7 @@ public void testGetRuntimes() { // 2.2 set optimize group and db filter res = tableManager() - .queryTableRuntimeMetas(optimizerGroup1, db1, null, Collections.emptyList(), 5, 0); + .queryTableOptimizingInfo(optimizerGroup1, db1, null, Collections.emptyList(), 5, 0); // there are 8 tables in db1 in optimizerGroup1 Integer expectedTotalGroup1Db1 = 8; Assert.assertEquals(expectedTotalGroup1Db1, res.getRight()); @@ -583,14 +583,14 @@ public void testGetRuntimes() { String fuzzyDbName = "InOtherGroup"; res = tableManager() - .queryTableRuntimeMetas(opGroup2, null, fuzzyDbName, Collections.emptyList(), 2, 0); + .queryTableOptimizingInfo(opGroup2, null, fuzzyDbName, Collections.emptyList(), 2, 0); Integer expectedTotalWithFuzzyDbName = 3; Assert.assertEquals(expectedTotalWithFuzzyDbName, res.getRight()); Assert.assertEquals(2, res.getLeft().size()); res = tableManager() - .queryTableRuntimeMetas(opGroup2, null, fuzzyDbName, Collections.emptyList(), 5, 0); + .queryTableOptimizingInfo(opGroup2, null, fuzzyDbName, Collections.emptyList(), 5, 0); Assert.assertEquals(expectedTotalWithFuzzyDbName, res.getRight()); // there are only 3 tables with the suffix in opGroup2 Assert.assertEquals(3, res.getLeft().size()); @@ -598,7 +598,7 @@ public void testGetRuntimes() { // 2.4 set optimize group and status filter, with only one status List statusCode = new ArrayList<>(); statusCode.add(OptimizingStatus.MAJOR_OPTIMIZING.getCode()); - res = tableManager().queryTableRuntimeMetas(optimizerGroup1, null, null, statusCode, 10, 0); + res = tableManager().queryTableOptimizingInfo(optimizerGroup1, null, null, statusCode, 10, 0); Integer expectedTotalInGroup1WithMajorStatus = 2; Assert.assertEquals(expectedTotalInGroup1WithMajorStatus, res.getRight()); Assert.assertEquals(2, res.getLeft().size()); @@ -607,7 +607,7 @@ public void testGetRuntimes() { statusCode.clear(); statusCode.add(OptimizingStatus.MINOR_OPTIMIZING.getCode()); statusCode.add(OptimizingStatus.MAJOR_OPTIMIZING.getCode()); - res = tableManager().queryTableRuntimeMetas(optimizerGroup1, null, null, statusCode, 3, 0); + res = tableManager().queryTableOptimizingInfo(optimizerGroup1, null, null, statusCode, 3, 0); Integer expectedTotalInGroup1WithMinorMajorStatus = 4; Assert.assertEquals(expectedTotalInGroup1WithMinorMajorStatus, res.getRight()); Assert.assertEquals(3, res.getLeft().size()); @@ -618,7 +618,8 @@ public void testGetRuntimes() { statusCode.add(OptimizingStatus.FULL_OPTIMIZING.getCode()); String tableFilter = "pending"; res = - tableManager().queryTableRuntimeMetas(optimizerGroup1, db1, tableFilter, statusCode, 10, 0); + tableManager() + .queryTableOptimizingInfo(optimizerGroup1, db1, tableFilter, statusCode, 10, 0); Integer expectedTotalInGroup1InDb1WithTableFilterAndStatus = 2; Assert.assertEquals(expectedTotalInGroup1InDb1WithTableFilterAndStatus, res.getRight()); Assert.assertEquals(2, res.getLeft().size()); @@ -630,7 +631,7 @@ public void testGetRuntimes() { String wrongTableFilter2 = "noTableWithName"; res = tableManager() - .queryTableRuntimeMetas(optimizerGroup1, db1, wrongTableFilter2, statusCode, 10, 0); + .queryTableOptimizingInfo(optimizerGroup1, db1, wrongTableFilter2, statusCode, 10, 0); Assert.assertEquals(0, (int) res.getRight()); Assert.assertTrue(res.getLeft().isEmpty()); } diff --git a/amoro-common/pom.xml b/amoro-common/pom.xml index e65c424155..0f50d55ca9 100644 --- a/amoro-common/pom.xml +++ b/amoro-common/pom.xml @@ -166,7 +166,7 @@ - + org.apache.thrift.tools maven-thrift-plugin diff --git a/amoro-common/src/main/gen-java/org/apache/amoro/api/OptimizingService.java b/amoro-common/src/main/gen-java/org/apache/amoro/api/OptimizingService.java index d2bbdb7664..331e693883 100644 --- a/amoro-common/src/main/gen-java/org/apache/amoro/api/OptimizingService.java +++ b/amoro-common/src/main/gen-java/org/apache/amoro/api/OptimizingService.java @@ -6,7 +6,7 @@ */ package org.apache.amoro.api; -@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.20.0)", date = "2024-06-11") +@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.20.0)", date = "2025-01-23") @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) public class OptimizingService { @@ -24,6 +24,8 @@ public interface Iface { public java.lang.String authenticate(OptimizerRegisterInfo registerInfo) throws org.apache.amoro.api.AmoroException, org.apache.amoro.shade.thrift.org.apache.thrift.TException; + public boolean cancelProcess(long processId) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException; + } public interface AsyncIface { @@ -40,6 +42,8 @@ public interface AsyncIface { public void authenticate(OptimizerRegisterInfo registerInfo, org.apache.amoro.shade.thrift.org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException; + public void cancelProcess(long processId, org.apache.amoro.shade.thrift.org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException; + } public static class Client extends org.apache.amoro.shade.thrift.org.apache.thrift.TServiceClient implements Iface { @@ -214,6 +218,30 @@ public java.lang.String recv_authenticate() throws org.apache.amoro.api.AmoroExc throw new org.apache.amoro.shade.thrift.org.apache.thrift.TApplicationException(org.apache.amoro.shade.thrift.org.apache.thrift.TApplicationException.MISSING_RESULT, "authenticate failed: unknown result"); } + @Override + public boolean cancelProcess(long processId) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException + { + send_cancelProcess(processId); + return recv_cancelProcess(); + } + + public void send_cancelProcess(long processId) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException + { + cancelProcess_args args = new cancelProcess_args(); + args.setProcessId(processId); + sendBase("cancelProcess", args); + } + + public boolean recv_cancelProcess() throws org.apache.amoro.shade.thrift.org.apache.thrift.TException + { + cancelProcess_result result = new cancelProcess_result(); + receiveBase(result, "cancelProcess"); + if (result.isSetSuccess()) { + return result.success; + } + throw new org.apache.amoro.shade.thrift.org.apache.thrift.TApplicationException(org.apache.amoro.shade.thrift.org.apache.thrift.TApplicationException.MISSING_RESULT, "cancelProcess failed: unknown result"); + } + } public static class AsyncClient extends org.apache.amoro.shade.thrift.org.apache.thrift.async.TAsyncClient implements AsyncIface { public static class Factory implements org.apache.amoro.shade.thrift.org.apache.thrift.async.TAsyncClientFactory { @@ -456,6 +484,41 @@ public java.lang.String getResult() throws org.apache.amoro.api.AmoroException, } } + @Override + public void cancelProcess(long processId, org.apache.amoro.shade.thrift.org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + checkReady(); + cancelProcess_call method_call = new cancelProcess_call(processId, resultHandler, this, ___protocolFactory, ___transport); + this.___currentMethod = method_call; + ___manager.call(method_call); + } + + public static class cancelProcess_call extends org.apache.amoro.shade.thrift.org.apache.thrift.async.TAsyncMethodCall { + private long processId; + public cancelProcess_call(long processId, org.apache.amoro.shade.thrift.org.apache.thrift.async.AsyncMethodCallback resultHandler, org.apache.amoro.shade.thrift.org.apache.thrift.async.TAsyncClient client, org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.amoro.shade.thrift.org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + super(client, protocolFactory, transport, resultHandler, false); + this.processId = processId; + } + + @Override + public void write_args(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol prot) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + prot.writeMessageBegin(new org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TMessage("cancelProcess", org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TMessageType.CALL, 0)); + cancelProcess_args args = new cancelProcess_args(); + args.setProcessId(processId); + args.write(prot); + prot.writeMessageEnd(); + } + + @Override + public java.lang.Boolean getResult() throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + if (getState() != org.apache.amoro.shade.thrift.org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) { + throw new java.lang.IllegalStateException("Method call not finished!"); + } + org.apache.amoro.shade.thrift.org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.amoro.shade.thrift.org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array()); + org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport); + return (new Client(prot)).recv_cancelProcess(); + } + } + } public static class Processor extends org.apache.amoro.shade.thrift.org.apache.thrift.TBaseProcessor implements org.apache.amoro.shade.thrift.org.apache.thrift.TProcessor { @@ -475,6 +538,7 @@ protected Processor(I iface, java.util.Map extends org.apache.amoro.shade.thrift.org.apache.thrift.ProcessFunction { + public cancelProcess() { + super("cancelProcess"); + } + + @Override + public cancelProcess_args getEmptyArgsInstance() { + return new cancelProcess_args(); + } + + @Override + protected boolean isOneway() { + return false; + } + + @Override + protected boolean rethrowUnhandledExceptions() { + return false; + } + + @Override + public cancelProcess_result getResult(I iface, cancelProcess_args args) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + cancelProcess_result result = new cancelProcess_result(); + result.success = iface.cancelProcess(args.processId); + result.setSuccessIsSet(true); + return result; + } + } + } public static class AsyncProcessor extends org.apache.amoro.shade.thrift.org.apache.thrift.TBaseAsyncProcessor { @@ -685,6 +778,7 @@ protected AsyncProcessor(I iface, java.util.Map extends org.apache.amoro.shade.thrift.org.apache.thrift.AsyncProcessFunction { + public cancelProcess() { + super("cancelProcess"); + } + + @Override + public cancelProcess_args getEmptyArgsInstance() { + return new cancelProcess_args(); + } + + @Override + public org.apache.amoro.shade.thrift.org.apache.thrift.async.AsyncMethodCallback getResultHandler(final org.apache.amoro.shade.thrift.org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) { + final org.apache.amoro.shade.thrift.org.apache.thrift.AsyncProcessFunction fcall = this; + return new org.apache.amoro.shade.thrift.org.apache.thrift.async.AsyncMethodCallback() { + @Override + public void onComplete(java.lang.Boolean o) { + cancelProcess_result result = new cancelProcess_result(); + result.success = o; + result.setSuccessIsSet(true); + try { + fcall.sendResponse(fb, result, org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TMessageType.REPLY,seqid); + } catch (org.apache.amoro.shade.thrift.org.apache.thrift.transport.TTransportException e) { + _LOGGER.error("TTransportException writing to internal frame buffer", e); + fb.close(); + } catch (java.lang.Exception e) { + _LOGGER.error("Exception writing to internal frame buffer", e); + onError(e); + } + } + @Override + public void onError(java.lang.Exception e) { + byte msgType = org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TMessageType.REPLY; + org.apache.amoro.shade.thrift.org.apache.thrift.TSerializable msg; + cancelProcess_result result = new cancelProcess_result(); + if (e instanceof org.apache.amoro.shade.thrift.org.apache.thrift.transport.TTransportException) { + _LOGGER.error("TTransportException inside handler", e); + fb.close(); + return; + } else if (e instanceof org.apache.amoro.shade.thrift.org.apache.thrift.TApplicationException) { + _LOGGER.error("TApplicationException inside handler", e); + msgType = org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TMessageType.EXCEPTION; + msg = (org.apache.amoro.shade.thrift.org.apache.thrift.TApplicationException)e; + } else { + _LOGGER.error("Exception inside handler", e); + msgType = org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TMessageType.EXCEPTION; + msg = new org.apache.amoro.shade.thrift.org.apache.thrift.TApplicationException(org.apache.amoro.shade.thrift.org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); + } + try { + fcall.sendResponse(fb,msg,msgType,seqid); + } catch (java.lang.Exception ex) { + _LOGGER.error("Exception writing to internal frame buffer", ex); + fb.close(); + } + } + }; + } + + @Override + protected boolean isOneway() { + return false; + } + + @Override + public void start(I iface, cancelProcess_args args, org.apache.amoro.shade.thrift.org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + iface.cancelProcess(args.processId,resultHandler); + } + } + } @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) @@ -6074,4 +6236,753 @@ private static , java.io.Serializable, Cloneable, Comparable { + private static final org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TStruct("cancelProcess_args"); + + private static final org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TField PROCESS_ID_FIELD_DESC = new org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TField("processId", org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TType.I64, (short)1); + + private static final org.apache.amoro.shade.thrift.org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new cancelProcess_argsStandardSchemeFactory(); + private static final org.apache.amoro.shade.thrift.org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new cancelProcess_argsTupleSchemeFactory(); + + public long processId; // required + + /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ + public enum _Fields implements org.apache.amoro.shade.thrift.org.apache.thrift.TFieldIdEnum { + PROCESS_ID((short)1, "processId"); + + private static final java.util.Map byName = new java.util.HashMap(); + + static { + for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** + * Find the _Fields constant that matches fieldId, or null if its not found. + */ + @org.apache.amoro.shade.thrift.org.apache.thrift.annotation.Nullable + public static _Fields findByThriftId(int fieldId) { + switch(fieldId) { + case 1: // PROCESS_ID + return PROCESS_ID; + default: + return null; + } + } + + /** + * Find the _Fields constant that matches fieldId, throwing an exception + * if it is not found. + */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** + * Find the _Fields constant that matches name, or null if its not found. + */ + @org.apache.amoro.shade.thrift.org.apache.thrift.annotation.Nullable + public static _Fields findByName(java.lang.String name) { + return byName.get(name); + } + + private final short _thriftId; + private final java.lang.String _fieldName; + + _Fields(short thriftId, java.lang.String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + @Override + public short getThriftFieldId() { + return _thriftId; + } + + @Override + public java.lang.String getFieldName() { + return _fieldName; + } + } + + // isset id assignments + private static final int __PROCESSID_ISSET_ID = 0; + private byte __isset_bitfield = 0; + public static final java.util.Map<_Fields, org.apache.amoro.shade.thrift.org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + static { + java.util.Map<_Fields, org.apache.amoro.shade.thrift.org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.amoro.shade.thrift.org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put(_Fields.PROCESS_ID, new org.apache.amoro.shade.thrift.org.apache.thrift.meta_data.FieldMetaData("processId", org.apache.amoro.shade.thrift.org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.amoro.shade.thrift.org.apache.thrift.meta_data.FieldValueMetaData(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TType.I64))); + metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); + org.apache.amoro.shade.thrift.org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(cancelProcess_args.class, metaDataMap); + } + + public cancelProcess_args() { + } + + public cancelProcess_args( + long processId) + { + this(); + this.processId = processId; + setProcessIdIsSet(true); + } + + /** + * Performs a deep copy on other. + */ + public cancelProcess_args(cancelProcess_args other) { + __isset_bitfield = other.__isset_bitfield; + this.processId = other.processId; + } + + @Override + public cancelProcess_args deepCopy() { + return new cancelProcess_args(this); + } + + @Override + public void clear() { + setProcessIdIsSet(false); + this.processId = 0; + } + + public long getProcessId() { + return this.processId; + } + + public cancelProcess_args setProcessId(long processId) { + this.processId = processId; + setProcessIdIsSet(true); + return this; + } + + public void unsetProcessId() { + __isset_bitfield = org.apache.amoro.shade.thrift.org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __PROCESSID_ISSET_ID); + } + + /** Returns true if field processId is set (has been assigned a value) and false otherwise */ + public boolean isSetProcessId() { + return org.apache.amoro.shade.thrift.org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __PROCESSID_ISSET_ID); + } + + public void setProcessIdIsSet(boolean value) { + __isset_bitfield = org.apache.amoro.shade.thrift.org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __PROCESSID_ISSET_ID, value); + } + + @Override + public void setFieldValue(_Fields field, @org.apache.amoro.shade.thrift.org.apache.thrift.annotation.Nullable java.lang.Object value) { + switch (field) { + case PROCESS_ID: + if (value == null) { + unsetProcessId(); + } else { + setProcessId((java.lang.Long)value); + } + break; + + } + } + + @org.apache.amoro.shade.thrift.org.apache.thrift.annotation.Nullable + @Override + public java.lang.Object getFieldValue(_Fields field) { + switch (field) { + case PROCESS_ID: + return getProcessId(); + + } + throw new java.lang.IllegalStateException(); + } + + /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ + @Override + public boolean isSet(_Fields field) { + if (field == null) { + throw new java.lang.IllegalArgumentException(); + } + + switch (field) { + case PROCESS_ID: + return isSetProcessId(); + } + throw new java.lang.IllegalStateException(); + } + + @Override + public boolean equals(java.lang.Object that) { + if (that instanceof cancelProcess_args) + return this.equals((cancelProcess_args)that); + return false; + } + + public boolean equals(cancelProcess_args that) { + if (that == null) + return false; + if (this == that) + return true; + + boolean this_present_processId = true; + boolean that_present_processId = true; + if (this_present_processId || that_present_processId) { + if (!(this_present_processId && that_present_processId)) + return false; + if (this.processId != that.processId) + return false; + } + + return true; + } + + @Override + public int hashCode() { + int hashCode = 1; + + hashCode = hashCode * 8191 + org.apache.amoro.shade.thrift.org.apache.thrift.TBaseHelper.hashCode(processId); + + return hashCode; + } + + @Override + public int compareTo(cancelProcess_args other) { + if (!getClass().equals(other.getClass())) { + return getClass().getName().compareTo(other.getClass().getName()); + } + + int lastComparison = 0; + + lastComparison = java.lang.Boolean.compare(isSetProcessId(), other.isSetProcessId()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetProcessId()) { + lastComparison = org.apache.amoro.shade.thrift.org.apache.thrift.TBaseHelper.compareTo(this.processId, other.processId); + if (lastComparison != 0) { + return lastComparison; + } + } + return 0; + } + + @org.apache.amoro.shade.thrift.org.apache.thrift.annotation.Nullable + @Override + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + @Override + public void read(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol iprot) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + scheme(iprot).read(iprot, this); + } + + @Override + public void write(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol oprot) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + scheme(oprot).write(oprot, this); + } + + @Override + public java.lang.String toString() { + java.lang.StringBuilder sb = new java.lang.StringBuilder("cancelProcess_args("); + boolean first = true; + + sb.append("processId:"); + sb.append(this.processId); + first = false; + sb.append(")"); + return sb.toString(); + } + + public void validate() throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + // check for required fields + // check for sub-struct validity + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write(new org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TCompactProtocol(new org.apache.amoro.shade.thrift.org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.amoro.shade.thrift.org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { + try { + // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor. + __isset_bitfield = 0; + read(new org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TCompactProtocol(new org.apache.amoro.shade.thrift.org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.amoro.shade.thrift.org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private static class cancelProcess_argsStandardSchemeFactory implements org.apache.amoro.shade.thrift.org.apache.thrift.scheme.SchemeFactory { + @Override + public cancelProcess_argsStandardScheme getScheme() { + return new cancelProcess_argsStandardScheme(); + } + } + + private static class cancelProcess_argsStandardScheme extends org.apache.amoro.shade.thrift.org.apache.thrift.scheme.StandardScheme { + + @Override + public void read(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol iprot, cancelProcess_args struct) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TField schemeField; + iprot.readStructBegin(); + while (true) + { + schemeField = iprot.readFieldBegin(); + if (schemeField.type == org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TType.STOP) { + break; + } + switch (schemeField.id) { + case 1: // PROCESS_ID + if (schemeField.type == org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TType.I64) { + struct.processId = iprot.readI64(); + struct.setProcessIdIsSet(true); + } else { + org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + default: + org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + iprot.readFieldEnd(); + } + iprot.readStructEnd(); + + // check for required fields of primitive type, which can't be checked in the validate method + struct.validate(); + } + + @Override + public void write(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol oprot, cancelProcess_args struct) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + struct.validate(); + + oprot.writeStructBegin(STRUCT_DESC); + oprot.writeFieldBegin(PROCESS_ID_FIELD_DESC); + oprot.writeI64(struct.processId); + oprot.writeFieldEnd(); + oprot.writeFieldStop(); + oprot.writeStructEnd(); + } + + } + + private static class cancelProcess_argsTupleSchemeFactory implements org.apache.amoro.shade.thrift.org.apache.thrift.scheme.SchemeFactory { + @Override + public cancelProcess_argsTupleScheme getScheme() { + return new cancelProcess_argsTupleScheme(); + } + } + + private static class cancelProcess_argsTupleScheme extends org.apache.amoro.shade.thrift.org.apache.thrift.scheme.TupleScheme { + + @Override + public void write(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol prot, cancelProcess_args struct) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TTupleProtocol) prot; + java.util.BitSet optionals = new java.util.BitSet(); + if (struct.isSetProcessId()) { + optionals.set(0); + } + oprot.writeBitSet(optionals, 1); + if (struct.isSetProcessId()) { + oprot.writeI64(struct.processId); + } + } + + @Override + public void read(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol prot, cancelProcess_args struct) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TTupleProtocol) prot; + java.util.BitSet incoming = iprot.readBitSet(1); + if (incoming.get(0)) { + struct.processId = iprot.readI64(); + struct.setProcessIdIsSet(true); + } + } + } + + private static S scheme(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol proto) { + return (org.apache.amoro.shade.thrift.org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme(); + } + } + + @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) + public static class cancelProcess_result implements org.apache.amoro.shade.thrift.org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TStruct("cancelProcess_result"); + + private static final org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TField("success", org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TType.BOOL, (short)0); + + private static final org.apache.amoro.shade.thrift.org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new cancelProcess_resultStandardSchemeFactory(); + private static final org.apache.amoro.shade.thrift.org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new cancelProcess_resultTupleSchemeFactory(); + + public boolean success; // required + + /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ + public enum _Fields implements org.apache.amoro.shade.thrift.org.apache.thrift.TFieldIdEnum { + SUCCESS((short)0, "success"); + + private static final java.util.Map byName = new java.util.HashMap(); + + static { + for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** + * Find the _Fields constant that matches fieldId, or null if its not found. + */ + @org.apache.amoro.shade.thrift.org.apache.thrift.annotation.Nullable + public static _Fields findByThriftId(int fieldId) { + switch(fieldId) { + case 0: // SUCCESS + return SUCCESS; + default: + return null; + } + } + + /** + * Find the _Fields constant that matches fieldId, throwing an exception + * if it is not found. + */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** + * Find the _Fields constant that matches name, or null if its not found. + */ + @org.apache.amoro.shade.thrift.org.apache.thrift.annotation.Nullable + public static _Fields findByName(java.lang.String name) { + return byName.get(name); + } + + private final short _thriftId; + private final java.lang.String _fieldName; + + _Fields(short thriftId, java.lang.String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + @Override + public short getThriftFieldId() { + return _thriftId; + } + + @Override + public java.lang.String getFieldName() { + return _fieldName; + } + } + + // isset id assignments + private static final int __SUCCESS_ISSET_ID = 0; + private byte __isset_bitfield = 0; + public static final java.util.Map<_Fields, org.apache.amoro.shade.thrift.org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + static { + java.util.Map<_Fields, org.apache.amoro.shade.thrift.org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.amoro.shade.thrift.org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put(_Fields.SUCCESS, new org.apache.amoro.shade.thrift.org.apache.thrift.meta_data.FieldMetaData("success", org.apache.amoro.shade.thrift.org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.amoro.shade.thrift.org.apache.thrift.meta_data.FieldValueMetaData(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TType.BOOL))); + metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); + org.apache.amoro.shade.thrift.org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(cancelProcess_result.class, metaDataMap); + } + + public cancelProcess_result() { + } + + public cancelProcess_result( + boolean success) + { + this(); + this.success = success; + setSuccessIsSet(true); + } + + /** + * Performs a deep copy on other. + */ + public cancelProcess_result(cancelProcess_result other) { + __isset_bitfield = other.__isset_bitfield; + this.success = other.success; + } + + @Override + public cancelProcess_result deepCopy() { + return new cancelProcess_result(this); + } + + @Override + public void clear() { + setSuccessIsSet(false); + this.success = false; + } + + public boolean isSuccess() { + return this.success; + } + + public cancelProcess_result setSuccess(boolean success) { + this.success = success; + setSuccessIsSet(true); + return this; + } + + public void unsetSuccess() { + __isset_bitfield = org.apache.amoro.shade.thrift.org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __SUCCESS_ISSET_ID); + } + + /** Returns true if field success is set (has been assigned a value) and false otherwise */ + public boolean isSetSuccess() { + return org.apache.amoro.shade.thrift.org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __SUCCESS_ISSET_ID); + } + + public void setSuccessIsSet(boolean value) { + __isset_bitfield = org.apache.amoro.shade.thrift.org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __SUCCESS_ISSET_ID, value); + } + + @Override + public void setFieldValue(_Fields field, @org.apache.amoro.shade.thrift.org.apache.thrift.annotation.Nullable java.lang.Object value) { + switch (field) { + case SUCCESS: + if (value == null) { + unsetSuccess(); + } else { + setSuccess((java.lang.Boolean)value); + } + break; + + } + } + + @org.apache.amoro.shade.thrift.org.apache.thrift.annotation.Nullable + @Override + public java.lang.Object getFieldValue(_Fields field) { + switch (field) { + case SUCCESS: + return isSuccess(); + + } + throw new java.lang.IllegalStateException(); + } + + /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ + @Override + public boolean isSet(_Fields field) { + if (field == null) { + throw new java.lang.IllegalArgumentException(); + } + + switch (field) { + case SUCCESS: + return isSetSuccess(); + } + throw new java.lang.IllegalStateException(); + } + + @Override + public boolean equals(java.lang.Object that) { + if (that instanceof cancelProcess_result) + return this.equals((cancelProcess_result)that); + return false; + } + + public boolean equals(cancelProcess_result that) { + if (that == null) + return false; + if (this == that) + return true; + + boolean this_present_success = true; + boolean that_present_success = true; + if (this_present_success || that_present_success) { + if (!(this_present_success && that_present_success)) + return false; + if (this.success != that.success) + return false; + } + + return true; + } + + @Override + public int hashCode() { + int hashCode = 1; + + hashCode = hashCode * 8191 + ((success) ? 131071 : 524287); + + return hashCode; + } + + @Override + public int compareTo(cancelProcess_result other) { + if (!getClass().equals(other.getClass())) { + return getClass().getName().compareTo(other.getClass().getName()); + } + + int lastComparison = 0; + + lastComparison = java.lang.Boolean.compare(isSetSuccess(), other.isSetSuccess()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetSuccess()) { + lastComparison = org.apache.amoro.shade.thrift.org.apache.thrift.TBaseHelper.compareTo(this.success, other.success); + if (lastComparison != 0) { + return lastComparison; + } + } + return 0; + } + + @org.apache.amoro.shade.thrift.org.apache.thrift.annotation.Nullable + @Override + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + @Override + public void read(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol iprot) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + scheme(iprot).read(iprot, this); + } + + public void write(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol oprot) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + scheme(oprot).write(oprot, this); + } + + @Override + public java.lang.String toString() { + java.lang.StringBuilder sb = new java.lang.StringBuilder("cancelProcess_result("); + boolean first = true; + + sb.append("success:"); + sb.append(this.success); + first = false; + sb.append(")"); + return sb.toString(); + } + + public void validate() throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + // check for required fields + // check for sub-struct validity + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write(new org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TCompactProtocol(new org.apache.amoro.shade.thrift.org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.amoro.shade.thrift.org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { + try { + // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor. + __isset_bitfield = 0; + read(new org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TCompactProtocol(new org.apache.amoro.shade.thrift.org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.amoro.shade.thrift.org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private static class cancelProcess_resultStandardSchemeFactory implements org.apache.amoro.shade.thrift.org.apache.thrift.scheme.SchemeFactory { + @Override + public cancelProcess_resultStandardScheme getScheme() { + return new cancelProcess_resultStandardScheme(); + } + } + + private static class cancelProcess_resultStandardScheme extends org.apache.amoro.shade.thrift.org.apache.thrift.scheme.StandardScheme { + + @Override + public void read(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol iprot, cancelProcess_result struct) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TField schemeField; + iprot.readStructBegin(); + while (true) + { + schemeField = iprot.readFieldBegin(); + if (schemeField.type == org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TType.STOP) { + break; + } + switch (schemeField.id) { + case 0: // SUCCESS + if (schemeField.type == org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TType.BOOL) { + struct.success = iprot.readBool(); + struct.setSuccessIsSet(true); + } else { + org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + default: + org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + iprot.readFieldEnd(); + } + iprot.readStructEnd(); + + // check for required fields of primitive type, which can't be checked in the validate method + struct.validate(); + } + + @Override + public void write(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol oprot, cancelProcess_result struct) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + struct.validate(); + + oprot.writeStructBegin(STRUCT_DESC); + if (struct.isSetSuccess()) { + oprot.writeFieldBegin(SUCCESS_FIELD_DESC); + oprot.writeBool(struct.success); + oprot.writeFieldEnd(); + } + oprot.writeFieldStop(); + oprot.writeStructEnd(); + } + + } + + private static class cancelProcess_resultTupleSchemeFactory implements org.apache.amoro.shade.thrift.org.apache.thrift.scheme.SchemeFactory { + @Override + public cancelProcess_resultTupleScheme getScheme() { + return new cancelProcess_resultTupleScheme(); + } + } + + private static class cancelProcess_resultTupleScheme extends org.apache.amoro.shade.thrift.org.apache.thrift.scheme.TupleScheme { + + @Override + public void write(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol prot, cancelProcess_result struct) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TTupleProtocol) prot; + java.util.BitSet optionals = new java.util.BitSet(); + if (struct.isSetSuccess()) { + optionals.set(0); + } + oprot.writeBitSet(optionals, 1); + if (struct.isSetSuccess()) { + oprot.writeBool(struct.success); + } + } + + @Override + public void read(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol prot, cancelProcess_result struct) throws org.apache.amoro.shade.thrift.org.apache.thrift.TException { + org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TTupleProtocol) prot; + java.util.BitSet incoming = iprot.readBitSet(1); + if (incoming.get(0)) { + struct.success = iprot.readBool(); + struct.setSuccessIsSet(true); + } + } + } + + private static S scheme(org.apache.amoro.shade.thrift.org.apache.thrift.protocol.TProtocol proto) { + return (org.apache.amoro.shade.thrift.org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme(); + } + } + } diff --git a/amoro-common/src/main/thrift/amoro_optimizing_service.thrift b/amoro-common/src/main/thrift/amoro_optimizing_service.thrift index 360ab6b6b9..77b6b7dce2 100644 --- a/amoro-common/src/main/thrift/amoro_optimizing_service.thrift +++ b/amoro-common/src/main/thrift/amoro_optimizing_service.thrift @@ -65,4 +65,6 @@ service OptimizingService { string authenticate(1: OptimizerRegisterInfo registerInfo) throws (1: amoro_commons.AmoroException e1) + + bool cancelProcess(1:i64 processId) } diff --git a/amoro-common/src/test/java/org/apache/amoro/MockAmoroManagementServer.java b/amoro-common/src/test/java/org/apache/amoro/MockAmoroManagementServer.java index 26eec24083..c4775b5483 100644 --- a/amoro-common/src/test/java/org/apache/amoro/MockAmoroManagementServer.java +++ b/amoro-common/src/test/java/org/apache/amoro/MockAmoroManagementServer.java @@ -464,6 +464,11 @@ public String authenticate(OptimizerRegisterInfo registerInfo) throws TException return token; } + @Override + public boolean cancelProcess(long processId) throws TException { + return false; + } + public Map getRegisteredOptimizers() { return registeredOptimizers; }