You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@linkis.apache.org by al...@apache.org on 2022/02/14 03:39:13 UTC
[incubator-linkis] branch dev-udf updated: Added multiple features of Linkis-UDF version (#1447)
This is an automated email from the ASF dual-hosted git repository.
alexkun pushed a commit to branch dev-udf
in repository https://gitbox.apache.org/repos/asf/incubator-linkis.git
The following commit(s) were added to refs/heads/dev-udf by this push:
new 7773a6f Added multiple features of Linkis-UDF version (#1447)
7773a6f is described below
commit 7773a6fca3ecba040bd01894ed89bb91d4a63a4c
Author: peacewong <wp...@gmail.com>
AuthorDate: Mon Feb 14 11:39:04 2022 +0800
Added multiple features of Linkis-UDF version (#1447)
* Adjust SimpleDateFormat to ThreadLocal variable close #1379
* Adjust log
* Implement the default retryHandler to facilitate java class inheritance
* provide a method of forced cleanup when HDFS fs cache is enabled close #1380
* Add retry to enable httpClient to support Gateway HA close #1381
* Access-Control-Allow-Methods Support configuration
* Access-Control-Allow-Methods Support configuration
* add method of getSessionTimeOut
* Adjust the default connection pool of the mybatis module to druid close #1384
* Added resource related constants
* optimize code
* Optimize the way the RPC module supports the @receiver annotation close #1385
* optimize code
* Fix the memory leak bug of FS in ResultSetReader close #1386
* HDFSFileSystem supports updating FS objects close #1387
* Add a method to get the row and col number of the file close #1388
* optimize code
* for client add getTableStatisticInfo method
* Add tool class for killing Linux process close #1399
* Add jsonCodeParser
* optimize code
* Add the resultLocation property to the JobRequest object close #1400
* Add bml copy resources restful_interface and rollback version restful_interface close #1401
* Add datasource-cient to provide client way for datasource to access the server close #1407
* The naming method of the jobhistory field needs to be converted to camelCase. close #1413
* The ps module adds a database-based distributed lock module. close #1416
* optimize code
* add RetryWaitTimeOutLabel
* Modify message-scheduler to the receiver of rpc
* Solve compilation problems
* Solve compilation problems
* optimize code
* Modify message-scheduler to the receiver of rpc
* Fix issue #1406
* Support Engine working time idle Maintain feature close #1402
* Record task yarn queue resource usage. close #1405
* Fix issue #1406
* merge the resource-manager-common module into the manager-common module $1420
* remove useless code
* RM supports record changes of resource usage #1423
* 1.The udf module adds version management function and stores udf resources to bml-server.
2.modify ps dependency linkis-message-scheduler to linkis-rpc. close #1422
* Solve compilation problems
* Add a Token authentication module for gateway. close #1430
* optimize code
* Modify message-scheduler to the receiver of rpc
* optimize code
* use spotless plugin to format java code
* fix Licenses issue
* use spotless plugin to format java code
* fix Licenses issue
* add gateway-authentication module
* add Licenses
* add gateway-authentication module
* add Licenses
* add Licenses
* use spotless plugin to format java code
* add OnceEngineConnHook
* Module optimization
* Cooperate with UDF to support version management optimization close #1422
* Module optimization
* Module optimization
* Support Engine working time idle Maintain feature close #1402
* computation engineConn supports asynchronous execution close #1443
* optimize code
* add init sql hook
* add reset label hook
* add use db hook
* Optimization task reporting error information
* Support reporting yarn resource information #1423
* error code optimize
* add get pid method
* ecm supports reporting actual resource usage to manager #1444
* optimize code
* Optimized to use GovernanceUtils.killProcess kill ec #1399
* Modify message-scheduler to the receiver of rpc
* Optimize ec startup directory format #1445
* Replace message-scheduler with rpc module
* Module optimization
* Module optimization
Co-authored-by: HmhWz <93...@qq.com>
---
.gitignore | 2 -
.../assembly-combined/sbin/kill-process-by-pid.sh | 81 ++
.../linkis/common/conf/BDPConfiguration.scala | 10 +-
.../apache/linkis/common/conf/Configuration.scala | 2 +-
.../apache/linkis/common/utils/RetryHandler.scala | 10 +-
.../apache/linkis/common/utils/VariableUtils.scala | 20 +-
linkis-commons/linkis-hadoop-common/pom.xml | 24 +
.../linkis/hadoop/common/utils/HDFSUtils.scala | 60 +-
.../linkis/httpclient/AbstractHttpClient.scala | 230 +++--
.../AbstractAuthenticationStrategy.scala | 31 +-
.../linkis/httpclient/config/ClientConfig.scala | 29 +-
.../httpclient/config/HttpClientConstant.scala | 14 +-
.../httpclient/discovery/AbstractDiscovery.scala | 110 ++-
.../exception/HttpClientRetryException.scala | 19 +-
.../loadbalancer/DefaultLoadbalancerStrategy.scala | 3 +
.../linkis/httpclient/request/DownloadAction.scala | 13 +-
.../linkis/server/conf/ServerConfiguration.scala | 2 +
.../apache/linkis/server/security/SSOUtils.scala | 2 +
.../linkis/server/security/SecurityFilter.scala | 4 +-
linkis-commons/linkis-mybatis/pom.xml | 7 +
.../apache/linkis/mybatis/DataSourceConfig.java | 5 +-
.../linkis/protocol/constants/TaskConstant.java | 6 +
.../apache/linkis/rpc/serializer/NoneDelegate.java | 28 -
.../linkis/rpc/serializer/annotation/Chain.java | 13 +-
.../linkis/rpc/serializer/annotation/Method.java | 14 +-
.../linkis/rpc/serializer/annotation/Order.java | 12 +-
.../linkis/rpc/serializer/annotation/Receiver.java | 12 +-
.../exception/MessageErrorException.java | 12 +-
.../serializer/exception/MessageWarnException.java | 11 +-
.../rpc/serializer/method/MessageExecutor.java | 95 ++
.../serializer/method/MethodExecuteWrapper.java | 69 ++
.../serializer/method/ReceiverMethodSearcher.java | 99 +++
.../serializer/parser/DefaultServiceParser.java | 109 +++
.../rpc/serializer/parser/ServiceMethod.java | 113 +++
.../rpc/serializer/parser/ServiceParser.java} | 15 +-
.../registry/AbstractServiceRegistry.java | 98 ++
.../rpc/serializer/registry/ServiceRegistry.java | 14 +-
.../serializer/registry/SpringServiceRegistry.java | 33 +-
.../linkis/rpc/serializer/utils/MessageUtils.java | 94 ++
.../org/apache/linkis/rpc/MessageReceiver.scala | 52 ++
.../apache/linkis/rpc/MessageReceiverChooser.scala | 21 +-
.../org/apache/linkis/rpc/RPCReceiveRestful.scala | 4 +-
.../apache/linkis/rpc/conf/RPCConfiguration.scala | 8 +-
.../linkis/scheduler/queue/LoopArrayQueue.scala | 7 +-
.../linkis/storage/fs/impl/HDFSFileSystem.java | 37 +-
.../apache/linkis/storage/domain/DataType.scala | 31 +-
.../linkis/storage/resultset/ResultSetReader.scala | 7 +-
.../storage/resultset/StorageResultSetReader.scala | 22 +-
.../script/reader/StorageScriptFsReader.scala | 6 +-
.../linkis/storage/source/AbstractFileSource.scala | 2 +
.../apache/linkis/storage/source/FileSource.scala | 2 +
.../apache/linkis/storage/source/FileSplit.scala | 19 +
.../storage/source/ResultsetFileSource.scala | 3 +-
.../linkis/storage/utils/FileSystemUtils.scala | 63 +-
.../storage/utils/StorageConfiguration.scala | 2 +
.../linkis-computation-client/pom.xml | 14 +
.../computation/client/LinkisJobBuilder.scala | 23 +-
.../computation/client/LinkisJobClient.scala | 2 +-
.../client/interactive/InteractiveJobBuilder.scala | 7 +-
.../client/once/LinkisManagerClient.scala | 3 +-
.../once/result/EngineConnOperateResult.scala | 11 +-
.../client/once/simple/SimpleOnceJobBuilder.scala | 15 +-
.../org/apache/linkis/ujes/client/UJESClient.scala | 4 +
.../apache/linkis/ujes/client/UJESClientImpl.scala | 2 +-
.../request/GetTableStatisticInfoAction.scala | 81 ++
.../ujes/client/request/JobExecuteAction.scala | 2 +-
.../response/GetTableStatisticInfoResult.scala} | 36 +-
.../ujes/client/response/JobInfoResult.scala | 11 +
.../governance/common/entity/job/JobRequest.java | 11 +
.../common/entity/job/OnceExecutorContent.scala | 6 +-
.../governance/common/paser/CodeParser.scala | 43 +
.../governance/common/utils/GovernanceUtils.scala | 50 ++
.../launch/LinuxProcessEngineConnLaunch.scala | 18 +
.../apache/linkis/ecm/core/conf/ECMErrorCode.scala | 8 +-
.../ecm/core/launch/EngineConnManagerEnv.scala | 4 +-
.../ecm/core/launch/ProcessEngineConnLaunch.scala | 8 +
.../linkis-engineconn-manager-server/pom.xml | 8 +-
.../linkis/ecm/server/conf/ECMConfiguration.scala | 8 +-
.../linkis/ecm/server/hook/JarUDFLoadECMHook.scala | 69 +-
.../server/operator/EngineConnLogOperator.scala | 10 +-
.../ecm/server/service/ECMHealthService.scala | 17 +-
.../server/service/LocalDirsHandleService.scala | 6 +-
.../impl/AbstractEngineConnLaunchService.scala | 29 +-
.../impl/BmlResourceLocalizationService.scala | 55 +-
.../service/impl/DefaultECMHealthService.scala | 136 ++-
.../service/impl/DefaultEngineConnKillService.java | 44 +-
.../impl/DefaultEngineConnPidCallbackService.scala | 2 +-
.../DefaultEngineConnStatusCallbackService.scala | 2 +-
.../impl/DefaultLocalDirsHandleService.scala | 19 +-
.../service/impl/DefaultOperateService.scala | 2 +-
.../service/impl/DefaultYarnCallbackService.scala | 2 +-
.../impl/LinuxProcessEngineConnLaunchService.scala | 10 +-
.../impl/ProcessEngineConnLaunchService.scala | 44 +-
.../ecm/server/spring/ECMSpringConfiguration.scala | 3 +-
.../apache/linkis/ecm/server/util/ECMUtils.scala | 17 +-
.../linkis/ecm/server/util/HardwareUtils.scala | 49 +-
.../linkis-once-engineconn/pom.xml | 2 +-
.../once/executor/hook/OnceEngineConnHook.scala | 40 +
.../linkis-computation-engineconn/pom.xml | 6 +-
.../async/AsyncConcurrentComputationExecutor.scala | 199 ++++-
.../executor/async/AsyncEngineConnJob.scala | 65 ++
.../executor/async/AsyncExecuteContext.scala | 58 ++
.../executor/async/AsyncExecuteExecutor.scala | 50 ++
...ionExecutor.scala => AsyncExecuteRequest.scala} | 9 +-
.../executor/async/AsyncExecutorManager.scala | 58 ++
.../executor/conf/ComputationExecutorConf.scala | 10 +
.../execute/ComputationEngineConnExecution.scala | 5 +-
.../executor/execute/ComputationExecutor.scala | 27 +-
.../execute/ConcurrentComputationExecutor.scala | 2 +-
.../executor/hook/ComputationExecutorHook.scala | 2 +-
.../executor/hook/ExecutorLabelsRestHook.scala | 58 ++
.../computation/executor/hook/InitSQLHook.scala | 104 +++
.../executor/hook/UDFLoadEngineConnHook.scala | 238 +++--
.../executor/hook/UseDatabaseEngineHook.scala | 79 ++
.../hook/executor/FunctionExecutorHook.scala | 74 ++
.../executor/listener/TaskStatusListener.scala | 4 +-
.../executor/service/TaskExecutionService.scala | 4 +-
.../service/TaskExecutionServiceImpl.scala | 116 ++-
.../executor/utlis/ComputationErrorCode.scala} | 10 +-
.../engineconn/core/executor/ExecutorManager.scala | 63 +-
.../engineconn/core/hook/ExecutorHook.scala} | 45 +-
.../engineconn/launch/EngineConnServer.scala | 41 +-
.../accessible-executor/pom.xml | 10 +-
.../conf/AccessibleExecutorConfiguration.scala | 9 +-
.../execution/AccessibleEngineConnExecution.scala | 66 +-
.../executor/listener/event/TaskEvent.scala | 4 +-
.../executor/service/AccessibleService.scala | 4 +-
.../service/DefaultAccessibleService.scala | 37 +-
.../service/DefaultExecutorHeartbeatService.scala | 2 +-
.../executor/service/DefaultManagerService.scala | 9 +-
.../executor/service/DefaultOperateService.scala | 4 +-
.../service/EngineConnTimedLockService.scala | 4 +-
.../callback-service/pom.xml | 3 +-
.../callback/service/EngineConnCallback.scala | 10 +-
.../executor/entity/ResourceFetchExecutor.scala} | 12 +-
.../executor/service/ManagerService.scala | 4 +-
.../linkis-engineconn-launch/pom.xml | 73 --
.../linkis-engineconn/pom.xml | 1 -
.../linkis-entrance-client/pom.xml | 77 --
.../ClientEngineBuilderBeanAnnotation.java | 50 --
.../ClientEngineRequesterBeanAnnotation.java | 50 --
.../ClientEngineSelectorBeanAnnotation.java | 50 --
.../ClientEntranceParserBeanAnnotation.java | 50 --
.../ClientGroupFactoryBeanAnnotation.java | 50 --
.../ClientInterceptorsBeanAnnotation.java | 50 --
.../DefaultEntranceClientBeanAnnotation.java | 50 --
.../conf/ClientSpringConfiguration.java | 98 --
.../src/main/resources/META-INF/spring.factories | 20 -
.../EngineApplicationNameFactory.scala | 36 -
.../linkis/entranceclient/EntranceClient.scala | 43 -
.../linkis/entranceclient/EntranceClientImpl.scala | 132 ---
.../entranceclient/conf/ClientConfiguration.scala | 33 -
.../ClientForEntranceSpringConfiguration.scala | 82 --
.../conf/MultiEntranceCondition.scala | 35 -
.../context/ClientEntranceParser.scala | 45 -
.../entranceclient/context/ClientLogManager.scala | 44 -
.../context/ClientPersistenceEngine.scala | 57 --
.../context/ClientPersistenceManager.scala | 61 --
.../linkis/entranceclient/execute/ClientJob.scala | 62 --
.../linkis-entrance/pom.xml | 2 +-
.../entrance/conf/EntranceSpringConfiguration.java | 56 +-
.../persistence/QueryPersistenceManager.java | 32 +-
.../entrance/restful/EntranceRestfulApi.java | 10 +-
.../entrance/vo/YarnResourceWithStatusVo.java | 109 +++
.../entrance/conf/EntranceConfiguration.scala | 2 +-
.../manager/label/constant/LabelKeyConstant.java | 2 +
.../manager/label/entity/SerializableLabel.java | 3 -
.../linkis/manager/label/entity/TenantLabel.java | 3 +-
.../manager/label/entity/engine/RunType.scala | 1 +
.../label/entity/engine/UserCreatorLabel.java | 4 +-
.../entity/entrance/RetryWaitTimeOutLabel.java | 46 +
.../manager/label/entity/route/RouteLabel.java | 3 +-
.../linkis-manager/label-manager/pom.xml | 3 +-
.../label/service/ResourceLabelService.scala | 3 +
.../service/impl/DefaultNodeLabelAddService.scala | 2 +-
.../impl/DefaultNodeLabelRemoveService.scala | 6 +-
.../service/impl/DefaultNodeLabelService.scala | 6 +-
.../service/impl/DefaultResourceLabelService.scala | 21 +-
.../linkis-application-manager/pom.xml | 2 +-
.../linkis/manager/am/restful/EMRestfulApi.java | 30 +-
.../manager/am/restful/EngineRestfulApi.java | 27 +-
.../linkis/manager/am/conf/AMConfiguration.scala | 8 +-
.../linkis/manager/am/label/AMLabelChecker.scala | 7 -
.../am/locker/DefaultEngineNodeLocker.scala | 2 +-
.../manager/am/manager/DefaultEMNodeManager.scala | 8 +-
.../am/manager/DefaultEngineNodeManager.scala | 23 +-
.../manager/am/pointer/AbstractNodePointer.scala | 3 +
.../manager/am/pointer/DefaultEMNodPointer.scala | 6 +-
.../manager/am/selector/ECAvailableRule.scala | 50 ++
.../am/selector/rule/AvailableNodeSelectRule.scala | 2 +-
.../linkis/manager/am/service/EngineService.scala | 2 +-
.../am/service/cache/DefaultConfCacheService.scala | 2 +-
.../am/service/em/DefaultEMEngineService.scala | 8 +-
.../am/service/em/DefaultEMInfoService.scala | 10 +-
.../am/service/em/DefaultEMRegisterService.scala | 18 +-
.../am/service/em/DefaultEMUnregisterService.scala | 9 +-
.../manager/am/service/em/EMRegisterService.scala | 4 +-
.../am/service/em/EMUnregisterService.scala | 3 +-
.../engine/DefaultEngineAskEngineService.scala | 18 +-
.../engine/DefaultEngineConnCanKillService.scala | 159 ++++
.../DefaultEngineConnStatusCallbackService.scala | 6 +-
.../engine/DefaultEngineCreateService.scala | 99 ++-
.../service/engine/DefaultEngineInfoService.scala | 2 +-
.../engine/DefaultEngineRecycleService.scala | 6 +-
.../service/engine/DefaultEngineReuseService.scala | 12 +-
.../service/engine/DefaultEngineStopService.scala | 22 +-
.../engine/DefaultEngineSwitchService.scala | 2 +-
.../am/service/engine/EngineAskEngineService.scala | 4 +-
...ervice.scala => EngineConnCanKillService.scala} | 13 +-
.../am/service/engine/EngineCreateService.scala | 4 +-
.../am/service/engine/EngineInfoService.scala | 3 +-
.../am/service/engine/EngineKillService.scala | 3 +-
.../am/service/engine/EngineReuseService.scala | 3 +-
.../am/service/engine/EngineStopService.scala | 9 +-
.../am/service/heartbeat/AMHeartbeatService.scala | 4 +-
.../am/service/monitor/NodeHeartbeatMonitor.scala | 18 +-
.../linkis-manager/linkis-manager-client/pom.xml | 60 --
.../annotation/resource/RMAnnotationParser.java | 82 --
.../client/resource/ResourceManagerClient.scala | 87 --
.../common/entity/enumeration/MaintainType.java} | 14 +-
.../PersistenceResourceActionRecord.java | 155 ++++
.../entity/resource/ResourceActionRecord.java | 133 +++
.../common}/exception/RMErrorException.java | 2 +-
.../common}/exception/RMFatalException.java | 2 +-
.../manager/common}/exception/RMWarnException.java | 2 +-
.../common/protocol/engine/ECCanKillRequest.java | 81 ++
.../common/protocol/engine/ECCanKillResponse.java} | 41 +-
.../engine/EngineReourceClearRequest.java} | 31 +-
.../common/protocol/node/NodeHealthyRequest.java} | 16 +-
.../protocol/node/NodeHeartbeatResourceMsg.java | 107 +++
.../protocol/yarn/YarnAuthorizationRequest.java | 15 +-
.../protocol/yarn/YarnAuthorizationResponse.java} | 36 +-
.../manager/common/conf}/RMConfiguration.scala | 10 +-
.../protocol/resource/ResourceProtocol.scala | 2 +
.../protocol/resource/ResourceWithStatus.scala} | 13 +-
.../resourcemanager/ResourceManagerParam.scala | 0
.../linkis/resourcemanager/ResultResource.scala | 0
.../service/common/pointer/NodePointer.scala | 4 +-
.../linkis-resource-manager-common/pom.xml | 63 --
.../linkis/resourcemanager/RMRPCFormats.scala | 30 -
.../linkis-manager-persistence/pom.xml | 2 +-
.../linkis/manager/dao/ResourceManagerMapper.java | 9 +
.../manager/dao/impl/ResourceManagerMapper.xml | 50 +-
.../persistence/ResourceManagerPersistence.java | 7 +
.../impl/DefaultResourceManagerPersistence.java | 16 +
.../linkis-manager/linkis-resource-manager/pom.xml | 8 +-
.../resourcemanager/conf/ResourceStatus.java | 53 ++
.../resourcemanager/domain/RMLabelContainer.java | 2 +-
.../external/service/ExternalResourceService.java | 2 +-
.../service/impl/ExternalResourceServiceImpl.java | 4 +-
.../restful/vo/UserCreatorEngineType.java} | 38 +-
.../resourcemanager/restful/vo/UserResourceVo.java | 178 ++++
.../linkis/resourcemanager/utils/AlertUtils.java | 77 +-
.../external/yarn/YarnResourceRequester.scala | 4 +-
.../resourcemanager/message/RMMessageService.scala | 45 +-
.../resourcemanager/restful/RMMonitorRest.scala | 204 ++++-
.../service/LabelResourceService.scala | 2 +
.../service/RequestResourceService.scala | 3 +-
.../service/impl/DefaultResourceManager.scala | 163 ++--
.../impl/DriverAndYarnReqResourceService.scala | 3 +-
.../service/impl/LabelResourceServiceImpl.scala | 4 +
.../service/impl/ResourceLogService.scala | 86 +-
.../service/impl/UserResourceService.scala | 100 +++
.../linkis/resourcemanager/utils/RMUtils.scala | 36 +-
.../resourcemanager/utils/UserConfiguration.scala | 4 +-
.../linkis-manager/pom.xml | 1 -
.../engineconn-plugins/spark/pom.xml | 21 +
.../org/apache/linkis/bml/client/BmlClient.java | 8 +
.../linkis/bml/client/impl/HttpBmlClient.scala | 90 +-
.../org/apache/linkis/bml/http/HttpConf.scala | 4 +
.../apache/linkis/bml/request/BmlPOSTAction.scala | 31 +-
.../org/apache/linkis/bml/response/BmlResult.scala | 10 +
.../apache/linkis/bml/protocol/BmlProtocol.scala | 8 +-
.../src/main/assembly/distribution.xml | 26 +-
.../org/apache/linkis/bml/Entity/ResourceTask.java | 37 +
.../apache/linkis/bml/Entity/ResourceVersion.java | 20 +
.../linkis/bml/common/HdfsResourceHelper.java | 6 +-
.../apache/linkis/bml/common/OperationEnum.java | 5 +-
.../apache/linkis/bml/common/ScheduledTask.java | 3 -
.../org/apache/linkis/bml/dao/ResourceDao.java | 8 +
.../java/org/apache/linkis/bml/dao/VersionDao.java | 4 +
.../apache/linkis/bml/restful/BmlRestfulApi.java | 77 ++
.../apache/linkis/bml/service/ResourceService.java | 4 +
.../org/apache/linkis/bml/service/TaskService.java | 7 +
.../bml/service/impl/ResourceServiceImpl.java | 8 +
.../linkis/bml/service/impl/TaskServiceImpl.java | 125 +++
.../linkis-cs-highavailable/pom.xml | 2 +-
.../linkis-cs-search/pom.xml | 2 +-
.../linkis-cs-server/pom.xml | 28 +-
.../datasource/client/DataSourceRemoteClient.scala | 38 +
...moteClient.scala => MetaDataRemoteClient.scala} | 17 +-
.../linkis/datasource/client/RemoteClient.scala | 2 +-
.../client/impl/LinkisDataSourceRemoteClient.scala | 58 ++
.../client/impl/LinkisMetaDataRemoteClient.scala | 37 +
.../client/request/CreateDataSourceAction.scala | 68 ++
.../client/request/DataSourceAction.scala | 14 +-
.../request/DataSourceTestConnectAction.scala | 77 ++
.../client/request/DeleteDataSourceAction.scala | 60 ++
.../client/request/ExpireDataSourceAction.scala | 61 ++
.../request/GetAllDataSourceTypesAction.scala | 50 ++
.../GetConnectParamsByDataSourceIdAction.scala | 73 ++
.../GetConnectParamsByDataSourceNameAction.scala | 83 ++
.../request/GetDataSourceVersionsAction.scala | 61 ++
.../request/GetInfoByDataSourceIdAction.scala | 71 ++
.../request/GetKeyTypeDatasourceAction.scala | 61 ++
.../client/request/MetadataGetColumnsAction.scala | 91 ++
.../request/MetadataGetDatabasesAction.scala | 71 ++
.../request/MetadataGetPartitionsAction.scala | 89 ++
.../request/MetadataGetTablePropsAction.scala | 90 ++
.../client/request/MetadataGetTablesAction.scala | 79 ++
.../request/PublishDataSourceVersionAction.scala | 72 ++
.../client/request/QueryDataSourceAction.scala | 101 +++
.../client/request/QueryDataSourceEnvAction.scala | 87 ++
.../client/request/UpdateDataSourceAction.scala | 81 ++
.../request/UpdateDataSourceParameterAction.scala | 80 ++
.../client/response/CreateDataSourceResult.scala | 12 +-
.../response/DataSourceTestConnectResult.scala | 18 +-
.../client/response/DeleteDataSourceResult.scala | 12 +-
.../client/response/ExpireDataSourceResult.scala | 12 +-
.../response/GetAllDataSourceTypesResult.scala | 37 +-
.../GetConnectParamsByDataSourceIdResult.scala | 17 +-
.../GetConnectParamsByDataSourceNameResult.scala | 17 +-
.../response/GetDataSourceVersionsResult.scala | 35 +-
.../response/GetInfoByDataSourceIdResult.scala | 31 +-
.../response/GetKeyTypeDatasourceResult.scala | 38 +
.../client/response/MetadataGetColumnsResult.scala | 36 +-
.../response/MetadataGetDatabasesResult.scala | 13 +-
.../response/MetadataGetPartitionsResult.scala | 18 +-
.../response/MetadataGetTablePropsResult.scala | 18 +-
.../client/response/MetadataGetTablesResult.scala | 18 +-
.../response/PublishDataSourceVersionResult.scala | 10 +-
.../client/response/QueryDataSourceEnvResult.scala | 36 +-
.../client/response/QueryDataSourceResult.scala | 36 +-
.../response/UpdateDataSourceParameterResult.scala | 12 +-
.../client/response/UpdateDataSourceResult.scala | 12 +-
.../datasource/client/TestDataSourceClient.scala | 78 ++
.../datasourcemanager/common/DsmConfiguration.java | 10 +-
.../common/util/PatternInjectUtils.java | 209 -----
.../server/receiver/BaseMetaReceiver.scala | 67 ++
.../linkis-metadata-manager/service/hive/pom.xml | 2 +-
.../linkis-datasource/linkis-metadata/pom.xml | 8 +-
.../org/apache/linkis/metadata/dao/impl/MdqDao.xml | 2 +-
.../metadata/domain/mdq/DomainCoversionUtils.java | 14 +
.../domain/mdq/bo/MdqTableFieldsInfoBO.java | 12 +
.../linkis/metadata/domain/mdq/po/MdqField.java | 10 +
.../linkis/metadata/ddl/ScalaDDLCreator.scala | 3 +
.../linkis-configuration/pom.xml | 2 +-
.../linkis-instance-label-client/pom.xml | 2 +-
.../linkis-instance-label-server/pom.xml | 2 +-
.../label/service/InsLabelRpcService.scala | 12 +-
.../service/rpc/DefaultInsLabelRpcService.scala | 14 +-
.../linkis-publicservice/linkis-jobhistory/pom.xml | 7 +-
.../linkis/jobhistory/dao/impl/JobDetailMapper.xml | 28 +-
.../jobhistory/dao/impl/JobHistoryMapper.xml | 70 +-
.../apache/linkis/jobhistory/entity/JobDetail.java | 72 +-
.../linkis/jobhistory/entity/JobHistory.java | 133 +--
.../jobhistory/conversions/TaskConversions.scala | 108 +--
.../service/JobHistoryDetailQueryService.java | 5 +
.../impl/JobHistoryDetailQueryServiceImpl.scala | 13 +-
.../service/impl/JobHistoryQueryServiceImpl.scala | 27 +-
.../apache/linkis/jobhistory/util/QueryUtils.scala | 8 +-
.../linkis-ps-common-lock}/pom.xml | 31 +-
.../common/lock/CommonLockSpringConfiguration.java | 38 +
.../common/lock/dao/CommonLockMapper.java | 42 +
.../common/lock/entity/CommonLock.java | 87 ++
.../common/lock/service/CommonLockService.java | 14 +-
.../service/impl/DefaultCommonLockService.java | 79 ++
.../linkis/filesystem/WorkspaceClientImpl.scala | 18 +
.../filesystem/request/WorkspaceClient.scala | 2 +
.../linkis-storage-script-dev-server/pom.xml | 2 +-
.../linkis-udf/linkis-udf-client/pom.xml | 2 +-
.../scala/org/apache/linkis/udf/UDFClient.scala | 72 +-
.../linkis-udf/linkis-udf-common/pom.xml | 8 +-
.../java/org/apache/linkis/udf/entity/UDFInfo.java | 59 +-
.../java/org/apache/linkis/udf/entity/UDFTree.java | 8 +-
.../org/apache/linkis/udf/entity/UDFVersion.java | 133 +++
.../org/apache/linkis/udf/utils/ConstantVar.java | 16 +-
.../java/org/apache/linkis/udf/vo/DownloadVo.java | 31 +-
.../udf/{entity/UDFInfo.java => vo/UDFAddVo.java} | 146 +--
.../udf/{entity/UDFInfo.java => vo/UDFInfoVo.java} | 146 +--
.../{entity/UDFInfo.java => vo/UDFUpdateVo.java} | 112 +--
.../{entity/UDFInfo.java => vo/UDFVersionVo.java} | 144 ++-
.../linkis-udf/linkis-udf-service/pom.xml | 7 +-
.../java/org/apache/linkis/udf/api/UDFApi.java | 424 ++++++---
.../java/org/apache/linkis/udf/dao/UDFDao.java | 48 +-
.../java/org/apache/linkis/udf/dao/UDFTreeDao.java | 14 +-
.../org/apache/linkis/udf/dao/UDFVersionDao.java | 60 ++
.../java/org/apache/linkis/udf/dao/impl/UDFDao.xml | 226 +++--
.../org/apache/linkis/udf/dao/impl/UDFTreeDao.xml | 20 +-
.../apache/linkis/udf/dao/impl/UDFVersionDao.xml | 107 +++
.../org/apache/linkis/udf/service/UDFService.java | 61 +-
.../linkis/udf/service/impl/UDFServiceImpl.java | 989 +++++++++++++++------
.../udf/service/impl/UDFTreeServiceImpl.java | 30 +-
.../linkis-publicservice/linkis-variable/pom.xml | 2 +-
.../linkis-publicservice/pom.xml | 2 +
.../src/main/assembly/distribution.xml | 26 +-
.../linkis-gateway-authentication}/pom.xml | 75 +-
.../gateway/authentication/dao/TokenDao.java | 18 +-
.../authentication/dao/impl/TokenMapper.xml | 53 ++
.../gateway/authentication/entity/TokenEntity.java | 104 +++
.../exception/TokenAuthException.java | 18 +-
.../exception/TokenNotExistException.java | 18 +-
.../linkis/gateway/authentication/bo/Token.scala | 70 ++
.../linkis/gateway/authentication/bo/User.scala | 14 +-
.../gateway/authentication/bo/impl/TokenImpl.scala | 158 ++++
.../gateway/authentication/bo/impl/UserImpl.scala | 12 +-
.../authentication/conf/TokenConfiguration.scala | 24 +-
.../service/CachedTokenService.scala | 157 ++++
.../authentication/service/TokenService.scala | 49 +
.../gateway/authentication/dao/TokenDaoTest.java | 51 ++
.../authentication/dao/utils/MyBatisUtil.java | 53 ++
.../service/CachedTokenServiceTest.java | 110 +++
.../src/test/resources/TokenMapper.xml | 53 ++
.../src/test/resources/conf/mybatis-config.xml} | 48 +-
.../src/test/resources/conf/run_first_for_test.sql | 30 +-
.../linkis-gateway-core/pom.xml | 7 +
.../gateway/config/GatewayConfiguration.scala | 12 +-
.../config/GatewaySpringConfiguration.scala | 7 +
.../linkis/gateway/route/GatewayRouter.scala | 27 +-
.../linkis/gateway/security/GatewaySSOUtils.scala | 37 +-
.../linkis/gateway/security/SecurityFilter.scala | 8 +-
.../linkis/gateway/security/UserRestful.scala | 178 +---
.../security/token/TokenAuthentication.scala | 81 +-
.../linkis/httpclient/dws/DWSHttpClient.scala | 13 +-
.../StaticAuthenticationStrategy.scala | 41 +-
.../dws/config/GatewayHttpClientConf.scala | 11 +-
.../dws/discovery/DefaultConfigDiscovery.scala | 53 ++
.../linkis/httpclient/dws/response/DWSResult.scala | 46 +-
.../linkis-gateway-server-support/pom.xml | 30 +
.../src/main/assembly/distribution.xml | 29 +-
.../ujes/parser/ResultSetCacheGatewayParser.scala | 110 +++
.../ujes/route/AbstractLabelGatewayRouter.scala | 2 +-
.../ujes/route/GatewayRouterConfiguration.scala | 4 +-
.../ujes/route/label/RouteLabelParser.scala | 12 +-
.../linkis-service-gateway/pom.xml | 1 +
pom.xml | 1 +
436 files changed, 12042 insertions(+), 5061 deletions(-)
diff --git a/.gitignore b/.gitignore
index 9e68f71..73a643c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,7 +32,6 @@ linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manage
linkis-computation-governance/linkis-engineconn/target/
linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/target/
linkis-computation-governance/linkis-engineconn/linkis-engineconn-common/target/
-linkis-computation-governance/linkis-engineconn/linkis-engineconn-launch/target/
linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/target/
linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/callback-service/target/
linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/executor-core/target/
@@ -49,7 +48,6 @@ linkis-computation-governance/linkis-manager/label-manager/target/
linkis-computation-governance/linkis-manager/linkis-application-manager/target/
linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-manager-common/target/
linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-manager-service-common/target/
-linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-resource-manager-common/target/
linkis-computation-governance/linkis-manager/linkis-manager-monitor/target/
linkis-computation-governance/linkis-manager/linkis-manager-persistence/target/
linkis-computation-governance/linkis-manager/linkis-resource-manager/target/
diff --git a/assembly-combined-package/assembly-combined/sbin/kill-process-by-pid.sh b/assembly-combined-package/assembly-combined/sbin/kill-process-by-pid.sh
new file mode 100644
index 0000000..aff0efe
--- /dev/null
+++ b/assembly-combined-package/assembly-combined/sbin/kill-process-by-pid.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+#
+# 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.
+#
+
+function list_descendants ()
+{
+ ppid=$1
+ local children=$(pgrep -P ${ppid})
+
+ for spid in $children
+ do
+ list_descendants "$spid"
+ done
+
+ sub_pid_list=(${sub_pid_list[@]} ${children[@]})
+}
+function kill_proc_by_pid() {
+ pid=$1
+ sub_pid_list=()
+
+ echo "`date '+%Y-%m-%d %H:%M:%S'` Starting to kill parent process ${pid}"
+ #KILL PARENT FIRST
+ cnt=0
+ MAX_RETRY=6
+ while kill -0 ${pid} > /dev/null 2>&1 && [ $cnt -lt $MAX_RETRY ]
+ do
+ list_descendants ${pid}
+ kill -15 ${pid}
+ let cnt++
+ sleep 5s
+ done
+ if kill -0 ${pid} > /dev/null 2>&1; then
+ list_descendants ${pid}
+ kill -9 ${pid}
+ echo "`date '+%Y-%m-%d %H:%M:%S'` Killed parent process ${pid} with \'-9\' signal. May not be able to kill gracefully(yarn application may still be alive)" 1>&2
+ else
+ echo "`date '+%Y-%m-%d %H:%M:%S'` Finished to kill parent process ${pid}"
+ fi
+
+ #REMOVE DUPLICATE
+ sub_pid_list=($(echo ${sub_pid_list[*]} | sed 's/ /\n/g' | sort | uniq))
+ echo "sub_pid_list:${sub_pid_list[*]}"
+ #THEN KILL CHILDREN
+ for sub_pid in ${sub_pid_list[@]}; do
+ cnt=0
+ MAX_RETRY=6
+ while kill -0 ${sub_pid} > /dev/null 2>&1 && [ $cnt -lt $MAX_RETRY ]
+ do
+ kill -15 ${sub_pid}
+ echo "to Killed sub-process ${sub_pid}"
+ let cnt++
+ sleep 5s
+ if kill -0 ${sub_pid} > /dev/null 2>&1; then
+ let 1+1
+ else
+ echo "`date '+%Y-%m-%d %H:%M:%S'` Killed sub-process ${sub_pid}"
+ fi
+ done
+ if kill -0 ${sub_pid} > /dev/null 2>&1; then
+ kill -9 ${sub_pid}
+ echo "`date '+%Y-%m-%d %H:%M:%S'` Killed sub-process ${sub_pid} with \'-9\' signal. May not be able to kill gracefully(yarn application may still be alive)" 1>&2
+ fi
+ done
+
+ echo "`date '+%Y-%m-%d %H:%M:%S'` Finished killing process and its sub-process ${pid}"
+}
+
+
+kill_proc_by_pid $@
\ No newline at end of file
diff --git a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/conf/BDPConfiguration.scala b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/conf/BDPConfiguration.scala
index 12be538..917e065 100644
--- a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/conf/BDPConfiguration.scala
+++ b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/conf/BDPConfiguration.scala
@@ -45,8 +45,8 @@ private[conf] object BDPConfiguration extends Logging {
val propertyFile = sysProps.getOrElse("wds.linkis.configuration", DEFAULT_PROPERTY_FILE_NAME)
val configFileURL = getClass.getClassLoader.getResource(propertyFile)
if (configFileURL != null && new File(configFileURL.getPath).exists) {
+ warn(s"******************************** Notice: The Linkis configuration file is $propertyFile ! ***************************")
initConfig(config, configFileURL.getPath)
- info(s"******************************** Info: The Linkis read $propertyFile file from $configFileURL !***************************")
}
else warn(s"******************************** Notice: The Linkis configuration file $propertyFile is not exists! ***************************")
@@ -54,10 +54,10 @@ private[conf] object BDPConfiguration extends Logging {
val serverConf = sysProps.getOrElse("wds.linkis.server.conf", DEFAULT_SERVER_CONF_FILE_NAME)
val serverConfFileURL = getClass.getClassLoader.getResource(serverConf)
if (serverConfFileURL != null && new File(serverConfFileURL.getPath).exists) {
+ warn(s"******************************** Notice: The Linkis serverConf file is $propertyFile ! ***************************")
initConfig(config, serverConfFileURL.getPath)
- info(s"******************************** Info: The Linkis read $serverConf file from $serverConfFileURL !***************************")
}
- else warn(s"******************************** Notice: The Linkis serverConf file $serverConf is not exists! ***************************")
+ else warn(s"******************************** Notice: The Linkis serverConf file $serverConfFileURL is not exists! ***************************")
// load server confs
val propertyFileOptions = sysProps.get("wds.linkis.server.confs")
@@ -66,10 +66,10 @@ private[conf] object BDPConfiguration extends Logging {
propertyFiles.foreach { propertyF =>
val configFileURL = getClass.getClassLoader.getResource(propertyF)
if (configFileURL != null && new File(configFileURL.getPath).exists) {
+ warn(s"******************************** Notice: The Linkis server.confs is file $propertyF ***************************")
initConfig(config, configFileURL.getPath)
- info(s"******************************** Info: The Linkis read $propertyF file from $configFileURL !***************************")
}
- else warn(s"******************************** Notice: The Linkis configuration file $propertyF is not exists! ***************************")
+ else warn(s"******************************** Notice: The Linkis server.confs file $propertyF is not exists! ***************************")
}
}
diff --git a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/conf/Configuration.scala b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/conf/Configuration.scala
index 1131a64..b649dfe 100644
--- a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/conf/Configuration.scala
+++ b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/conf/Configuration.scala
@@ -38,7 +38,7 @@ object Configuration extends Logging {
val REFLECT_SCAN_PACKAGE = CommonVars.apply("wds.linkis.reflect.scan.package", "org.apache.linkis,com.webank.wedatasphere").getValue.split(",")
- val CLOUD_CONSOLE_CONFIGURATION_SPRING_APPLICATION_NAME = CommonVars("wds.linkis.console.configuration.application.name", "linkis-ps-publicservice")
+ val CLOUD_CONSOLE_CONFIGURATION_SPRING_APPLICATION_NAME = CommonVars("wds.linkis.console.configuration.application.name", "linkis-ps-configuration")
val CLOUD_CONSOLE_VARIABLE_SPRING_APPLICATION_NAME = CommonVars("wds.linkis.console.variable.application.name", "linkis-ps-publicservice")
diff --git a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/RetryHandler.scala b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/RetryHandler.scala
index 9de19b0..3ada866 100644
--- a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/RetryHandler.scala
+++ b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/RetryHandler.scala
@@ -37,7 +37,7 @@ trait RetryHandler extends Logging {
def setRetryMaxPeriod(retryMaxPeriod: Long): Unit = this.maxPeriod = retryMaxPeriod
def getRetryMaxPeriod: Long = maxPeriod
def addRetryException(t: Class[_ <: Throwable]): Unit = retryExceptions += t
- def getRetryExceptions: Array[Class[_ <: Throwable]] = retryExceptions.toArray
+ def getRetryExceptions: Array[Class[_ <: Throwable]] = retryExceptions.toArray
protected def exceptionCanRetry(t: Throwable): Boolean = !t.isInstanceOf[FatalException] &&
retryExceptions.exists(c => CommonClassUtils.isAssignable(t.getClass, c))
@@ -49,13 +49,13 @@ trait RetryHandler extends Logging {
}
def retry[T](op: => T, retryName: String): T = {
- if(retryExceptions.isEmpty || retryNum <= 1) return op
+ if (retryExceptions.isEmpty || retryNum <= 1) return op
var retry = 0
var result = null.asInstanceOf[T]
while(retry < retryNum && result == null) result = Utils.tryCatch(op) { t =>
retry += 1
if(retry >= retryNum) throw t
- else if(exceptionCanRetry(t)) {
+ else if (exceptionCanRetry(t)) {
val retryInterval = nextInterval(retry)
info(retryName + s" failed with ${t.getClass.getName}, wait ${ByteTimeUtils.msDurationToString(retryInterval)} for next retry. Retried $retry++ ...")
Utils.tryQuietly(Thread.sleep(retryInterval))
@@ -65,3 +65,7 @@ trait RetryHandler extends Logging {
result
}
}
+
+class DefaultRetryHandler extends RetryHandler {
+}
+
diff --git a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/VariableUtils.scala b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/VariableUtils.scala
index 8b259ee..1ce3586 100644
--- a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/VariableUtils.scala
+++ b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/VariableUtils.scala
@@ -36,8 +36,17 @@ object VariableUtils extends Logging {
/**
* date Format
*/
- val dateFormat = new SimpleDateFormat("yyyyMMdd")
- val dateFormat_std = new SimpleDateFormat("yyyy-MM-dd")
+ //val dateFormat = new SimpleDateFormat("yyyyMMdd")
+ //val dateFormat_std = new SimpleDateFormat("yyyy-MM-dd")
+
+ val dateFormatLocal = new ThreadLocal[SimpleDateFormat]() {
+ override protected def initialValue = new SimpleDateFormat("yyyyMMdd")
+ }
+
+ val dateFormatStdLocal = new ThreadLocal[SimpleDateFormat]() {
+ override protected def initialValue = new SimpleDateFormat("yyyy-MM-dd")
+ }
+
val codeReg: Regex = "\\$\\{\\s*[A-Za-z][A-Za-z0-9_\\.]*\\s*[\\+\\-\\*/]?\\s*[A-Za-z0-9_\\.]*\\s*\\}".r
val calReg: Regex = "(\\s*[A-Za-z][A-Za-z0-9_\\.]*\\s*)([\\+\\-\\*/]?)(\\s*[A-Za-z0-9_\\.]*\\s*)".r
@@ -124,6 +133,8 @@ object VariableUtils extends Logging {
* @return
*/
private def getYesterday(std: Boolean = true): String = {
+ val dateFormat = dateFormatLocal.get()
+ val dateFormat_std = dateFormatStdLocal.get()
val cal: Calendar = Calendar.getInstance()
cal.add(Calendar.DATE, -1)
if (std) {
@@ -141,6 +152,8 @@ object VariableUtils extends Logging {
* @return
*/
private[utils] def getMonth(date: Date, std: Boolean = true, isEnd: Boolean = false): String = {
+ val dateFormat = dateFormatLocal.get()
+ val dateFormat_std = dateFormatStdLocal.get()
val cal = Calendar.getInstance()
cal.setTime(date)
cal.set(Calendar.DATE, 1)
@@ -232,7 +245,8 @@ case class StringType(value: String) extends VariableType {
import VariableUtils._
class CustomDateType(date: String, std: Boolean = true) {
-
+ protected val dateFormat = dateFormatLocal.get()
+ protected val dateFormat_std = dateFormatStdLocal.get()
def -(days: Int): String = {
if (std) {
dateFormat_std.format(DateUtils.addDays(dateFormat_std.parse(date), -days))
diff --git a/linkis-commons/linkis-hadoop-common/pom.xml b/linkis-commons/linkis-hadoop-common/pom.xml
index b56ce78..eba9677 100644
--- a/linkis-commons/linkis-hadoop-common/pom.xml
+++ b/linkis-commons/linkis-hadoop-common/pom.xml
@@ -129,8 +129,20 @@
<artifactId>*</artifactId>
</exclusion>
+ <exclusion>
+ <groupId>com.google.protobuf</groupId>
+ <artifactId>protobuf-java</artifactId>
+ </exclusion>
+
</exclusions>
</dependency>
+
+ <dependency>
+ <groupId>com.google.protobuf</groupId>
+ <artifactId>protobuf-java</artifactId>
+ <version>${protobuf.version}</version>
+ </dependency>
+
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
@@ -184,6 +196,18 @@
<groupId>org.eclipse.jetty</groupId>
<artifactId>*</artifactId>
</exclusion>
+ <exclusion>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty-util</artifactId>
+ </exclusion>
</exclusions>
</dependency>
<dependency>
diff --git a/linkis-commons/linkis-hadoop-common/src/main/scala/org/apache/linkis/hadoop/common/utils/HDFSUtils.scala b/linkis-commons/linkis-hadoop-common/src/main/scala/org/apache/linkis/hadoop/common/utils/HDFSUtils.scala
index d73e739..0fa2f2f 100644
--- a/linkis-commons/linkis-hadoop-common/src/main/scala/org/apache/linkis/hadoop/common/utils/HDFSUtils.scala
+++ b/linkis-commons/linkis-hadoop-common/src/main/scala/org/apache/linkis/hadoop/common/utils/HDFSUtils.scala
@@ -99,40 +99,50 @@ object HDFSUtils extends Logging {
def getHDFSUserFileSystem(userName: String, conf: org.apache.hadoop.conf.Configuration): FileSystem = if (HadoopConf.HDFS_ENABLE_CACHE) {
val locker = userName + LOCKER_SUFFIX
- locker.intern().synchronized {
- val hdfsFileSystemContainer = if (fileSystemCache.containsKey(userName)) {
- fileSystemCache.get(userName)
- } else {
- val newHDFSFileSystemContainer = new HDFSFileSystemContainer(createFileSystem(userName, conf), userName)
- fileSystemCache.put(userName, newHDFSFileSystemContainer)
- newHDFSFileSystemContainer
- }
- hdfsFileSystemContainer.addAccessCount()
- hdfsFileSystemContainer.updateLastAccessTime
- hdfsFileSystemContainer.getFileSystem
- }
+ locker.intern().synchronized {
+ val hdfsFileSystemContainer = if (fileSystemCache.containsKey(userName)) {
+ fileSystemCache.get(userName)
} else {
- createFileSystem(userName, conf)
+ val newHDFSFileSystemContainer = new HDFSFileSystemContainer(createFileSystem(userName, conf), userName)
+ fileSystemCache.put(userName, newHDFSFileSystemContainer)
+ newHDFSFileSystemContainer
}
+ hdfsFileSystemContainer.addAccessCount()
+ hdfsFileSystemContainer.updateLastAccessTime
+ hdfsFileSystemContainer.getFileSystem
+ }
+ } else {
+ createFileSystem(userName, conf)
+ }
- def createFileSystem(userName: String, conf: org.apache.hadoop.conf.Configuration): FileSystem =
- getUserGroupInformation(userName)
+ def createFileSystem(userName: String, conf: org.apache.hadoop.conf.Configuration): FileSystem =
+ getUserGroupInformation(userName)
.doAs(new PrivilegedExceptionAction[FileSystem] {
def run = FileSystem.get(conf)
})
- def closeHDFSFIleSystem(fileSystem: FileSystem, userName: String): Unit = if (null != fileSystem && StringUtils.isNotBlank(userName)) {
- if (HadoopConf.HDFS_ENABLE_CACHE) {
- val hdfsFileSystemContainer = fileSystemCache.get(userName)
- if (null != hdfsFileSystemContainer) {
- val locker = userName + LOCKER_SUFFIX
- locker synchronized hdfsFileSystemContainer.minusAccessCount()
- }
- } else {
- fileSystem.close()
- }
+ def closeHDFSFIleSystem(fileSystem: FileSystem, userName: String): Unit = if (null != fileSystem && StringUtils.isNotBlank(userName)) {
+ closeHDFSFIleSystem(fileSystem, userName, false)
+ }
+
+ def closeHDFSFIleSystem(fileSystem: FileSystem, userName: String, isForce: Boolean): Unit = if (null != fileSystem && StringUtils.isNotBlank(userName)) {
+ if (HadoopConf.HDFS_ENABLE_CACHE) {
+ val hdfsFileSystemContainer = fileSystemCache.get(userName)
+ if (null != hdfsFileSystemContainer) {
+ val locker = userName + LOCKER_SUFFIX
+ if (isForce) {
+ locker synchronized fileSystemCache.remove(hdfsFileSystemContainer.getUser)
+ IOUtils.closeQuietly(hdfsFileSystemContainer.getFileSystem)
+ info(s"user${hdfsFileSystemContainer.getUser} to Force remove hdfsFileSystemContainer")
+ } else {
+ locker synchronized hdfsFileSystemContainer.minusAccessCount()
}
+ }
+ } else {
+ IOUtils.closeQuietly(fileSystem)
+ }
+ }
def getUserGroupInformation(userName: String): UserGroupInformation = {
if (KERBEROS_ENABLE.getValue) {
diff --git a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/AbstractHttpClient.scala b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/AbstractHttpClient.scala
index a40fe4c..622053c 100644
--- a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/AbstractHttpClient.scala
+++ b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/AbstractHttpClient.scala
@@ -14,44 +14,51 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
package org.apache.linkis.httpclient
+import java.net.URI
import java.util
-import org.apache.linkis.common.conf.Configuration
+import org.apache.linkis.common.conf.{CommonVars, Configuration}
import org.apache.linkis.common.io.{Fs, FsPath}
import org.apache.linkis.httpclient.authentication.{AbstractAuthenticationStrategy, AuthenticationAction, HttpAuthentication}
-import org.apache.linkis.httpclient.config.ClientConfig
+import org.apache.linkis.httpclient.config.{ClientConfig, HttpClientConstant}
import org.apache.linkis.httpclient.discovery.{AbstractDiscovery, Discovery, HeartbeatAction}
-import org.apache.linkis.httpclient.exception.{HttpClientResultException, HttpMessageParseException, HttpMethodNotSupportException}
+import org.apache.linkis.httpclient.exception.{HttpClientResultException, HttpClientRetryException, HttpMessageParseException, HttpMethodNotSupportException}
import org.apache.linkis.httpclient.loadbalancer.{AbstractLoadBalancer, DefaultLoadbalancerStrategy, LoadBalancer}
import org.apache.linkis.httpclient.request._
import org.apache.linkis.httpclient.response._
import org.apache.commons.io.IOUtils
import org.apache.commons.lang.StringUtils
-import org.apache.http.client.CookieStore
+import org.apache.http.client.{CookieStore, ResponseHandler}
import org.apache.http.client.config.RequestConfig
-import org.apache.http.client.entity.{DeflateDecompressingEntity, GzipDecompressingEntity, UrlEncodedFormEntity}
+import org.apache.http.client.entity.{DeflateDecompressingEntity, EntityBuilder, GzipDecompressingEntity, UrlEncodedFormEntity}
import org.apache.http.client.methods._
import org.apache.http.client.utils.URIBuilder
+import org.apache.http.conn.{ConnectTimeoutException, ConnectionPoolTimeoutException, HttpHostConnectException}
import org.apache.http.entity.mime.MultipartEntityBuilder
import org.apache.http.entity.{ContentType, StringEntity}
import org.apache.http.impl.client.{BasicCookieStore, CloseableHttpClient, HttpClients}
import org.apache.http.message.BasicNameValuePair
import org.apache.http.util.EntityUtils
import org.apache.http.{HttpResponse, _}
+import org.apache.linkis.common.utils.Logging
import scala.collection.JavaConversions._
+abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String) extends Client with Logging {
-abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String) extends Client {
-
- protected val CONNECT_TIME_OUT = 50000
+ protected val CONNECT_TIME_OUT = CommonVars("wds.linkis.httpclient.default.connect.timeOut", 50000).getValue
protected val cookieStore = new BasicCookieStore
- protected val httpClient: CloseableHttpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build
+ protected val httpClient: CloseableHttpClient = HttpClients
+ .custom()
+ .setDefaultCookieStore(cookieStore)
+ .setMaxConnTotal(clientConfig.getMaxConnection)
+ .setMaxConnPerRoute(clientConfig.getMaxConnection / 2)
+ .build
if (clientConfig.getAuthenticationStrategy != null) clientConfig.getAuthenticationStrategy match {
case auth: AbstractAuthenticationStrategy => auth.setClient(this)
@@ -67,10 +74,9 @@ abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String
d.setSchedule(clientConfig.getDiscoveryPeriod, clientConfig.getDiscoveryTimeUnit)
case d => d.setServerUrl(clientConfig.getServerUrl)
}
- //如果discovery没有启用,那么启用loadBalancer是没有意义的
- val loadBalancer = if (clientConfig.isLoadbalancerEnabled && this.clientConfig.getLoadbalancerStrategy != null)
+ val loadBalancer = if (clientConfig.isLoadbalancerEnabled && this.clientConfig.getLoadbalancerStrategy != null) {
Some(this.clientConfig.getLoadbalancerStrategy.createLoadBalancer())
- else if (clientConfig.isLoadbalancerEnabled) Some(DefaultLoadbalancerStrategy.createLoadBalancer())
+ } else if (clientConfig.isLoadbalancerEnabled) Some(DefaultLoadbalancerStrategy.createLoadBalancer())
else None
loadBalancer match {
case Some(lb: AbstractLoadBalancer) =>
@@ -87,26 +93,36 @@ abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String
override def execute(requestAction: Action): Result = execute(requestAction, -1)
override def execute(requestAction: Action, waitTime: Long): Result = {
- if (!requestAction.isInstanceOf[HttpAction])
+ if (!requestAction.isInstanceOf[HttpAction]) {
throw new UnsupportedOperationException("only HttpAction supported, but the fact is " + requestAction.getClass)
+ }
val action = prepareAction(requestAction.asInstanceOf[HttpAction])
val startTime = System.currentTimeMillis
- val req = prepareReq(action)
val prepareReqTime = System.currentTimeMillis - startTime
prepareCookie(action)
val attempts = new util.ArrayList[Long]()
+
def addAttempt(): CloseableHttpResponse = {
+ val req = prepareReq(action)
val startTime = System.currentTimeMillis
val response = executeRequest(req, Some(waitTime).filter(_ > 0))
- attempts.add(System.currentTimeMillis - startTime)
+ if (response.getStatusLine.getStatusCode == 401) {
+ tryLogin(action, getRequestUrl(action), true)
+ logger.info("The user is not logged in, client retry Login")
+ throw new HttpClientRetryException("The user is not logged in,Client had reTry Login, you can set a retry")
+ }
+ val taken = System.currentTimeMillis - startTime
+ attempts.add(taken)
+ logger.info(s"invoke ${req.getURI} taken: ${taken}")
response
}
+
val response = if (!clientConfig.isRetryEnabled) addAttempt()
else clientConfig.getRetryHandler.retry(addAttempt(), action.getClass.getSimpleName + "HttpRequest")
val beforeDeserializeTime = System.currentTimeMillis
responseToResult(response, action) match {
case metricResult: MetricResult =>
- if(metricResult.getMetric == null) metricResult.setMetric(new HttpMetric)
+ if (metricResult.getMetric == null) metricResult.setMetric(new HttpMetric)
metricResult.getMetric.setPrepareReqTime(prepareReqTime)
metricResult.getMetric.addRetries(attempts)
metricResult.getMetric.setDeserializeTime(System.currentTimeMillis - beforeDeserializeTime)
@@ -122,54 +138,78 @@ abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String
}
protected def getRequestUrl(suffixUrl: String, requestBody: String): String = {
- val urlPrefix = loadBalancer.map(_.chooseServerUrl(requestBody)).getOrElse(clientConfig.getServerUrl)
- if(suffixUrl.contains(urlPrefix)) suffixUrl else connectUrl(urlPrefix, suffixUrl)
+ val chooseUrlPrefix = loadBalancer.map(_.chooseServerUrl(requestBody)).orNull
+ val urlPrefix = if (null == chooseUrlPrefix) clientConfig.getDefaultServerUrl else chooseUrlPrefix
+ if (suffixUrl.contains(urlPrefix)) suffixUrl else connectUrl(urlPrefix, suffixUrl)
}
protected def connectUrl(prefix: String, suffix: String): String = {
- val prefixEnd = prefix.endsWith("/")
- val suffixStart = suffix.startsWith("/")
+ val prefixEnd = prefix.endsWith(HttpClientConstant.PATH_SPLIT_TOKEN)
+ val suffixStart = suffix.startsWith(HttpClientConstant.PATH_SPLIT_TOKEN)
if (prefixEnd && suffixStart) prefix.substring(0, prefix.length - 1) + suffix
- else if (!prefixEnd && !suffixStart) prefix + "/" + suffix
+ else if (!prefixEnd && !suffixStart) prefix + HttpClientConstant.PATH_SPLIT_TOKEN + suffix
else prefix + suffix
}
+ protected def getServerUrl(uri: URI): String = {
+ s"${uri.getScheme}://${uri.getHost}:${uri.getPort}"
+ }
+
protected def prepareAction(requestAction: HttpAction): HttpAction = requestAction
- protected def prepareCookie(requestAction:HttpAction): Unit = if(requestAction.getCookies.nonEmpty) {
+ protected def prepareCookie(requestAction: HttpAction): Unit = if (requestAction.getCookies.nonEmpty) {
requestAction.getCookies.foreach(cookieStore.addCookie)
}
- protected def prepareReq(requestAction: HttpAction): HttpRequestBase = {
- var realURL = ""
+ private def tryLogin(requestAction: HttpAction, realURL: String, isForce: Boolean): Unit = {
+ if (clientConfig.getAuthenticationStrategy != null) {
+ val authentication = clientConfig.getAuthenticationStrategy match {
+ case abstractAuthenticationStrategy: AbstractAuthenticationStrategy if (isForce) =>
+ abstractAuthenticationStrategy.enforceLogin(requestAction, realURL.replaceAll(requestAction.getURL, ""))
+ case _ =>
+ clientConfig.getAuthenticationStrategy.login(requestAction, realURL.replaceAll(requestAction.getURL, ""))
+ }
+ authentication match {
+ case authAction: HttpAuthentication =>
+ val cookies = authAction.authToCookies
+ if (cookies != null && cookies.nonEmpty) cookies.foreach(requestAction.addCookie)
+ val headers = authAction.authToHeaders
+ if (headers != null && !headers.isEmpty) {
+ headers.foreach { case (k, v) => if (k != null && v != null) requestAction.addHeader(k.toString, v.toString) }
+ }
+ case _ =>
+ }
+ }
+ }
+
+ private def getRequestUrl(requestAction: HttpAction): String = {
requestAction match {
case serverUrlAction: ServerUrlAction =>
- realURL = connectUrl(serverUrlAction.serverUrl, requestAction.getURL)
+ connectUrl(serverUrlAction.serverUrl, requestAction.getURL)
case _ =>
- realURL = getRequestUrl(requestAction.getURL, requestAction.getRequestBody)
+ getRequestUrl(requestAction.getURL, requestAction.getRequestBody)
}
+ }
- if (clientConfig.getAuthenticationStrategy != null) clientConfig.getAuthenticationStrategy.login(requestAction, realURL.replaceAll(requestAction.getURL, "")) match {
- case authAction: HttpAuthentication =>
- val cookies = authAction.authToCookies
- if (cookies != null && cookies.nonEmpty) cookies.foreach(requestAction.addCookie)
- val headers = authAction.authToHeaders
- if (headers != null && !headers.isEmpty) {
- headers.foreach { case (k, v) => if(k != null && v != null) requestAction.addHeader(k.toString, v.toString) }
- }
- case _ =>
- }
+ protected def prepareReq(requestAction: HttpAction): HttpRequestBase = {
+
+ val realURL = getRequestUrl(requestAction)
+ tryLogin(requestAction, realURL, false)
val request = requestAction match {
case delete: DeleteAction =>
val builder = new URIBuilder(realURL)
if (!delete.getParameters.isEmpty) {
- delete.getParameters.foreach { case (k, v) => if(k != null && v != null) builder.addParameter(k.toString, v.toString) }
+ delete.getParameters.foreach {
+ case (k, v) => if (k != null && v != null) builder.addParameter(k.toString, v.toString)
+ }
}
val httpDelete = new HttpDelete(builder.build())
if (requestAction.getHeaders.nonEmpty) {
- requestAction.getHeaders.foreach { case (k, v) => if(k != null && v != null) httpDelete.addHeader(k.toString, v.toString) }
+ requestAction.getHeaders.foreach {
+ case (k, v) => if (k != null && v != null) httpDelete.addHeader(k.toString, v.toString)
+ }
}
httpDelete
case put: PutAction =>
@@ -177,10 +217,14 @@ abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String
if (put.getParameters.nonEmpty || put.getFormParams.nonEmpty) {
val nameValuePairs = new util.ArrayList[NameValuePair]
if (put.getParameters.nonEmpty) {
- put.getParameters.foreach { case (k, v) => if(v != null) nameValuePairs.add(new BasicNameValuePair(k, v.toString)) }
+ put.getParameters.foreach {
+ case (k, v) => if (v != null) nameValuePairs.add(new BasicNameValuePair(k, v.toString))
+ }
}
if (put.getFormParams.nonEmpty) {
- put.getFormParams.foreach { case (k, v) => if(v != null) nameValuePairs.add(new BasicNameValuePair(k, v.toString)) }
+ put.getFormParams.foreach {
+ case (k, v) => if (v != null) nameValuePairs.add(new BasicNameValuePair(k, v.toString))
+ }
}
httpPut.setEntity(new UrlEncodedFormEntity(nameValuePairs))
}
@@ -193,27 +237,34 @@ abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String
}
if (requestAction.getHeaders.nonEmpty) {
- requestAction.getHeaders.foreach { case (k, v) => if(k != null && v != null) httpPut.addHeader(k.toString, v.toString) }
+ requestAction.getHeaders.foreach {
+ case (k, v) => if (k != null && v != null) httpPut.addHeader(k.toString, v.toString)
+ }
}
httpPut
case upload: UploadAction =>
val httpPost = new HttpPost(realURL)
val builder = MultipartEntityBuilder.create()
if (upload.inputStreams != null)
- upload.inputStreams.foreach { case (k, v) =>
- builder.addBinaryBody(k, v, ContentType.create("multipart/form-data"), k)
+ upload.inputStreams.foreach {
+ case (k, v) =>
+ builder.addBinaryBody(k, v, ContentType.create("multipart/form-data"), k)
}
upload.binaryBodies.foreach(binaryBody => builder.addBinaryBody(binaryBody.parameterName, binaryBody.inputStream, binaryBody.contentType, binaryBody.fileName))
upload match {
case get: GetAction => get.getParameters.
retain((k, v) => v != null && k != null).
- foreach { case (k, v) => if(k != null && v != null) builder.addTextBody(k.toString, v.toString) }
+ foreach {
+ case (k, v) => if (k != null && v != null) builder.addTextBody(k.toString, v.toString)
+ }
case _ =>
}
upload match {
case get: GetAction => get.getHeaders.
retain((k, v) => v != null && k != null).
- foreach { case (k, v) => if(k != null && v != null) httpPost.addHeader(k.toString, v.toString) }
+ foreach {
+ case (k, v) => if (k != null && v != null) httpPost.addHeader(k.toString, v.toString)
+ }
case _ =>
}
val httpEntity = builder.build()
@@ -224,15 +275,21 @@ abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String
if (post.getParameters.nonEmpty || post.getFormParams.nonEmpty) {
val nvps = new util.ArrayList[NameValuePair]
if (post.getParameters.nonEmpty) {
- post.getParameters.foreach { case (k, v) => if(v != null) nvps.add(new BasicNameValuePair(k, v.toString)) }
- }
- if (post.getFormParams.nonEmpty) {
- post.getFormParams.foreach { case (k, v) => if(v != null) nvps.add(new BasicNameValuePair(k, v.toString)) }
+ post.getParameters.foreach {
+ case (k, v) => if (v != null) nvps.add(new BasicNameValuePair(k, v.toString))
+ }
+ httpPost.setEntity(new UrlEncodedFormEntity(nvps))
+ } else if (post.getFormParams.nonEmpty) {
+ post.getFormParams.foreach {
+ case (k, v) => if (v != null) nvps.add(new BasicNameValuePair(k, v.toString))
+ }
+ val entity: HttpEntity = EntityBuilder.create(). /*setContentEncoding("UTF-8").*/
+ setContentType(ContentType.create("application/x-www-form-urlencoded", Consts.UTF_8))
+ .setParameters(nvps).build();
+ httpPost.setEntity(entity)
}
- httpPost.setEntity(new UrlEncodedFormEntity(nvps))
- }
- if (StringUtils.isNotBlank(post.getRequestPayload)) {
+ } else if (StringUtils.isNotBlank(post.getRequestPayload)) {
val stringEntity = new StringEntity(post.getRequestPayload, "UTF-8")
stringEntity.setContentEncoding(Configuration.BDP_ENCODING.getValue)
stringEntity.setContentType("application/json")
@@ -240,17 +297,23 @@ abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String
}
if (requestAction.getHeaders.nonEmpty) {
- requestAction.getHeaders.foreach { case (k, v) => if(k != null && v != null) httpPost.addHeader(k.toString, v.toString) }
+ requestAction.getHeaders.foreach {
+ case (k, v) => if (k != null && v != null) httpPost.addHeader(k.toString, v.toString)
+ }
}
httpPost
case get: GetAction =>
val builder = new URIBuilder(realURL)
if (!get.getParameters.isEmpty) {
- get.getParameters.foreach { case (k, v) => if(k != null && v != null) builder.addParameter(k.toString, v.toString) }
+ get.getParameters.foreach {
+ case (k, v) => if (k != null && v != null) builder.addParameter(k.toString, v.toString)
+ }
}
val httpGet = new HttpGet(builder.build())
if (requestAction.getHeaders.nonEmpty) {
- requestAction.getHeaders.foreach { case (k, v) => if(k != null && v != null) httpGet.addHeader(k.toString, v.toString) }
+ requestAction.getHeaders.foreach {
+ case (k, v) => if (k != null && v != null) httpGet.addHeader(k.toString, v.toString)
+ }
}
httpGet
case _ =>
@@ -260,7 +323,9 @@ abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String
stringEntity.setContentType("application/json")
httpost.setEntity(stringEntity)
if (requestAction.getHeaders.nonEmpty) {
- requestAction.getHeaders.foreach { case (k, v) => if(k != null && v != null) httpost.addHeader(k.toString, v.toString) }
+ requestAction.getHeaders.foreach {
+ case (k, v) => if (k != null && v != null) httpost.addHeader(k.toString, v.toString)
+ }
}
httpost
}
@@ -269,7 +334,6 @@ abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String
protected def getFsByUser(user: String, path: FsPath): Fs
-
protected def executeRequest(req: HttpRequestBase, waitTime: Option[Long]): CloseableHttpResponse = {
val readTimeOut = waitTime.getOrElse(clientConfig.getReadTimeout)
val connectTimeOut = if (clientConfig.getConnectTimeout > 1000 || clientConfig.getConnectTimeout < 0) clientConfig.getConnectTimeout else CONNECT_TIME_OUT
@@ -278,10 +342,38 @@ abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String
.setConnectionRequestTimeout(connectTimeOut.toInt)
.setSocketTimeout(readTimeOut.toInt).build
req.setConfig(requestConfig)
- val response = httpClient.execute(req)
+ val response = try {
+ httpClient.execute(req)
+ } catch {
+ case connectionPoolTimeOutException: ConnectionPoolTimeoutException =>
+ val serverUrl = getServerUrl(req.getURI)
+ addUnHealThyUrlToDiscovery(serverUrl)
+ logger.warn("will be server url add unhealthy for connectionPoolTimeOutException")
+ throw new HttpClientRetryException("connectionPoolTimeOutException", connectionPoolTimeOutException)
+ case connectionTimeOutException: ConnectTimeoutException =>
+ val serverUrl = getServerUrl(req.getURI)
+ addUnHealThyUrlToDiscovery(serverUrl)
+ logger.warn("will be server url add unhealthy for connectionTimeOutException")
+ throw new HttpClientRetryException("connectionTimeOutException", connectionTimeOutException)
+ case httpHostConnectException: HttpHostConnectException =>
+ val serverUrl = getServerUrl(req.getURI)
+ addUnHealThyUrlToDiscovery(serverUrl)
+ logger.warn("will be server url add unhealthy for httpHostConnectException")
+ throw new HttpClientRetryException("httpHostConnectException", httpHostConnectException)
+ case t: Throwable =>
+ throw t
+ }
response
}
+ private def addUnHealThyUrlToDiscovery(serverUrl: String): Unit = {
+ discovery.foreach {
+ case d: AbstractDiscovery =>
+ d.addUnhealthyServerInstances(serverUrl)
+ case _ =>
+ }
+ }
+
protected def executeRequest(req: HttpRequestBase, waitTime: Option[Long], cookieStore: CookieStore): CloseableHttpResponse = {
val readTimeOut = waitTime.getOrElse(clientConfig.getReadTimeout)
val connectTimeOut = if (clientConfig.getConnectTimeout > 1000 || clientConfig.getConnectTimeout < 0) clientConfig.getConnectTimeout else CONNECT_TIME_OUT
@@ -306,13 +398,12 @@ abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String
}
throw new HttpClientResultException(s"request failed! ResponseBody is $responseBody.")
}
- val inputStream = if(entity.getContentEncoding != null && StringUtils.isNotBlank(entity.getContentEncoding.getValue))
- entity.getContentEncoding.getValue.toLowerCase match {
- case "gzip" => new GzipDecompressingEntity(entity).getContent
- case "deflate" => new DeflateDecompressingEntity(entity).getContent
- case str => throw new HttpClientResultException(s"request failed! Reason: not support decompress type $str.")
- } else entity.getContent
- download.write(inputStream)
+ val inputStream = if (entity.getContentEncoding != null && StringUtils.isNotBlank(entity.getContentEncoding.getValue)) entity.getContentEncoding.getValue.toLowerCase match {
+ case "gzip" => new GzipDecompressingEntity(entity).getContent
+ case "deflate" => new DeflateDecompressingEntity(entity).getContent
+ case str => throw new HttpClientResultException(s"request failed! Reason: not support decompress type $str.")
+ } else entity.getContent
+ download.write(inputStream, response)
Result()
case heartbeat: HeartbeatAction =>
discovery.map {
@@ -331,6 +422,13 @@ abstract class AbstractHttpClient(clientConfig: ClientConfig, clientName: String
httpResponseToResult(response, httpAction, responseBody)
.getOrElse(throw new HttpMessageParseException("cannot parse message: " + responseBody))
}
+ if (!requestAction.isInstanceOf[DownloadAction]) {
+ response match {
+ case r: CloseableHttpResponse =>
+ r.close()
+ case _ =>
+ }
+ }
result match {
case userAction: UserAction => requestAction match {
case _userAction: UserAction => userAction.setUser(_userAction.getUser)
diff --git a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/authentication/AbstractAuthenticationStrategy.scala b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/authentication/AbstractAuthenticationStrategy.scala
index 53e8aa9..b7e9082 100644
--- a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/authentication/AbstractAuthenticationStrategy.scala
+++ b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/authentication/AbstractAuthenticationStrategy.scala
@@ -18,21 +18,22 @@
package org.apache.linkis.httpclient.authentication
import java.util.concurrent.ConcurrentHashMap
-
import org.apache.linkis.httpclient.Client
import org.apache.linkis.httpclient.config.ClientConfig
import org.apache.linkis.httpclient.request.{Action, UserAction}
import org.apache.commons.lang.StringUtils
import org.apache.http.HttpResponse
+import org.apache.linkis.common.utils.Logging
-abstract class AbstractAuthenticationStrategy extends AuthenticationStrategy {
+abstract class AbstractAuthenticationStrategy extends AuthenticationStrategy with Logging{
private var client: Client = _
private val userNameToAuthentications = new ConcurrentHashMap[String, Authentication]()
private var clientConfig: ClientConfig = _
protected val sessionMaxAliveTime: Long
def setClient(client: Client): Unit = this.client = client
+
def getClient: Client = client
protected def getKeyByUserAndURL(user: String, serverUrl: String): String = user + "@" + serverUrl
@@ -46,25 +47,27 @@ abstract class AbstractAuthenticationStrategy extends AuthenticationStrategy {
protected def getKey(requestAction: Action, serverUrl: String): String = {
val user = getUser(requestAction)
- if(user == null) return null
+ if (user == null) return null
getKeyByUserAndURL(user, serverUrl)
}
def setClientConfig(clientConfig: ClientConfig): Unit = this.clientConfig = clientConfig
+
def getClientConfig: ClientConfig = clientConfig
def login(requestAction: Action, serverUrl: String): Authentication = {
val key = getKey(requestAction, serverUrl)
- if(key == null) return null
- if(userNameToAuthentications.containsKey(key) && !isTimeout(userNameToAuthentications.get(key))) {
+ if (key == null) return null
+ if (userNameToAuthentications.containsKey(key) && !isTimeout(userNameToAuthentications.get(key))) {
val authenticationAction = userNameToAuthentications.get(key)
authenticationAction.updateLastAccessTime()
authenticationAction
} else key.intern() synchronized {
var authentication = userNameToAuthentications.get(key)
- if(authentication == null || isTimeout(authentication)) {
+ if (authentication == null || isTimeout(authentication)) {
authentication = tryLogin(requestAction, serverUrl)
- userNameToAuthentications.put(key, authentication)
+ putSession(key, authentication)
+ logger.info(s"$key try reLogin")
}
authentication
}
@@ -77,9 +80,23 @@ abstract class AbstractAuthenticationStrategy extends AuthenticationStrategy {
}
}
+ /**
+ * The static account password method, when the return code is determined to be 401, a mandatory login is triggered
+ * @param requestAction
+ * @param serverUrl
+ * @return
+ */
+ def enforceLogin(requestAction: Action, serverUrl: String): Authentication = {
+ login(requestAction, serverUrl)
+ }
+
protected def getAuthenticationAction(requestAction: Action, serverUrl: String): AuthenticationAction
def getAuthenticationResult(response: HttpResponse, requestAction: AuthenticationAction): AuthenticationResult
def isTimeout(authentication: Authentication): Boolean = System.currentTimeMillis() - authentication.getLastAccessTime >= sessionMaxAliveTime
+
+ def putSession(key: String, authentication: Authentication): Unit = {
+ this.userNameToAuthentications.put(key, authentication)
+ }
}
\ No newline at end of file
diff --git a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/config/ClientConfig.scala b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/config/ClientConfig.scala
index 5f9ea81..f117d1b 100644
--- a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/config/ClientConfig.scala
+++ b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/config/ClientConfig.scala
@@ -14,9 +14,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
package org.apache.linkis.httpclient.config
+import org.apache.commons.lang.StringUtils
import org.apache.linkis.common.utils.RetryHandler
import org.apache.linkis.httpclient.authentication.{AbstractAuthenticationStrategy, AuthenticationStrategy}
import org.apache.linkis.httpclient.loadbalancer.LoadBalancerStrategy
@@ -25,6 +26,7 @@ import scala.concurrent.duration.TimeUnit
class ClientConfig private() {
+
private var serverUrl: String = _
private var discoveryEnabled: Boolean = false
private var discoveryPeriod: Long = _
@@ -36,7 +38,7 @@ class ClientConfig private() {
private var authTokenValue: String = _
private var connectTimeout: Long = _
private var readTimeout: Long = _
- private var maxConnection: Int = _
+ private var maxConnection: Int = 20
private var retryEnabled: Boolean = _
private var retryHandler: RetryHandler = _
@@ -46,7 +48,9 @@ class ClientConfig private() {
authTokenKey: String, authTokenValue: String) = {
this()
this.serverUrl = serverUrl
+
this.discoveryEnabled = discoveryEnabled
+
this.discoveryPeriod = discoveryPeriod
this.discoveryTimeUnit = discoveryTimeUnit
this.loadbalancerEnabled = loadbalancerEnabled
@@ -66,18 +70,39 @@ class ClientConfig private() {
}
def getServerUrl = serverUrl
+
+ def getDefaultServerUrl: String = {
+ if (StringUtils.isNotBlank(serverUrl) && serverUrl.contains(HttpClientConstant.URL_SPLIT_TOKEN)) {
+ serverUrl.split(HttpClientConstant.URL_SPLIT_TOKEN)(0)
+ } else {
+ serverUrl
+ }
+ }
+
def isDiscoveryEnabled = discoveryEnabled
+
def getDiscoveryPeriod = discoveryPeriod
+
def getDiscoveryTimeUnit = discoveryTimeUnit
+
def isLoadbalancerEnabled = loadbalancerEnabled
+
def getLoadbalancerStrategy = loadbalancerStrategy
+
def getAuthenticationStrategy = authenticationStrategy
+
def getAuthTokenKey: String = authTokenKey
+
def getAuthTokenValue: String = authTokenValue
+
def getConnectTimeout = connectTimeout
+
def getReadTimeout = readTimeout
+
def getMaxConnection = maxConnection
+
def isRetryEnabled = retryEnabled
+
def getRetryHandler = retryHandler
}
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/exception/ClientErrorException.scala b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/config/HttpClientConstant.scala
similarity index 78%
rename from linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/exception/ClientErrorException.scala
rename to linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/config/HttpClientConstant.scala
index a73d6c9..3181f81 100644
--- a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/exception/ClientErrorException.scala
+++ b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/config/HttpClientConstant.scala
@@ -5,18 +5,20 @@
* 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.linkis.entranceclient.exception
-import org.apache.linkis.common.exception.ErrorException
+package org.apache.linkis.httpclient.config
-class ClientErrorException(errorCode: Int, desc: String) extends ErrorException(errorCode, desc)
\ No newline at end of file
+object HttpClientConstant {
+ val URL_SPLIT_TOKEN = ","
+
+ val PATH_SPLIT_TOKEN = "/"
+}
diff --git a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/discovery/AbstractDiscovery.scala b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/discovery/AbstractDiscovery.scala
index cc74114..19a3215 100644
--- a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/discovery/AbstractDiscovery.scala
+++ b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/discovery/AbstractDiscovery.scala
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
package org.apache.linkis.httpclient.discovery
import java.io.Closeable
@@ -22,10 +22,12 @@ import java.net.ConnectException
import java.util
import java.util.concurrent.ScheduledFuture
+import org.apache.commons.lang.StringUtils
import org.apache.linkis.common.utils.{Logging, Utils}
import org.apache.linkis.httpclient.Client
import org.apache.linkis.httpclient.exception.DiscoveryException
import org.apache.http.HttpResponse
+import org.apache.linkis.httpclient.config.HttpClientConstant
import scala.collection.JavaConversions._
import scala.concurrent.duration.TimeUnit
@@ -45,9 +47,11 @@ abstract class AbstractDiscovery extends Discovery with Closeable with Logging {
private var heartbeatFuture: ScheduledFuture[_] = _
private var unhealthyHeartbeatFuture: ScheduledFuture[_] = _
+
override def setServerUrl(serverUrl: String): Unit = {
this.serverUrl = serverUrl
}
+
def getServerUrl: String = serverUrl
def setSchedule(period: Long, timeUnit: TimeUnit): Unit = {
@@ -56,59 +60,67 @@ abstract class AbstractDiscovery extends Discovery with Closeable with Logging {
}
def setClient(client: Client): Unit = this.client = client
+
def getClient: Client = client
override def start(): Unit = {
- client.execute(getHeartbeatAction(serverUrl), 3000) match {
- case heartbeat: HeartbeatResult => if(!heartbeat.isHealthy)
- throw new DiscoveryException(s"connect to serverUrl $serverUrl failed! Reason: gateway server is unhealthy!")
- else discoveryListeners.foreach(_.onServerDiscovered(serverUrl))
- }
- val delayTime = timeUnit.convert(timeUnit.toMillis(period)/5, timeUnit)
- discoveryFuture = Utils.defaultScheduler.scheduleAtFixedRate(new Runnable {
- override def run(): Unit = Utils.tryAndWarn {
- val serverUrls = discovery()
- serverInstances synchronized serverUrls.foreach { serverUrl =>
- if(!serverInstances.contains(serverUrl)) {
- serverInstances.add(serverUrl)
- discoveryListeners.foreach(_.onServerDiscovered(serverUrl))
- }
- }
- }
- }, delayTime, period, timeUnit)
- heartbeatFuture = Utils.defaultScheduler.scheduleAtFixedRate(new Runnable {
+ val delayTime = timeUnit.convert(timeUnit.toMillis(period) / 5, timeUnit)
+ discoveryFuture = startDiscovery()
+ heartbeatFuture = startHealthyCheck(delayTime)
+ unhealthyHeartbeatFuture = startUnHealthyCheck(delayTime)
+ }
+
+ def startHealthyCheck(delayTime: Long): ScheduledFuture[_] = {
+ logger.info("start HealthyCheck thread")
+ Utils.defaultScheduler.scheduleAtFixedRate(new Runnable {
override def run(): Unit = {
serverInstances.toList.foreach { serverUrl =>
val action = getHeartbeatAction(serverUrl)
- info("heartbeat to healthy gateway " + serverUrl)
+ logger.info("heartbeat to healthy gateway " + serverUrl)
Utils.tryCatch(client.execute(action, 3000) match {
case heartbeat: HeartbeatResult =>
- if(!heartbeat.isHealthy) {
- unhealthyServerInstances synchronized unhealthyServerInstances.add(serverUrl)
- discoveryListeners.foreach(_.onServerUnhealthy(serverUrl))
- serverInstances synchronized serverInstances.remove(serverUrl)
+ if (!heartbeat.isHealthy) {
+ addUnhealthyServerInstances(serverUrl)
}
}) {
case _: ConnectException =>
- unhealthyServerInstances synchronized unhealthyServerInstances.remove(serverUrl)
- serverInstances synchronized serverInstances.remove(serverUrl)
- discoveryListeners.foreach(_.onServerUnconnected(serverUrl))
+ addUnhealthyServerInstances(serverUrl)
}
}
}
}, delayTime, period, timeUnit)
- unhealthyHeartbeatFuture = Utils.defaultScheduler.scheduleAtFixedRate(new Runnable {
+ }
+
+ def startDiscovery(): ScheduledFuture[_] = {
+ logger.info("start Discovery thread")
+ client.execute(getHeartbeatAction(serverUrl), 3000) match {
+ case heartbeat: HeartbeatResult => if (!heartbeat.isHealthy) throw new DiscoveryException(s"connect to serverUrl $serverUrl failed! Reason: gateway server is unhealthy!")
+ else discoveryListeners.foreach(_.onServerDiscovered(serverUrl))
+ }
+
+ Utils.defaultScheduler.scheduleAtFixedRate(new Runnable {
+ override def run(): Unit = Utils.tryAndWarn {
+ logger.info("to discovery gateway" + serverUrl)
+ val serverUrls = discovery()
+ addServerInstances(serverUrls)
+ }
+ }, 1, period + 30, timeUnit)
+ }
+
+ def startUnHealthyCheck(delayTime: Long): ScheduledFuture[_] = {
+ logger.info("start UnHealthyCheck thread")
+ Utils.defaultScheduler.scheduleAtFixedRate(new Runnable {
override def run(): Unit = {
unhealthyServerInstances.toList.foreach { serverUrl =>
val action = getHeartbeatAction(serverUrl)
- info("heartbeat to unhealthy gateway " + serverUrl)
+ logger.info("heartbeat to unhealthy gateway " + serverUrl)
Utils.tryCatch(client.execute(action, 3000) match {
case heartbeat: HeartbeatResult =>
- if(heartbeat.isHealthy) {
+ if (heartbeat.isHealthy) {
unhealthyServerInstances synchronized unhealthyServerInstances.remove(serverUrl)
discoveryListeners.foreach(_.onServerHealthy(serverUrl))
serverInstances synchronized serverInstances.add(serverUrl)
- } else if(serverInstances.contains(serverUrl)) serverInstances synchronized serverInstances.remove(serverUrl)
+ } else if (serverInstances.contains(serverUrl)) serverInstances synchronized serverInstances.remove(serverUrl)
}) {
case _: ConnectException =>
unhealthyServerInstances synchronized unhealthyServerInstances.remove(serverUrl)
@@ -132,8 +144,38 @@ abstract class AbstractDiscovery extends Discovery with Closeable with Logging {
override def getServerInstances: Array[String] = serverInstances.toArray(new Array[String](serverInstances.size()))
override def close(): Unit = {
- discoveryFuture.cancel(true)
- heartbeatFuture.cancel(true)
- unhealthyHeartbeatFuture.cancel(true)
+ if (null != discoveryFuture) discoveryFuture.cancel(true)
+ if (null != heartbeatFuture) heartbeatFuture.cancel(true)
+ if (null != unhealthyHeartbeatFuture) unhealthyHeartbeatFuture.cancel(true)
}
+
+ def addUnhealthyServerInstances(unhealthyUrl: String): Unit = {
+ logger.info(s"add ${unhealthyUrl} to unhealthy list ")
+ val updateUnhealthyUrl = if (serverInstances.contains(unhealthyUrl)) {
+ unhealthyUrl
+ } else if (serverInstances.contains(unhealthyUrl + HttpClientConstant.PATH_SPLIT_TOKEN)) {
+ unhealthyUrl + HttpClientConstant.PATH_SPLIT_TOKEN
+ } else {
+ ""
+ }
+ if (StringUtils.isBlank(updateUnhealthyUrl)) {
+ logger.info(s"${unhealthyUrl} unhealthy url not exists")
+ } else {
+ unhealthyServerInstances synchronized unhealthyServerInstances.add(updateUnhealthyUrl)
+ discoveryListeners.foreach(_.onServerUnhealthy(updateUnhealthyUrl))
+ serverInstances synchronized serverInstances.remove(updateUnhealthyUrl)
+ }
+ }
+
+ def addServerInstances(serverUrls: Array[String]): Unit = {
+ serverInstances synchronized serverUrls.foreach { url =>
+ if (!serverInstances.contains(url)) {
+ val parsedUrl = if (url.endsWith(HttpClientConstant.PATH_SPLIT_TOKEN)) url.substring(0, url.length - 1)
+ else url
+ serverInstances.add(parsedUrl)
+ discoveryListeners.foreach(_.onServerDiscovered(parsedUrl))
+ }
+ }
+ }
+
}
diff --git a/linkis-computation-governance/linkis-manager/linkis-application-manager/src/main/scala/org/apache/linkis/manager/am/service/engine/EngineReuseService.scala b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/exception/HttpClientRetryException.scala
similarity index 72%
copy from linkis-computation-governance/linkis-manager/linkis-application-manager/src/main/scala/org/apache/linkis/manager/am/service/engine/EngineReuseService.scala
copy to linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/exception/HttpClientRetryException.scala
index 903a41f..dc023f0 100644
--- a/linkis-computation-governance/linkis-manager/linkis-application-manager/src/main/scala/org/apache/linkis/manager/am/service/engine/EngineReuseService.scala
+++ b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/exception/HttpClientRetryException.scala
@@ -5,26 +5,25 @@
* 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.linkis.manager.am.service.engine
-import org.apache.linkis.common.exception.LinkisRetryException
-import org.apache.linkis.manager.common.entity.node.EngineNode
-import org.apache.linkis.manager.common.protocol.engine.EngineReuseRequest
+package org.apache.linkis.httpclient.exception
+import org.apache.linkis.common.exception.LinkisRetryException
-trait EngineReuseService {
+class HttpClientRetryException(errorDesc: String) extends LinkisRetryException(10900, errorDesc) {
- @throws[LinkisRetryException]
- def reuseEngine(engineReuseRequest: EngineReuseRequest): EngineNode
+ def this(errorDesc: String, throwable: Throwable) = {
+ this(errorDesc)
+ initCause(throwable)
+ }
}
diff --git a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/loadbalancer/DefaultLoadbalancerStrategy.scala b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/loadbalancer/DefaultLoadbalancerStrategy.scala
index ff48947..d2a0ab3 100644
--- a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/loadbalancer/DefaultLoadbalancerStrategy.scala
+++ b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/loadbalancer/DefaultLoadbalancerStrategy.scala
@@ -25,6 +25,9 @@ object DefaultLoadbalancerStrategy extends LoadBalancerStrategy {
override def chooseServerUrl(requestBody: String): String = {
val serverUrls = getAllServerUrls.filterNot(getAllUnhealthyServerUrls.contains)
+ if (serverUrls.isEmpty) {
+ return null
+ }
Random.shuffle(serverUrls.toList).head
}
diff --git a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/request/DownloadAction.scala b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/request/DownloadAction.scala
index 5824db9..5826bcd 100644
--- a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/request/DownloadAction.scala
+++ b/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/request/DownloadAction.scala
@@ -17,11 +17,22 @@
package org.apache.linkis.httpclient.request
+import org.apache.http.HttpResponse
+import org.apache.linkis.common.utils.Logging
+
import scala.tools.nsc.interpreter.InputStream
-trait DownloadAction {
+trait DownloadAction extends Logging {
+
+ def getResponse: HttpResponse
+
+ def setResponse(response: HttpResponse)
def write(inputStream: InputStream): Unit
+ def write(inputStream: InputStream, response: HttpResponse): Unit = {
+ write(inputStream)
+ setResponse(response)
+ }
}
diff --git a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/conf/ServerConfiguration.scala b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/conf/ServerConfiguration.scala
index 6e077a2..921b0d1 100644
--- a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/conf/ServerConfiguration.scala
+++ b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/conf/ServerConfiguration.scala
@@ -100,4 +100,6 @@ object ServerConfiguration extends Logging{
val BDP_SERVER_RESTFUL_REGISTER_CLASSES = CommonVars("wds.linkis.server.restful.register.classes", "")
// val BDP_SERVER_SOCKET_SERVICE_SCAN_PACKAGES = CommonVars("wds.linkis.server.socket.service.scan.packages", BDP_SERVER_RESTFUL_SCAN_PACKAGES.getValue)
val IS_GATEWAY = CommonVars("wds.linkis.is.gateway", "false")
+ val BDP_SERVER_WEB_ALLOW_ORIGIN = CommonVars("wds.linkis.server.web.alloworigin", "*")
+ val BDP_SERVER_WEB_ALLOW_METHOD = CommonVars("wds.linkis.server.web.allowmethod", "POST,GET,OPTIONS,PUT,HEAD,DELETE")
}
diff --git a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SSOUtils.scala b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SSOUtils.scala
index fbd32bd..c7933ca 100644
--- a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SSOUtils.scala
+++ b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SSOUtils.scala
@@ -151,4 +151,6 @@ object SSOUtils extends Logging {
}
}
+ def getSessionTimeOut(): Long = sessionTimeout
+
}
diff --git a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SecurityFilter.scala b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SecurityFilter.scala
index 64a6043..d9cce5d 100644
--- a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SecurityFilter.scala
+++ b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SecurityFilter.scala
@@ -106,10 +106,10 @@ class SecurityFilter extends Filter {
}
protected def addAccessHeaders(response: HttpServletResponse) {
- response.setHeader("Access-Control-Allow-Origin", "*")
+ response.setHeader("Access-Control-Allow-Origin", ServerConfiguration.BDP_SERVER_WEB_ALLOW_ORIGIN.getValue)
response.setHeader("Access-Control-Allow-Credentials", "true")
response.setHeader("Access-Control-Allow-Headers", "authorization,Content-Type")
- response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, HEAD, DELETE")
+ response.setHeader("Access-Control-Allow-Methods", ServerConfiguration.BDP_SERVER_WEB_ALLOW_METHOD.getValue)
val fullDateFormatEN = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, new Locale("EN", "en"))
response.setHeader("Date", fullDateFormatEN.format(new Date))
}
diff --git a/linkis-commons/linkis-mybatis/pom.xml b/linkis-commons/linkis-mybatis/pom.xml
index c89898c..9225593 100644
--- a/linkis-commons/linkis-mybatis/pom.xml
+++ b/linkis-commons/linkis-mybatis/pom.xml
@@ -69,6 +69,13 @@
<artifactId>pagehelper</artifactId>
<version>5.1.4</version>
</dependency>
+
+ <dependency>
+ <groupId>com.alibaba</groupId>
+ <artifactId>druid</artifactId>
+ <version>${druid.version}</version>
+ </dependency>
+
</dependencies>
<build>
<plugins>
diff --git a/linkis-commons/linkis-mybatis/src/main/java/org/apache/linkis/mybatis/DataSourceConfig.java b/linkis-commons/linkis-mybatis/src/main/java/org/apache/linkis/mybatis/DataSourceConfig.java
index 9144b35..69bfb6e 100644
--- a/linkis-commons/linkis-mybatis/src/main/java/org/apache/linkis/mybatis/DataSourceConfig.java
+++ b/linkis-commons/linkis-mybatis/src/main/java/org/apache/linkis/mybatis/DataSourceConfig.java
@@ -20,8 +20,6 @@ package org.apache.linkis.mybatis;
import org.apache.linkis.common.utils.JavaLog;
import org.apache.linkis.mybatis.conf.MybatisConfiguration;
-import org.apache.commons.dbcp.BasicDataSource;
-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
@@ -29,6 +27,7 @@ import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
+import com.alibaba.druid.pool.DruidDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -69,7 +68,7 @@ public class DataSourceConfig extends JavaLog {
MybatisConfiguration.MYBATIS_DATASOURCE_REMOVE_ABANDONED_ENABLED.getValue();
int removeAbandonedTimeout =
MybatisConfiguration.MYBATIS_DATASOURCE_REMOVE_ABANDONED_TIMEOUT.getValue();
- BasicDataSource datasource = new BasicDataSource();
+ DruidDataSource datasource = new DruidDataSource();
info("Database connection address information(数据库连接地址信息)=" + dbUrl);
datasource.setUrl(dbUrl);
datasource.setUsername(username);
diff --git a/linkis-commons/linkis-protocol/src/main/java/org/apache/linkis/protocol/constants/TaskConstant.java b/linkis-commons/linkis-protocol/src/main/java/org/apache/linkis/protocol/constants/TaskConstant.java
index 88d3e07..f5cca82 100644
--- a/linkis-commons/linkis-protocol/src/main/java/org/apache/linkis/protocol/constants/TaskConstant.java
+++ b/linkis-commons/linkis-protocol/src/main/java/org/apache/linkis/protocol/constants/TaskConstant.java
@@ -54,6 +54,12 @@ public interface TaskConstant {
String ENTRANCEJOB_SCHEDULE_TIME = "scheduleTime";
String ENTRANCEJOB_TO_ORCHESTRATOR = "timeToOrchestrator";
String ENTRANCEJOB_COMPLETE_TIME = "completeTime";
+ String ENTRANCEJOB_YARN_METRICS = "yarnMetrics";
+ String ENTRANCEJOB_YARNRESOURCE = "yarnResource";
+ String ENTRANCEJOB_CORE_PERCENT = "corePercent";
+ String ENTRANCEJOB_MEMORY_PERCENT = "memoryPercent";
+ String ENTRANCEJOB_CORE_RGB = "coreRGB";
+ String ENTRANCEJOB_MEMORY_RGB = "memoryRGB";
String PARAMS_DATA_SOURCE = "dataSources";
diff --git a/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/NoneDelegate.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/NoneDelegate.java
index 2394bae..2813cc8 100644
--- a/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/NoneDelegate.java
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/NoneDelegate.java
@@ -50,32 +50,4 @@ public class NoneDelegate implements Delegate<Option> {
public Class<?> typeClass() {
return Option.class;
}
-
- /*@Override
- public WireFormat.FieldType getFieldType() {
- return WireFormat.FieldType.UINT32;
- }
-
- @Override
- public None$ readFrom(Input input) throws IOException {
- if(0 != input.readUInt32())
- throw new ProtostuffException("Corrupt input.");
-
- return None$.MODULE$;
- }
-
- @Override
- public void writeTo(Output output, int number, None$ none$, boolean repeated) throws IOException {
- output.writeFixed64(number, 0, repeated);
- }
-
- @Override
- public void transfer(Pipe pipe, Input input, Output output, int number, boolean repeated) throws IOException {
- output.writeUInt32(number, input.readUInt32(), repeated);
- }
-
- @Override
- public Class<?> typeClass() {
- return None$.class;
- }*/
}
diff --git a/linkis-computation-governance/linkis-manager/linkis-manager-client/src/main/java/org/apache/linkis/manager/client/annotation/resource/RegisterResource.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/annotation/Chain.java
similarity index 89%
copy from linkis-computation-governance/linkis-manager/linkis-manager-client/src/main/java/org/apache/linkis/manager/client/annotation/resource/RegisterResource.java
copy to linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/annotation/Chain.java
index 8948f80..43d537f 100644
--- a/linkis-computation-governance/linkis-manager/linkis-manager-client/src/main/java/org/apache/linkis/manager/client/annotation/resource/RegisterResource.java
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/annotation/Chain.java
@@ -5,25 +5,26 @@
* 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.linkis.manager.client.annotation.resource;
+
+package org.apache.linkis.rpc.serializer.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
-public @interface RegisterResource {
+public @interface Chain {
+
+ String value() default "default";
}
diff --git a/linkis-computation-governance/linkis-manager/linkis-manager-client/src/main/java/org/apache/linkis/manager/client/annotation/resource/EnableResourceManager.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/annotation/Method.java
similarity index 89%
rename from linkis-computation-governance/linkis-manager/linkis-manager-client/src/main/java/org/apache/linkis/manager/client/annotation/resource/EnableResourceManager.java
rename to linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/annotation/Method.java
index 817d6da..c1083ba 100644
--- a/linkis-computation-governance/linkis-manager/linkis-manager-client/src/main/java/org/apache/linkis/manager/client/annotation/resource/EnableResourceManager.java
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/annotation/Method.java
@@ -5,25 +5,25 @@
* 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.linkis.manager.client.annotation.resource;
+
+package org.apache.linkis.rpc.serializer.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
-public @interface EnableResourceManager {
-}
\ No newline at end of file
+public @interface Method {
+ String value() default "";
+}
diff --git a/linkis-computation-governance/linkis-manager/linkis-manager-client/src/main/java/org/apache/linkis/manager/client/annotation/resource/RegisterResource.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/annotation/Order.java
similarity index 89%
copy from linkis-computation-governance/linkis-manager/linkis-manager-client/src/main/java/org/apache/linkis/manager/client/annotation/resource/RegisterResource.java
copy to linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/annotation/Order.java
index 8948f80..8155760 100644
--- a/linkis-computation-governance/linkis-manager/linkis-manager-client/src/main/java/org/apache/linkis/manager/client/annotation/resource/RegisterResource.java
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/annotation/Order.java
@@ -5,25 +5,25 @@
* 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.linkis.manager.client.annotation.resource;
+
+package org.apache.linkis.rpc.serializer.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
-public @interface RegisterResource {
+public @interface Order {
+ int value() default 2147483647;
}
diff --git a/linkis-computation-governance/linkis-manager/linkis-manager-client/src/main/java/org/apache/linkis/manager/client/annotation/resource/RegisterResource.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/annotation/Receiver.java
similarity index 90%
rename from linkis-computation-governance/linkis-manager/linkis-manager-client/src/main/java/org/apache/linkis/manager/client/annotation/resource/RegisterResource.java
rename to linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/annotation/Receiver.java
index 8948f80..9440501 100644
--- a/linkis-computation-governance/linkis-manager/linkis-manager-client/src/main/java/org/apache/linkis/manager/client/annotation/resource/RegisterResource.java
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/annotation/Receiver.java
@@ -5,25 +5,23 @@
* 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.linkis.manager.client.annotation.resource;
+
+package org.apache.linkis.rpc.serializer.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
-public @interface RegisterResource {
-}
+public @interface Receiver {}
diff --git a/linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-resource-manager-common/src/main/java/org/apache/linkis/resourcemanager/exception/RMErrorException.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/exception/MessageErrorException.java
similarity index 71%
copy from linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-resource-manager-common/src/main/java/org/apache/linkis/resourcemanager/exception/RMErrorException.java
copy to linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/exception/MessageErrorException.java
index e7faa9d..3335e65 100644
--- a/linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-resource-manager-common/src/main/java/org/apache/linkis/resourcemanager/exception/RMErrorException.java
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/exception/MessageErrorException.java
@@ -15,22 +15,18 @@
* limitations under the License.
*/
-package org.apache.linkis.resourcemanager.exception;
+package org.apache.linkis.rpc.serializer.exception;
import org.apache.linkis.common.exception.ErrorException;
-public class RMErrorException extends ErrorException {
+public class MessageErrorException extends ErrorException {
- public RMErrorException(int errCode, String desc) {
+ public MessageErrorException(int errCode, String desc) {
super(errCode, desc);
}
- public RMErrorException(int errCode, String desc, Throwable t) {
+ public MessageErrorException(int errCode, String desc, Throwable t) {
super(errCode, desc);
initCause(t);
}
-
- public RMErrorException(int errCode, String desc, String ip, int port, String serviceKind) {
- super(errCode, desc, ip, port, serviceKind);
- }
}
diff --git a/linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-resource-manager-common/src/main/java/org/apache/linkis/resourcemanager/exception/RMWarnException.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/exception/MessageWarnException.java
similarity index 74%
copy from linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-resource-manager-common/src/main/java/org/apache/linkis/resourcemanager/exception/RMWarnException.java
copy to linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/exception/MessageWarnException.java
index 5c7aaa1..6b4f387 100644
--- a/linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-resource-manager-common/src/main/java/org/apache/linkis/resourcemanager/exception/RMWarnException.java
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/exception/MessageWarnException.java
@@ -15,17 +15,18 @@
* limitations under the License.
*/
-package org.apache.linkis.resourcemanager.exception;
+package org.apache.linkis.rpc.serializer.exception;
import org.apache.linkis.common.exception.WarnException;
-public class RMWarnException extends WarnException {
+public class MessageWarnException extends WarnException {
- public RMWarnException(int errCode, String desc) {
+ public MessageWarnException(int errCode, String desc) {
super(errCode, desc);
}
- public RMWarnException(int errCode, String desc, String ip, int port, String serviceKind) {
- super(errCode, desc, ip, port, serviceKind);
+ public MessageWarnException(int errCode, String desc, Throwable t) {
+ super(errCode, desc);
+ initCause(t);
}
}
diff --git a/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/method/MessageExecutor.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/method/MessageExecutor.java
new file mode 100644
index 0000000..fb858e6
--- /dev/null
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/method/MessageExecutor.java
@@ -0,0 +1,95 @@
+/*
+ * 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.linkis.rpc.serializer.method;
+
+import org.apache.linkis.common.utils.JavaLog;
+import org.apache.linkis.protocol.message.RequestProtocol;
+import org.apache.linkis.rpc.Sender;
+import org.apache.linkis.rpc.serializer.exception.MessageErrorException;
+import org.apache.linkis.rpc.serializer.exception.MessageWarnException;
+import org.apache.linkis.rpc.serializer.utils.MessageUtils;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class MessageExecutor extends JavaLog {
+
+ private List<MethodExecuteWrapper> getMinOrderMethodWrapper(
+ Map<String, List<MethodExecuteWrapper>> methodWrappers) {
+ // get min key order
+ List<MethodExecuteWrapper> minOrderMethodWrapper = new ArrayList<>();
+ methodWrappers.forEach(
+ (k, v) ->
+ v.forEach(
+ m -> {
+ if (MessageUtils.orderIsMin(m, v)) {
+ minOrderMethodWrapper.add(m);
+ }
+ }));
+ return minOrderMethodWrapper;
+ }
+
+ public Object execute(
+ RequestProtocol requestProtocol,
+ Map<String, List<MethodExecuteWrapper>> methodWrappers,
+ Sender sender)
+ throws InterruptedException, MessageErrorException {
+ Integer count = methodWrappers.values().stream().map(List::size).reduce(0, Integer::sum);
+ if (count == 1) {
+ return executeOneMethod(requestProtocol, methodWrappers, sender);
+ } else {
+ throw new MessageErrorException(
+ 120001,
+ String.format(
+ "find %s method for the rpc request:%s",
+ count, requestProtocol.getClass().getName()));
+ }
+ }
+
+ private Object executeOneMethod(
+ RequestProtocol requestProtocol,
+ Map<String, List<MethodExecuteWrapper>> methodWrappers,
+ Sender sender) {
+ List<MethodExecuteWrapper> methodExecuteWrappers = getMinOrderMethodWrapper(methodWrappers);
+ Object result = null;
+ if (methodExecuteWrappers.size() == 1) {
+ MethodExecuteWrapper methodWrapper = methodExecuteWrappers.get(0);
+ try {
+ if (!methodWrapper.shouldSkip) {
+ Method method = methodWrapper.getMethod();
+ Object service = methodWrapper.getService();
+ if (methodWrapper.isHasSender()) {
+ if (methodWrapper.isSenderOnLeft()) {
+ result = method.invoke(service, sender, requestProtocol);
+ } else {
+ result = method.invoke(service, requestProtocol, sender);
+ }
+ } else {
+ result = method.invoke(service, requestProtocol);
+ }
+ }
+ } catch (Throwable t) {
+ logger().error(String.format("method %s call failed", methodWrapper.getAlias()), t);
+ throw new MessageWarnException(10000, "method call failed", t);
+ }
+ }
+ return result;
+ }
+}
diff --git a/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/method/MethodExecuteWrapper.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/method/MethodExecuteWrapper.java
new file mode 100644
index 0000000..075d4f7
--- /dev/null
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/method/MethodExecuteWrapper.java
@@ -0,0 +1,69 @@
+/*
+ * 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.linkis.rpc.serializer.method;
+
+import org.apache.linkis.rpc.serializer.parser.ServiceMethod;
+
+import java.lang.reflect.Method;
+
+public class MethodExecuteWrapper {
+
+ public MethodExecuteWrapper(ServiceMethod serviceMethod) {
+ this.serviceMethod = serviceMethod;
+ }
+
+ private final ServiceMethod serviceMethod;
+
+ public boolean shouldSkip;
+
+ public boolean isShouldSkip() {
+ return shouldSkip;
+ }
+
+ public void setShouldSkip(boolean shouldSkip) {
+ this.shouldSkip = shouldSkip;
+ }
+
+ public Method getMethod() {
+ return this.serviceMethod.getMethod();
+ }
+
+ public Object getService() {
+ return this.serviceMethod.getService();
+ }
+
+ public String getAlias() {
+ return this.serviceMethod.getAlias();
+ }
+
+ public int getOrder() {
+ return this.serviceMethod.getOrder();
+ }
+
+ public String getChainName() {
+ return this.serviceMethod.getChainName();
+ }
+
+ public boolean isHasSender() {
+ return this.serviceMethod.isHasSender();
+ }
+
+ public boolean isSenderOnLeft() {
+ return this.serviceMethod.isSenderOnLeft();
+ }
+}
diff --git a/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/method/ReceiverMethodSearcher.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/method/ReceiverMethodSearcher.java
new file mode 100644
index 0000000..b92cafb
--- /dev/null
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/method/ReceiverMethodSearcher.java
@@ -0,0 +1,99 @@
+/*
+ * 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.linkis.rpc.serializer.method;
+
+import org.apache.linkis.protocol.message.RequestProtocol;
+import org.apache.linkis.rpc.serializer.exception.MessageWarnException;
+import org.apache.linkis.rpc.serializer.parser.ServiceMethod;
+import org.apache.linkis.rpc.serializer.registry.SpringServiceRegistry;
+import org.apache.linkis.rpc.serializer.utils.MessageUtils;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+public class ReceiverMethodSearcher {
+
+ /** key是requestProtocol的全类名,Map中,key是groupName */
+ private final Map<String, Map<String, List<ServiceMethod>>> protocolServiceMethodCache =
+ new ConcurrentHashMap<>();
+
+ private SpringServiceRegistry serviceRegistry;
+
+ private void initRegistry() {
+ serviceRegistry = new SpringServiceRegistry();
+ }
+
+ public Map<String, List<MethodExecuteWrapper>> getMethodExecuteWrappers(
+ RequestProtocol requestProtocol) {
+ if (serviceRegistry == null) {
+ synchronized (ReceiverMethodSearcher.class) {
+ if (serviceRegistry == null) {
+ initRegistry();
+ }
+ }
+ }
+ String protocolName = requestProtocol.getClass().getName();
+ Map<String, List<ServiceMethod>> protocolServiceMethods =
+ this.protocolServiceMethodCache.get(protocolName);
+ // 静态信息,无需加锁
+ if (protocolServiceMethods == null) {
+ Map<String, List<ServiceMethod>> serviceMethodCache =
+ serviceRegistry.getServiceMethodCache();
+ // 找出注册方法中,参数是当前请求的父类的
+ Map<String, List<ServiceMethod>> serviceMatchs =
+ serviceMethodCache.entrySet().stream()
+ .filter(e -> MessageUtils.isAssignableFrom(e.getKey(), protocolName))
+ .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+ // group by chain name 扁平化后再group,这时protocol的父类可能和转换的处于同一个chain中
+ serviceMatchs =
+ serviceMatchs.values().stream()
+ .flatMap(Collection::stream)
+ .collect(Collectors.groupingBy(ServiceMethod::getChainName));
+ // order判断
+ for (List<ServiceMethod> value : serviceMatchs.values()) {
+ Integer repeatOrder = MessageUtils.repeatOrder(value);
+ if (repeatOrder != null && !MessageUtils.orderIsLast(repeatOrder, value)) {
+ throw new MessageWarnException(
+ 10000,
+ String.format(
+ "repeat order : %s for request %s", repeatOrder, protocolName));
+ }
+ }
+ this.protocolServiceMethodCache.put(protocolName, serviceMatchs);
+ }
+ // clone 对象并返回
+ return serviceMethod2Wrapper(this.protocolServiceMethodCache.get(protocolName));
+ }
+
+ private Map<String, List<MethodExecuteWrapper>> serviceMethod2Wrapper(
+ Map<String, List<ServiceMethod>> source) {
+ HashMap<String, List<MethodExecuteWrapper>> target = new HashMap<>();
+ source.forEach(
+ (k, v) ->
+ target.put(
+ k,
+ v.stream()
+ .map(MethodExecuteWrapper::new)
+ .collect(Collectors.toList())));
+ return target;
+ }
+}
diff --git a/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/parser/DefaultServiceParser.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/parser/DefaultServiceParser.java
new file mode 100644
index 0000000..760684f
--- /dev/null
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/parser/DefaultServiceParser.java
@@ -0,0 +1,109 @@
+/*
+ * 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.linkis.rpc.serializer.parser;
+
+import org.apache.linkis.rpc.Sender;
+import org.apache.linkis.rpc.serializer.annotation.Chain;
+import org.apache.linkis.rpc.serializer.annotation.Order;
+import org.apache.linkis.rpc.serializer.annotation.Receiver;
+
+import org.springframework.aop.support.AopUtils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class DefaultServiceParser implements ServiceParser {
+
+ Logger logger = LoggerFactory.getLogger(DefaultServiceParser.class);
+
+ @Override
+ public Map<String, List<ServiceMethod>> parse(Object service) {
+ // TODO: 2020/7/15 more analysis
+ // Method[] methods = service.getClass().getMethods();
+ Method[] methods = AopUtils.getTargetClass(service).getMethods();
+ return Arrays.stream(methods)
+ .filter(this::methodFilterPredicate)
+ .map(m -> getServiceMethod(m, service))
+ .collect(Collectors.groupingBy(ServiceMethod::getProtocolName));
+ }
+
+ private ServiceMethod getServiceMethod(Method method, Object service) {
+ ServiceMethod serviceMethod = new ServiceMethod();
+ serviceMethod.setMethod(method);
+ serviceMethod.setService(service);
+ serviceMethod.setAlias(
+ String.format("%s.%s", service.getClass().getName(), method.getName()));
+ Order order = method.getAnnotation(Order.class);
+ if (order != null) {
+ serviceMethod.setOrder(order.value());
+ }
+ Chain chain = method.getAnnotation(Chain.class);
+ if (chain != null) {
+ serviceMethod.setChainName(chain.value());
+ }
+ Parameter[] parameters = method.getParameters();
+ if (parameters.length == 2) {
+ serviceMethod.setHasSender(true);
+ if (Sender.class.isAssignableFrom(parameters[0].getType()))
+ serviceMethod.setSenderOnLeft(true);
+ }
+ logger.info(
+ method
+ + " parameter:"
+ + Arrays.toString(
+ Arrays.stream(parameters).map(Parameter::getName).toArray()));
+ @SuppressWarnings("all")
+ Parameter parameter =
+ Arrays.stream(parameters)
+ .filter(p -> !Sender.class.isAssignableFrom(p.getType()))
+ .findFirst()
+ .get();
+ serviceMethod.setProtocolName(parameter.getType().getName());
+ return serviceMethod;
+ }
+
+ /**
+ * 标注了@Receiver注解,方法至少一个参数 1个参数:非ServiceMethodContext 子类即可 2个参数 其中一个需要是ServiceMethodContext 的子类
+ * && 2个参数都非ServiceMethodContext 子类即可
+ *
+ * @param method
+ * @return
+ */
+ private boolean methodFilterPredicate(Method method) {
+ if (method.getAnnotation(Receiver.class) != null) {
+ Class<?>[] parameterTypes = method.getParameterTypes();
+ if (method.getParameterCount() == 1) {
+ return !Sender.class.isAssignableFrom(parameterTypes[0]);
+ } else if (method.getParameterCount() == 2) {
+ boolean hasContext =
+ Arrays.stream(parameterTypes).anyMatch(Sender.class::isAssignableFrom);
+ boolean allContext =
+ Arrays.stream(parameterTypes).allMatch(Sender.class::isAssignableFrom);
+ return hasContext && !allContext;
+ }
+ }
+ return false;
+ }
+}
diff --git a/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/parser/ServiceMethod.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/parser/ServiceMethod.java
new file mode 100644
index 0000000..99aba6f
--- /dev/null
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/parser/ServiceMethod.java
@@ -0,0 +1,113 @@
+/*
+ * 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.linkis.rpc.serializer.parser;
+
+import java.lang.reflect.Method;
+
+public class ServiceMethod {
+
+ private Object service;
+
+ private Method method;
+
+ private String alias;
+
+ private String protocolName;
+
+ private int order = 2147483647;
+
+ private boolean allowImplicit = true;
+
+ private boolean hasSender;
+
+ private boolean senderOnLeft;
+
+ private String chainName = "default";
+
+ public String getChainName() {
+ return chainName;
+ }
+
+ public void setChainName(String chainName) {
+ this.chainName = chainName;
+ }
+
+ public boolean isHasSender() {
+ return hasSender;
+ }
+
+ public void setHasSender(boolean hasSender) {
+ this.hasSender = hasSender;
+ }
+
+ public boolean isAllowImplicit() {
+ return allowImplicit;
+ }
+
+ public void setAllowImplicit(boolean allowImplicit) {
+ this.allowImplicit = allowImplicit;
+ }
+
+ public int getOrder() {
+ return order;
+ }
+
+ public void setOrder(int order) {
+ this.order = order;
+ }
+
+ public Object getService() {
+ return service;
+ }
+
+ public void setService(Object service) {
+ this.service = service;
+ }
+
+ public Method getMethod() {
+ return method;
+ }
+
+ public void setMethod(Method method) {
+ this.method = method;
+ }
+
+ public String getAlias() {
+ return alias;
+ }
+
+ public void setAlias(String alias) {
+ this.alias = alias;
+ }
+
+ public String getProtocolName() {
+ return protocolName;
+ }
+
+ public void setProtocolName(String protocolName) {
+ this.protocolName = protocolName;
+ }
+
+ public boolean isSenderOnLeft() {
+ return senderOnLeft;
+ }
+
+ public void setSenderOnLeft(boolean senderOnLeft) {
+ this.senderOnLeft = senderOnLeft;
+ }
+}
diff --git a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/request/DownloadAction.scala b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/parser/ServiceParser.java
similarity index 80%
copy from linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/request/DownloadAction.scala
copy to linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/parser/ServiceParser.java
index 5824db9..6e09e9c 100644
--- a/linkis-commons/linkis-httpclient/src/main/scala/org/apache/linkis/httpclient/request/DownloadAction.scala
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/parser/ServiceParser.java
@@ -5,23 +5,22 @@
* 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.linkis.httpclient.request
-import scala.tools.nsc.interpreter.InputStream
+package org.apache.linkis.rpc.serializer.parser;
+import java.util.List;
+import java.util.Map;
-trait DownloadAction {
-
- def write(inputStream: InputStream): Unit
+public interface ServiceParser {
+ Map<String, List<ServiceMethod>> parse(Object service);
}
diff --git a/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/registry/AbstractServiceRegistry.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/registry/AbstractServiceRegistry.java
new file mode 100644
index 0000000..331f99b
--- /dev/null
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/registry/AbstractServiceRegistry.java
@@ -0,0 +1,98 @@
+/*
+ * 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.linkis.rpc.serializer.registry;
+
+import org.apache.linkis.common.utils.JavaLog;
+import org.apache.linkis.rpc.serializer.parser.DefaultServiceParser;
+import org.apache.linkis.rpc.serializer.parser.ServiceMethod;
+import org.apache.linkis.rpc.serializer.parser.ServiceParser;
+
+import org.springframework.aop.support.AopUtils;
+
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public abstract class AbstractServiceRegistry extends JavaLog implements ServiceRegistry {
+
+ @SuppressWarnings("all")
+ public final Interner<String> lock = Interners.<String>newWeakInterner();
+ /** key:requestprotocol or custom implicit object class name */
+ private final Map<String, List<ServiceMethod>> serviceMethodCache = new ConcurrentHashMap<>();
+
+ private final Map<String, Object> registedServieMap = new ConcurrentHashMap<>();
+
+ private final ServiceParser serviceParser = new DefaultServiceParser();
+
+ @SuppressWarnings("all")
+ @Override
+ public void register(Object service) {
+ // 防止不同方式注册时候的并发,比如spring和手动注册,同时防止不同包名下类名一样的service
+ // 默认用getName,则会拿到spring代理过的类,没有方法的注解,比如
+ // org.apache.linkis.jobhistory.service.impl.JobHistoryQueryServiceImpl$$EnhancerBySpringCGLIB$$5fa1dd59
+ // String serviceName = service.getClass().getName();
+ // 下面会拿到原始的class,包含方法注解信息
+ String serviceName = AopUtils.getTargetClass(service).getName();
+ synchronized (this.lock.intern(serviceName)) {
+ // 1.是否注册过
+ Object o = this.registedServieMap.get(serviceName);
+ if (o != null) return;
+ // 2..解析
+ Map<String, List<ServiceMethod>> serviceMethods = serviceParser.parse(service);
+ serviceMethods.entrySet().stream()
+ .forEach(
+ entry -> {
+ if (entry.getValue().size() != 1) {
+ error(
+ String.format(
+ "rpc receive method init error! find %s method for the request:%s, this type of rpc request will not be handled!",
+ entry.getValue().size(), entry.getKey()));
+ }
+ });
+ // 3.注册
+ serviceMethods.forEach(this::register);
+ this.registedServieMap.put(serviceName, service);
+ }
+ }
+
+ /**
+ * @param key
+ * @param value
+ * @throws MessageWarnException
+ */
+ @SuppressWarnings("all")
+ private void register(String key, List<ServiceMethod> serviceMethods) {
+ // 防止相同key在不同service的并发注册
+ synchronized (this.lock.intern(key)) {
+ // 1.添加cache
+ refreshServiceMethodCache(key, serviceMethods);
+ }
+ }
+
+ private void refreshServiceMethodCache(String key, List<ServiceMethod> serviceMethods) {
+ this.serviceMethodCache.computeIfAbsent(key, k -> new ArrayList<>()).addAll(serviceMethods);
+ }
+
+ public Map<String, List<ServiceMethod>> getServiceMethodCache() {
+ return this.serviceMethodCache;
+ }
+}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/conf/ECMErrorCode.scala b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/registry/ServiceRegistry.java
similarity index 85%
copy from linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/conf/ECMErrorCode.scala
copy to linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/registry/ServiceRegistry.java
index 2b1456c..2435648 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/conf/ECMErrorCode.scala
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/registry/ServiceRegistry.java
@@ -5,23 +5,19 @@
* 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.linkis.ecm.core.conf
+package org.apache.linkis.rpc.serializer.registry;
-object ECMErrorCode {
-
- val PROCESS_WAITFOR_ERROR = 20001
-
- val EC_START_FAILED = 11102
+public interface ServiceRegistry {
+ void register(Object service);
}
diff --git a/linkis-computation-governance/linkis-manager/linkis-application-manager/src/main/scala/org/apache/linkis/manager/am/service/engine/DefaultEngineSwitchService.scala b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/registry/SpringServiceRegistry.java
similarity index 50%
copy from linkis-computation-governance/linkis-manager/linkis-application-manager/src/main/scala/org/apache/linkis/manager/am/service/engine/DefaultEngineSwitchService.scala
copy to linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/registry/SpringServiceRegistry.java
index b6f7be7..50389ac 100644
--- a/linkis-computation-governance/linkis-manager/linkis-application-manager/src/main/scala/org/apache/linkis/manager/am/service/engine/DefaultEngineSwitchService.scala
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/registry/SpringServiceRegistry.java
@@ -5,28 +5,37 @@
* 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.linkis.manager.am.service.engine
-import org.apache.linkis.manager.common.entity.node.EngineNode
-import org.apache.linkis.manager.common.protocol.engine.EngineSwitchRequest
-import org.apache.linkis.message.annotation.Receiver
-import org.springframework.stereotype.Service
+package org.apache.linkis.rpc.serializer.registry;
+import org.apache.linkis.rpc.conf.RPCConfiguration;
+import org.apache.linkis.rpc.serializer.annotation.Receiver;
+import org.apache.linkis.rpc.serializer.utils.MessageUtils;
-@Service
-class DefaultEngineSwitchService extends EngineSwitchService {
+import java.lang.reflect.Method;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
- @Receiver
- override def switchEngine(engineSwitchRequest: EngineSwitchRequest): EngineNode = null
+public class SpringServiceRegistry extends AbstractServiceRegistry {
+ public SpringServiceRegistry() {
+ Set<? extends Class<?>> services =
+ RPCConfiguration.REFLECTIONS().getMethodsAnnotatedWith(Receiver.class).stream()
+ .map(Method::getDeclaringClass)
+ .collect(Collectors.toSet());
+ services.stream()
+ .map(MessageUtils::getBean)
+ .filter(Objects::nonNull)
+ .forEach(this::register);
+ }
}
diff --git a/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/utils/MessageUtils.java b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/utils/MessageUtils.java
new file mode 100644
index 0000000..04d9005
--- /dev/null
+++ b/linkis-commons/linkis-rpc/src/main/java/org/apache/linkis/rpc/serializer/utils/MessageUtils.java
@@ -0,0 +1,94 @@
+/*
+ * 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.linkis.rpc.serializer.utils;
+
+import org.apache.linkis.DataWorkCloudApplication;
+import org.apache.linkis.rpc.serializer.method.MethodExecuteWrapper;
+import org.apache.linkis.rpc.serializer.parser.ServiceMethod;
+
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.context.ApplicationContext;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MessageUtils {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(MessageUtils.class);
+
+ public static <T> T getBean(Class<T> tClass) {
+ T t = null;
+ ApplicationContext applicationContext = DataWorkCloudApplication.getApplicationContext();
+ if (applicationContext != null) {
+ try {
+ t = applicationContext.getBean(tClass);
+ } catch (NoSuchBeanDefinitionException e) {
+ LOGGER.warn(String.format("can not get bean from spring ioc:%s", tClass.getName()));
+ }
+ }
+ return t;
+ }
+
+ public static boolean isAssignableFrom(String supperClassName, String className) {
+ try {
+ return Class.forName(supperClassName).isAssignableFrom(Class.forName(className));
+ } catch (ClassNotFoundException e) {
+ LOGGER.error("class not found", e);
+ return false;
+ }
+ }
+
+ public static boolean orderIsMin(
+ MethodExecuteWrapper methodExecuteWrapper,
+ List<MethodExecuteWrapper> methodExecuteWrappers) {
+ for (MethodExecuteWrapper tmp : methodExecuteWrappers) {
+ if (tmp.getOrder() < methodExecuteWrapper.getOrder()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static boolean orderIsLast(int order, List<ServiceMethod> serviceMethods) {
+ // TODO: 2020/8/5 方法判断修改为重复的order 支持头部
+ if (order == 2147483647) return true;
+ for (ServiceMethod serviceMethod : serviceMethods) {
+ if (serviceMethod.getOrder() > order) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ public static Integer repeatOrder(List<ServiceMethod> serviceMethods) {
+ Map<Integer, Integer> tmp = new HashMap<>();
+ for (ServiceMethod serviceMethod : serviceMethods) {
+ int order = serviceMethod.getOrder();
+ if (tmp.get(order) == null) {
+ tmp.put(order, order);
+ } else {
+ return order;
+ }
+ }
+ return null;
+ }
+}
diff --git a/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/MessageReceiver.scala b/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/MessageReceiver.scala
new file mode 100644
index 0000000..37b46dc
--- /dev/null
+++ b/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/MessageReceiver.scala
@@ -0,0 +1,52 @@
+/*
+ * 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.linkis.rpc
+
+import org.apache.linkis.protocol.message.RequestProtocol
+import org.apache.linkis.rpc.serializer.method.{MessageExecutor, ReceiverMethodSearcher}
+
+import scala.concurrent.duration.Duration
+import scala.language.implicitConversions
+
+
+class MessageReceiver extends Receiver {
+
+ private val receiverMethodSearcher = new ReceiverMethodSearcher
+
+ private val messageExecutor = new MessageExecutor
+
+ override def receive(message: Any, sender: Sender): Unit = {
+ receiveAndReply(message, sender)
+ }
+
+ override def receiveAndReply(message: Any, sender: Sender): Any = {
+ message match {
+ case requestProtocol: RequestProtocol => {
+ val methodExecuteWrapper = receiverMethodSearcher.getMethodExecuteWrappers(requestProtocol)
+ messageExecutor.execute(requestProtocol, methodExecuteWrapper, sender)
+ }
+ case _ =>
+ }
+ }
+
+ // TODO
+ override def receiveAndReply(message: Any, duration: Duration, sender: Sender): Any = {
+
+ }
+
+}
diff --git a/linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-manager-common/src/main/scala/org/apache/linkis/manager/common/protocol/resource/ResourceProtocol.scala b/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/MessageReceiverChooser.scala
similarity index 69%
copy from linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-manager-common/src/main/scala/org/apache/linkis/manager/common/protocol/resource/ResourceProtocol.scala
copy to linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/MessageReceiverChooser.scala
index ddf0252..ebb0ce3 100644
--- a/linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-manager-common/src/main/scala/org/apache/linkis/manager/common/protocol/resource/ResourceProtocol.scala
+++ b/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/MessageReceiverChooser.scala
@@ -5,25 +5,30 @@
* 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.linkis.manager.common.protocol.resource
-import org.apache.linkis.common.ServiceInstance
-import org.apache.linkis.manager.common.entity.resource.NodeResource
+package org.apache.linkis.rpc
+
import org.apache.linkis.protocol.message.RequestProtocol
+import java.util
-trait ResourceProtocol extends RequestProtocol
-case class ResourceUsedProtocol(serviceInstance: ServiceInstance, engineResource: NodeResource, ticketId: String = null) extends RequestProtocol
+class MessageReceiverChooser extends ReceiverChooser {
+ val receiver: Option[Receiver] = Option(new MessageReceiver)
+ override def chooseReceiver(event: RPCMessageEvent): Option[Receiver] = event.message match {
+ case _: util.Map[String, Object] => receiver
+ case _: RequestProtocol => receiver
+ case _ => None
+ }
+}
diff --git a/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/RPCReceiveRestful.scala b/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/RPCReceiveRestful.scala
index 0d9175e..26cf5b6 100644
--- a/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/RPCReceiveRestful.scala
+++ b/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/RPCReceiveRestful.scala
@@ -70,6 +70,8 @@ private[rpc] class RPCReceiveRestful extends RPCReceiveRemote with Logging {
def initListenerBus(): Unit = {
if(!receiverChoosers.exists(_.isInstanceOf[CommonReceiverChooser]))
receiverChoosers = receiverChoosers :+ new CommonReceiverChooser
+ if(!receiverChoosers.exists(_.isInstanceOf[MessageReceiverChooser]))
+ receiverChoosers = receiverChoosers :+ new MessageReceiverChooser
info("init all receiverChoosers in spring beans, list => " + receiverChoosers.toList)
if(!receiverSenderBuilders.exists(_.isInstanceOf[CommonReceiverSenderBuilder]))
receiverSenderBuilders = receiverSenderBuilders :+ new CommonReceiverSenderBuilder
@@ -108,7 +110,7 @@ private[rpc] class RPCReceiveRestful extends RPCReceiveRemote with Logging {
}
private implicit def toMessage(obj: Any): Message = obj match {
- case Unit | () =>
+ case Unit | () | null =>
RPCProduct.getRPCProduct.ok()
case _: BoxedUnit => RPCProduct.getRPCProduct.ok()
case _ =>
diff --git a/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/conf/RPCConfiguration.scala b/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/conf/RPCConfiguration.scala
index c23d289..305e69d 100644
--- a/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/conf/RPCConfiguration.scala
+++ b/linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/conf/RPCConfiguration.scala
@@ -18,6 +18,8 @@
package org.apache.linkis.rpc.conf
import org.apache.linkis.common.conf.{CommonVars, TimeType}
+import org.reflections.Reflections
+import org.reflections.scanners.{MethodAnnotationsScanner, SubTypesScanner, TypeAnnotationsScanner}
object RPCConfiguration {
@@ -25,7 +27,7 @@ object RPCConfiguration {
val BDP_RPC_BROADCAST_THREAD_SIZE = CommonVars("wds.linkis.rpc.broadcast.thread.num", new Integer(25))
val BDP_RPC_EUREKA_SERVICE_REFRESH_INTERVAL = CommonVars("wds.linkis.rpc.eureka.client.refresh.interval", new TimeType("1s"))
- val BDP_RPC_EUREKA_SERVICE_REFRESH_MAX_WAIT_TIME = CommonVars("wds.linkis.rpc.eureka.client.refresh.wait.time.max", new TimeType("1m"))
+ val BDP_RPC_EUREKA_SERVICE_REFRESH_MAX_WAIT_TIME = CommonVars("wds.linkis.rpc.eureka.client.refresh.wait.time.max", new TimeType("30s"))
val BDP_RPC_RECEIVER_ASYN_CONSUMER_THREAD_MAX = CommonVars("wds.linkis.rpc.receiver.asyn.consumer.thread.max", 400)
val BDP_RPC_RECEIVER_ASYN_CONSUMER_THREAD_FREE_TIME_MAX = CommonVars("wds.linkis.rpc.receiver.asyn.consumer.freeTime.max", new TimeType("2m"))
val BDP_RPC_RECEIVER_ASYN_QUEUE_CAPACITY = CommonVars("wds.linkis.rpc.receiver.asyn.queue.size.max", 5000)
@@ -46,4 +48,8 @@ object RPCConfiguration {
val ENABLE_LOCAL_MESSAGE = CommonVars("wds.linkis.rpc.conf.enable.local.message", false)
val LOCAL_APP_LIST = CommonVars("wds.linkis.rpc.conf.local.app.list", "").getValue.split(",")
+ val SERVICE_SCAN_PACKAGE = CommonVars("wds.linkis.ms.service.scan.package", "org.apache.linkis").getValue
+
+ val REFLECTIONS = new Reflections(SERVICE_SCAN_PACKAGE, new MethodAnnotationsScanner(), new TypeAnnotationsScanner(), new SubTypesScanner())
+
}
diff --git a/linkis-commons/linkis-scheduler/src/main/scala/org/apache/linkis/scheduler/queue/LoopArrayQueue.scala b/linkis-commons/linkis-scheduler/src/main/scala/org/apache/linkis/scheduler/queue/LoopArrayQueue.scala
index bf49b37..e4a83d6 100644
--- a/linkis-commons/linkis-scheduler/src/main/scala/org/apache/linkis/scheduler/queue/LoopArrayQueue.scala
+++ b/linkis-commons/linkis-scheduler/src/main/scala/org/apache/linkis/scheduler/queue/LoopArrayQueue.scala
@@ -17,9 +17,10 @@
package org.apache.linkis.scheduler.queue
+import org.apache.linkis.common.utils.Logging
-class LoopArrayQueue(var group: Group) extends ConsumeQueue{
+class LoopArrayQueue(var group: Group) extends ConsumeQueue with Logging {
private val eventQueue: Array[Any] = new Array[Any](group.getMaximumCapacity)
private val maxCapacity: Int = group.getMaximumCapacity
@@ -198,12 +199,12 @@ override def offer(event: SchedulerEvent): Option[Int] = {
val _max = max
if(takeIndex < _min) takeIndex = _min
else if(takeIndex > _max) {
- println(s"none, notice...max: ${_max}, takeIndex: $takeIndex, realSize: $realSize.")
+ logger.info(s"none, notice...max: ${_max}, takeIndex: $takeIndex, realSize: $realSize.")
return None
}
val t = get(takeIndex)
if(t == null) {
- println("null, notice...")
+ logger.info("null, notice...")
}
takeIndex += 1
t
diff --git a/linkis-commons/linkis-storage/src/main/java/org/apache/linkis/storage/fs/impl/HDFSFileSystem.java b/linkis-commons/linkis-storage/src/main/java/org/apache/linkis/storage/fs/impl/HDFSFileSystem.java
index f658b11..e14d51c 100644
--- a/linkis-commons/linkis-storage/src/main/java/org/apache/linkis/storage/fs/impl/HDFSFileSystem.java
+++ b/linkis-commons/linkis-storage/src/main/java/org/apache/linkis/storage/fs/impl/HDFSFileSystem.java
@@ -18,6 +18,7 @@
package org.apache.linkis.storage.fs.impl;
import org.apache.linkis.common.io.FsPath;
+import org.apache.linkis.hadoop.common.conf.HadoopConf;
import org.apache.linkis.hadoop.common.utils.HDFSUtils;
import org.apache.linkis.storage.domain.FsPathListWithError;
import org.apache.linkis.storage.fs.FileSystem;
@@ -28,7 +29,6 @@ import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
@@ -50,6 +50,7 @@ public class HDFSFileSystem extends FileSystem {
public static final String HDFS_PREFIX_WITHOUT_AUTH = "hdfs:///";
public static final String HDFS_PREFIX_WITH_AUTH = "hdfs://";
+ private static final String FS_CLOSED_ERROR = "Filesystem closed";
private org.apache.hadoop.fs.FileSystem fs = null;
private Configuration conf = null;
@@ -192,7 +193,9 @@ public class HDFSFileSystem extends FileSystem {
}
}
}
- /*conf.set("fs.hdfs.impl.disable.cache","true");*/
+ if (StorageConfiguration.FS_CACHE_DISABLE().getValue()) {
+ conf.set("fs.hdfs.impl.disable.cache", "true");
+ }
fs = HDFSUtils.getHDFSUserFileSystem(user, conf);
if (fs == null) {
throw new IOException("init HDFS FileSystem failed!");
@@ -238,7 +241,7 @@ public class HDFSFileSystem extends FileSystem {
if (!overwrite) {
return fs.append(new Path(path));
} else {
- FSDataOutputStream out = fs.create(new Path(path), true);
+ OutputStream out = fs.create(new Path(path), true);
this.setPermission(dest, this.getDefaultFilePerm());
return out;
}
@@ -294,7 +297,33 @@ public class HDFSFileSystem extends FileSystem {
@Override
public boolean exists(FsPath dest) throws IOException {
- return fs.exists(new Path(checkHDFSPath(dest.getPath())));
+ try {
+ return fs.exists(new Path(checkHDFSPath(dest.getPath())));
+ } catch (IOException e) {
+ if (null != e.getMessage() && e.getMessage().contains(FS_CLOSED_ERROR)) {
+ logger.info("Failed to execute exists, retry", e);
+ resetRootHdfs();
+ return fs.exists(new Path(checkHDFSPath(dest.getPath())));
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ private void resetRootHdfs() {
+ if (fs != null) {
+ synchronized (this) {
+ if (fs != null) {
+ if (HadoopConf.HDFS_ENABLE_CACHE()) {
+ HDFSUtils.closeHDFSFIleSystem(fs, user, true);
+ } else {
+ HDFSUtils.closeHDFSFIleSystem(fs, user);
+ }
+ logger.warn(user + "FS reset close.");
+ fs = HDFSUtils.getHDFSUserFileSystem(user, conf);
+ }
+ }
+ }
}
@Override
diff --git a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/domain/DataType.scala b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/domain/DataType.scala
index 1aa48c1..3074862 100644
--- a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/domain/DataType.scala
+++ b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/domain/DataType.scala
@@ -74,22 +74,31 @@ object DataType extends Logging{
def toValue(dataType: DataType, value: String): Any = Utils.tryCatch(dataType match {
case NullType => null
case StringType | CharType | VarcharType | StructType | ListType | ArrayType | MapType => value
- case BooleanType => if(isNull(value)) null else value.toBoolean
- case ShortIntType => if(isNull(value)) null else value.toShort
- case IntType =>if(isNull(value)) null else value.toInt
- case LongType | BigIntType => if(isNull(value)) null else value.toLong
- case FloatType => if(isNull(value)) null else value.toFloat
- case DoubleType => if(isNull(value)) null else value.toDouble
- case DecimalType => if(isNull(value)) null else BigDecimal(value)
- case DateType => if(isNull(value)) null else Date.valueOf(value)
- case TimestampType => if(isNull(value)) null else Timestamp.valueOf(value).toString.stripSuffix(".0")
+ case BooleanType => if(isNumberNull(value)) null else value.toBoolean
+ case ShortIntType => if(isNumberNull(value)) null else value.toShort
+ case IntType =>if(isNumberNull(value)) null else value.toInt
+ case LongType | BigIntType => if(isNumberNull(value)) null else value.toLong
+ case FloatType => if(isNumberNull(value)) null else value.toFloat
+ case DoubleType => if(isNumberNull(value)) null else value.toDouble
+ case DecimalType => if(isNumberNull(value)) null else BigDecimal(value)
+ case DateType => if(isNumberNull(value)) null else Date.valueOf(value)
+ case TimestampType => if(isNumberNull(value)) null else Timestamp.valueOf(value).toString.stripSuffix(".0")
case BinaryType => if(isNull(value)) null else value.getBytes()
case _ => value
}){
- t => warn(s"Failed to $value switch to dataType:",t)
+ t =>
+ logger.debug(s"Failed to $value switch to dataType:", t)
value
}
- def isNull(value:String):Boolean= if(value == null || value == NULL_VALUE || value.trim == "") true else false
+
+ def isNull(value: String): Boolean = if (value == null || value == NULL_VALUE || value.trim == "") true else false
+
+ def isNumberNull(value: String): Boolean = if (null == value || NULL_VALUE.equalsIgnoreCase(value) || value.trim == "") {
+ true
+ } else {
+ false
+ }
+
}
abstract class DataType(val typeName:String,
diff --git a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/resultset/ResultSetReader.scala b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/resultset/ResultSetReader.scala
index 3de246a..71ff18d 100644
--- a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/resultset/ResultSetReader.scala
+++ b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/resultset/ResultSetReader.scala
@@ -45,7 +45,12 @@ object ResultSetReader {
val resultSet = rsFactory.getResultSetByPath(resPath)
val fs = FSFactory.getFs(resPath)
fs.init(null)
- ResultSetReader.getResultSetReader(resultSet, fs.read(resPath))
+ val reader = ResultSetReader.getResultSetReader(resultSet, fs.read(resPath))
+ reader match {
+ case storageResultSetReader: StorageResultSetReader[_, _] => storageResultSetReader.setFs(fs)
+ case _ =>
+ }
+ reader
}
}
diff --git a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/resultset/StorageResultSetReader.scala b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/resultset/StorageResultSetReader.scala
index cee259e..d35a509 100644
--- a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/resultset/StorageResultSetReader.scala
+++ b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/resultset/StorageResultSetReader.scala
@@ -20,8 +20,8 @@ package org.apache.linkis.storage.resultset
import java.io.{ByteArrayInputStream, IOException, InputStream}
import org.apache.linkis.common.io.resultset.{ResultSet, ResultSetReader}
-import org.apache.linkis.common.io.{MetaData, Record}
-import org.apache.linkis.common.utils.Logging
+import org.apache.linkis.common.io.{Fs, MetaData, Record}
+import org.apache.linkis.common.utils.{Logging, Utils}
import org.apache.linkis.storage.domain.Dolphin
import org.apache.linkis.storage.exception.StorageWarnException
import org.apache.linkis.storage.utils.StorageUtils
@@ -38,6 +38,8 @@ class StorageResultSetReader[K <: MetaData, V <: Record](resultSet: ResultSet[K,
private var colCount = 0
private var rowCount = 0
+ private var fs: Fs = _
+
private val READ_CACHE = 1024
private val bytes = new Array[Byte](READ_CACHE)
@@ -96,6 +98,9 @@ class StorageResultSetReader[K <: MetaData, V <: Record](resultSet: ResultSet[K,
row
}
+ def setFs(fs:Fs):Unit = this.fs = fs
+ def getFs:Fs = this.fs
+
@scala.throws[IOException]
override def getMetaData: MetaData = {
if(metaData == null) init()
@@ -108,8 +113,12 @@ class StorageResultSetReader[K <: MetaData, V <: Record](resultSet: ResultSet[K,
if(recordNum < 0 ) return -1
if(metaData == null) getMetaData
- for(i <- recordNum until (0, -1)){
- try inputStream.skip(Dolphin.readInt(inputStream)) catch { case t: Throwable => return -1}
+ for(i <- recordNum until (0, -1)) {
+ try inputStream.skip(Dolphin.readInt(inputStream))
+ catch {
+ case t: Throwable =>
+ return recordNum - i
+ }
}
recordNum
}
@@ -130,5 +139,8 @@ class StorageResultSetReader[K <: MetaData, V <: Record](resultSet: ResultSet[K,
@scala.throws[IOException]
override def available: Long = inputStream.available()
- override def close(): Unit = inputStream.close()
+ override def close(): Unit = {
+ inputStream.close()
+ if(this.fs != null) Utils.tryQuietly(this.fs.close())
+ }
}
diff --git a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/script/reader/StorageScriptFsReader.scala b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/script/reader/StorageScriptFsReader.scala
index 1a10912..c7b06a1 100644
--- a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/script/reader/StorageScriptFsReader.scala
+++ b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/script/reader/StorageScriptFsReader.scala
@@ -66,7 +66,11 @@ class StorageScriptFsReader(val path: FsPath, val charset: String, val inputStre
}
@scala.throws[IOException]
- override def skip(recordNum: Int): Int = -1
+ override def skip(recordNum: Int): Int = {
+ if(recordNum < 0 ) return -1
+ if(metadata == null) getMetaData
+ try bufferedReader.skip(recordNum).toInt catch { case t: Throwable => recordNum }
+ }
@scala.throws[IOException]
override def getPosition: Long = -1L
diff --git a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/AbstractFileSource.scala b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/AbstractFileSource.scala
index 424e739..52aad63 100644
--- a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/AbstractFileSource.scala
+++ b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/AbstractFileSource.scala
@@ -62,4 +62,6 @@ abstract class AbstractFileSource(var fileSplits: Array[FileSplit]) extends File
override def getTypes: Array[String] = this.fileSplits.map(_.`type`)
+ override def getFileInfo(needToCountRowNumber: Int = 5000): Array[Pair[Int, Int]] = fileSplits.map(_.getFileInfo(needToCountRowNumber))
+
}
diff --git a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/FileSource.scala b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/FileSource.scala
index f13a0f5..43138af 100644
--- a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/FileSource.scala
+++ b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/FileSource.scala
@@ -36,6 +36,8 @@ trait FileSource extends Closeable {
def collect(): Array[Pair[Object, util.ArrayList[Array[String]]]]
+ def getFileInfo(needToCountRowNumber: Int = 5000): Array[Pair[Int, Int]]
+
def write[K <: MetaData, V <: Record](fsWriter: FsWriter[K, V]): Unit
def addParams(params: util.Map[String, String]): FileSource
diff --git a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/FileSplit.scala b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/FileSplit.scala
index 8191c3a..ff0b70b 100644
--- a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/FileSplit.scala
+++ b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/FileSplit.scala
@@ -78,6 +78,25 @@ class FileSplit(var fsReader: FsReader[_ <: MetaData, _ <: Record], var `type`:
t
}
+ /**
+ * Get the colNumber and rowNumber of the row to be counted
+ * @param needToCountRowNumber
+ * @return colNumber, rowNumber
+ */
+ def getFileInfo(needToCountRowNumber: Int = 5000): Pair[Int, Int] = {
+ val metaData = fsReader.getMetaData
+ val colNumber = metaData match {
+ case tableMetaData: TableMetaData => tableMetaData.columns.length
+ case _ => 1
+ }
+ val rowNumber = if (needToCountRowNumber == -1) {
+ fsReader.skip(Int.MaxValue)
+ } else {
+ fsReader.skip(needToCountRowNumber)
+ }
+ new Pair(colNumber, rowNumber)
+ }
+
def write[K <: MetaData, V <: Record](fsWriter: FsWriter[K, V]): Unit = {
`while`(fsWriter.addMetaData, fsWriter.addRecord)
}
diff --git a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/ResultsetFileSource.scala b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/ResultsetFileSource.scala
index 33638d1..a6b14fb 100644
--- a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/ResultsetFileSource.scala
+++ b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/source/ResultsetFileSource.scala
@@ -25,7 +25,8 @@ class ResultsetFileSource(fileSplits: Array[FileSplit]) extends AbstractFileSour
shuffle({
case t: TableRecord => new TableRecord(t.row.map {
- case null | "NULL" | "" => getParams.getOrDefault("nullValue", "NULL")
+ case null | "NULL" => getParams.getOrDefault("nullValue", "NULL")
+ case "" => getParams.getOrDefault("nullValue", "")
case value: Double => StorageUtils.doubleToString(value)
case r => r
})
diff --git a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/utils/FileSystemUtils.scala b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/utils/FileSystemUtils.scala
index f40d83e..491536b 100644
--- a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/utils/FileSystemUtils.scala
+++ b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/utils/FileSystemUtils.scala
@@ -29,7 +29,7 @@ import org.apache.linkis.storage.fs.impl.LocalFileSystem
object FileSystemUtils extends Logging{
def copyFile(filePath: FsPath, origin: FsPath, user: String): Unit = {
- val fileSystem = FSFactory.getFsByProxyUser(filePath,user).asInstanceOf[FileSystem]
+ val fileSystem = FSFactory.getFsByProxyUser(filePath, user).asInstanceOf[FileSystem]
Utils.tryFinally {
fileSystem.init(null)
if (!fileSystem.exists(filePath)) {
@@ -43,41 +43,36 @@ object FileSystemUtils extends Logging{
}
/**
- * Create a new file(创建新文件)
- * @param filePath
- * @param createParentWhenNotExists Whether to recursively create a directory(是否递归创建目录)
- */
+ * Create a new file(创建新文件)
+ *
+ * @param filePath
+ * @param createParentWhenNotExists Whether to recursively create a directory(是否递归创建目录)
+ */
def createNewFile(filePath: FsPath, createParentWhenNotExists: Boolean): Unit = {
- val fileSystem = FSFactory.getFs(filePath).asInstanceOf[FileSystem]
+ createNewFile(filePath, StorageUtils.getJvmUser, createParentWhenNotExists)
+ }
+
+ def createNewFile(filePath: FsPath, user: String, createParentWhenNotExists: Boolean): Unit = {
+ val fileSystem = FSFactory.getFsByProxyUser(filePath, user).asInstanceOf[FileSystem]
Utils.tryFinally {
fileSystem.init(null)
- if (!fileSystem.exists(filePath)) {
- if (!fileSystem.exists(filePath.getParent)) {
- if(!createParentWhenNotExists) throw new IOException("parent dir " + filePath.getParent.getPath + " dose not exists.")
- fileSystem.mkdirs(filePath.getParent)
- }
- fileSystem.createNewFile(filePath)
- }
+ createNewFileWithFileSystem(fileSystem, filePath, user, createParentWhenNotExists)
}(Utils.tryQuietly(fileSystem.close()))
}
- def createNewFile(filePath: FsPath, user:String,createParentWhenNotExists: Boolean): Unit = {
- val fileSystem = FSFactory.getFsByProxyUser(filePath,user).asInstanceOf[FileSystem]
- Utils.tryFinally {
- fileSystem.init(null)
- if (!fileSystem.exists(filePath)) {
- if (!fileSystem.exists(filePath.getParent)) {
- if(!createParentWhenNotExists) throw new IOException("parent dir " + filePath.getParent.getPath + " dose not exists.")
- mkdirs(fileSystem,filePath.getParent, user)
- }
- fileSystem.createNewFile(filePath)
- fileSystem match {
- case l:LocalFileSystem => fileSystem.setOwner(filePath,user)
- case _ => info(s"doesn't need to call setOwner")
- }
- /*fileSystem.setOwner(filePath,user,StorageConfiguration.STORAGE_HDFS_GROUP.getValue)*/
+ def createNewFileWithFileSystem(fileSystem: FileSystem, filePath: FsPath, user: String, createParentWhenNotExists: Boolean): Unit = {
+ if (!fileSystem.exists(filePath)) {
+ if (!fileSystem.exists(filePath.getParent)) {
+ if (!createParentWhenNotExists) throw new IOException("parent dir " + filePath.getParent.getPath + " dose not exists.")
+ mkdirs(fileSystem, filePath.getParent, user)
}
- }(Utils.tryQuietly(fileSystem.close()))
+ fileSystem.createNewFile(filePath)
+ fileSystem match {
+ case l: LocalFileSystem => fileSystem.setOwner(filePath, user)
+ case _ => info(s"doesn't need to call setOwner")
+ }
+ /*fileSystem.setOwner(filePath,user,StorageConfiguration.STORAGE_HDFS_GROUP.getValue)*/
+ }
}
/**
@@ -89,22 +84,22 @@ object FileSystemUtils extends Logging{
* @return
*/
@throws[IOException]
- def mkdirs(fileSystem: FileSystem,dest: FsPath, user: String): Boolean = {
+ def mkdirs(fileSystem: FileSystem, dest: FsPath, user: String): Boolean = {
var parentPath = dest.getParent
val dirsToMake = new util.Stack[FsPath]()
dirsToMake.push(dest)
- while (!fileSystem.exists(parentPath)){
+ while (!fileSystem.exists(parentPath)) {
dirsToMake.push(parentPath)
parentPath = parentPath.getParent
}
- if(! fileSystem.canExecute(parentPath)){
+ if (!fileSystem.canExecute(parentPath)) {
throw new IOException("You have not permission to access path " + dest.getPath)
}
- while (!dirsToMake.empty()){
+ while (!dirsToMake.empty()) {
val path = dirsToMake.pop()
fileSystem.mkdir(path)
fileSystem match {
- case l:LocalFileSystem => fileSystem.setOwner(path,user)
+ case l: LocalFileSystem => fileSystem.setOwner(path, user)
case _ => info(s"doesn't need to call setOwner")
}
//fileSystem.setOwner(path,user,StorageConfiguration.STORAGE_HDFS_GROUP.getValue)
diff --git a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/utils/StorageConfiguration.scala b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/utils/StorageConfiguration.scala
index e384fcc..96cc891 100644
--- a/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/utils/StorageConfiguration.scala
+++ b/linkis-commons/linkis-storage/src/main/scala/org/apache/linkis/storage/utils/StorageConfiguration.scala
@@ -66,4 +66,6 @@ object StorageConfiguration {
val HDFS_PATH_PREFIX_REMOVE = CommonVars[Boolean]("wds.linkis.storage.hdfs.prefxi.remove", true)
+ val FS_CACHE_DISABLE = CommonVars[java.lang.Boolean]("wds.linkis.fs.hdfs.impl.disable.cache", false)
+
}
diff --git a/linkis-computation-governance/linkis-client/linkis-computation-client/pom.xml b/linkis-computation-governance/linkis-client/linkis-computation-client/pom.xml
index 577cab0..ab78905 100644
--- a/linkis-computation-governance/linkis-client/linkis-computation-client/pom.xml
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/pom.xml
@@ -62,6 +62,20 @@
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-bml-client</artifactId>
<version>${linkis.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.apache.linkis</groupId>
+ <artifactId>linkis-storage</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.linkis</groupId>
+ <artifactId>linkis-hadoop-common</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.json4s</groupId>
+ <artifactId>json4s-jackson_${scala.binary.version}</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
</dependencies>
diff --git a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/LinkisJobBuilder.scala b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/LinkisJobBuilder.scala
index 8ec2f66..a1f2bf9 100644
--- a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/LinkisJobBuilder.scala
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/LinkisJobBuilder.scala
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
package org.apache.linkis.computation.client
import java.util
@@ -40,10 +40,11 @@ trait LinkisJobBuilder[Job <: LinkisJob] {
protected var params: util.Map[String, Any] = _
protected var source: util.Map[String, Any] = _
- protected def ensureNotNull(obj: Any, errorMsg: String): Unit = if(obj == null)
+ protected def ensureNotNull(obj: Any, errorMsg: String): Unit = if (obj == null) {
throw new UJESJobException(s"$errorMsg cannot be null.")
+ }
- protected def nullThenSet(obj: Any)(setTo: => Unit): Unit = if(obj == null) setTo
+ protected def nullThenSet(obj: Any)(setTo: => Unit): Unit = if (obj == null) setTo
def addExecuteUser(executeUser: String): this.type = {
this.executeUser = executeUser
@@ -56,7 +57,7 @@ trait LinkisJobBuilder[Job <: LinkisJob] {
}
def addJobContent(key: String, value: Any): this.type = {
- if(jobContent == null) jobContent = new util.HashMap[String, Any]
+ if (jobContent == null) jobContent = new util.HashMap[String, Any]
jobContent.put(key, value)
this
}
@@ -67,7 +68,7 @@ trait LinkisJobBuilder[Job <: LinkisJob] {
}
def addLabel(key: String, value: Any): this.type = {
- if(labels == null) labels = new util.HashMap[String, Any]
+ if (labels == null) labels = new util.HashMap[String, Any]
labels.put(key, value)
this
}
@@ -83,7 +84,7 @@ trait LinkisJobBuilder[Job <: LinkisJob] {
}
def addSource(key: String, value: Any): this.type = {
- if(source == null) source = new util.HashMap[String, Any]
+ if (source == null) source = new util.HashMap[String, Any]
source.put(key, value)
this
}
@@ -165,7 +166,7 @@ object LinkisJobBuilder {
def setDefaultClientConfig(clientConfig: DWSClientConfig): Unit = this.clientConfig = clientConfig
def getDefaultClientConfig: DWSClientConfig = {
- if(clientConfig == null) synchronized {
+ if (clientConfig == null) synchronized {
if (clientConfig == null) buildDefaultConfig()
}
clientConfig
@@ -174,9 +175,9 @@ object LinkisJobBuilder {
def setDefaultUJESClient(ujesClient: UJESClient): Unit = this.ujesClient = ujesClient
def getDefaultServerUrl: String = {
- if(StringUtils.isEmpty(serverUrl)) {
+ if (StringUtils.isEmpty(serverUrl)) {
serverUrl = Configuration.getGateWayURL()
- if(StringUtils.isEmpty(serverUrl)) throw new UJESClientBuilderException("serverUrl must be set!")
+ if (StringUtils.isEmpty(serverUrl)) throw new UJESClientBuilderException("serverUrl must be set!")
}
serverUrl
}
@@ -188,8 +189,8 @@ object LinkisJobBuilder {
private[client] def justGetDefaultUJESClient: UJESClient = ujesClient
def getDefaultUJESClient: UJESClient = {
- if(ujesClient == null) synchronized {
- if(clientConfig == null) buildDefaultConfig()
+ if (ujesClient == null) synchronized {
+ if (clientConfig == null) buildDefaultConfig()
if(ujesClient == null) {
ujesClient = new UJESClientImpl(clientConfig)
}
diff --git a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/LinkisJobClient.scala b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/LinkisJobClient.scala
index d5e6974..ef452fb 100644
--- a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/LinkisJobClient.scala
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/LinkisJobClient.scala
@@ -35,7 +35,7 @@ object LinkisJobClient extends Closeable {
val once = OnceJob
override def close(): Unit = {
- if(config.justGetDefaultUJESClient != null) {
+ if (config.justGetDefaultUJESClient != null) {
config.justGetDefaultUJESClient.close()
}
}
diff --git a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/interactive/InteractiveJobBuilder.scala b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/interactive/InteractiveJobBuilder.scala
index 90ca613..f1af58c 100644
--- a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/interactive/InteractiveJobBuilder.scala
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/interactive/InteractiveJobBuilder.scala
@@ -41,14 +41,15 @@ class InteractiveJobBuilder private[interactive]()
def setCode(code: String): this.type = addJobContent("code", code)
- def setRunType(runType: RunType): this.type= addJobContent("runType", runType.toString)
+ def setRunType(runType: RunType): this.type = addJobContent("runType", runType.toString)
def setRunTypeStr(runType: String): this.type = addJobContent("runType", runType)
override protected def validate(): Unit = {
- if(labels != null && !labels.containsKey(LabelKeyUtils.USER_CREATOR_LABEL_KEY)
- && StringUtils.isNotBlank(creator))
+ if (labels != null && !labels.containsKey(LabelKeyUtils.USER_CREATOR_LABEL_KEY)
+ && StringUtils.isNotBlank(creator)) {
addLabel(LabelKeyUtils.USER_CREATOR_LABEL_KEY, executeUser + "-" + creator)
+ }
super.validate()
}
diff --git a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/once/LinkisManagerClient.scala b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/once/LinkisManagerClient.scala
index 25f8f90..48de998 100644
--- a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/once/LinkisManagerClient.scala
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/once/LinkisManagerClient.scala
@@ -34,7 +34,8 @@ trait LinkisManagerClient extends Closeable {
def killEngineConn(killEngineConnAction: KillEngineConnAction): KillEngineConnResult
- def executeEngineConnOperation(engineOperateAction: EngineConnOperateAction): EngineConnOperateResult
+ def executeEngineConnOperation(engineConnOperateAction: EngineConnOperateAction): EngineConnOperateResult
+
}
object LinkisManagerClient {
diff --git a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/once/result/EngineConnOperateResult.scala b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/once/result/EngineConnOperateResult.scala
index 0cdecb4..b2bf3ef 100644
--- a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/once/result/EngineConnOperateResult.scala
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/once/result/EngineConnOperateResult.scala
@@ -39,13 +39,12 @@ class EngineConnOperateResult extends LinkisManagerResult {
def setIsError(isError: Boolean): Unit = this.isError = isError
- def getResult: util.Map[String, Any] = if(isError) throw new UJESJobException(20301, errorMsg) else result
+ def getResult: util.Map[String, Any] = if (isError) throw new UJESJobException(20301, errorMsg) else result
def getAsOption[T](key: String): Option[T] = Option(getAs(key))
- def getAs[T](key: String): T = getAs(key, null.asInstanceOf[T])
+ def getAs[T](key: String): T = getAs[T](key, null.asInstanceOf[T])
- def getAs[T](key: String, defaultValue: T): T = if(getResult != null && result.containsKey(key)) result.get(key).asInstanceOf[T]
- else defaultValue
-
-}
+ def getAs[T](key: String, defaultValue: T): T = if (getResult != null && result.containsKey(key)) result.get(key).asInstanceOf[T]
+ else defaultValue
+}
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/once/simple/SimpleOnceJobBuilder.scala b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/once/simple/SimpleOnceJobBuilder.scala
index 186ac82..c020390 100644
--- a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/once/simple/SimpleOnceJobBuilder.scala
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/computation/client/once/simple/SimpleOnceJobBuilder.scala
@@ -78,15 +78,16 @@ class SimpleOnceJobBuilder private[simple]()
override def build(): SubmittableSimpleOnceJob = {
ensureNotNull(labels, "labels")
ensureNotNull(jobContent, "jobContent")
- nullThenSet(params){
+ nullThenSet(params) {
params = new util.HashMap[String, Any]
}
- nullThenSet(source){
+ nullThenSet(source) {
source = new util.HashMap[String, Any]()
}
addStartupParam("label." + LabelKeyConstant.CODE_TYPE_KEY, jobContent.get("runType"))
- if(!labels.containsKey(SimpleOnceJobBuilder.ONCE_ENGINE_CONN_MODE_LABEL_KEY))
+ if (!labels.containsKey(SimpleOnceJobBuilder.ONCE_ENGINE_CONN_MODE_LABEL_KEY)) {
addLabel(ONCE_ENGINE_CONN_MODE_LABEL_KEY, ONCE_ENGINE_CONN_MODE_LABEL_VALUE)
+ }
val properties = new util.HashMap[String, String]
properties.put(OnceExecutorContentUtils.ONCE_EXECUTOR_CONTENT_KEY, getOnceExecutorContent)
properties.putAll(TaskUtils.getStartupMap(params))
@@ -114,8 +115,8 @@ object SimpleOnceJobBuilder {
private var bmlClient: BmlClient = _
private var linkisManagerClient: LinkisManagerClient = _
def getBmlClient: BmlClient = {
- if(bmlClient == null) synchronized {
- if(bmlClient == null) {
+ if (bmlClient == null) synchronized {
+ if (bmlClient == null) {
bmlClient = BmlClientFactory.createBmlClient(LinkisJobBuilder.getDefaultClientConfig)
Utils.addShutdownHook(() => bmlClient.close())
}
@@ -123,8 +124,8 @@ object SimpleOnceJobBuilder {
bmlClient
}
def getLinkisManagerClient: LinkisManagerClient = {
- if(linkisManagerClient == null) synchronized {
- if(linkisManagerClient == null) {
+ if (linkisManagerClient == null) synchronized {
+ if (linkisManagerClient == null) {
linkisManagerClient = LinkisManagerClient(LinkisJobBuilder.getDefaultUJESClient)
Utils.addShutdownHook(() => linkisManagerClient.close())
}
diff --git a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/UJESClient.scala b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/UJESClient.scala
index 792adbd..1dcb364 100644
--- a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/UJESClient.scala
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/UJESClient.scala
@@ -91,6 +91,10 @@ abstract class UJESClient extends Closeable {
executeUJESJob(getColumnsAction).asInstanceOf[GetColumnsResult]
}
+ def getTableStatisticInfo(getTableStatisticInfoAction: GetTableStatisticInfoAction): GetTableStatisticInfoResult = {
+ executeUJESJob(getTableStatisticInfoAction).asInstanceOf[GetTableStatisticInfoResult]
+ }
+
}
object UJESClient {
def apply(clientConfig: DWSClientConfig): UJESClient = new UJESClientImpl(clientConfig)
diff --git a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/UJESClientImpl.scala b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/UJESClientImpl.scala
index 39e15e0..9c63634 100644
--- a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/UJESClientImpl.scala
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/UJESClientImpl.scala
@@ -23,7 +23,7 @@ import org.apache.linkis.httpclient.response.Result
import org.apache.linkis.ujes.client.request.UJESJobAction
class UJESClientImpl(clientConfig: DWSClientConfig) extends UJESClient {
- private val dwsHttpClient = new DWSHttpClient(clientConfig, "UJES-Job-Execution-Thread")
+ private val dwsHttpClient = new DWSHttpClient(clientConfig, "Linkis-Job-Execution-Thread")
override protected[client] def executeUJESJob(ujesJobAction: UJESJobAction): Result = ujesJobAction match {
case action: Action => dwsHttpClient.execute(action)
}
diff --git a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/request/GetTableStatisticInfoAction.scala b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/request/GetTableStatisticInfoAction.scala
new file mode 100644
index 0000000..e924f03
--- /dev/null
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/request/GetTableStatisticInfoAction.scala
@@ -0,0 +1,81 @@
+/*
+ * 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.linkis.ujes.client.request
+
+import org.apache.linkis.httpclient.request.GetAction
+import org.apache.linkis.ujes.client.exception.UJESClientBuilderException
+import org.apache.commons.lang.StringUtils
+
+
+
+class GetTableStatisticInfoAction extends GetAction with UJESJobAction {
+ override def suffixURLs: Array[String] = Array("datasource", "getTableStatisticInfo")
+}
+
+object GetTableStatisticInfoAction {
+ def builder(): Builder = new Builder
+ class Builder private[GetTableStatisticInfoAction]() {
+ private var user: String = _
+ private var database: String = _
+ private var tableName: String = _
+ private var pageSize: Int = 100
+ private var partitionSort: String = "desc"
+
+ def setUser(user: String): Builder = {
+ this.user = user
+ this
+ }
+
+ def getUser(): String = user
+
+ def setDatabase(db: String): Builder = {
+ this.database = db
+ this
+ }
+
+ def setTable(table: String): Builder = {
+ this.tableName = table
+ this
+ }
+
+ def setPageSize(pageSize: Int): Builder = {
+ this.pageSize = pageSize
+ this
+ }
+
+ def setPartitionSort(order: String): Builder = {
+ this.partitionSort = order
+ this
+ }
+
+ def builder(): GetTableStatisticInfoAction = {
+ if (StringUtils.isBlank(user)) throw new UJESClientBuilderException("user is needed!")
+ if (StringUtils.isBlank(database)) throw new UJESClientBuilderException("database is needed!")
+ if (StringUtils.isBlank(tableName)) throw new UJESClientBuilderException("table is needed!")
+ val getTableStatisticInfoAction = new GetTableStatisticInfoAction
+ getTableStatisticInfoAction.setUser(user)
+ getTableStatisticInfoAction.setParameter("database", database)
+ getTableStatisticInfoAction.setParameter("tableName", tableName)
+ getTableStatisticInfoAction.setParameter("pageSize", pageSize)
+ getTableStatisticInfoAction.setParameter("partitionSort", partitionSort)
+ getTableStatisticInfoAction
+ }
+
+ }
+
+}
diff --git a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/request/JobExecuteAction.scala b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/request/JobExecuteAction.scala
index fdf52a7..33aec6c 100644
--- a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/request/JobExecuteAction.scala
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/request/JobExecuteAction.scala
@@ -216,7 +216,7 @@ object JobExecuteAction {
val PRESTO = new EngineType {
override val toString: String = "presto"
val PSQL = new RunType {
- override val toString: String = "presto"
+ override val toString: String = "psql"
}
override def getDefaultRunType: RunType = PSQL
}
diff --git a/linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-resource-manager-common/src/main/java/org/apache/linkis/resourcemanager/protocol/TimeoutEMEngineRequest.java b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/response/GetTableStatisticInfoResult.scala
similarity index 56%
copy from linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-resource-manager-common/src/main/java/org/apache/linkis/resourcemanager/protocol/TimeoutEMEngineRequest.java
copy to linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/response/GetTableStatisticInfoResult.scala
index c4ba1c4..6ffef19 100644
--- a/linkis-computation-governance/linkis-manager/linkis-manager-commons/linkis-resource-manager-common/src/main/java/org/apache/linkis/resourcemanager/protocol/TimeoutEMEngineRequest.java
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/response/GetTableStatisticInfoResult.scala
@@ -15,29 +15,27 @@
* limitations under the License.
*/
-package org.apache.linkis.resourcemanager.protocol;
+package org.apache.linkis.ujes.client.response
-import org.apache.linkis.manager.common.protocol.em.EMRequest;
+import org.apache.linkis.httpclient.dws.annotation.DWSHttpMessageResult
+import org.apache.linkis.httpclient.dws.response.DWSResult
+import org.apache.linkis.ujes.client.request.UserAction
-public class TimeoutEMEngineRequest implements EMRequest {
+import java.util
+import scala.beans.BeanProperty
- private String user;
- private String ticketId;
- @Override
- public String getUser() {
- return user;
- }
+@DWSHttpMessageResult("/api/rest_j/v\\d+/datasource/getTableStatisticInfo")
+class GetTableStatisticInfoResult extends DWSResult with UserAction {
- public void setUser(String user) {
- this.user = user;
- }
+ @BeanProperty
+ var pageNow : Int = _
+ @BeanProperty
+ var pageSize : Int = _
+ @BeanProperty
+ var tableStatisticInfo : util.Map[String, Any] = _
+ @BeanProperty
+ var totalSize : Int = _
- public String getTicketId() {
- return ticketId;
- }
-
- public void setTicketId(String ticketId) {
- this.ticketId = ticketId;
- }
}
+
diff --git a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/response/JobInfoResult.scala b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/response/JobInfoResult.scala
index 2760dc2..0f7f0d9 100644
--- a/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/response/JobInfoResult.scala
+++ b/linkis-computation-governance/linkis-client/linkis-computation-client/src/main/scala/org/apache/linkis/ujes/client/response/JobInfoResult.scala
@@ -36,6 +36,8 @@ class JobInfoResult extends DWSResult with UserAction with Status {
private var requestPersistTask: RequestPersistTask = _
private var resultSetList: Array[String] = _
+ private var strongerExecId: String = _
+
def setTask(task: util.Map[_, _]): Unit = {
this.task = task
requestPersistTask = new RequestPersistTask
@@ -44,6 +46,7 @@ class JobInfoResult extends DWSResult with UserAction with Status {
task.remove("createdTime")
task.remove("updatedTime")
task.remove("engineStartTime")
+ task.remove("labels")
Utils.tryCatch{
BeanUtils.populate(requestPersistTask, task.asInstanceOf[util.Map[String, _]])
}{
@@ -53,12 +56,20 @@ class JobInfoResult extends DWSResult with UserAction with Status {
requestPersistTask.setCreatedTime(new Date(createdTime))
requestPersistTask.setUpdatedTime(new Date(updatedTime))
requestPersistTask.setEngineStartTime(new Date(updatedTime))
+ if (task.containsKey("strongerExecId")) {
+ this.strongerExecId = task.get("strongerExecId").asInstanceOf[String]
+ }
+
}
def getTask = task
def getRequestPersistTask: RequestPersistTask = requestPersistTask
+ def getStrongerExecId: String = {
+ this.strongerExecId
+ }
+
def getResultSetList(ujesClient: UJESClient): Array[String] = {
if(isSucceed && resultSetList == null) synchronized {
if(resultSetList != null) return resultSetList
diff --git a/linkis-computation-governance/linkis-computation-governance-common/src/main/java/org/apache/linkis/governance/common/entity/job/JobRequest.java b/linkis-computation-governance/linkis-computation-governance-common/src/main/java/org/apache/linkis/governance/common/entity/job/JobRequest.java
index 648966c..9ed1f2a 100644
--- a/linkis-computation-governance/linkis-computation-governance-common/src/main/java/org/apache/linkis/governance/common/entity/job/JobRequest.java
+++ b/linkis-computation-governance/linkis-computation-governance-common/src/main/java/org/apache/linkis/governance/common/entity/job/JobRequest.java
@@ -46,6 +46,9 @@ public class JobRequest {
private Date createdTime;
private Date updatedTime;
private String instances;
+ /** result location */
+ private String resultLocation;
+
private Map<String, Object> metrics = new HashMap<>();
public Long getId() {
@@ -184,6 +187,14 @@ public class JobRequest {
this.metrics = metrics;
}
+ public String getResultLocation() {
+ return resultLocation;
+ }
+
+ public void setResultLocation(String resultLocation) {
+ this.resultLocation = resultLocation;
+ }
+
@Override
public String toString() {
return "JobRequest{"
diff --git a/linkis-computation-governance/linkis-computation-governance-common/src/main/java/org/apache/linkis/governance/common/entity/job/OnceExecutorContent.scala b/linkis-computation-governance/linkis-computation-governance-common/src/main/scala/org/apache/linkis/governance/common/entity/job/OnceExecutorContent.scala
similarity index 99%
rename from linkis-computation-governance/linkis-computation-governance-common/src/main/java/org/apache/linkis/governance/common/entity/job/OnceExecutorContent.scala
rename to linkis-computation-governance/linkis-computation-governance-common/src/main/scala/org/apache/linkis/governance/common/entity/job/OnceExecutorContent.scala
index 0092e16..f28c6ac 100644
--- a/linkis-computation-governance/linkis-computation-governance-common/src/main/java/org/apache/linkis/governance/common/entity/job/OnceExecutorContent.scala
+++ b/linkis-computation-governance/linkis-computation-governance-common/src/main/scala/org/apache/linkis/governance/common/entity/job/OnceExecutorContent.scala
@@ -5,16 +5,16 @@
* 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.linkis.governance.common.entity.job
import java.util
diff --git a/linkis-computation-governance/linkis-computation-governance-common/src/main/scala/org/apache/linkis/governance/common/paser/CodeParser.scala b/linkis-computation-governance/linkis-computation-governance-common/src/main/scala/org/apache/linkis/governance/common/paser/CodeParser.scala
index ff637d7..d7ac1d6 100644
--- a/linkis-computation-governance/linkis-computation-governance-common/src/main/scala/org/apache/linkis/governance/common/paser/CodeParser.scala
+++ b/linkis-computation-governance/linkis-computation-governance-common/src/main/scala/org/apache/linkis/governance/common/paser/CodeParser.scala
@@ -260,6 +260,49 @@ class EmptyCodeParser extends SingleCodeParser {
}
+class JsonCodeParser extends SingleCodeParser {
+
+ override val codeType: CodeType = CodeType.JSON
+
+ override def parse(code: String): Array[String] = {
+ // parse json code
+ val codeBuffer = new ArrayBuffer[String]()
+ val statementBuffer = new ArrayBuffer[Char]()
+
+ var status = 0
+ var isBegin = false
+ code.trim.toCharArray().foreach {
+ case '{' => {
+ if (status == 0) {
+ if (isBegin && !statementBuffer.isEmpty) {
+ codeBuffer.append(new String(statementBuffer.toArray))
+ statementBuffer.clear()
+ } else {
+ isBegin = true
+ }
+ }
+ status -= 1
+ statementBuffer.append('{')
+ }
+ case '}' => {
+ status += 1
+ statementBuffer.append('}')
+ }
+ case char: Char => if (status == 0 && isBegin && !statementBuffer.isEmpty) {
+ codeBuffer.append(new String(statementBuffer.toArray))
+ statementBuffer.clear()
+ isBegin = false
+ } else {
+ statementBuffer.append(char)
+ }
+ }
+
+ if(statementBuffer.nonEmpty) codeBuffer.append(new String(statementBuffer.toArray))
+
+ codeBuffer.toArray
+ }
+
+}
object CodeType extends Enumeration {
type CodeType = Value
diff --git a/linkis-computation-governance/linkis-computation-governance-common/src/main/scala/org/apache/linkis/governance/common/utils/GovernanceUtils.scala b/linkis-computation-governance/linkis-computation-governance-common/src/main/scala/org/apache/linkis/governance/common/utils/GovernanceUtils.scala
new file mode 100644
index 0000000..8489732
--- /dev/null
+++ b/linkis-computation-governance/linkis-computation-governance-common/src/main/scala/org/apache/linkis/governance/common/utils/GovernanceUtils.scala
@@ -0,0 +1,50 @@
+/*
+ * 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.linkis.governance.common.utils
+
+import org.apache.commons.lang.StringUtils
+import org.apache.linkis.common.conf.Configuration
+import org.apache.linkis.common.utils.{Logging, Utils}
+
+import java.io.File
+
+object GovernanceUtils extends Logging{
+
+
+ def killProcess(pid: String, desc: String, isSudo: Boolean): Unit = {
+ val subProcessKillScriptPath = Configuration.getLinkisHome() + "/sbin/kill-process-by-pid.sh"
+ if (StringUtils.isBlank(subProcessKillScriptPath) || !new File(subProcessKillScriptPath).exists()) {
+ logger.error(s"Failed to locate kill-script, $subProcessKillScriptPath not exist")
+ } else if (StringUtils.isNotBlank(pid)) {
+ val cmd = if (isSudo) {
+ Array("sudo", "sh", subProcessKillScriptPath, String.valueOf(pid))
+ } else {
+ Array("sh", subProcessKillScriptPath, String.valueOf(pid))
+ }
+ logger.info(s"Starting to kill sub-processes. desc: $desc Kill Command: " + cmd.mkString(" "))
+
+ Utils.tryCatch {
+ val output = Utils.exec(cmd, 600 * 1000L)
+ logger.info(s"Kill Success! desc: $desc. msg:\n ${output}")
+ } { t =>
+ logger.error(s"Kill error! desc: $desc.", t)
+ }
+ }
+ }
+
+}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-linux-launch/src/main/scala/org/apache/linkis/ecm/linux/launch/LinuxProcessEngineConnLaunch.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-linux-launch/src/main/scala/org/apache/linkis/ecm/linux/launch/LinuxProcessEngineConnLaunch.scala
index 1f68186..217f0b2 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-linux-launch/src/main/scala/org/apache/linkis/ecm/linux/launch/LinuxProcessEngineConnLaunch.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-linux-launch/src/main/scala/org/apache/linkis/ecm/linux/launch/LinuxProcessEngineConnLaunch.scala
@@ -17,6 +17,7 @@
package org.apache.linkis.ecm.linux.launch
+import org.apache.linkis.common.utils.Utils
import org.apache.linkis.ecm.core.launch.ProcessEngineConnLaunch
@@ -27,4 +28,21 @@ class LinuxProcessEngineConnLaunch extends ProcessEngineConnLaunch {
override protected def sudoCommand(user: String, command: String): Array[String] =
Array("sudo", "su", "-", user, "-c", command)
+
+ override def getPid(): Option[String] = {
+ Utils.tryCatch {
+ val clazz = Class.forName("java.lang.UNIXProcess");
+ val field = clazz.getDeclaredField("pid");
+ field.setAccessible(true);
+ val pid = field.get(getProcess()).asInstanceOf[Int]
+ if (pid >0) {
+ Some(pid.toString)
+ } else {
+ None
+ }
+ } { t =>
+ info("Failed to acquire pid for shell process", t)
+ None
+ }
+ }
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/conf/ECMErrorCode.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/conf/ECMErrorCode.scala
index 2b1456c..760993f 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/conf/ECMErrorCode.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/conf/ECMErrorCode.scala
@@ -20,8 +20,14 @@ package org.apache.linkis.ecm.core.conf
object ECMErrorCode {
- val PROCESS_WAITFOR_ERROR = 20001
+ val EC_START_TIME_OUT = 11100
+
+ val EC_INTERRUPT_TIME_OUT = 11101
val EC_START_FAILED = 11102
+ val EC_FETCH_LOG_FAILED = 11110
+
+ val PROCESS_WAITFOR_ERROR = 20001
+
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/launch/EngineConnManagerEnv.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/launch/EngineConnManagerEnv.scala
index 51fdd03..a1c2bfd 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/launch/EngineConnManagerEnv.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/launch/EngineConnManagerEnv.scala
@@ -17,6 +17,8 @@
package org.apache.linkis.ecm.core.launch
+import scala.collection.mutable
+
trait EngineConnManagerEnv {
@@ -26,7 +28,7 @@ trait EngineConnManagerEnv {
val engineConnTempDirs: String
val engineConnManagerHost: String
val engineConnManagerPort: String
- val linkDirs: Map[String, String]
+ val linkDirs: mutable.HashMap[String, String]
val properties: Map[String, String]
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/launch/ProcessEngineConnLaunch.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/launch/ProcessEngineConnLaunch.scala
index e3432b7..7c12d2a 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/launch/ProcessEngineConnLaunch.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-core/src/main/scala/org/apache/linkis/ecm/core/launch/ProcessEngineConnLaunch.scala
@@ -125,6 +125,14 @@ trait ProcessEngineConnLaunch extends EngineConnLaunch with Logging {
def getEngineConnPort: String = engineConnPort
+ protected def getProcess(): Process = this.process
+
+ /**
+ * Get the pid of the startup process
+ * @return
+ */
+ def getPid(): Option[String] = None
+
protected def getCommandArgs: Array[String] = {
if (request.creationDesc.properties.exists { case (k, v) => k.contains(" ") || (v != null && v.contains(" ")) })
throw new ErrorException(30000, "Startup parameters contain spaces!(启动参数中包含空格!)") //TODO exception
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/pom.xml b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/pom.xml
index 3ac89d9..4949f45 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/pom.xml
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/pom.xml
@@ -51,7 +51,7 @@
<dependency>
<groupId>org.apache.linkis</groupId>
- <artifactId>linkis-message-scheduler</artifactId>
+ <artifactId>linkis-rpc</artifactId>
<version>${linkis.version}</version>
<scope>provided</scope>
</dependency>
@@ -84,6 +84,12 @@
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>com.github.oshi</groupId>
+ <artifactId>oshi-core</artifactId>
+ <version>5.3.4</version>
+ </dependency>
+
</dependencies>
<build>
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/conf/ECMConfiguration.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/conf/ECMConfiguration.scala
index c39df6c..dae3d4b 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/conf/ECMConfiguration.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/conf/ECMConfiguration.scala
@@ -37,14 +37,17 @@ object ECMConfiguration {
val ECM_ASYNC_BUS_WAITTOEMPTY_TIME: Long = CommonVars("wds.linkis.ecm.async.bus.waittoempty.time", 5000L).getValue
//resource
- val ECM_MAX_MEMORY_AVAILABLE: Long = CommonVars[Long]("wds.linkis.ecm.memory.max", ByteTimeUtils.byteStringAsBytes("80g")).getValue
- val ECM_MAX_CORES_AVAILABLE: Int = CommonVars[Integer]("wds.linkis.ecm.cores.max", 50).getValue
+ val ECM_MAX_MEMORY_AVAILABLE: Long = CommonVars[Long]("wds.linkis.ecm.memory.max", ByteTimeUtils.byteStringAsBytes("100g")).getValue
+ val ECM_MAX_CORES_AVAILABLE: Int = CommonVars[Integer]("wds.linkis.ecm.cores.max", 100).getValue
val ECM_MAX_CREATE_INSTANCES: Int = CommonVars[Integer]("wds.linkis.ecm.engineconn.instances.max", 50).getValue
val ECM_PROTECTED_MEMORY: Long = CommonVars[Long]("wds.linkis.ecm.protected.memory", ByteTimeUtils.byteStringAsBytes("4g")).getValue
+ val ECM_PROTECTED_CPU_LOAD: Double = CommonVars[Double]("wds.linkis.ecm.protected.cpu.load", 0.98D).getValue
val ECM_PROTECTED_CORES: Int = CommonVars[Integer]("wds.linkis.ecm.protected.cores.max", 2).getValue
val ECM_PROTECTED_INSTANCES: Int = CommonVars[Integer]("wds.linkis.ecm.protected.engine.instances", 2).getValue
+ val ECM_PROTECTED_LOAD_ENABLED: Boolean = CommonVars[Boolean]("wds.linkis.ecm.protected.load.enabled", false).getValue
+
val MANAGER_SPRING_NAME: String = GovernanceCommonConf.MANAGER_SPRING_NAME.getValue
val ENGINE_CONN_MANAGER_SPRING_NAME: String = GovernanceCommonConf.ENGINE_CONN_MANAGER_SPRING_NAME.getValue
@@ -75,5 +78,6 @@ object ECMConfiguration {
val ENGINE_START_ERROR_MSG_MAX_LEN = CommonVars("wds.linkis.ecm.engine.start.error.msg.max.len", 500)
+ val ECM_PROCESS_SCRIPT_KILL: Boolean = CommonVars[Boolean]("wds.linkis.ecm.script.kill.engineconn", true).getValue
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/hook/JarUDFLoadECMHook.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/hook/JarUDFLoadECMHook.scala
index aedabe8..86e5fbe 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/hook/JarUDFLoadECMHook.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/hook/JarUDFLoadECMHook.scala
@@ -16,23 +16,82 @@
*/
package org.apache.linkis.ecm.server.hook
-import org.apache.linkis.common.utils.Logging
+import org.apache.linkis.common.utils.{Logging, Utils}
import org.apache.linkis.ecm.core.engineconn.EngineConn
import org.apache.linkis.manager.engineplugin.common.launch.entity.EngineConnLaunchRequest
-import org.apache.linkis.manager.engineplugin.common.launch.process.{LaunchConstants, ProcessEngineConnLaunchRequest}
+import org.apache.linkis.manager.engineplugin.common.launch.process.{Environment, LaunchConstants, ProcessEngineConnLaunchRequest}
import org.apache.linkis.udf.UDFClient
import org.apache.commons.lang.StringUtils
+import org.apache.linkis.common.io.FsPath
+import org.apache.linkis.ecm.server.service.LocalDirsHandleService
+import org.apache.linkis.ecm.server.service.impl.DefaultLocalDirsHandleService
+import org.apache.linkis.ecm.server.util.ECMUtils
+import org.apache.linkis.manager.common.protocol.bml.BmlResource
+import org.apache.linkis.manager.label.utils.LabelUtil
+import org.apache.linkis.storage.FSFactory
+import org.apache.linkis.storage.fs.FileSystem
+import org.apache.linkis.storage.utils.{FileSystemUtils, StorageUtils}
+
+import java.io.File
+import java.nio.file.Paths
+import scala.collection.mutable
class JarUDFLoadECMHook extends ECMHook with Logging {
+ private var localDirsHandleService: LocalDirsHandleService = new DefaultLocalDirsHandleService
+
+ private val fs: FileSystem = FSFactory.getFs(StorageUtils.FILE).asInstanceOf[FileSystem]
+
+ fs.init(null)
+
override def beforeLaunch(request: EngineConnLaunchRequest, conn: EngineConn): Unit = {
request match {
case pel: ProcessEngineConnLaunchRequest =>
info("start loading UDFs")
- val udfInfos = UDFClient.getUdfInfos(request.user,"udf").filter{ info => info.getUdfType == 0 && info.getExpire == false && StringUtils.isNotBlank(info.getPath) && info.getLoad == true }
- udfInfos.foreach{ udfInfo =>
- LaunchConstants.addPathToUDFPath(pel.environment, udfInfo.getPath)
+ val user = pel.user
+ val ticketId = pel.ticketId
+ val engineType = LabelUtil.getEngineType(pel.labels)
+ val workDir = localDirsHandleService.getEngineConnWorkDir(user, ticketId, engineType)
+ val pubDir = localDirsHandleService.getEngineConnPublicDir
+ val udfDir = workDir + File.separator + "udf"
+ val fsPath = new FsPath(StorageUtils.FILE_SCHEMA + udfDir)
+ if (!fs.exists(fsPath)) {
+ FileSystemUtils.mkdirs(fs, fsPath, Utils.getJvmUser)
+ fs.setPermission(fsPath, "rwxrwxrwx")
+ }
+
+ val udfInfos = UDFClient.getJarUdf(pel.user)
+ val fileNameSet: mutable.HashSet[String] = new mutable.HashSet[String]()
+ import util.control.Breaks._
+ udfInfos.foreach { udfInfo =>
+ val resourceId = udfInfo.getBmlResourceId
+ val version = udfInfo.getBmlResourceVersion
+ val bmlResourceDir = StorageUtils.FILE_SCHEMA + Paths.get(pubDir, resourceId, version).toFile.getPath
+ val fsPath = new FsPath(bmlResourceDir)
+ val bmlResource: BmlResource = new BmlResource
+ bmlResource.setResourceId(resourceId)
+ bmlResource.setVersion(version)
+ // 文件名用path最后一截
+ val fileName = udfInfo.getPath.substring(udfInfo.getPath.lastIndexOf("/") + 1)
+ bmlResource.setFileName(fileName)
+ breakable {
+ if (StringUtils.isEmpty(fileName) || fileNameSet.contains(fileName)) {
+ break()
+ }
+ fileNameSet += bmlResource.getFileName
+ if (!fs.exists(fsPath)) resourceId.intern().synchronized {
+ if (!fs.exists(fsPath)) {
+ ECMUtils.downLoadBmlResourceToLocal(bmlResource, if (udfInfo.getCreateUser.equals("bdp")) "hadoop" else udfInfo.getCreateUser, fsPath.getPath)(fs)
+ info(s"Finished to download bml resource ${fsPath.getPath}")
+ }
+ }
+ conn.getEngineConnLaunchRunner.getEngineConnLaunch.getEngineConnManagerEnv().linkDirs.
+ put(fsPath.getPath + File.separator + bmlResource.getFileName, udfDir + File.separator + bmlResource.getFileName)
+ }
}
+ // LaunchConstants.addPathToClassPath(pel.environment, udfDir + File.separator + "*")
+ val udfJars = fileNameSet.map(udfDir + File.separator + _)
+ pel.environment.put(Environment.UDF_JARS.toString, udfJars.mkString(","));
}
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/operator/EngineConnLogOperator.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/operator/EngineConnLogOperator.scala
index bd1e3c6..c446abc 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/operator/EngineConnLogOperator.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/operator/EngineConnLogOperator.scala
@@ -20,16 +20,16 @@ package org.apache.linkis.ecm.server.operator
import java.io.{File, RandomAccessFile}
import java.util
-
import org.apache.linkis.DataWorkCloudApplication
import org.apache.linkis.common.conf.CommonVars
import org.apache.linkis.common.utils.{Logging, Utils}
-import org.apache.linkis.ecm.server.exception.{ECMErrorCode, ECMErrorException}
+import org.apache.linkis.ecm.server.exception.ECMErrorException
import org.apache.linkis.ecm.server.service.{EngineConnListService, LocalDirsHandleService}
import org.apache.linkis.manager.common.operator.Operator
import org.apache.linkis.manager.common.protocol.em.ECMOperateRequest
import org.apache.commons.io.IOUtils
import org.apache.commons.lang.StringUtils
+import org.apache.linkis.ecm.core.conf.ECMErrorCode
import scala.collection.JavaConverters.asScalaBufferConverter
import scala.util.matching.Regex
@@ -130,12 +130,12 @@ class EngineConnLogOperator extends Operator with Logging {
.getOrElse {
val creator = getAsThrow[String]("creator")
val engineConnType = getAsThrow[String]("engineConnType")
- localDirsHandleService.getEngineConnLogDir(creator, ticketId)
+ localDirsHandleService.getEngineConnLogDir(creator, ticketId, engineConnType)
}
(logDir, ticketId)
}
- val logPath = new File(engineConnLogDir, EngineConnLogOperator.LOG_FILE_NAME.getValue)
- if(!logPath.exists() || !logPath.isFile) {
+ val logPath = new File(engineConnLogDir, getAs("logType", EngineConnLogOperator.LOG_FILE_NAME.getValue));
+ if (!logPath.exists() || !logPath.isFile) {
throw new ECMErrorException(ECMErrorCode.EC_FETCH_LOG_FAILED, s"LogFile $logPath is not exists or is not a file.")
}
info(s"Try to fetch EngineConn(id: $ticketId, instance: $engineConnInstance) logs from ${logPath.getPath}.")
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/ECMHealthService.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/ECMHealthService.scala
index e713561..b596756 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/ECMHealthService.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/ECMHealthService.scala
@@ -18,7 +18,8 @@
package org.apache.linkis.ecm.server.service
import org.apache.linkis.ecm.core.report.ECMHealthReport
-import org.apache.linkis.manager.common.protocol.node.{NodeHeartbeatMsg, NodeHeartbeatRequest}
+import org.apache.linkis.manager.common.entity.enumeration.{NodeHealthy, NodeStatus}
+import org.apache.linkis.manager.common.protocol.node.{NodeHealthyRequest, NodeHeartbeatMsg, NodeHeartbeatRequest}
trait ECMHealthService{
@@ -27,8 +28,20 @@ trait ECMHealthService{
def reportHealth(report: ECMHealthReport): Unit
- def generateHealthReport(reportTime:Long): ECMHealthReport
+ def generateHealthReport(reportTime: Long): ECMHealthReport
def dealNodeHeartbeatRequest(nodeHeartbeatRequest: NodeHeartbeatRequest): NodeHeartbeatMsg
+ def dealNodeHealthyRequest(nodeHealthyRequest: NodeHealthyRequest): Unit
+
+ def getNodeStatus: NodeStatus
+
+ def getNodeHealthy: NodeHealthy
+
+ def isSetByManager: Boolean
+
+ def transitionStatus(toStatus: NodeStatus): Unit
+
+ def transitionHealthy(toHealthy: NodeHealthy): Unit
+
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/LocalDirsHandleService.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/LocalDirsHandleService.scala
index d686c7c..f4cbded 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/LocalDirsHandleService.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/LocalDirsHandleService.scala
@@ -22,13 +22,13 @@ trait LocalDirsHandleService {
def getEngineConnManagerHomeDir: String
- def getEngineConnWorkDir(user: String, ticketId: String): String
+ def getEngineConnWorkDir(user: String, ticketId: String, engineType: String): String
def getEngineConnPublicDir: String
- def getEngineConnLogDir(user: String, ticketId: String): String
+ def getEngineConnLogDir(user: String, ticketId: String, engineType: String): String
- def getEngineConnTmpDir(user: String, ticketId: String): String
+ def getEngineConnTmpDir(user: String, ticketId: String, engineType: String): String
def cleanup(): Unit
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/AbstractEngineConnLaunchService.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/AbstractEngineConnLaunchService.scala
index 79a8667..cc70c45 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/AbstractEngineConnLaunchService.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/AbstractEngineConnLaunchService.scala
@@ -92,28 +92,27 @@ abstract class AbstractEngineConnLaunchService extends EngineConnLaunchService w
conn.setServiceInstance(serviceInstance)
case _ =>
}
+ afterLaunch(request, conn, duration)
+
val future = Future {
- afterLaunch(request, conn, duration)
+ logger.info(s"wait engineConn ${conn.getServiceInstance} start")
+ waitEngineConnStart(request, conn, duration)
}
future onComplete {
case Failure(t) =>
- throw t
+ logger.error(s"init ${conn.getServiceInstance} failed.${conn.getEngineConnLaunchRunner.getEngineConnLaunch.getEngineConnManagerEnv().engineConnWorkDir}")
case Success(_) =>
- info(s"init ${conn.getServiceInstance} succeed.")
+ logger.info(s"init ${conn.getServiceInstance} succeed.${conn.getEngineConnLaunchRunner.getEngineConnLaunch.getEngineConnManagerEnv().engineConnWorkDir}")
}
- //超时忽略,如果状态翻转了则直接返回
- Utils.tryQuietly(Await.result(future, Duration(WAIT_ENGINECONN_PID.getValue.toLong, TimeUnit.MILLISECONDS)))
- }{
- //failed,1.被ms打断,2.超时,3.普通错误,比如process
- t: Throwable =>
- error(s"init ${conn.getServiceInstance} failed, now stop and delete it. message: ${t.getMessage}")
- conn.getEngineConnLaunchRunner.stop()
- Sender.getSender(MANAGER_SPRING_NAME).send(EngineConnStatusCallbackToAM(conn.getServiceInstance,
- NodeStatus.ShuttingDown, " wait init failed , reason " + ExceptionUtils.getRootCauseMessage(t)))
- LinkisECMApplication.getContext.getECMSyncListenerBus.postToAll(EngineConnStatusChangeEvent(conn.getTickedId, Failed))
- throw t
+ } { t =>
+ error(s"init ${conn.getServiceInstance} failed, ${conn.getEngineConnLaunchRunner.getEngineConnLaunch.getEngineConnManagerEnv().engineConnWorkDir}, now stop and delete it. message: ${t.getMessage}", t)
+ conn.getEngineConnLaunchRunner.stop()
+ Sender.getSender(MANAGER_SPRING_NAME).send(EngineConnStatusCallbackToAM(conn.getServiceInstance,
+ NodeStatus.ShuttingDown, " wait init failed , reason " + ExceptionUtils.getRootCauseMessage(t)))
+ LinkisECMApplication.getContext.getECMSyncListenerBus.postToAll(EngineConnStatusChangeEvent(conn.getTickedId, Failed))
+ throw t
}
val engineNode = new AMEngineNode()
engineNode.setLabels(conn.getLabels)
@@ -124,6 +123,8 @@ abstract class AbstractEngineConnLaunchService extends EngineConnLaunchService w
engineNode
}
+ def waitEngineConnStart(request: EngineConnLaunchRequest, conn: EngineConn, duration: Long): Unit
+
def createEngineConn: EngineConn = new DefaultEngineConn
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/BmlResourceLocalizationService.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/BmlResourceLocalizationService.scala
index 485857b..f61aec4 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/BmlResourceLocalizationService.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/BmlResourceLocalizationService.scala
@@ -19,7 +19,6 @@ package org.apache.linkis.ecm.server.service.impl
import java.io.File
import java.nio.file.Paths
-
import org.apache.linkis.DataWorkCloudApplication
import org.apache.linkis.common.conf.Configuration
import org.apache.linkis.common.io.FsPath
@@ -34,6 +33,7 @@ import org.apache.linkis.ecm.server.util.ECMUtils
import org.apache.linkis.manager.common.protocol.bml.BmlResource
import org.apache.linkis.manager.engineplugin.common.launch.entity.EngineConnLaunchRequest
import org.apache.linkis.manager.engineplugin.common.launch.process.ProcessEngineConnLaunchRequest
+import org.apache.linkis.manager.label.utils.LabelUtil
import org.apache.linkis.storage.FSFactory
import org.apache.linkis.storage.fs.FileSystem
import org.apache.linkis.storage.utils.{FileSystemUtils, StorageUtils}
@@ -65,26 +65,20 @@ class BmlResourceLocalizationService extends ResourceLocalizationService with Lo
val linkDirsP = new mutable.HashMap[String, String]
val user = request.user
val ticketId = request.ticketId
- val workDir = createDirIfNotExit(localDirsHandleService.getEngineConnWorkDir(user, ticketId))
+ val engineType = LabelUtil.getEngineType(request.labels)
+ val workDir = createDirIfNotExit(localDirsHandleService.getEngineConnWorkDir(user, ticketId, engineType))
val emHomeDir = createDirIfNotExit(localDirsHandleService.getEngineConnManagerHomeDir)
- val logDirs = createDirIfNotExit(localDirsHandleService.getEngineConnLogDir(user, ticketId))
- val tmpDirs = createDirIfNotExit(localDirsHandleService.getEngineConnTmpDir(user, ticketId))
+ val logDirs = createDirIfNotExit(localDirsHandleService.getEngineConnLogDir(user, ticketId, engineType))
+ val tmpDirs = createDirIfNotExit(localDirsHandleService.getEngineConnTmpDir(user, ticketId, engineType))
files.foreach(downloadBmlResource(request, linkDirsP, _, workDir))
engineConn.getEngineConnLaunchRunner.getEngineConnLaunch.setEngineConnManagerEnv(new EngineConnManagerEnv {
override val engineConnManagerHomeDir: String = emHomeDir
override val engineConnWorkDir: String = workDir
override val engineConnLogDirs: String = logDirs
override val engineConnTempDirs: String = tmpDirs
-
- var hostName = Utils.getComputerName
- val eurekaPreferIp = Configuration.EUREKA_PREFER_IP
- if(eurekaPreferIp){
- hostName = DataWorkCloudApplication.getApplicationContext.getEnvironment().getProperty("spring.cloud.client.ip-address")
- }
- override val engineConnManagerHost: String = hostName
+ override val engineConnManagerHost: String = Utils.getComputerName
override val engineConnManagerPort: String = DataWorkCloudApplication.getApplicationContext.getEnvironment.getProperty("server.port")
- override val linkDirs: Map[String, String] = linkDirsP.toMap
- // TODO: 注册发现信息的配置化
+ override val linkDirs: mutable.HashMap[String, String] = linkDirsP
override val properties: Map[String, String] = Map("eureka.client.serviceUrl.defaultZone" -> ECM_EUREKA_DEFAULTZONE)
})
case _ =>
@@ -112,17 +106,36 @@ class BmlResourceLocalizationService extends ResourceLocalizationService with Lo
val publicDir = localDirsHandleService.getEngineConnPublicDir
val bmlResourceDir = schema + Paths.get(publicDir, resourceId, version).toFile.getPath
val fsPath = new FsPath(bmlResourceDir)
- if (!fs.exists(fsPath)) {
- ECMUtils.downLoadBmlResourceToLocal(resource, user, fsPath.getPath)
- val unzipDir = fsPath.getSchemaPath + File.separator + resource.getFileName.substring(0, resource.getFileName.lastIndexOf("."))
- FileSystemUtils.mkdirs(fs, new FsPath(unzipDir), Utils.getJvmUser)
- ZipUtils.unzip(bmlResourceDir + File.separator + resource.getFileName, unzipDir)
- fs.delete(new FsPath(bmlResourceDir + File.separator + resource.getFileName))
+
+ /**
+ * Prevent concurrent use of resourceId as a lock object
+ */
+ if (!fs.exists(fsPath)) resourceId.intern().synchronized {
+ if (!fs.exists(fsPath)) {
+ ECMUtils.downLoadBmlResourceToLocal(resource, user, fsPath.getPath)
+ val unzipDir = fsPath.getSchemaPath + File.separator + resource.getFileName.substring(0, resource.getFileName.lastIndexOf("."))
+ FileSystemUtils.mkdirs(fs, new FsPath(unzipDir), Utils.getJvmUser)
+ val path = bmlResourceDir + File.separator + resource.getFileName
+ Utils.tryCatch(ZipUtils.unzip(path, unzipDir)) {
+ t: Throwable =>
+ logger.error("Failed to unzip path", t)
+ Utils.tryAndWarn(fs.delete(fsPath))
+ }
+ logger.info(s"Finished to download bml resource ${fsPath.getPath}")
+ fs.delete(new FsPath(bmlResourceDir + File.separator + resource.getFileName))
+ }
}
//2.软连,并且添加到map
val dirAndFileList = fs.listPathWithError(fsPath)
- dirAndFileList.getFsPaths.foreach {
- case path: FsPath =>
+ var paths = dirAndFileList.getFsPaths.toList
+ if (paths.exists(_.getPath.endsWith(".zip"))) {
+ logger.info(s"Start to wait fs path to init ${fsPath.getPath}")
+ resourceId.intern().synchronized {
+ logger.info(s"Finished to wait fs path to init ${fsPath.getPath} ")
+ }
+ paths = fs.listPathWithError(fsPath).getFsPaths.toList
+ }
+ paths.foreach { path =>
val name = new File(path.getPath).getName
linkDirs.put(path.getPath, workDir + seperator + name)
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultECMHealthService.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultECMHealthService.scala
index ea83e97..6ddb94d 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultECMHealthService.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultECMHealthService.scala
@@ -19,33 +19,52 @@ package org.apache.linkis.ecm.server.service.impl
import java.util.Date
import java.util.concurrent.TimeUnit
-
-import org.apache.linkis.common.utils.Utils
+import org.apache.linkis.common.utils.{ByteTimeUtils, OverloadUtils, Utils}
import org.apache.linkis.ecm.core.listener.{ECMEvent, ECMEventListener}
import org.apache.linkis.ecm.core.report.ECMHealthReport
import org.apache.linkis.ecm.server.LinkisECMApplication
+import org.apache.linkis.ecm.server.conf.ECMConfiguration
import org.apache.linkis.ecm.server.conf.ECMConfiguration._
import org.apache.linkis.ecm.server.listener.{ECMClosedEvent, ECMReadyEvent}
import org.apache.linkis.ecm.server.report.DefaultECMHealthReport
import org.apache.linkis.ecm.server.service.{ECMHealthService, EngineConnListService}
+import org.apache.linkis.ecm.server.util.HardwareUtils
import org.apache.linkis.manager.common.entity.enumeration.{NodeHealthy, NodeStatus}
import org.apache.linkis.manager.common.entity.metrics.{NodeHealthyInfo, NodeOverLoadInfo}
import org.apache.linkis.manager.common.entity.resource.{CommonNodeResource, LoadInstanceResource}
-import org.apache.linkis.manager.common.protocol.node.{NodeHeartbeatMsg, NodeHeartbeatRequest}
-import org.apache.linkis.message.annotation.Receiver
+import org.apache.linkis.manager.common.protocol.node.{NodeHealthyRequest, NodeHeartbeatMsg, NodeHeartbeatRequest, NodeHeartbeatResourceMsg}
+import org.apache.linkis.rpc.serializer.annotation.Receiver
import org.apache.linkis.rpc.Sender
import org.springframework.beans.factory.annotation.Autowired
class DefaultECMHealthService extends ECMHealthService with ECMEventListener {
- val maxResource = new LoadInstanceResource(ECM_MAX_MEMORY_AVAILABLE, ECM_MAX_CORES_AVAILABLE, ECM_MAX_CREATE_INSTANCES)
- val minResource = new LoadInstanceResource(ECM_PROTECTED_MEMORY, ECM_PROTECTED_CORES, ECM_PROTECTED_INSTANCES)
+ private val maxResource = new LoadInstanceResource(ECM_MAX_MEMORY_AVAILABLE, ECM_MAX_CORES_AVAILABLE, ECM_MAX_CREATE_INSTANCES)
+
+ private val minResource = new LoadInstanceResource(ECM_PROTECTED_MEMORY, ECM_PROTECTED_CORES, ECM_PROTECTED_INSTANCES)
+
private val runtime: Runtime = Runtime.getRuntime
+ private var status: NodeStatus = NodeStatus.Starting
+
+ private var healthy: NodeHealthy = NodeHealthy.Healthy
+
+ private var setByManager: Boolean = false
+
+ private var lastCpuLoad: Double = 0D
+
+ private var lastFreeMemory: Long = ECM_MAX_MEMORY_AVAILABLE
+
+ private val statusLocker = new Object()
+
+ private val healthyLocker = new Object()
+
+
private val future = Utils.defaultScheduler.scheduleAtFixedRate(new Runnable {
- override def run(): Unit =Utils.tryAndWarn{
+ override def run(): Unit = Utils.tryAndWarn{
if (LinkisECMApplication.isReady) {
+ checkMachinePerformance()
reportHealth(getLastEMHealthReport)
}
}
@@ -57,7 +76,7 @@ class DefaultECMHealthService extends ECMHealthService with ECMEventListener {
override def getLastEMHealthReport: ECMHealthReport = {
val report = new DefaultECMHealthReport
report.setNodeId(LinkisECMApplication.getECMServiceInstance.toString)
- report.setNodeStatus(NodeStatus.Running)
+ report.setNodeStatus(getNodeStatus)
//todo report right metrics
report.setTotalResource(maxResource)
report.setProtectedResource(minResource)
@@ -65,18 +84,27 @@ class DefaultECMHealthService extends ECMHealthService with ECMEventListener {
report.setReportTime(new Date().getTime)
report.setRunningEngineConns(LinkisECMApplication.getContext.getECMMetrics.getRunningEngineConns)
val info = new NodeOverLoadInfo
- info.setMaxMemory(runtime.maxMemory())
- info.setUsedMemory(runtime.totalMemory() - runtime.freeMemory())
- // TODO: 根据系统获取当前操作系统负载
+ val (max, free) = HardwareUtils.getTotalAndAvailableMemory()
+ info.setMaxMemory(max)
+ info.setSystemLeftMemory(free)
+ info.setUsedMemory(max - free)
report.setOverload(info)
report
}
- // TODO: 可能还需要个判断health状态的方法
+
override def reportHealth(report: ECMHealthReport): Unit = {
val heartbeat: NodeHeartbeatMsg = transferECMHealthReportToNodeHeartbeatMsg(report)
+ val resourceHeartbeat: NodeHeartbeatResourceMsg = new NodeHeartbeatResourceMsg
+ resourceHeartbeat.setHealthyInfo(heartbeat.getHealthyInfo)
+ resourceHeartbeat.setHeartBeatMsg(heartbeat.getHeartBeatMsg)
+ resourceHeartbeat.setNodeResource(heartbeat.getNodeResource)
+ resourceHeartbeat.setOverLoadInfo(heartbeat.getOverLoadInfo)
+ resourceHeartbeat.setServiceInstance(heartbeat.getServiceInstance)
+ resourceHeartbeat.setStatus(heartbeat.getStatus)
Sender.getSender(MANAGER_SPRING_NAME).send(heartbeat)
+ Sender.getSender(MANAGER_SPRING_NAME).send(resourceHeartbeat)
}
private def transferECMHealthReportToNodeHeartbeatMsg(report: ECMHealthReport) = {
@@ -93,7 +121,7 @@ class DefaultECMHealthService extends ECMHealthService with ECMEventListener {
heartbeat.setHeartBeatMsg("")
val nodeHealthyInfo = new NodeHealthyInfo
nodeHealthyInfo.setMsg("")
- nodeHealthyInfo.setNodeHealthy(NodeHealthy.Healthy)
+ nodeHealthyInfo.setNodeHealthy(getNodeHealthy)
heartbeat.setHealthyInfo(nodeHealthyInfo)
heartbeat
}
@@ -104,26 +132,29 @@ class DefaultECMHealthService extends ECMHealthService with ECMEventListener {
}
private def emShutdownHealthReport(event: ECMClosedEvent): Unit = {
+ transitionStatus(NodeStatus.ShuttingDown)
val report = getLastEMHealthReport
- report.setNodeStatus(NodeStatus.ShuttingDown)
reportHealth(report)
}
- private def emReadyHealthReport(event: ECMReadyEvent): Unit = reportHealth(getLastEMHealthReport)
+ private def emReadyHealthReport(event: ECMReadyEvent): Unit = {
+ transitionStatus(NodeStatus.Running)
+ reportHealth(getLastEMHealthReport)
+ }
override def onEvent(event: ECMEvent): Unit = event match {
case event: ECMReadyEvent =>
emReadyHealthReport(event)
case event: ECMClosedEvent =>
- cancelHealthReportThread(event)
emShutdownHealthReport(event)
presistenceLeftReports(event)
+ cancelHealthReportThread(event)
case _ =>
}
private def cancelHealthReportThread(event: ECMClosedEvent): Unit = {
-
+ Utils.tryAndWarn(future.cancel(true))
}
private def presistenceLeftReports(event: ECMClosedEvent): Unit = {
@@ -132,9 +163,76 @@ class DefaultECMHealthService extends ECMHealthService with ECMEventListener {
@Receiver
override def dealNodeHeartbeatRequest(nodeHeartbeatRequest: NodeHeartbeatRequest): NodeHeartbeatMsg = {
- val hearlthReport = getLastEMHealthReport
- transferECMHealthReportToNodeHeartbeatMsg(hearlthReport)
+ val healthReport = getLastEMHealthReport
+ transferECMHealthReportToNodeHeartbeatMsg(healthReport)
}
+ override def getNodeStatus: NodeStatus = {
+ this.status
+ }
+ override def getNodeHealthy: NodeHealthy = {
+ this.healthy
+ }
+
+ override def isSetByManager: Boolean = {
+ this.setByManager
+ }
+
+ override def transitionStatus(toStatus: NodeStatus): Unit = statusLocker synchronized {
+ this.status match {
+ case NodeStatus.Failed | NodeStatus.Success =>
+ logger.warn(s"$toString attempt to change status ${this.status} => $toStatus, ignore it .")
+ return
+ case NodeStatus.ShuttingDown =>
+ toStatus match {
+ case NodeStatus.Failed | NodeStatus.Success =>
+ case _ =>
+ logger.warn(s"$toString attempt to change a Executor from ShuttingDown to $toStatus, ignore it.")
+ return
+ }
+ case _ =>
+
+ }
+ logger.info(s"$toString changed status $status => $toStatus.")
+ this.status = toStatus
+ }
+
+ override def transitionHealthy(toHealthy: NodeHealthy): Unit = healthyLocker synchronized {
+ logger.info(s"nodeHealthy from ${healthy} to ${toHealthy}")
+ this.healthy = toHealthy
+ }
+
+ @Receiver
+ override def dealNodeHealthyRequest(nodeHealthyRequest: NodeHealthyRequest): Unit = {
+ if (NodeHealthy.isAvailable(nodeHealthyRequest.getNodeHealthy)) {
+ this.setByManager = false
+ transitionHealthy(nodeHealthyRequest.getNodeHealthy)
+ } else {
+ this.setByManager = true
+ transitionHealthy(nodeHealthyRequest.getNodeHealthy)
+ }
+ }
+
+ private def checkMachinePerformance(): Unit = {
+ if (!ECMConfiguration.ECM_PROTECTED_LOAD_ENABLED) {
+ return
+ }
+ val cpuLoad = OverloadUtils.getOSBean.getSystemCpuLoad
+ val freeMemory = HardwareUtils.getAvailableMemory()
+ if ((cpuLoad > ECM_PROTECTED_CPU_LOAD && lastCpuLoad > ECM_PROTECTED_CPU_LOAD)
+ || (freeMemory < ECM_PROTECTED_MEMORY && lastFreeMemory < ECM_PROTECTED_MEMORY)) {
+ warn(s"cpuLoad(${cpuLoad}) and freeMemory(${ByteTimeUtils.bytesToString(freeMemory)}) overload prepare to mark ecm to StockAvailable")
+ if (NodeHealthy.isAvailable(getNodeHealthy)) {
+ transitionHealthy(NodeHealthy.StockAvailable)
+ }
+ } else {
+ if (!NodeHealthy.isAvailable(getNodeHealthy) && !isSetByManager) {
+ warn(s"cpuLoad(${cpuLoad}) and freeMemory(${ByteTimeUtils.bytesToString(freeMemory)}) recover prepare to mark ecm to Healthy")
+ transitionHealthy(NodeHealthy.Healthy)
+ }
+ }
+ lastCpuLoad = cpuLoad
+ lastFreeMemory = freeMemory
}
+}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultEngineConnKillService.java b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultEngineConnKillService.java
index 0e38151..67dd060 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultEngineConnKillService.java
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultEngineConnKillService.java
@@ -20,12 +20,14 @@ package org.apache.linkis.ecm.server.service.impl;
import org.apache.linkis.common.ServiceInstance;
import org.apache.linkis.common.utils.Utils;
import org.apache.linkis.ecm.core.engineconn.EngineConn;
+import org.apache.linkis.ecm.server.conf.ECMConfiguration;
import org.apache.linkis.ecm.server.service.EngineConnKillService;
import org.apache.linkis.ecm.server.service.EngineConnListService;
+import org.apache.linkis.governance.common.utils.GovernanceUtils;
import org.apache.linkis.manager.common.protocol.engine.EngineStopRequest;
import org.apache.linkis.manager.common.protocol.engine.EngineStopResponse;
import org.apache.linkis.manager.common.protocol.engine.EngineSuicideRequest;
-import org.apache.linkis.message.annotation.Receiver;
+import org.apache.linkis.rpc.serializer.annotation.Receiver;
import org.apache.linkis.rpc.Sender;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
@@ -48,6 +50,7 @@ public class DefaultEngineConnKillService implements EngineConnKillService {
@Override
@Receiver
public EngineStopResponse dealEngineConnStop(EngineStopRequest engineStopRequest) {
+ logger.info("received EngineStopRequest " + engineStopRequest);
EngineConn engineConn = getEngineConnByServiceInstance(engineStopRequest.getServiceInstance());
EngineStopResponse response = new EngineStopResponse();
if (null != engineConn) {
@@ -92,22 +95,10 @@ public class DefaultEngineConnKillService implements EngineConnKillService {
private boolean killEngineConnByPid(EngineConn engineConn) {
logger.info("try to kill {} toString with pid({}).", engineConn.getServiceInstance().toString(), engineConn.getPid());
if (StringUtils.isNotBlank(engineConn.getPid())) {
- String k15cmd = "sudo kill " + engineConn.getPid();
- String k9cmd = "sudo kill -9 " + engineConn.getPid();
- int tryNum = 0;
- try {
- while (isProcessAlive(engineConn.getPid()) && tryNum <= 3) {
- logger.info("{} still alive with pid({}), use shell command to kill it. try {}++", engineConn.getServiceInstance().toString(), engineConn.getPid(), tryNum++);
- if (tryNum <= 3) {
- Utils.exec(k15cmd.split(" "), 3000L);
- } else {
- logger.info("{} still alive with pid({}). try {}, use shell command to kill -9 it", engineConn.getServiceInstance().toString(), engineConn.getPid(), tryNum);
- Utils.exec(k9cmd.split(" "), 3000L);
- }
- Thread.sleep(5000);
- }
- } catch (InterruptedException e) {
- logger.error("Interrupted while killing engine {} with pid({})." + engineConn.getServiceInstance().toString(), engineConn.getPid());
+ if (ECMConfiguration.ECM_PROCESS_SCRIPT_KILL()) {
+ GovernanceUtils.killProcess(engineConn.getPid(), engineConn.getServiceInstance().toString(), true);
+ } else {
+ killProcessByKillCmd(engineConn.getPid(), engineConn.getServiceInstance().toString());
}
if (isProcessAlive(engineConn.getPid())) {
return false;
@@ -136,4 +127,23 @@ public class DefaultEngineConnKillService implements EngineConnKillService {
}
}
+ private void killProcessByKillCmd(String pid, String desc ) {
+ String k15cmd = "sudo kill " + pid;
+ String k9cmd = "sudo kill -9 " + pid;
+ int tryNum = 0;
+ try {
+ while (isProcessAlive(pid) && tryNum <= 3) {
+ logger.info("{} still alive with pid({}), use shell command to kill it. try {}++", desc, pid, tryNum++);
+ if (tryNum <= 3) {
+ Utils.exec(k15cmd.split(" "), 3000L);
+ } else {
+ logger.info("{} still alive with pid({}). try {}, use shell command to kill -9 it", desc, pid, tryNum);
+ Utils.exec(k9cmd.split(" "), 3000L);
+ }
+ Thread.sleep(5000);
+ }
+ } catch (InterruptedException e) {
+ logger.error("Interrupted while killing engine {} with pid({})." + desc, pid);
+ }
+ }
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultEngineConnPidCallbackService.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultEngineConnPidCallbackService.scala
index f54fc98..ba64d31 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultEngineConnPidCallbackService.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultEngineConnPidCallbackService.scala
@@ -22,7 +22,7 @@ import org.apache.linkis.ecm.server.LinkisECMApplication
import org.apache.linkis.ecm.server.listener.EngineConnPidCallbackEvent
import org.apache.linkis.ecm.server.service.EngineConnPidCallbackService
import org.apache.linkis.governance.common.protocol.task.ResponseEngineConnPid
-import org.apache.linkis.message.annotation.Receiver
+import org.apache.linkis.rpc.serializer.annotation.Receiver
class DefaultEngineConnPidCallbackService extends EngineConnPidCallbackService with Logging {
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultEngineConnStatusCallbackService.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultEngineConnStatusCallbackService.scala
index 10818d6..b19795c 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultEngineConnStatusCallbackService.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultEngineConnStatusCallbackService.scala
@@ -25,7 +25,7 @@ import org.apache.linkis.ecm.server.service.EngineConnStatusCallbackService
import org.apache.linkis.manager.common.entity.enumeration.NodeStatus
import org.apache.linkis.manager.common.entity.enumeration.NodeStatus.{Failed, Running}
import org.apache.linkis.manager.common.protocol.engine.{EngineConnStatusCallback, EngineConnStatusCallbackToAM}
-import org.apache.linkis.message.annotation.Receiver
+import org.apache.linkis.rpc.serializer.annotation.Receiver
import org.apache.linkis.rpc.Sender
import org.springframework.stereotype.Service
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultLocalDirsHandleService.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultLocalDirsHandleService.scala
index 7b6a1d7..5f0c846 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultLocalDirsHandleService.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultLocalDirsHandleService.scala
@@ -23,24 +23,33 @@ import java.nio.file.Paths
import org.apache.linkis.common.io.FsPath
import org.apache.linkis.ecm.server.conf.ECMConfiguration._
import org.apache.linkis.ecm.server.service.LocalDirsHandleService
-
+import org.apache.commons.lang.StringUtils
+import org.apache.commons.lang.time.DateFormatUtils
class DefaultLocalDirsHandleService extends LocalDirsHandleService {
// TODO: 检测当前磁盘的健康状态,如果目录满了,需要上报am
- override def cleanup(): Unit = ???
+ override def cleanup(): Unit = {}
override def getEngineConnManagerHomeDir: String = ECM_HOME_DIR
- override def getEngineConnWorkDir(user: String, ticketId: String): String = new FsPath(Paths.get(ENGINECONN_ROOT_DIR, user, "workDir", ticketId).toFile.getPath).getPath
+ override def getEngineConnWorkDir(user: String, ticketId: String, engineType: String): String = {
+ val prefix = if (StringUtils.isBlank(engineType)) {
+ Paths.get(ENGINECONN_ROOT_DIR, user, DateFormatUtils.format(System.currentTimeMillis(), "yyyyMMdd")).toFile.getPath
+ } else {
+ Paths.get(ENGINECONN_ROOT_DIR, user, DateFormatUtils.format(System.currentTimeMillis(), "yyyyMMdd"), engineType).toFile.getPath
+ }
+ new FsPath(prefix + File.separator + ticketId).getPath
+ }
override def getEngineConnPublicDir: String = ENGINECONN_PUBLIC_DIR
- override def getEngineConnLogDir(user: String, ticketId: String): String = s"${getEngineConnWorkDir(user, ticketId)}${File.separator}logs"
+ override def getEngineConnLogDir(user: String, ticketId: String, engineType: String): String = s"${getEngineConnWorkDir(user, ticketId, engineType)}${File.separator}logs"
+
+ override def getEngineConnTmpDir(user: String, ticketId: String, engineType: String): String = s"${getEngineConnWorkDir(user, ticketId, engineType)}${File.separator}tmp"
- override def getEngineConnTmpDir(user: String, ticketId: String): String = s"${getEngineConnWorkDir(user, ticketId)}${File.separator}tmp"
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultOperateService.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultOperateService.scala
index bae6a26..3af1a7a 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultOperateService.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultOperateService.scala
@@ -22,7 +22,7 @@ import org.apache.linkis.common.utils.{Logging, Utils}
import org.apache.linkis.ecm.server.service.OperateService
import org.apache.linkis.manager.common.operator.OperatorFactory
import org.apache.linkis.manager.common.protocol.em.{ECMOperateRequest, ECMOperateResponse}
-import org.apache.linkis.message.annotation.Receiver
+import org.apache.linkis.rpc.serializer.annotation.Receiver
import org.springframework.stereotype.Service
import scala.collection.JavaConverters.mapAsScalaMapConverter
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultYarnCallbackService.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultYarnCallbackService.scala
index 80f151a..c136e75 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultYarnCallbackService.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/DefaultYarnCallbackService.scala
@@ -20,7 +20,7 @@ package org.apache.linkis.ecm.server.service.impl
import org.apache.linkis.ecm.server.LinkisECMApplication
import org.apache.linkis.ecm.server.listener.{YarnAppIdCallbackEvent, YarnInfoCallbackEvent}
import org.apache.linkis.ecm.server.service.YarnCallbackService
-import org.apache.linkis.message.annotation.Receiver
+import org.apache.linkis.rpc.serializer.annotation.Receiver
import org.apache.linkis.protocol.callback.{YarnAPPIdCallbackProtocol, YarnInfoCallbackProtocol}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/LinuxProcessEngineConnLaunchService.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/LinuxProcessEngineConnLaunchService.scala
index 49d7666..921a2f7 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/LinuxProcessEngineConnLaunchService.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/LinuxProcessEngineConnLaunchService.scala
@@ -22,24 +22,18 @@ import org.apache.linkis.ecm.linux.launch.LinuxProcessEngineConnLaunch
import org.apache.linkis.ecm.server.conf.ECMConfiguration._
import org.apache.linkis.manager.common.entity.node.EngineNode
import org.apache.linkis.manager.engineplugin.common.launch.entity.{EngineConnBuildRequest, EngineConnLaunchRequest}
-import org.apache.linkis.message.annotation.Receiver
-import org.apache.linkis.message.builder.ServiceMethodContext
-import org.apache.linkis.message.conf.MessageSchedulerConf._
import org.apache.linkis.rpc.Sender
-
-import scala.concurrent.duration.Duration
+import org.apache.linkis.rpc.serializer.annotation.Receiver
class LinuxProcessEngineConnLaunchService extends ProcessEngineConnLaunchService {
@Receiver
- def launchEngineConn(engineConnBuildRequest: EngineConnBuildRequest, smc: ServiceMethodContext): EngineNode = {
+ def launchEngineConn(engineConnBuildRequest: EngineConnBuildRequest, sender: Sender): EngineNode = {
Sender.getSender(ENGINECONN_PLUGIN_SPRING_NAME).ask(engineConnBuildRequest) match {
case request: EngineConnLaunchRequest if ENGINECONN_CREATE_DURATION._1 != 0L =>
launchEngineConn(request, ENGINECONN_CREATE_DURATION._1)
- case request: EngineConnLaunchRequest =>
- launchEngineConn(request, smc.getAttribute(DURATION_KEY).asInstanceOf[Duration]._1)
}
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/ProcessEngineConnLaunchService.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/ProcessEngineConnLaunchService.scala
index 2c30a13..4651bb6 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/ProcessEngineConnLaunchService.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/service/impl/ProcessEngineConnLaunchService.scala
@@ -18,7 +18,6 @@
package org.apache.linkis.ecm.server.service.impl
import java.util.concurrent.TimeUnit
-
import org.apache.linkis.common.conf.Configuration
import org.apache.linkis.common.utils.Utils
import org.apache.linkis.ecm.core.engineconn.EngineConn
@@ -26,6 +25,7 @@ import org.apache.linkis.ecm.core.launch.ProcessEngineConnLaunch
import org.apache.linkis.ecm.server.LinkisECMApplication
import org.apache.linkis.ecm.server.conf.ECMConfiguration
import org.apache.linkis.ecm.server.conf.ECMConfiguration.MANAGER_SPRING_NAME
+import org.apache.linkis.ecm.core.conf.ECMErrorCode
import org.apache.linkis.ecm.server.errorcode.ECMErrorConstants
import org.apache.linkis.ecm.server.exception.ECMErrorException
import org.apache.linkis.ecm.server.listener.EngineConnStatusChangeEvent
@@ -36,6 +36,8 @@ import org.apache.linkis.manager.engineplugin.common.launch.entity.EngineConnLau
import org.apache.linkis.rpc.Sender
import org.apache.commons.io.IOUtils
import org.apache.commons.lang.exception.ExceptionUtils
+import org.apache.linkis.ecm.server.service.LocalDirsHandleService
+import org.apache.linkis.manager.label.utils.LabelUtil
import scala.concurrent.duration.Duration
import scala.concurrent.{Future, TimeoutException}
@@ -43,18 +45,34 @@ import scala.concurrent.{Future, TimeoutException}
abstract class ProcessEngineConnLaunchService extends AbstractEngineConnLaunchService {
- override def afterLaunch(request: EngineConnLaunchRequest, conn: EngineConn, duration: Long): Unit = {
- super.afterLaunch(request, conn, duration)
+ private var localDirsHandleService: LocalDirsHandleService = _
+
+ def setLocalDirsHandleService(localDirsHandleService: LocalDirsHandleService): Unit = this.localDirsHandleService = localDirsHandleService
+
+
+ override def waitEngineConnStart(request: EngineConnLaunchRequest, conn: EngineConn, duration: Long): Unit = {
conn.getEngineConnLaunchRunner.getEngineConnLaunch match {
- case launch: ProcessEngineConnLaunch => try {
+ case launch: ProcessEngineConnLaunch => Utils.tryCatch{
+ // Set the pid of the shell script before the pid callBack returns
+ launch.getPid().foreach(conn.setPid)
processMonitorThread(conn, launch, duration)
- } catch {
- case e: ECMErrorException =>
- warn(s"Failed to init ${conn.getServiceInstance}, status shutting down")
+ }{
+ case e: Throwable =>
val logPath = Utils.tryCatch(conn.getEngineConnManagerEnv.engineConnLogDirs) { t =>
- ECMConfiguration.ENGINECONN_ROOT_DIR + "/userName/" + conn.getTickedId + "/logs"
+ localDirsHandleService.getEngineConnLogDir(request.user, request.ticketId, LabelUtil.getEngineType(request.labels))
+ }
+ val canRetry = e match {
+ case ecmError: ECMErrorException =>
+ if (ECMErrorCode.EC_START_TIME_OUT == ecmError.getErrCode) {
+ true
+ } else {
+ false
+ }
+ case _ => false
}
- Sender.getSender(MANAGER_SPRING_NAME).send(EngineConnStatusCallbackToAM(conn.getServiceInstance, NodeStatus.ShuttingDown, "Failed to start EngineConn, reason: " + ExceptionUtils.getRootCauseMessage(e) + s"\n You can go to this path($logPath) to find the reason or ask the administrator for help"))
+ logger.warn(s"Failed to init ${conn.getServiceInstance}, status shutting down, canRetry $canRetry, logPath $logPath", e)
+ Sender.getSender(MANAGER_SPRING_NAME).send(EngineConnStatusCallbackToAM(conn.getServiceInstance, NodeStatus.ShuttingDown, "Failed to start EngineConn, reason: " + ExceptionUtils.getRootCauseMessage(e) + s"\n You can go to this path($logPath) to find the reason or ask the administrator for help", canRetry))
+ throw e
}
case _ =>
}
@@ -65,17 +83,17 @@ abstract class ProcessEngineConnLaunchService extends AbstractEngineConnLaunchSe
val tickedId = engineConn.getTickedId
val errorMsg = new StringBuilder
Future {
- val iterator = IOUtils.lineIterator(launch.getProcessInputStream, Configuration.BDP_ENCODING.getValue)
+ val iterator = IOUtils.lineIterator(launch.getProcessInputStream, Configuration.BDP_ENCODING.getValue)
var count = 0
val maxLen = ECMConfiguration.ENGINE_START_ERROR_MSG_MAX_LEN.getValue
while (!isCompleted(engineConn) && iterator.hasNext && count < maxLen) {
val line = iterator.next()
- println(s"${engineConn.getTickedId}:${line}")
errorMsg.append(line).append("\n")
count += 1
}
val exitCode = Option(launch.processWaitFor)
if (exitCode.exists(_ != 0)) {
+ logger.info(s"engine ${tickedId} process exit ")
LinkisECMApplication.getContext.getECMSyncListenerBus.postToAll(EngineConnStatusChangeEvent(tickedId, ShuttingDown))
} else {
LinkisECMApplication.getContext.getECMSyncListenerBus.postToAll(EngineConnStatusChangeEvent(tickedId, Success))
@@ -84,10 +102,10 @@ abstract class ProcessEngineConnLaunchService extends AbstractEngineConnLaunchSe
Utils.tryThrow(Utils.waitUntil(() => engineConn.getStatus != Starting, Duration(timeout, TimeUnit.MILLISECONDS))) {
case e: TimeoutException =>
throw new ECMErrorException(ECMErrorConstants.ECM_ERROR, s"wait for $engineConn initial timeout.")
- case e: InterruptedException => //比如被ms cancel
+ case e: InterruptedException =>
throw new ECMErrorException(ECMErrorConstants.ECM_ERROR, s"wait for $engineConn initial interrupted.")
case t: Throwable =>
- error(s"unexpected error, now shutdown it.")
+ logger.error(s"unexpected error, now shutdown it.")
throw t
}
if (engineConn.getStatus == ShuttingDown) {
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/spring/ECMSpringConfiguration.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/spring/ECMSpringConfiguration.scala
index 504a7a6..4ca29a6 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/spring/ECMSpringConfiguration.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/spring/ECMSpringConfiguration.scala
@@ -77,9 +77,10 @@ class ECMSpringConfiguration {
@Bean
@ConditionalOnMissingBean
- def getLinuxProcessEngineConnLaunchService(resourceLocalizationService: ResourceLocalizationService): EngineConnLaunchService = {
+ def getLinuxProcessEngineConnLaunchService(resourceLocalizationService: ResourceLocalizationService, localDirsHandleService: LocalDirsHandleService): EngineConnLaunchService = {
val service = new LinuxProcessEngineConnLaunchService
service.setResourceLocalizationService(resourceLocalizationService)
+ service.setLocalDirsHandleService(localDirsHandleService)
service
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/util/ECMUtils.scala b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/util/ECMUtils.scala
index 341bac9..8a75343 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/util/ECMUtils.scala
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/util/ECMUtils.scala
@@ -33,8 +33,11 @@ import scala.collection.JavaConversions._
object ECMUtils {
+ @volatile var bmlClient: BmlClient = _
+ val lock = new Object()
+
private def download(resource: BmlResource, userName: String): util.Map[String, Object] = {
- val client: BmlClient = createBMLClient(userName)
+ val client: BmlClient = getBMLClient(userName)
var response: BmlDownloadResponse = null
if (resource.getVersion == null) {
response = client.downloadShareResource(userName, resource.getResourceId)
@@ -55,11 +58,13 @@ object ECMUtils {
IOUtils.closeQuietly(is)
}
- private def createBMLClient(userName: String): BmlClient = {
- if (userName == null)
- BmlClientFactory.createBmlClient()
- else
- BmlClientFactory.createBmlClient(userName)
+ private def getBMLClient(userName: String): BmlClient = {
+ if (bmlClient == null) {
+ lock.synchronized {
+ if (bmlClient == null) bmlClient = BmlClientFactory.createBmlClient(userName)
+ }
+ }
+ bmlClient
}
diff --git a/linkis-public-enhancements/linkis-publicservice/linkis-udf/linkis-udf-service/src/main/java/org/apache/linkis/udf/dao/UDFTreeDao.java b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/util/HardwareUtils.scala
similarity index 52%
copy from linkis-public-enhancements/linkis-publicservice/linkis-udf/linkis-udf-service/src/main/java/org/apache/linkis/udf/dao/UDFTreeDao.java
copy to linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/util/HardwareUtils.scala
index dd02919..9344e58 100644
--- a/linkis-public-enhancements/linkis-publicservice/linkis-udf/linkis-udf-service/src/main/java/org/apache/linkis/udf/dao/UDFTreeDao.java
+++ b/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/util/HardwareUtils.scala
@@ -15,22 +15,37 @@
* limitations under the License.
*/
-package org.apache.linkis.udf.dao;
+package org.apache.linkis.ecm.server.util
+
+import oshi.SystemInfo
+
+object HardwareUtils {
+
+
+ def getAvailableMemory(): Long = {
+ val systemInfo = new SystemInfo
+ val hardware = systemInfo.getHardware
+ val globalMemory = hardware.getMemory
+ globalMemory.getAvailable
+ }
+
+ def getMaxMemory(): Long = {
+ val systemInfo = new SystemInfo
+ val hardware = systemInfo.getHardware
+ val globalMemory = hardware.getMemory
+ globalMemory.getTotal
+ }
+
+ /**
+ * 1 total
+ * 2 available
+ * @return
+ */
+ def getTotalAndAvailableMemory(): (Long, Long) = {
+ val systemInfo = new SystemInfo
+ val hardware = systemInfo.getHardware
+ val globalMemory = hardware.getMemory
+ (globalMemory.getTotal, globalMemory.getAvailable)
+ }
-import org.apache.linkis.udf.entity.UDFTree;
-
-import java.util.List;
-import java.util.Map;
-
-public interface UDFTreeDao {
-
- void addTree(UDFTree udfTree);
-
- void updateTree(UDFTree udfTree);
-
- void deleteTree(Long id, String userName);
-
- UDFTree getTreeById(Long id, String category);
-
- List<UDFTree> getTreesByParentId(Map<String, Object> params);
}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-clustered-engineconn/linkis-once-engineconn/pom.xml b/linkis-computation-governance/linkis-engineconn/linkis-clustered-engineconn/linkis-once-engineconn/pom.xml
index 70060ce..d1e87d7 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-clustered-engineconn/linkis-once-engineconn/pom.xml
+++ b/linkis-computation-governance/linkis-engineconn/linkis-clustered-engineconn/linkis-once-engineconn/pom.xml
@@ -68,7 +68,7 @@
<dependency>
<groupId>org.apache.linkis</groupId>
- <artifactId>linkis-message-scheduler</artifactId>
+ <artifactId>linkis-rpc</artifactId>
<version>${linkis.version}</version>
<scope>provided</scope>
</dependency>
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-clustered-engineconn/linkis-once-engineconn/src/main/scala/org/apache/linkis/engineconn/once/executor/hook/OnceEngineConnHook.scala b/linkis-computation-governance/linkis-engineconn/linkis-clustered-engineconn/linkis-once-engineconn/src/main/scala/org/apache/linkis/engineconn/once/executor/hook/OnceEngineConnHook.scala
new file mode 100644
index 0000000..e08f29c
--- /dev/null
+++ b/linkis-computation-governance/linkis-engineconn/linkis-clustered-engineconn/linkis-once-engineconn/src/main/scala/org/apache/linkis/engineconn/once/executor/hook/OnceEngineConnHook.scala
@@ -0,0 +1,40 @@
+/*
+ * 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.linkis.engineconn.once.executor.hook
+
+import org.apache.linkis.engineconn.callback.hook.CallbackEngineConnHook
+import org.apache.linkis.engineconn.common.creation.EngineCreationContext
+import org.apache.linkis.engineconn.common.engineconn.EngineConn
+import org.apache.linkis.engineconn.core.executor.ExecutorManager
+import org.apache.linkis.manager.common.entity.enumeration.NodeStatus
+
+/**
+ * Conn Hook
+ */
+class OnceEngineConnHook extends CallbackEngineConnHook{
+
+ override protected def getNodeStatusOfStartSuccess(engineCreationContext: EngineCreationContext,
+ engineConn: EngineConn): NodeStatus = NodeStatus.Unlock
+
+ override def afterEngineServerStartSuccess(engineCreationContext: EngineCreationContext,
+ engineConn: EngineConn): Unit =
+ {
+ super.afterEngineServerStartSuccess(engineCreationContext, engineConn)
+ ExecutorManager.getInstance.getReportExecutor.tryReady()
+ }
+}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/pom.xml b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/pom.xml
index a27ef6e..3274276 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/pom.xml
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/pom.xml
@@ -70,7 +70,7 @@
<dependency>
<groupId>org.apache.linkis</groupId>
- <artifactId>linkis-message-scheduler</artifactId>
+ <artifactId>linkis-rpc</artifactId>
<version>${linkis.version}</version>
<scope>provided</scope>
</dependency>
@@ -93,11 +93,11 @@
<version>${linkis.version}</version>
</dependency>
- <dependency>
+ <!-- <dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
- </dependency>
+ </dependency>-->
</dependencies>
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncConcurrentComputationExecutor.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncConcurrentComputationExecutor.scala
index 32bff09..e77da19 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncConcurrentComputationExecutor.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncConcurrentComputationExecutor.scala
@@ -17,9 +17,204 @@
package org.apache.linkis.engineconn.computation.executor.async
-import org.apache.linkis.engineconn.computation.executor.execute.ConcurrentComputationExecutor
+import java.util
+import java.util.concurrent.ConcurrentHashMap
+import org.apache.linkis.DataWorkCloudApplication
+import org.apache.linkis.common.log.LogUtils
+import org.apache.linkis.common.utils.Utils
+import org.apache.linkis.engineconn.acessible.executor.listener.event.TaskResponseErrorEvent
+import org.apache.linkis.engineconn.common.conf.EngineConnConf
+import org.apache.linkis.engineconn.computation.executor.entity.EngineConnTask
+import org.apache.linkis.engineconn.computation.executor.execute.{ComputationExecutor, EngineExecutionContext}
+import org.apache.linkis.engineconn.computation.executor.hook.ComputationExecutorHook
+import org.apache.linkis.engineconn.core.EngineConnObject
+import org.apache.linkis.engineconn.executor.entity.ConcurrentExecutor
+import org.apache.linkis.engineconn.executor.listener.{EngineConnSyncListenerBus, ExecutorListenerBusContext}
+import org.apache.linkis.governance.common.entity.ExecutionNodeStatus
+import org.apache.linkis.manager.common.entity.enumeration.NodeStatus
+import org.apache.linkis.protocol.engine.JobProgressInfo
+import org.apache.linkis.scheduler.executer._
+import org.apache.linkis.scheduler.listener.JobListener
+import org.apache.linkis.scheduler.queue.SchedulerEventState._
+import org.apache.linkis.scheduler.queue.{Job, SchedulerEventState}
+import org.apache.commons.lang.StringUtils
+import org.apache.commons.lang.exception.ExceptionUtils
-abstract class AsyncConcurrentComputationExecutor extends ConcurrentComputationExecutor{
+abstract class AsyncConcurrentComputationExecutor(override val outputPrintLimit: Int = 1000) extends ComputationExecutor(outputPrintLimit) with ConcurrentExecutor with JobListener {
+ private lazy val scheduler = AsyncExecuteContext.getAsyncExecuteContext.getOrCreateScheduler(this)
+
+
+ private val taskIdToJobMap: util.Map[String, Job] = new ConcurrentHashMap[String, Job](8)
+
+ override def toExecuteTask(engineConnTask: EngineConnTask, internalExecute: Boolean = false): ExecuteResponse = {
+
+ transformTaskStatus(engineConnTask, ExecutionNodeStatus.Running)
+
+ val job = parserTaskToJob(engineConnTask)
+ job.setJobListener(this)
+ job.setId(engineConnTask.getTaskId)
+ taskIdToJobMap.put(engineConnTask.getTaskId, job)
+ Utils.tryCatch(scheduler.submit(job)) { t =>
+ val msg = s" submit task(${engineConnTask.getTaskId}) failed"
+ getEngineSyncListenerBus.postToAll(TaskResponseErrorEvent(engineConnTask.getTaskId, msg))
+ logger.error(msg, t)
+ onJobCompleted(job)
+ }
+ null
+ }
+
+ protected def parserTaskToJob(engineConnTask: EngineConnTask): Job = {
+ val engineExecutionContext = createEngineExecutionContext(engineConnTask)
+ new AsyncEngineConnJob(engineConnTask, engineExecutionContext)
+ }
+
+ def asyncExecuteTask(engineConnTask: EngineConnTask, engineExecutionContext: EngineExecutionContext): ExecuteResponse = {
+
+ var hookedCode = engineConnTask.getCode
+ Utils.tryCatch {
+ val engineCreationContext = EngineConnObject.getEngineCreationContext
+ ComputationExecutorHook.getComputationExecutorHooks.foreach(hook => {
+ hookedCode = hook.beforeExecutorExecute(engineExecutionContext, engineCreationContext, hookedCode)
+ })
+ }{
+ e =>
+ info("failed to do with hook", e)
+ engineExecutionContext.appendStdout(LogUtils.generateWarn(s"failed execute hook: ${ExceptionUtils.getFullStackTrace(e)}"))
+ }
+ if (hookedCode.length > 100) {
+ info(s"hooked after code: ${hookedCode.substring(0, 100)} ....")
+ } else {
+ info(s"hooked after code: $hookedCode ")
+ }
+ val localPath = EngineConnConf.getLogDir
+ engineExecutionContext.appendStdout(LogUtils.generateInfo(s"EngineConn local log path: ${DataWorkCloudApplication.getServiceInstance.toString} $localPath"))
+
+ var response: ExecuteResponse = Utils.tryCatch(executeLine(engineExecutionContext, hookedCode)
+ ) {
+ t => ErrorExecuteResponse(ExceptionUtils.getRootCauseMessage(t), t)
+ }
+
+ response match {
+ case e: ErrorExecuteResponse =>
+ logger.error("execute code failed!", e.t)
+ engineExecutionContext.appendStdout(LogUtils.generateERROR(s"execute code failed!: ${ExceptionUtils.getFullStackTrace(e.t)}"))
+ case SuccessExecuteResponse() =>
+ logger.info(s"task{${engineConnTask.getTaskId} execute success")
+ case e: OutputExecuteResponse =>
+ val output = if (StringUtils.isNotEmpty(e.getOutput) && e.getOutput.length > outputPrintLimit) {
+ e.getOutput.substring(0, outputPrintLimit)
+ } else e.getOutput
+ engineExecutionContext.appendStdout(output)
+ if (StringUtils.isNotBlank(e.getOutput)) engineExecutionContext.sendResultSet(e)
+ response = SuccessExecuteResponse()
+ case r: AsynReturnExecuteResponse =>
+ val msg = s"task${engineConnTask.getTaskId} received asyncReturnExecuteResponse"
+ logger.info(msg)
+ engineExecutionContext.appendStdout(msg)
+ case _ =>
+ logger.error(s"execute code failed! ${response}")
+ response = ErrorExecuteResponse("Unexpected response", null)
+ }
+ response
+ }
+
+ private def getJobByTaskId(taskId: String): Job = taskIdToJobMap.get(taskId)
+
+ private def removeJob(taskId: String): Job = taskIdToJobMap.remove(taskId)
+
+ override def progress(taskID: String): Float = 0f
+
+ override def getProgressInfo(taskID: String): Array[JobProgressInfo] = null
+
+ override def killTask(taskId: String): Unit = {
+ Utils.tryAndWarn {
+ val task = getTaskById(taskId)
+ if (null != task) {
+ val job = getJobByTaskId(task.getTaskId)
+ if (null != job) {
+ logger.info(s"kill job${job.getId()} task is ${task.getTaskId}")
+ job.kill()
+ }
+ /*task.setStatus(ExecutionNodeStatus.Cancelled)
+ transformTaskStatus(task, ExecutionNodeStatus.Cancelled)*/
+ }
+ }
+ }
+
+ override def killAll(): Unit = {
+ val jobs = taskIdToJobMap.values().iterator()
+ while (jobs.hasNext) {
+ val job = jobs.next()
+ if (null != job) {
+ logger.info(s"kill job${job.getId()} by killAll")
+ job.kill()
+ }
+ }
+ }
+
+ protected override def ensureOp[A](f: => A): A = f
+
+ override def afterExecute(engineConnTask: EngineConnTask, executeResponse: ExecuteResponse): Unit = {
+ }
+
+ private def getEngineSyncListenerBus: EngineConnSyncListenerBus = {
+ ExecutorListenerBusContext.getExecutorListenerBusContext().getEngineConnSyncListenerBus
+ }
+
+ // JobListener
+
+ override def onJobScheduled(job: Job): Unit = {
+ }
+
+ override def onJobInited(job: Job): Unit = {
+ }
+
+ override def onJobWaitForRetry(job: Job): Unit = {
+ }
+
+ override def onJobRunning(job: Job): Unit = {
+ if (isBusy) {
+ error(s"Executor is busy but still got new task ! Running task num : ${getRunningTask}")
+ }
+ if (getRunningTask >= getConcurrentLimit) synchronized {
+ if (getRunningTask >= getConcurrentLimit && NodeStatus.isIdle(getStatus)) {
+ info(s"running task($getRunningTask) > concurrent limit $getConcurrentLimit, now to mark engine to busy ")
+ transition(NodeStatus.Busy)
+ }
+ }
+ runningTasks.increase()
+ }
+
+ override def onJobCompleted(job: Job): Unit = {
+ runningTasks.decrease()
+ job match {
+ case asyncEngineConnJob: AsyncEngineConnJob =>
+ job.getState match {
+ case Succeed =>
+ succeedTasks.increase()
+ transformTaskStatus(asyncEngineConnJob.getEngineConnTask, ExecutionNodeStatus.Succeed)
+ case Failed =>
+ failedTasks.increase()
+ transformTaskStatus(asyncEngineConnJob.getEngineConnTask, ExecutionNodeStatus.Failed)
+ case _ =>
+ }
+ if(!SchedulerEventState.isSucceed(job.getState)) {
+ getEngineSyncListenerBus.postToAll(TaskResponseErrorEvent(asyncEngineConnJob.getEngineConnTask.getTaskId, job.getErrorResponse.message))
+ }
+ removeJob(asyncEngineConnJob.getEngineConnTask.getTaskId)
+ clearTaskCache(asyncEngineConnJob.getEngineConnTask.getTaskId)
+
+ case _ =>
+ }
+
+ if (getStatus == NodeStatus.Busy && getConcurrentLimit > getRunningTask) synchronized {
+ if (getStatus == NodeStatus.Busy && getConcurrentLimit > getRunningTask) {
+ info(s"running task($getRunningTask) < concurrent limit $getConcurrentLimit, now to mark engine to Unlock ")
+ transition(NodeStatus.Unlock)
+ }
+ }
+ }
}
+
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncEngineConnJob.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncEngineConnJob.scala
new file mode 100644
index 0000000..fce9437
--- /dev/null
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncEngineConnJob.scala
@@ -0,0 +1,65 @@
+/*
+ * 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.linkis.engineconn.computation.executor.async
+
+import org.apache.linkis.common.utils.Utils
+import org.apache.linkis.engineconn.computation.executor.entity.EngineConnTask
+import org.apache.linkis.engineconn.computation.executor.execute.EngineExecutionContext
+import org.apache.linkis.scheduler.executer.{CompletedExecuteResponse, ErrorExecuteResponse, ExecuteRequest, SuccessExecuteResponse}
+import org.apache.linkis.scheduler.queue.{Job, JobInfo}
+
+class AsyncEngineConnJob(task: EngineConnTask, engineExecutionContext: EngineExecutionContext) extends Job {
+
+
+ override def init(): Unit = {}
+
+ override protected def jobToExecuteRequest: ExecuteRequest = {
+ new AsyncExecuteRequest(task, engineExecutionContext)
+ }
+
+ override def getName: String = getId()
+
+ override def getJobInfo: JobInfo = null
+
+ def getEngineExecutionContext: EngineExecutionContext = this.engineExecutionContext
+
+ def getEngineConnTask: EngineConnTask = task
+
+ override def close(): Unit = {
+
+ }
+
+ override def transitionCompleted(executeCompleted: CompletedExecuteResponse): Unit = {
+ var executeCompletedNew: CompletedExecuteResponse = executeCompleted
+ executeCompleted match {
+ case _: SuccessExecuteResponse =>
+ Utils.tryCatch {
+ logger.info(s"job ${task.getTaskId} execute success, Start to close engineExecutionContext")
+ engineExecutionContext.close()
+ logger.info(s"job ${task.getTaskId} execute success, Finished to close engineExecutionContext")
+ } {
+ t =>
+ executeCompletedNew = ErrorExecuteResponse("send resultSet to entrance failed!", t)
+ }
+ case _ =>
+ Utils.tryQuietly(engineExecutionContext)
+ }
+ super.transitionCompleted(executeCompleted)
+ }
+
+}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncExecuteContext.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncExecuteContext.scala
new file mode 100644
index 0000000..cf932b5
--- /dev/null
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncExecuteContext.scala
@@ -0,0 +1,58 @@
+/*
+ * 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.linkis.engineconn.computation.executor.async
+
+import org.apache.linkis.engineconn.computation.executor.conf.ComputationExecutorConf
+import org.apache.linkis.scheduler.queue.parallelqueue.{ParallelScheduler, ParallelSchedulerContextImpl}
+import org.apache.linkis.scheduler.{Scheduler, SchedulerContext}
+
+trait AsyncExecuteContext {
+
+ def getOrCreateScheduler(executor: AsyncConcurrentComputationExecutor): Scheduler
+
+}
+
+class AsyncExecuteContextImpl extends AsyncExecuteContext {
+
+ private var scheduler: Scheduler = _
+
+ override def getOrCreateScheduler(executor: AsyncConcurrentComputationExecutor): Scheduler = {
+ if (null == scheduler) synchronized {
+ if (null == scheduler) {
+ scheduler = new ParallelScheduler(createSchedulerContext(executor))
+ scheduler.init()
+ }
+ }
+ scheduler
+ }
+
+ private def createSchedulerContext(executor: AsyncConcurrentComputationExecutor): SchedulerContext = {
+ val parallelSchedulerContext = new ParallelSchedulerContextImpl(ComputationExecutorConf.ASYNC_EXECUTE_MAX_PARALLELISM.getValue)
+ parallelSchedulerContext.setExecutorManager(new AsyncExecutorManager(executor))
+ parallelSchedulerContext
+ }
+
+}
+
+object AsyncExecuteContext {
+
+ private val CONTEXT: AsyncExecuteContext = new AsyncExecuteContextImpl()
+
+ def getAsyncExecuteContext: AsyncExecuteContext = CONTEXT
+
+}
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncExecuteExecutor.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncExecuteExecutor.scala
new file mode 100644
index 0000000..a12ce3d
--- /dev/null
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncExecuteExecutor.scala
@@ -0,0 +1,50 @@
+/*
+ * 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.linkis.engineconn.computation.executor.async
+
+import org.apache.linkis.engineconn.common.exception.EngineConnException
+import org.apache.linkis.engineconn.computation.executor.utlis.ComputationErrorCode
+import org.apache.linkis.scheduler.executer.ExecutorState.ExecutorState
+import org.apache.linkis.scheduler.executer._
+
+class AsyncExecuteExecutor(executor: AsyncConcurrentComputationExecutor) extends Executor {
+
+ override def getId: Long = {
+ 0
+ }
+
+ override def execute(executeRequest: ExecuteRequest): ExecuteResponse = {
+ executeRequest match {
+ case asyncExecuteRequest: AsyncExecuteRequest =>
+ executor.asyncExecuteTask(asyncExecuteRequest.task, asyncExecuteRequest.engineExecutionContext)
+ case _ => throw EngineConnException(ComputationErrorCode.ASYNC_EXECUTOR_ERROR_CODE, "Mismatched execution request")
+ }
+ }
+
+ override def state: ExecutorState = {
+ ExecutorState.Idle
+ }
+
+ override def getExecutorInfo: ExecutorInfo = {
+ null
+ }
+
+ override def close(): Unit = {
+
+ }
+}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncConcurrentComputationExecutor.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncExecuteRequest.scala
similarity index 73%
copy from linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncConcurrentComputationExecutor.scala
copy to linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncExecuteRequest.scala
index 32bff09..7a90ade 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncConcurrentComputationExecutor.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncExecuteRequest.scala
@@ -17,9 +17,10 @@
package org.apache.linkis.engineconn.computation.executor.async
-import org.apache.linkis.engineconn.computation.executor.execute.ConcurrentComputationExecutor
-
-
-abstract class AsyncConcurrentComputationExecutor extends ConcurrentComputationExecutor{
+import org.apache.linkis.engineconn.computation.executor.entity.EngineConnTask
+import org.apache.linkis.engineconn.computation.executor.execute.EngineExecutionContext
+import org.apache.linkis.scheduler.executer.ExecuteRequest
+class AsyncExecuteRequest(val task: EngineConnTask, val engineExecutionContext: EngineExecutionContext) extends ExecuteRequest {
+ override val code: String = task.getCode
}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncExecutorManager.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncExecutorManager.scala
new file mode 100644
index 0000000..cc4f1db
--- /dev/null
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/async/AsyncExecutorManager.scala
@@ -0,0 +1,58 @@
+/*
+ * 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.linkis.engineconn.computation.executor.async
+
+import org.apache.linkis.common.utils.Logging
+import org.apache.linkis.scheduler.executer.{Executor, ExecutorManager}
+import org.apache.linkis.scheduler.listener.ExecutorListener
+import org.apache.linkis.scheduler.queue.SchedulerEvent
+
+import scala.concurrent.duration.Duration
+
+class AsyncExecutorManager(executor: AsyncConcurrentComputationExecutor) extends ExecutorManager with Logging {
+
+ private val asyncExecuteExecutor: AsyncExecuteExecutor = new AsyncExecuteExecutor(executor)
+
+ override def setExecutorListener(engineListener: ExecutorListener): Unit = {
+
+ }
+
+ override protected def createExecutor(event: SchedulerEvent): Executor = {
+ asyncExecuteExecutor
+ }
+
+ override def askExecutor(event: SchedulerEvent): Option[Executor] = {
+ Some(createExecutor(event))
+ }
+
+ override def askExecutor(event: SchedulerEvent, wait: Duration): Option[Executor] = {
+ Some(createExecutor(event))
+ }
+
+ override def getById(id: Long): Option[Executor] = {
+ None
+ }
+
+ override def getByGroup(groupName: String): Array[Executor] = {
+ Array.empty[Executor]
+ }
+
+ override def delete(executor: Executor): Unit = {}
+
+ override def shutdown(): Unit = {}
+}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/conf/ComputationExecutorConf.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/conf/ComputationExecutorConf.scala
index 91a554d..70b08dc 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/conf/ComputationExecutorConf.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/conf/ComputationExecutorConf.scala
@@ -34,6 +34,16 @@ object ComputationExecutorConf {
val UDF_LOAD_FAILED_IGNORE = CommonVars("wds.linkis.engineconn.udf.load.ignore", true)
+ val FUNCTION_LOAD_FAILED_IGNORE = CommonVars("wds.linkis.engineconn.function.load.ignore", true)
+
+ val TASK_IGNORE_UNCOMPLETED_STATUS = CommonVars("wds.linkis.engineconn.task.ignore.uncompleted.status", true).getValue
+
val ENGINE_CONCURRENT_THREAD_NUM = CommonVars("wds.linkis.engineconn.concurrent.thread.num", 20)
+
+ val ASYNC_EXECUTE_MAX_PARALLELISM = CommonVars("wds.linkis.engineconn.max.parallelism", 300)
+
+
+ val DEFAULT_COMPUTATION_EXECUTORMANAGER_CLAZZ = CommonVars("wds.linkis.default.computation.executormanager.clazz", "org.apache.linkis.engineconn.computation.executor.creation.ComputationExecutorManagerImpl")
+
}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/execute/ComputationEngineConnExecution.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/execute/ComputationEngineConnExecution.scala
index 9a686a3..bd53cf8 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/execute/ComputationEngineConnExecution.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/execute/ComputationEngineConnExecution.scala
@@ -21,6 +21,7 @@ import org.apache.linkis.DataWorkCloudApplication
import org.apache.linkis.engineconn.common.creation.EngineCreationContext
import org.apache.linkis.engineconn.common.engineconn.EngineConn
import org.apache.linkis.engineconn.common.execution.EngineConnExecution
+import org.apache.linkis.engineconn.computation.executor.conf.ComputationExecutorConf
import org.apache.linkis.engineconn.core.execution.AbstractEngineConnExecution
import org.apache.linkis.engineconn.executor.conf.EngineConnExecutorConfiguration
import org.apache.linkis.engineconn.executor.entity.Executor
@@ -64,8 +65,8 @@ class ComputationExecutorManagerEngineConnExecution extends EngineConnExecution
case _ =>
}
if(shouldSet) DataWorkCloudApplication.setProperty(EngineConnExecutorConfiguration.EXECUTOR_MANAGER_CLASS.key,
- "org.apache.linkis.engineconn.computation.executor.creation.ComputationExecutorManagerImpl")
-}
+ ComputationExecutorConf.DEFAULT_COMPUTATION_EXECUTORMANAGER_CLAZZ.getValue)
+ }
/**
* The smallest got the first execution opportunity.
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/execute/ComputationExecutor.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/execute/ComputationExecutor.scala
index 08f6c74..afa0839 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/execute/ComputationExecutor.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/execute/ComputationExecutor.scala
@@ -63,13 +63,13 @@ abstract class ComputationExecutor(val outputPrintLimit: Int = 1000) extends Acc
private var codeParser: Option[CodeParser] = None
- private var runningTasks: Count = new Count
+ protected val runningTasks: Count = new Count
- private var pendingTasks: Count = new Count
+ protected val pendingTasks: Count = new Count
- private var succeedTasks: Count = new Count
+ protected val succeedTasks: Count = new Count
- private var failedTasks: Count = new Count
+ protected val failedTasks: Count = new Count
private var lastTask: EngineConnTask = _
@@ -144,11 +144,11 @@ abstract class ComputationExecutor(val outputPrintLimit: Int = 1000) extends Acc
}
- def toExecuteTask(engineConnTask: EngineConnTask, internalExecute: Boolean = false): ExecuteResponse = {
+ def toExecuteTask(engineConnTask: EngineConnTask, internalExecute: Boolean = false): ExecuteResponse = {
runningTasks.increase()
this.internalExecute = internalExecute
Utils.tryFinally{
- transformTaskStatus(engineConnTask, ExecutionNodeStatus.Running)
+ transformTaskStatus(engineConnTask, ExecutionNodeStatus.Running)
val engineExecutionContext = createEngineExecutionContext(engineConnTask)
var hookedCode = engineConnTask.getCode
Utils.tryCatch {
@@ -156,7 +156,7 @@ abstract class ComputationExecutor(val outputPrintLimit: Int = 1000) extends Acc
ComputationExecutorHook.getComputationExecutorHooks.foreach(hook => {
hookedCode = hook.beforeExecutorExecute(engineExecutionContext, engineCreationContext, hookedCode)
})
- } ( e => info("failed to do with hook", e))
+ } (e => info("failed to do with hook", e))
if (hookedCode.length > 100) {
info(s"hooked after code: ${hookedCode.substring(0, 100)} ....")
} else {
@@ -207,11 +207,11 @@ abstract class ComputationExecutor(val outputPrintLimit: Int = 1000) extends Acc
failedTasks.increase()
}
+
if (null == response && codes.isEmpty) {
- error("This code is empty, and the task will be directly marked as successful.")
+ warn("This code is empty, the task will be directly marked as successful")
response = SuccessExecuteResponse()
}
-
response = response match {
case _: OutputExecuteResponse =>
succeedTasks.increase()
@@ -242,11 +242,11 @@ abstract class ComputationExecutor(val outputPrintLimit: Int = 1000) extends Acc
toExecuteTask(engineConnTask)
}
- Utils.tryAndWarn(afterExecute(engineConnTask, response))
+ Utils.tryAndWarn(afterExecute(engineConnTask, response))
info(s"Finished to execute task ${engineConnTask.getTaskId}")
- lastTask = null
- response
- }
+ //lastTask = null
+ response
+ }
def setCodeParser(codeParser: CodeParser): Unit = this.codeParser = Some(codeParser)
@@ -285,7 +285,6 @@ abstract class ComputationExecutor(val outputPrintLimit: Int = 1000) extends Acc
Utils.tryAndWarn {
val task = getTaskById(taskId)
if (null != task) {
- task.setStatus(ExecutionNodeStatus.Cancelled)
transformTaskStatus(task, ExecutionNodeStatus.Cancelled)
}
}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/execute/ConcurrentComputationExecutor.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/execute/ConcurrentComputationExecutor.scala
index a0b30a3..1627f49 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/execute/ConcurrentComputationExecutor.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/execute/ConcurrentComputationExecutor.scala
@@ -30,7 +30,7 @@ abstract class ConcurrentComputationExecutor(override val outputPrintLimit: Int
error(s"Executor is busy but still got new task ! Running task num : ${getRunningTask}")
}
if (getRunningTask >= getConcurrentLimit) synchronized {
- if (getRunningTask >= getConcurrentLimit) {
+ if (getRunningTask >= getConcurrentLimit && NodeStatus.isIdle(getStatus)) {
info(s"running task($getRunningTask) > concurrent limit $getConcurrentLimit, now to mark engine to busy ")
transition(NodeStatus.Busy)
}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/ComputationExecutorHook.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/ComputationExecutorHook.scala
index cae3289..1d4b184 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/ComputationExecutorHook.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/ComputationExecutorHook.scala
@@ -54,5 +54,5 @@ object ComputationExecutorHook extends Logging {
hooks.sortWith((a, b) => a.getOrder() <= b.getOrder()).toArray
}
- def getComputationExecutorHooks = computationExecutorHooks
+ def getComputationExecutorHooks: Array[ComputationExecutorHook] = computationExecutorHooks
}
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/ExecutorLabelsRestHook.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/ExecutorLabelsRestHook.scala
new file mode 100644
index 0000000..66e096e
--- /dev/null
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/ExecutorLabelsRestHook.scala
@@ -0,0 +1,58 @@
+/*
+ * 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.linkis.engineconn.computation.executor.hook
+
+import org.apache.linkis.common.utils.Logging
+import org.apache.linkis.manager.label.builder.factory.LabelBuilderFactoryContext
+import org.apache.linkis.manager.label.entity.Label
+import org.apache.linkis.manager.label.entity.engine.{CodeLanguageLabel, RunType}
+import org.apache.linkis.manager.label.utils.LabelUtil
+
+trait ExecutorLabelsRestHook {
+ def getOrder(): Int = 1
+
+ def getHookName(): String
+
+ def restExecutorLabels(labels: Array[Label[_]]): Array[Label[_]]
+}
+
+class CreatorRestLabelsHook extends ExecutorLabelsRestHook with Logging {
+
+ override def getHookName(): String = "CreatorRestLabelsHook"
+
+ override def restExecutorLabels(labels: Array[Label[_]]): Array[Label[_]] = {
+ val codeLabel = LabelUtil.getLabelFromArray[CodeLanguageLabel](labels)
+ if (null != codeLabel && RunType.FUNCTION_MDQ_TYPE.toString.equalsIgnoreCase(codeLabel.getCodeType)) {
+ logger.info(s"code Type Label($codeLabel) reset to scala")
+ val newCodeLabel = LabelBuilderFactoryContext.getLabelBuilderFactory.createLabel(classOf[CodeLanguageLabel])
+ newCodeLabel.setCodeType(RunType.SCALA.toString)
+ labels.filter(!_.isInstanceOf[CodeLanguageLabel]) ++ Array(newCodeLabel)
+ } else {
+ labels
+ }
+ }
+}
+
+object ExecutorLabelsRestHook {
+
+ private val HOOKS = Array[ExecutorLabelsRestHook](new CreatorRestLabelsHook)
+
+ def getExecutorLabelsRestHooks: Array[ExecutorLabelsRestHook] = HOOKS
+
+}
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/InitSQLHook.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/InitSQLHook.scala
new file mode 100644
index 0000000..ef5afcd
--- /dev/null
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/InitSQLHook.scala
@@ -0,0 +1,104 @@
+/*
+ * 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.linkis.engineconn.computation.executor.hook
+
+import java.io.File
+import java.util
+
+import org.apache.linkis.common.conf.CommonVars
+import org.apache.linkis.common.utils.{Logging, Utils}
+import org.apache.linkis.engineconn.common.creation.EngineCreationContext
+import org.apache.linkis.engineconn.common.engineconn.EngineConn
+import org.apache.linkis.engineconn.common.hook.EngineConnHook
+import org.apache.linkis.engineconn.computation.executor.entity.CommonEngineConnTask
+import org.apache.linkis.engineconn.computation.executor.execute.ComputationExecutor
+import org.apache.linkis.engineconn.core.executor.ExecutorManager
+import org.apache.linkis.governance.common.entity.ExecutionNodeStatus
+import org.apache.linkis.manager.label.entity.Label
+import org.apache.linkis.manager.label.entity.engine.{CodeLanguageLabel, RunType}
+import org.apache.commons.io.FileUtils
+import org.apache.commons.lang.StringUtils
+
+
+abstract class InitSQLHook extends EngineConnHook with Logging {
+
+
+ private val INIT_SQL_DIR = CommonVars("wds.linkis.bdp.hive.init.sql.dir", "/appcom/config/hive-config/init_sql/").getValue
+
+ private val INIT_SQL_ENABLE = CommonVars("wds.linkis.bdp.hive.init.sql.enable", false)
+
+ override def beforeCreateEngineConn(engineCreationContext: EngineCreationContext): Unit = {}
+
+ override def beforeExecutionExecute(engineCreationContext: EngineCreationContext, engineConn: EngineConn): Unit = {}
+
+ protected def getRunType(): String
+
+ override def afterExecutionExecute(engineCreationContext: EngineCreationContext, engineConn: EngineConn): Unit = Utils.tryAndError {
+ val user: String = if (StringUtils.isNotBlank(engineCreationContext.getUser)) engineCreationContext.getUser else {
+ Utils.getJvmUser
+ }
+ if (! INIT_SQL_ENABLE.getValue(engineCreationContext.getOptions)) {
+ info(s"$user engineConn skip execute init_sql")
+ return
+ }
+
+ val initSql = readFile(INIT_SQL_DIR + user + "_hive.sql")
+ if (StringUtils.isBlank(initSql)) {
+ info(s"$user init_sql is empty")
+ return
+ }
+ info(s"$user engineConn begin to run init_sql")
+ val codeLanguageLabel = new CodeLanguageLabel
+ codeLanguageLabel.setCodeType(getRunType())
+ val labels = Array[Label[_]](codeLanguageLabel)
+ val engineConnTask = new CommonEngineConnTask("init_sql")
+ engineConnTask.setLabels(labels)
+ engineConnTask.setCode(initSql)
+ engineConnTask.setProperties(new util.HashMap[String, AnyRef]())
+ engineConnTask.setStatus(ExecutionNodeStatus.Scheduled)
+ ExecutorManager.getInstance.getExecutorByLabels(labels) match {
+ case executor: ComputationExecutor =>
+ executor.toExecuteTask(engineConnTask, internalExecute = true)
+ case _ =>
+ }
+ info(s"$user engineConn finished to run init_sql")
+ }
+
+ protected def readFile(path: String): String = {
+ info("read file: " + path)
+ val file = new File(path)
+ if (file.exists()) {
+ FileUtils.readFileToString(file)
+ } else {
+ info("file: [" + path + "] doesn't exist, ignore it.")
+ ""
+ }
+ }
+}
+
+class SparkInitSQLHook extends InitSQLHook {
+
+ override protected def getRunType(): String = RunType.SQL.toString
+
+}
+
+class HiveInitSQLHook extends InitSQLHook {
+
+ override protected def getRunType(): String = RunType.HIVE.toString
+
+}
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/UDFLoadEngineConnHook.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/UDFLoadEngineConnHook.scala
index 4700c81..433c18a 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/UDFLoadEngineConnHook.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/UDFLoadEngineConnHook.scala
@@ -17,8 +17,8 @@
package org.apache.linkis.engineconn.computation.executor.hook
-import java.io.File
+import org.apache.linkis.bml.client.{BmlClient, BmlClientFactory}
import org.apache.linkis.common.utils.{Logging, Utils}
import org.apache.linkis.engineconn.common.creation.EngineCreationContext
import org.apache.linkis.engineconn.common.engineconn.EngineConn
@@ -27,75 +27,42 @@ import org.apache.linkis.engineconn.computation.executor.conf.ComputationExecuto
import org.apache.linkis.engineconn.computation.executor.execute.{ComputationExecutor, EngineExecutionContext}
import org.apache.linkis.engineconn.core.executor.ExecutorManager
import org.apache.linkis.manager.label.entity.Label
-import org.apache.linkis.manager.label.entity.engine.{CodeLanguageLabel, EngineTypeLabel}
+import org.apache.linkis.manager.label.entity.engine.{CodeLanguageLabel, EngineTypeLabel, RunType}
import org.apache.linkis.udf.UDFClient
-import org.apache.linkis.udf.entity.UDFInfo
import org.apache.linkis.udf.utils.ConstantVar
-import org.apache.commons.io.FileUtils
+import org.apache.commons.io.{FileUtils, IOUtils}
import org.apache.commons.lang.StringUtils
+import org.apache.linkis.common.conf.Configuration
+import org.apache.linkis.engineconn.core.engineconn.EngineConnManager
+import org.apache.linkis.engineconn.executor.entity.Executor
+import org.apache.linkis.manager.label.entity.engine.RunType.RunType
+import org.apache.linkis.udf.vo.UDFInfoVo
+import java.io.File
import scala.collection.JavaConversions._
import scala.collection.mutable.ArrayBuffer
-abstract class UDFLoadEngineConnHook extends EngineConnHook with Logging {
+abstract class UDFLoad extends Logging {
+
protected val udfType: BigInt
protected val category: String
- protected val runType: String
+ protected val runType: RunType
- protected def getRealRunType(engineType: String): String = runType
+ private val bmlClient: BmlClient = BmlClientFactory.createBmlClient()
- protected def constructCode(udfInfo: UDFInfo): String
-
- override def afterExecutionExecute(engineCreationContext: EngineCreationContext, engineConn: EngineConn): Unit = {
- val user = engineCreationContext.getUser
- val codeLanguageLabel = new CodeLanguageLabel
- engineCreationContext.getLabels().find(_.isInstanceOf[EngineTypeLabel]) match {
- case Some(engineTypeLabel) =>
- codeLanguageLabel.setCodeType(getRealRunType(engineTypeLabel.asInstanceOf[EngineTypeLabel].getEngineType))
- case None =>
- codeLanguageLabel.setCodeType(runType)
- warn("no EngineTypeLabel found, use default runType")
- }
- val labels = Array[Label[_]](codeLanguageLabel)
- generateCode(user).foreach {
- case "" =>
- case c: String =>
- info("Submit udf registration to engine, code: " + c)
- ExecutorManager.getInstance.getExecutorByLabels(labels) match {
- case executor: ComputationExecutor =>
-// val task = new CommonEngineConnTask("udf-register-" + UDFLoadEngineConnHook.taskIdGenerator.incrementAndGet(), false)
-// task.setCode(c)
-// task.setStatus(ExecutionNodeStatus.Scheduled)
-// task.setLabels(labels)
-// task.setProperties(Maps.newHashMap())
-// executor.execute(task)
- Utils.tryCatch(executor.executeLine(new EngineExecutionContext(executor), c)){
- case t: Throwable =>
- if (! ComputationExecutorConf.UDF_LOAD_FAILED_IGNORE.getValue) {
- Utils.tryQuietly(executor.close())
- throw t
- }else {
- error("Failed to load udf", t)
- null
- }
- }
- }
- info("executed code: " + c)
- }
- }
+ protected def getRealRunType(engineType: String): RunType = runType
- protected def acceptCodeType(line: String): Boolean = {
- line.startsWith("%" + runType)
- }
+ protected def constructCode(udfInfo: UDFInfoVo): String
protected def generateCode(user: String): Array[String] = {
val codeBuffer = new ArrayBuffer[String]
val statementBuffer = new ArrayBuffer[String]
var accept = true
- getLoadUdfCode(user).split("\n").foreach{
+ getLoadUdfCode(user).split("\n").foreach {
case "" =>
case l if l.startsWith("%") =>
- if(acceptCodeType(l)){
+
+ if (acceptCodeType(l)) {
accept = true
codeBuffer.append(statementBuffer.mkString("\n"))
statementBuffer.clear()
@@ -105,20 +72,27 @@ abstract class UDFLoadEngineConnHook extends EngineConnHook with Logging {
case l if accept => statementBuffer.append(l)
case _ =>
}
- if(statementBuffer.nonEmpty) codeBuffer.append(statementBuffer.mkString("\n"))
- codeBuffer.toArray
+ if (statementBuffer.nonEmpty) codeBuffer.append(statementBuffer.mkString("\n"))
+ codeBuffer.filter(StringUtils.isNotBlank).toArray
+ }
+
+ protected def acceptCodeType(line: String): Boolean = {
+ line.startsWith("%" + runType.toString)
}
+
protected def getLoadUdfCode(user: String): String = {
info("start loading UDFs")
- val udfInfos = UDFClient.getUdfInfos(user, category).filter{ info => info.getUdfType == udfType && info.getExpire == false && info.getLoad == true}
- udfInfos.map(constructCode).mkString("\n")
+ val udfInfos = UDFClient.getUdfInfosByUdfType(user, category, udfType)
+ info("all udfs: ")
+ udfInfos.foreach { l => info("udfName:" + l.getUdfName + " bml_resource_id:" + l.getBmlResourceId + "\n") }
+ udfInfos.filter { info => StringUtils.isNotEmpty(info.getBmlResourceId) }.map(constructCode).mkString("\n")
}
protected def readFile(path: String): String = {
info("read file: " + path)
val file = new File(path)
- if(file.exists()){
+ if (file.exists()) {
FileUtils.readFileToString(file)
} else {
info("udf file: [" + path + "] doesn't exist, ignore it.")
@@ -126,6 +100,101 @@ abstract class UDFLoadEngineConnHook extends EngineConnHook with Logging {
}
}
+ protected def readFile(user: String, resourceId: String, resourceVersion: String): String = {
+ info("begin to download udf from bml.")
+ val downloadResponse = bmlClient.downloadResource(if (user == null) Utils.getJvmUser else user, resourceId, resourceVersion)
+ if (downloadResponse.isSuccess) {
+ Utils.tryFinally {
+ IOUtils.toString(downloadResponse.inputStream, Configuration.BDP_ENCODING.getValue)
+ } {
+ IOUtils.closeQuietly(downloadResponse.inputStream)
+ }
+ } else {
+ info("failed to download udf from bml.")
+ ""
+ }
+ }
+
+ private def getFunctionCode(): Array[String] = {
+ val engineCreationContext = EngineConnManager.getEngineConnManager.getEngineConn.getEngineCreationContext
+ val user = engineCreationContext.getUser
+ Utils.tryCatch(generateCode(user)) {
+ case t: Throwable =>
+ if (!ComputationExecutorConf.UDF_LOAD_FAILED_IGNORE.getValue) {
+ logger.error("Failed to load function, executor close ")
+ throw t
+ } else {
+ logger.error("Failed to load function", t)
+ Array.empty[String]
+ }
+ }
+ }
+
+ private def executeFunctionCode(codes: Array[String], executor: ComputationExecutor): Unit = {
+ if (null == codes || null == executor) {
+ return
+ }
+ codes.foreach { code =>
+ logger.info("Submit function registration to engine, code: " + code)
+ Utils.tryCatch(executor.executeLine(new EngineExecutionContext(executor), code)) {
+ case t: Throwable =>
+ if (!ComputationExecutorConf.UDF_LOAD_FAILED_IGNORE.getValue) {
+ Utils.tryQuietly(executor.close())
+ logger.error("Failed to load function, executor close ")
+ throw t
+ } else {
+ logger.error("Failed to load function", t)
+ null
+ }
+ }
+ }
+ }
+
+ protected def loadFunctions(executor: Executor): Unit = {
+
+ val codes = getFunctionCode()
+ if (null != codes && codes.nonEmpty) {
+ executor match {
+ case computationExecutor: ComputationExecutor =>
+ executeFunctionCode(codes, computationExecutor)
+ case _ =>
+ }
+ }
+ logger.info(s"Successful to execute function code ${runType}, type : ${udfType}")
+ }
+
+ protected def loadUDF(labels : Array[Label[_]]): Unit = {
+
+ val codes = getFunctionCode()
+ if (null != codes && codes.nonEmpty) {
+ val executor = ExecutorManager.getInstance.getExecutorByLabels(labels)
+ executor match {
+ case computationExecutor: ComputationExecutor =>
+ executeFunctionCode(codes, computationExecutor)
+ case _ =>
+ }
+ }
+ logger.info(s"Successful to execute code ${runType}, type : ${udfType}")
+ }
+
+}
+
+abstract class UDFLoadEngineConnHook extends UDFLoad with EngineConnHook with Logging {
+
+
+ override def afterExecutionExecute(engineCreationContext: EngineCreationContext, engineConn: EngineConn): Unit = {
+ val codeLanguageLabel = new CodeLanguageLabel
+ engineCreationContext.getLabels().find(_.isInstanceOf[EngineTypeLabel]) match {
+ case Some(engineTypeLabel) =>
+ codeLanguageLabel.setCodeType(getRealRunType(engineTypeLabel.asInstanceOf[EngineTypeLabel].getEngineType).toString)
+ case None =>
+ codeLanguageLabel.setCodeType(runType.toString)
+ warn("no EngineTypeLabel found, use default runType")
+ }
+ val labels = Array[Label[_]](codeLanguageLabel)
+ loadUDF(labels)
+ }
+
override def afterEngineServerStartFailed(engineCreationContext: EngineCreationContext, throwable: Throwable): Unit = {}
override def beforeCreateEngineConn(engineCreationContext: EngineCreationContext): Unit = {}
@@ -137,59 +206,40 @@ abstract class UDFLoadEngineConnHook extends EngineConnHook with Logging {
class JarUdfEngineHook extends UDFLoadEngineConnHook {
override val udfType: BigInt = ConstantVar.UDF_JAR
override val category: String = ConstantVar.UDF
- override val runType = "sql"
+ override val runType = RunType.SQL
- override protected def constructCode(udfInfo: UDFInfo): String = {
+ override protected def constructCode(udfInfo: UDFInfoVo): String = {
"%sql\n" + udfInfo.getRegisterFormat
}
- override protected def getRealRunType(engineType: String): String = {
- if(engineType.equals("hive")){
- return "hql"
+ override protected def getRealRunType(engineType: String): RunType = {
+ if (engineType.equals("hive")) {
+ return RunType.HIVE
}
runType
}
}
-class PyUdfEngineHook extends UDFLoadEngineConnHook{
+
+class PyUdfEngineHook extends UDFLoadEngineConnHook {
override val udfType: BigInt = ConstantVar.UDF_PY
override val category: String = ConstantVar.UDF
- override val runType = "py"
- override protected def constructCode(udfInfo: UDFInfo): String = {
- "%py\n" + readFile(udfInfo.getPath) + "\n" + (if(StringUtils.isNotBlank(udfInfo.getRegisterFormat)) udfInfo.getRegisterFormat else "")
+ override val runType = RunType.PYSPARK
+
+ override protected def constructCode(udfInfo: UDFInfoVo): String = {
+ "%py\n" + readFile(udfInfo.getCreateUser, udfInfo.getBmlResourceId, udfInfo.getBmlResourceVersion) + "\n" +
+ (if (StringUtils.isNotBlank(udfInfo.getRegisterFormat)) udfInfo.getRegisterFormat else "")
}
}
-class ScalaUdfEngineHook extends UDFLoadEngineConnHook{
+
+class ScalaUdfEngineHook extends UDFLoadEngineConnHook {
override val udfType: BigInt = ConstantVar.UDF_SCALA
override val category: String = ConstantVar.UDF
- override val runType = "scala"
- override protected def constructCode(udfInfo: UDFInfo): String = {
- "%scala\n" + readFile(udfInfo.getPath) + "\n" + (if(StringUtils.isNotBlank(udfInfo.getRegisterFormat)) udfInfo.getRegisterFormat else "")
- }
-}
-class PyFunctionEngineHook extends UDFLoadEngineConnHook{
- override val udfType: BigInt = ConstantVar.FUNCTION_PY
- override val category: String = ConstantVar.FUNCTION
- override val runType = "py"
- override protected def constructCode(udfInfo: UDFInfo): String = {
- "%py\n" + readFile(udfInfo.getPath)
- }
+ override val runType = RunType.SCALA
- override protected def getRealRunType(engineType: String): String = {
- if(engineType.equals("python")){
- return "python"
- }
- runType
- }
-}
-class ScalaFunctionEngineHook extends UDFLoadEngineConnHook{
- override val udfType: BigInt = ConstantVar.FUNCTION_SCALA
- override val category: String = ConstantVar.FUNCTION
- override val runType = "scala"
- override protected def constructCode(udfInfo: UDFInfo): String = {
- "%scala\n" + readFile(udfInfo.getPath)
+ override protected def constructCode(udfInfo: UDFInfoVo): String = {
+ "%scala\n" + readFile(udfInfo.getCreateUser, udfInfo.getBmlResourceId, udfInfo.getBmlResourceVersion) + "\n" +
+ (if (StringUtils.isNotBlank(udfInfo.getRegisterFormat)) udfInfo.getRegisterFormat else "")
}
+
}
-//object UDFLoadEngineConnHook {
-// val taskIdGenerator = new AtomicInteger(0)
-//}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/UseDatabaseEngineHook.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/UseDatabaseEngineHook.scala
new file mode 100644
index 0000000..3f8cf5d
--- /dev/null
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/UseDatabaseEngineHook.scala
@@ -0,0 +1,79 @@
+/*
+ * 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.linkis.engineconn.computation.executor.hook
+
+import org.apache.linkis.common.conf.CommonVars
+import org.apache.linkis.common.utils.{Logging, Utils}
+import org.apache.linkis.engineconn.common.creation.EngineCreationContext
+import org.apache.linkis.engineconn.common.engineconn.EngineConn
+import org.apache.linkis.engineconn.common.hook.EngineConnHook
+import org.apache.linkis.engineconn.computation.executor.execute.{ComputationExecutor, EngineExecutionContext}
+import org.apache.linkis.engineconn.core.executor.ExecutorManager
+import org.apache.linkis.manager.label.entity.Label
+import org.apache.linkis.manager.label.entity.engine.{CodeLanguageLabel, RunType}
+import org.apache.commons.lang.StringUtils
+
+abstract class UseDatabaseEngineHook extends EngineConnHook with Logging {
+
+
+ private val USE_DEFAULT_DB_ENABLE = CommonVars("wds.linkis.bdp.use.default.db.enable", true)
+
+ override def beforeCreateEngineConn(engineCreationContext: EngineCreationContext): Unit = {}
+
+ override def beforeExecutionExecute(engineCreationContext: EngineCreationContext, engineConn: EngineConn): Unit = {}
+
+ protected def getRunType(): String
+
+ override def afterExecutionExecute(engineCreationContext: EngineCreationContext, engineConn: EngineConn): Unit = Utils.tryAndError {
+ val user: String = if (StringUtils.isNotBlank(engineCreationContext.getUser)) engineCreationContext.getUser else {
+ Utils.getJvmUser
+ }
+ if (! USE_DEFAULT_DB_ENABLE.getValue(engineCreationContext.getOptions)) {
+ info(s"$user engineConn skip execute use default db")
+ return
+ }
+ val database = if (StringUtils.isNotEmpty(user)) {
+ user + "_ind"
+ } else {
+ "default"
+ }
+ val useDataBaseSql = "use " + database
+ info(s"$user begin to run init_code $useDataBaseSql")
+ val codeLanguageLabel = new CodeLanguageLabel
+ codeLanguageLabel.setCodeType(getRunType)
+ val labels = Array[Label[_]](codeLanguageLabel)
+ ExecutorManager.getInstance.getExecutorByLabels(labels) match {
+ case executor: ComputationExecutor =>
+ executor.executeLine(new EngineExecutionContext(executor), useDataBaseSql)
+ case _ =>
+ }
+ }
+
+}
+
+class SparkUseDatabaseEngineHook extends UseDatabaseEngineHook {
+
+ override protected def getRunType(): String = RunType.SQL.toString
+
+}
+
+class HiveUseDatabaseEngineHook extends UseDatabaseEngineHook {
+
+ override protected def getRunType(): String = RunType.HIVE.toString
+
+}
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/executor/FunctionExecutorHook.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/executor/FunctionExecutorHook.scala
new file mode 100644
index 0000000..15d126d
--- /dev/null
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/executor/FunctionExecutorHook.scala
@@ -0,0 +1,74 @@
+/*
+ * 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.linkis.engineconn.computation.executor.hook.executor
+
+import org.apache.linkis.engineconn.computation.executor.hook.UDFLoad
+import org.apache.linkis.engineconn.core.hook.ExecutorHook
+import org.apache.linkis.engineconn.executor.entity.Executor
+import org.apache.linkis.manager.label.entity.engine.RunType
+import org.apache.linkis.manager.label.entity.engine.RunType.RunType
+import org.apache.linkis.udf.utils.ConstantVar
+import org.apache.linkis.udf.vo.UDFInfoVo
+
+class PyFunctionEngineHook extends UDFLoad with ExecutorHook {
+ override val udfType: BigInt = ConstantVar.FUNCTION_PY
+ override val category: String = ConstantVar.FUNCTION
+ override val runType = RunType.PYSPARK
+
+ override protected def constructCode(udfInfo: UDFInfoVo): String = {
+ "%py\n" + readFile(udfInfo.getCreateUser, udfInfo.getBmlResourceId, udfInfo.getBmlResourceVersion)
+ }
+
+ override protected def getRealRunType(runTypeIn: String): RunType = {
+ if (runTypeIn.equals("python")) {
+ return RunType.PYTHON
+ }
+ runType
+ }
+
+ override def getHookName(): String = "PyFunctionEngineHook"
+
+ override def afterExecutorInit(executor: Executor): Unit = {
+ logger.info("start to register python function ")
+ loadFunctions(executor)
+ logger.info("Finished to register python function ")
+ }
+
+ override def isAccepted(codeType: String): Boolean = runType.toString.equalsIgnoreCase(codeType) || RunType.PYTHON.toString.equalsIgnoreCase(codeType)
+}
+
+
+class ScalaFunctionEngineHook extends UDFLoad with ExecutorHook {
+ override val udfType: BigInt = ConstantVar.FUNCTION_SCALA
+ override val category: String = ConstantVar.FUNCTION
+ override val runType = RunType.SCALA
+
+ override protected def constructCode(udfInfo: UDFInfoVo): String = {
+ "%scala\n" + readFile(udfInfo.getCreateUser, udfInfo.getBmlResourceId, udfInfo.getBmlResourceVersion)
+ }
+
+ override def getHookName(): String = "ScalaFunctionEngineHook"
+
+ override def afterExecutorInit(executor: Executor): Unit = {
+ logger.info("start to register scala function ")
+ loadFunctions(executor)
+ logger.info("Finished to register scala function ")
+ }
+
+ override def isAccepted(codeType: String): Boolean = runType.toString.equalsIgnoreCase(codeType)
+}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/listener/TaskStatusListener.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/listener/TaskStatusListener.scala
index a893cc6..1619324 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/listener/TaskStatusListener.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/listener/TaskStatusListener.scala
@@ -17,7 +17,7 @@
package org.apache.linkis.engineconn.computation.executor.listener
-import org.apache.linkis.engineconn.acessible.executor.listener.event.TaskStatusChangedEvent
+import org.apache.linkis.engineconn.acessible.executor.listener.event.{TaskResponseErrorEvent, TaskStatusChangedEvent}
import org.apache.linkis.engineconn.executor.listener.EngineConnSyncListener
@@ -25,4 +25,6 @@ trait TaskStatusListener extends EngineConnSyncListener {
def onTaskStatusChanged(taskStatusChangedEvent: TaskStatusChangedEvent): Unit
+ def onTaskResponseErrorEvent(taskResponseErrorEvent: TaskResponseErrorEvent): Unit
+
}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/service/TaskExecutionService.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/service/TaskExecutionService.scala
index 159404c..7e62f54 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/service/TaskExecutionService.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/service/TaskExecutionService.scala
@@ -18,13 +18,13 @@
package org.apache.linkis.engineconn.computation.executor.service
import org.apache.linkis.governance.common.protocol.task._
-import org.apache.linkis.message.builder.ServiceMethodContext
+import org.apache.linkis.rpc.Sender
import org.apache.linkis.scheduler.executer.ExecuteResponse
trait TaskExecutionService {
- def execute(requestTask: RequestTask, smc: ServiceMethodContext): ExecuteResponse
+ def execute(requestTask: RequestTask, sender: Sender): ExecuteResponse
// def taskStatus(taskID: String): ResponseTaskStatus
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/service/TaskExecutionServiceImpl.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/service/TaskExecutionServiceImpl.scala
index 2589c20..29b21f4 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/service/TaskExecutionServiceImpl.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/service/TaskExecutionServiceImpl.scala
@@ -17,10 +17,9 @@
package org.apache.linkis.engineconn.computation.executor.service
-import java.util.concurrent.atomic.AtomicInteger
-import java.util.concurrent._
-
import com.google.common.cache.{Cache, CacheBuilder}
+import org.apache.commons.lang.StringUtils
+import org.apache.commons.lang.exception.ExceptionUtils
import org.apache.linkis.common.listener.Event
import org.apache.linkis.common.utils.{Logging, Utils}
import org.apache.linkis.engineconn.acessible.executor.listener.LogListener
@@ -28,30 +27,35 @@ import org.apache.linkis.engineconn.acessible.executor.listener.event._
import org.apache.linkis.engineconn.acessible.executor.log.LogHelper
import org.apache.linkis.engineconn.acessible.executor.service.LockService
import org.apache.linkis.engineconn.common.conf.{EngineConnConf, EngineConnConstant}
+import org.apache.linkis.engineconn.computation.executor.async.AsyncConcurrentComputationExecutor
import org.apache.linkis.engineconn.computation.executor.conf.ComputationExecutorConf
import org.apache.linkis.engineconn.computation.executor.entity.{CommonEngineConnTask, EngineConnTask}
import org.apache.linkis.engineconn.computation.executor.execute.{ComputationExecutor, ConcurrentComputationExecutor}
+import org.apache.linkis.engineconn.computation.executor.hook.ExecutorLabelsRestHook
import org.apache.linkis.engineconn.computation.executor.listener.{ResultSetListener, TaskProgressListener, TaskStatusListener}
import org.apache.linkis.engineconn.computation.executor.utlis.{ComputationEngineConstant, ComputationEngineUtils}
import org.apache.linkis.engineconn.core.executor.ExecutorManager
+import org.apache.linkis.engineconn.executor.entity.ResourceFetchExecutor
import org.apache.linkis.engineconn.executor.listener.ExecutorListenerBusContext
import org.apache.linkis.engineconn.executor.listener.event.EngineConnSyncEvent
import org.apache.linkis.governance.common.entity.ExecutionNodeStatus
import org.apache.linkis.governance.common.exception.engineconn.{EngineConnExecutorErrorCode, EngineConnExecutorErrorException}
import org.apache.linkis.governance.common.protocol.task._
import org.apache.linkis.manager.common.entity.enumeration.NodeStatus
-import org.apache.linkis.message.annotation.Receiver
-import org.apache.linkis.message.builder.ServiceMethodContext
+import org.apache.linkis.manager.common.protocol.resource.ResponseTaskYarnResource
+import org.apache.linkis.manager.label.entity.Label
import org.apache.linkis.protocol.message.RequestProtocol
import org.apache.linkis.rpc.Sender
+import org.apache.linkis.rpc.serializer.annotation.Receiver
import org.apache.linkis.rpc.utils.RPCUtils
import org.apache.linkis.scheduler.executer.{ErrorExecuteResponse, ExecuteResponse, IncompleteExecuteResponse, SubmitResponse}
import org.apache.linkis.server.BDPJettyServerHelper
-import javax.annotation.PostConstruct
-import org.apache.commons.lang.StringUtils
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
+import java.util.concurrent._
+import java.util.concurrent.atomic.AtomicInteger
+import javax.annotation.PostConstruct
import scala.collection.JavaConverters._
@@ -102,24 +106,23 @@ class TaskExecutionServiceImpl extends TaskExecutionService with Logging with Re
}
@Receiver
- override def execute(requestTask: RequestTask, smc: ServiceMethodContext): ExecuteResponse = {
- // smc // todo get sender
+ override def execute(requestTask: RequestTask, sender: Sender): ExecuteResponse = {
+
// check lock
info("Received a new task, task content is " + requestTask)
if (StringUtils.isBlank(requestTask.getLock)) {
error(s"Invalid lock : ${requestTask.getLock} , requestTask : " + requestTask)
- return ErrorExecuteResponse(s"Invalid lock : ${requestTask.getLock}.", new EngineConnExecutorErrorException(EngineConnExecutorErrorCode.INVALID_PARAMS, "Invalid lock or code(请获取到锁后再提交任务.)"))
+ return ErrorExecuteResponse(s"Invalid lock : ${requestTask.getLock}.", new EngineConnExecutorErrorException(EngineConnExecutorErrorCode.INVALID_PARAMS, "Invalid lock or code"))
}
if (!lockService.isLockExist(requestTask.getLock)) {
error(s"Lock ${requestTask.getLock} not exist, cannot execute.")
- return ErrorExecuteResponse("Lock not exixt", new EngineConnExecutorErrorException(EngineConnExecutorErrorCode.INVALID_LOCK, "Lock : " + requestTask.getLock + " not exist(您的锁无效,请重新获取后再提交)."))
+ return ErrorExecuteResponse("Lock not exixt", new EngineConnExecutorErrorException(EngineConnExecutorErrorCode.INVALID_LOCK, "Lock : " + requestTask.getLock + " not exist."))
}
if (StringUtils.isBlank(requestTask.getCode)) {
- return IncompleteExecuteResponse("Your code is incomplete, it may be that only comments are selected for execution(您的代码不完整,可能是仅仅选中了注释进行执行)")
+ return IncompleteExecuteResponse("Your code is incomplete, it may be that only comments are selected for execution")
}
- // 获取任务类型和任务代码,运行任务
val taskId: Int = taskExecutedNum.incrementAndGet()
val retryAble: Boolean = {
val retry = requestTask.getProperties.getOrDefault(ComputationEngineConstant.RETRYABLE_TYPE_NAME, null)
@@ -133,8 +136,34 @@ class TaskExecutionServiceImpl extends TaskExecutionService with Logging with Re
task.setStatus(ExecutionNodeStatus.Scheduled)
val labels = requestTask.getLabels.asScala.toArray
task.setLabels(labels)
- val entranceServerInstance = RPCUtils.getServiceInstanceFromSender(smc.getSender)
+ val entranceServerInstance = RPCUtils.getServiceInstanceFromSender(sender)
task.setCallbackServiceInstance(entranceServerInstance)
+ if (executorManager.containExecutor(labels)) {
+ submitTaskToExecutor(task, labels)
+ } else {
+ logger.info(s"task $taskId need to create executor")
+ val runnable = new Runnable {
+ override def run(): Unit = Utils.tryCatch {
+ submitTaskToExecutor(task, labels) match {
+ case ErrorExecuteResponse(message, throwable) =>
+ sendToEntrance(task, ResponseTaskError(task.getTaskId, message))
+ logger.error(message, throwable)
+ sendToEntrance(task, ResponseTaskStatus(task.getTaskId, ExecutionNodeStatus.Failed))
+ case _ =>
+ }
+ } { t =>
+ logger.warn("Failed to submit task ", t)
+ sendToEntrance(task, ResponseTaskError(task.getTaskId, ExceptionUtils.getRootCauseMessage(t)))
+ sendToEntrance(task, ResponseTaskStatus(task.getTaskId, ExecutionNodeStatus.Failed))
+ }
+ }
+ val submitTaskToExecutorFuture = Utils.defaultScheduler.submit(runnable)
+ SubmitResponse(task.getTaskId)
+ }
+ }
+
+ private def submitTaskToExecutor(task: CommonEngineConnTask, labels: Array[Label[_]]): ExecuteResponse = {
+ val newLabels = restExecutorLabels(labels)
val executor = executorManager.getExecutorByLabels(labels)
executor match {
case computationExecutor: ComputationExecutor =>
@@ -142,14 +171,18 @@ class TaskExecutionServiceImpl extends TaskExecutionService with Logging with Re
submitTask(task, computationExecutor)
case o =>
val labelsStr = if (labels != null) labels.filter(_ != null).map(_.getStringValue).mkString(",") else ""
- val msg = "Invalid computationExecutor : " + o.getClass.getName + ", labels : " + labelsStr + ", requestTask : " + requestTask
+ val msg = "Invalid computationExecutor : " + o.getClass.getName + ", labels : " + labelsStr + ", requestTask : " + task.getTaskId
error(msg)
- ErrorExecuteResponse("Invalid computationExecutor(生成无效的计算引擎,请联系管理员).",
+ ErrorExecuteResponse("Invalid computationExecutor.",
new EngineConnExecutorErrorException(EngineConnExecutorErrorCode.INVALID_ENGINE_TYPE, msg))
}
-
}
+ private def restExecutorLabels(labels: Array[Label[_]]): Array[Label[_]] = {
+ var newLabels = labels
+ ExecutorLabelsRestHook.getExecutorLabelsRestHooks.foreach(hooke => newLabels = hooke.restExecutorLabels(newLabels))
+ newLabels
+ }
// override def taskStatus(taskID: String): ResponseTaskStatus = {
// val task = taskIdCache.get(taskID)
@@ -159,6 +192,8 @@ class TaskExecutionServiceImpl extends TaskExecutionService with Logging with Re
private def submitTask(task: CommonEngineConnTask, computationExecutor: ComputationExecutor): ExecuteResponse = {
info(s"Task ${task.getTaskId} was submited.")
computationExecutor match {
+ case executor: AsyncConcurrentComputationExecutor =>
+ submitASyncTask(task, executor)
case concurrentComputationExecutor: ConcurrentComputationExecutor =>
submitConcurrentTask(task, concurrentComputationExecutor)
case _ =>
@@ -166,6 +201,19 @@ class TaskExecutionServiceImpl extends TaskExecutionService with Logging with Re
}
}
+ private def submitASyncTask(task: CommonEngineConnTask, computationExecutor: ComputationExecutor): ExecuteResponse = {
+ var response: ExecuteResponse = SubmitResponse(task.getTaskId)
+ Utils.tryCatch {
+ computationExecutor.execute(task)
+ } { t =>
+ error(s"Failed to submit task${task.getTaskId} ", t)
+ response = ErrorExecuteResponse("Failed to submit task", t)
+ null
+ }
+ response
+ }
+
+
private def submitSyncTask(task: CommonEngineConnTask, computationExecutor: ComputationExecutor): ExecuteResponse = {
val runTask = new Runnable {
override def run(): Unit = Utils.tryAndWarn {
@@ -264,6 +312,14 @@ class TaskExecutionServiceImpl extends TaskExecutionService with Logging with Re
while (null != taskFuture && !taskFuture.isDone) {
if (ExecutionNodeStatus.isCompleted(task.getStatus) || ExecutionNodeStatus.isRunning(task.getStatus)) {
sendToEntrance(task, taskProgress(task.getTaskId))
+ taskYarnResource(task.getTaskId) match {
+ case responseTaskYarnResource: ResponseTaskYarnResource => {
+ if (responseTaskYarnResource.resourceMap != null && !responseTaskYarnResource.resourceMap.isEmpty) {
+ sendToEntrance(task, responseTaskYarnResource)
+ }
+ }
+ case _ =>
+ }
Thread.sleep(TimeUnit.MILLISECONDS.convert(sleepInterval, TimeUnit.SECONDS))
}
}
@@ -271,6 +327,16 @@ class TaskExecutionServiceImpl extends TaskExecutionService with Logging with Re
})
}
+ private def taskYarnResource(taskID: String): ResponseTaskYarnResource = {
+ val executor = taskIdCache.getIfPresent(taskID)
+ executor match {
+ case executor: ResourceFetchExecutor =>
+ val resourceWithApplicationId = executor.FetchResource
+ ResponseTaskYarnResource(taskID, resourceWithApplicationId)
+ case _ => null
+ }
+ }
+
override def taskProgress(taskID: String): ResponseTaskProgress = {
var response = ResponseTaskProgress(taskID, 0, null)
if (StringUtils.isBlank(taskID)) return response
@@ -365,6 +431,7 @@ class TaskExecutionServiceImpl extends TaskExecutionService with Logging with Re
case logUpdateEvent: TaskLogUpdateEvent => onLogUpdate(logUpdateEvent)
case taskResultCreateEvent: TaskResultCreateEvent => onResultSetCreated(taskResultCreateEvent)
case taskResultSizeCreatedEvent: TaskResultSizeCreatedEvent => onResultSizeCreated(taskResultSizeCreatedEvent)
+ case taskResponseErrorEvent: TaskResponseErrorEvent => onTaskResponseErrorEvent(taskResponseErrorEvent)
case _ =>
warn("Unknown event : " + BDPJettyServerHelper.gson.toJson(event))
}
@@ -403,8 +470,12 @@ class TaskExecutionServiceImpl extends TaskExecutionService with Logging with Re
LogHelper.pushAllRemainLogs()
}
val toStatus = taskStatusChangedEvent.toStatus
- logger.info(s"send task ${task.getTaskId} status $toStatus to entrance")
- sendToEntrance(task, ResponseTaskStatus(taskStatusChangedEvent.taskId, taskStatusChangedEvent.toStatus))
+ if (!ComputationExecutorConf.TASK_IGNORE_UNCOMPLETED_STATUS || ExecutionNodeStatus.isCompleted(toStatus)) {
+ logger.info(s"send task ${task.getTaskId} status $toStatus to entrance")
+ sendToEntrance(task, ResponseTaskStatus(taskStatusChangedEvent.taskId, taskStatusChangedEvent.toStatus))
+ } else {
+ logger.info(s"task ${task.getTaskId} status $toStatus will not be send to entrance")
+ }
} else {
error("Task cannot null! taskStatusChangedEvent: " + ComputationEngineUtils.GSON.toJson(taskStatusChangedEvent))
}
@@ -473,4 +544,11 @@ class TaskExecutionServiceImpl extends TaskExecutionService with Logging with Re
}
}
}
+
+ override def onTaskResponseErrorEvent(taskResponseErrorEvent: TaskResponseErrorEvent): Unit = {
+ val task = getTaskByTaskId(taskResponseErrorEvent.taskId)
+ if (null != task) {
+ sendToEntrance(task, ResponseTaskError(task.getTaskId, taskResponseErrorEvent.errorMsg))
+ }
+ }
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/exception/ECMErrorCode.scala b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/utlis/ComputationErrorCode.scala
similarity index 80%
copy from linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/exception/ECMErrorCode.scala
copy to linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/utlis/ComputationErrorCode.scala
index 8302e45..08f9ddc 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/exception/ECMErrorCode.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/utlis/ComputationErrorCode.scala
@@ -15,16 +15,14 @@
* limitations under the License.
*/
-package org.apache.linkis.ecm.server.exception
+package org.apache.linkis.engineconn.computation.executor.utlis
-object ECMErrorCode {
+object ComputationErrorCode {
- val EC_START_TIME_OUT = 11100
- val EC_INTERRUPT_TIME_OUT = 11101
+ val ASYNC_EXECUTOR_ERROR_CODE = 11301
- val EC_START_FAILED = 11102
+ val UDF_LOAD_ERROR_CODE = 11302
- val EC_FETCH_LOG_FAILED = 11110
}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-core/src/main/scala/org/apache/linkis/engineconn/core/executor/ExecutorManager.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-core/src/main/scala/org/apache/linkis/engineconn/core/executor/ExecutorManager.scala
index bb6872e..4e019a6 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-core/src/main/scala/org/apache/linkis/engineconn/core/executor/ExecutorManager.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-core/src/main/scala/org/apache/linkis/engineconn/core/executor/ExecutorManager.scala
@@ -20,12 +20,12 @@ package org.apache.linkis.engineconn.core.executor
import java.util
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.atomic.AtomicInteger
-
import org.apache.linkis.common.utils.{Logging, Utils}
import org.apache.linkis.engineconn.common.creation.EngineCreationContext
import org.apache.linkis.engineconn.common.engineconn.EngineConn
import org.apache.linkis.engineconn.core.EngineConnObject
import org.apache.linkis.engineconn.core.engineconn.EngineConnManager
+import org.apache.linkis.engineconn.core.hook.ExecutorHook
import org.apache.linkis.engineconn.core.util.EngineConnUtils
import org.apache.linkis.engineconn.executor.conf.EngineConnExecutorConfiguration
import org.apache.linkis.engineconn.executor.entity.{Executor, LabelExecutor, SensibleExecutor}
@@ -33,6 +33,7 @@ import org.apache.linkis.manager.engineplugin.common.EngineConnPlugin
import org.apache.linkis.manager.engineplugin.common.creation._
import org.apache.linkis.manager.engineplugin.common.exception.{EngineConnPluginErrorCode, EngineConnPluginErrorException}
import org.apache.linkis.manager.label.entity.Label
+import org.apache.linkis.manager.label.utils.LabelUtil
import scala.collection.JavaConverters._
@@ -56,6 +57,8 @@ trait LabelExecutorManager extends ExecutorManager {
def removeExecutor(labels: Array[Label[_]]): LabelExecutor
+ def containExecutor(labels: Array[Label[_]]): Boolean
+
}
class LabelExecutorManagerImpl extends LabelExecutorManager with Logging {
@@ -64,6 +67,7 @@ class LabelExecutorManagerImpl extends LabelExecutorManager with Logging {
protected val GSON = EngineConnUtils.GSON
private val idCreator = new AtomicInteger()
+
protected lazy val engineConn: EngineConn = EngineConnManager.getEngineConnManager.getEngineConn
protected val engineConnPlugin: EngineConnPlugin = EngineConnObject.getEngineConnPlugin
@@ -97,8 +101,11 @@ class LabelExecutorManagerImpl extends LabelExecutorManager with Logging {
info("No LabelExecutorFactory matched, use DefaultExecutorFactory to create executor.")
defaultFactory.createExecutor(engineCreationContext, engineConn).asInstanceOf[LabelExecutor]
}
+ val codeType = LabelUtil.getCodeType(labelExecutor.getExecutorLabels())
info(s"Finished to create ${labelExecutor.getClass.getSimpleName}(${labelExecutor.getId}) with labels $labelStr.")
+ ExecutorHook.getAllExecutorHooks().filter(_.isAccepted(codeType)).foreach(_.beforeExecutorInit(labelExecutor))
labelExecutor.init()
+ ExecutorHook.getAllExecutorHooks().filter(_.isAccepted(codeType)).foreach(_.afterExecutorInit(labelExecutor))
info(s"Finished to init ${labelExecutor.getClass.getSimpleName}(${labelExecutor.getId}).")
labelExecutor
}
@@ -108,24 +115,23 @@ class LabelExecutorManagerImpl extends LabelExecutorManager with Logging {
protected def createExecutor(engineCreationContext: EngineCreationContext,
labels: Array[Label[_]] = null): LabelExecutor = {
if (null == labels || labels.isEmpty) {
- defaultFactory match {
- case labelExecutorFactory: CodeLanguageLabelExecutorFactory =>
+ defaultFactory match {
+ case labelExecutorFactory: CodeLanguageLabelExecutorFactory =>
val createExecutorLabels = Array[Label[_]](labelExecutorFactory.getDefaultCodeLanguageLabel)
createLabelExecutor(engineCreationContext, createExecutorLabels)
- case _ =>
- val executor = tryCreateExecutor(engineCreationContext, null)
- executors.put(executor.getId, executor)
- executor
+ case _ =>
+ val executor = tryCreateExecutor(engineCreationContext, null)
+ executors.put(executor.getId, executor)
+ executor
//throw new EngineConnPluginErrorException(EngineConnPluginErrorCode.INVALID_LABELS, "no labels and defaultFactory is not CodeLanguageLabelExecutorFactory")
- }
+ }
} else {
createLabelExecutor(engineCreationContext, labels)
- }
-
+ }
}
private def createLabelExecutor(engineCreationContext: EngineCreationContext,
- labels: Array[Label[_]]): LabelExecutor = {
+ labels: Array[Label[_]]): LabelExecutor = {
val labelKey = getLabelKey(labels)
if (null == labelKey) {
val msg = "Cannot get label key. labels : " + GSON.toJson(labels)
@@ -134,8 +140,8 @@ class LabelExecutorManagerImpl extends LabelExecutorManager with Logging {
if (!executors.containsKey(labelKey)) executors synchronized {
if (!executors.containsKey(labelKey)) {
- val executor = tryCreateExecutor(engineCreationContext, labels)
- executors.put(labelKey, executor)
+ val executor = tryCreateExecutor(engineCreationContext, labels)
+ executors.put(labelKey, executor)
}
}
executors.get(labelKey)
@@ -147,26 +153,33 @@ class LabelExecutorManagerImpl extends LabelExecutorManager with Logging {
val labelKey = getLabelKey(labels)
if (null == labelKey) return null
if (!executors.containsKey(labelKey)) executors synchronized {
- if (!executors.containsKey(labelKey)) {
- createExecutor(engineConn.getEngineCreationContext, labels)
- }
+ if (!executors.containsKey(labelKey)) {
+ createExecutor(engineConn.getEngineCreationContext, labels)
+ }
}
executors.get(labelKey)
}
+ override def containExecutor(labels: Array[Label[_]]): Boolean = {
+ val labelKey = getLabelKey(labels)
+ null != labelKey && executors.containsKey(labelKey)
+ }
+
override def getExecutor(id: String): Executor = executors.values().asScala.find(_.getId == id).orNull
override def getExecutors: Array[Executor] = executors.values().asScala.toArray
- override def removeExecutor(labels: Array[Label[_]]): LabelExecutor = {
+ override def removeExecutor(labels: Array[Label[_]]): LabelExecutor = executors.synchronized {
val labelKey = getLabelKey(labels)
if (labelKey != null && executors.containsKey(labelKey)) executors.remove(labelKey)
else null
}
- override def removeExecutor(id: String): Executor = executors.asScala.find(_._2.getId == id).map{
- case (k, _) => executors.remove(k)
- }.orNull
+ override def removeExecutor(id: String): Executor = executors.synchronized {
+ executors.asScala.find(_._2.getId == id).map {
+ case (k, _) => executors.remove(k)
+ }.orNull
+ }
override def getReportExecutor: Executor = if (getExecutors.isEmpty) {
val labels = defaultFactory match {
@@ -180,9 +193,11 @@ class LabelExecutorManagerImpl extends LabelExecutorManager with Logging {
} else {
getExecutors.maxBy {
case executor: SensibleExecutor => executor.getStatus.ordinal()
- case executor: Executor => executor.getId.hashCode
+ case executor: Executor => executor.getId.hashCode
+ }
}
-}
+
+
}
object ExecutorManager extends Logging {
@@ -196,8 +211,8 @@ object ExecutorManager extends Logging {
}
def getInstance: LabelExecutorManager = {
- if(executorManager == null) synchronized {
- if(executorManager == null) init()
+ if (executorManager == null) synchronized {
+ if (executorManager == null) init()
}
executorManager
}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/ComputationExecutorHook.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-core/src/main/scala/org/apache/linkis/engineconn/core/hook/ExecutorHook.scala
similarity index 58%
copy from linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/ComputationExecutorHook.scala
copy to linkis-computation-governance/linkis-engineconn/linkis-engineconn-core/src/main/scala/org/apache/linkis/engineconn/core/hook/ExecutorHook.scala
index cae3289..f87d64e 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-computation-engineconn/src/main/scala/org/apache/linkis/engineconn/computation/executor/hook/ComputationExecutorHook.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-core/src/main/scala/org/apache/linkis/engineconn/core/hook/ExecutorHook.scala
@@ -5,47 +5,55 @@
* 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.linkis.engineconn.computation.executor.hook
+
+package org.apache.linkis.engineconn.core.hook
import org.apache.linkis.common.utils.{ClassUtils, Logging, Utils}
-import org.apache.linkis.engineconn.common.creation.EngineCreationContext
-import org.apache.linkis.engineconn.computation.executor.execute.EngineExecutionContext
+import org.apache.linkis.engineconn.executor.entity.Executor
import scala.collection.JavaConverters.asScalaSetConverter
import scala.collection.mutable.ArrayBuffer
-
-trait ComputationExecutorHook {
+trait ExecutorHook extends Logging {
def getOrder(): Int = 1
- def getHookName(): String
+ def getHookName(): String = getClass.getName
+
+ def isAccepted(codeType: String): Boolean
- def beforeExecutorExecute(engineExecutionContext: EngineExecutionContext, engineCreationContext: EngineCreationContext, codeBeforeHook: String): String = codeBeforeHook
+ /*
+ Will be called before executor inited, and only be called once.
+ */
+ def beforeExecutorInit(executor: Executor): Unit = {}
+
+ /*
+ Will be called after executor inited, and only be called once.
+ */
+ def afterExecutorInit(executor: Executor): Unit = {}
}
-object ComputationExecutorHook extends Logging {
+object ExecutorHook extends Logging {
- private lazy val computationExecutorHooks: Array[ComputationExecutorHook] = initComputationExecutorHook
+ private lazy val executorHooks: Array[ExecutorHook] = initExecutorHooks
- private def initComputationExecutorHook: Array[ComputationExecutorHook] = {
- val hooks = new ArrayBuffer[ComputationExecutorHook]
+ private def initExecutorHooks(): Array[ExecutorHook] = {
+ val hooks = new ArrayBuffer[ExecutorHook]
Utils.tryCatch {
val reflections = ClassUtils.reflections
- val allSubClass = reflections.getSubTypesOf(classOf[ComputationExecutorHook])
+ val allSubClass = reflections.getSubTypesOf(classOf[ExecutorHook])
allSubClass.asScala.filter(!ClassUtils.isInterfaceOrAbstract(_)).foreach(l => {
- hooks += l.newInstance
+ hooks += l.newInstance()
})
} {
t: Throwable =>
@@ -54,5 +62,6 @@ object ComputationExecutorHook extends Logging {
hooks.sortWith((a, b) => a.getOrder() <= b.getOrder()).toArray
}
- def getComputationExecutorHooks = computationExecutorHooks
-}
\ No newline at end of file
+ def getAllExecutorHooks(): Array[ExecutorHook] = executorHooks
+
+}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-launch/src/main/scala/org/apache/linkis/engineconn/launch/EngineConnServer.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-core/src/main/scala/org/apache/linkis/engineconn/launch/EngineConnServer.scala
similarity index 90%
rename from linkis-computation-governance/linkis-engineconn/linkis-engineconn-launch/src/main/scala/org/apache/linkis/engineconn/launch/EngineConnServer.scala
rename to linkis-computation-governance/linkis-engineconn/linkis-engineconn-core/src/main/scala/org/apache/linkis/engineconn/launch/EngineConnServer.scala
index fd256e3..108adb1 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-launch/src/main/scala/org/apache/linkis/engineconn/launch/EngineConnServer.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-core/src/main/scala/org/apache/linkis/engineconn/launch/EngineConnServer.scala
@@ -5,18 +5,19 @@
* 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.linkis.engineconn.launch
+import org.apache.commons.lang.exception.ExceptionUtils
import org.apache.linkis.common.ServiceInstance
import org.apache.linkis.common.conf.{CommonVars, Configuration}
import org.apache.linkis.common.utils.{Logging, Utils}
@@ -34,12 +35,10 @@ import org.apache.linkis.governance.common.utils.EngineConnArgumentsParser
import org.apache.linkis.manager.engineplugin.common.launch.process.Environment
import org.apache.linkis.manager.label.builder.factory.{LabelBuilderFactory, LabelBuilderFactoryContext}
import org.apache.linkis.manager.label.entity.Label
-import org.apache.commons.lang.exception.ExceptionUtils
import scala.collection.JavaConversions._
import scala.collection.mutable.ArrayBuffer
-
object EngineConnServer extends Logging {
@@ -51,23 +50,23 @@ object EngineConnServer extends Logging {
info("<<---------------------EngineConnServer Start --------------------->>")
try {
- // 1. 封装EngineCreationContext
+ // 1. build EngineCreationContext
init(args)
val isTestMode = Configuration.IS_TEST_MODE.getValue(engineCreationContext.getOptions)
- if(isTestMode) {
+ if (isTestMode) {
info(s"Step into test mode, pause 30s if debug is required. If you want to disable test mode, please set ${Configuration.IS_TEST_MODE.key} = false.")
Utils.sleepQuietly(30000)
}
info("Finished to create EngineCreationContext, EngineCreationContext content: " + EngineConnUtils.GSON.toJson(engineCreationContext))
EngineConnHook.getEngineConnHooks.foreach(_.beforeCreateEngineConn(getEngineCreationContext))
info("Finished to execute hook of beforeCreateEngineConn.")
- //2. 创建EngineConn
+ //2. cresate EngineConn
val engineConn = getEngineConnManager.createEngineConn(getEngineCreationContext)
info(s"Finished to create ${engineConn.getEngineConnType}EngineConn.")
EngineConnHook.getEngineConnHooks.foreach(_.beforeExecutionExecute(getEngineCreationContext, engineConn))
info("Finished to execute all hooks of beforeExecutionExecute.")
- //3. 注册的executions 执行
- Utils.tryThrow(executeEngineConn(engineConn)){ t =>
+ //3. register executions
+ Utils.tryThrow(executeEngineConn(engineConn)) { t =>
error(s"Init executors error. Reason: ${ExceptionUtils.getRootCauseMessage(t)}", t)
throw new EngineConnExecutorErrorException(EngineConnExecutorErrorCode.INIT_EXECUTOR_FAILED, "Init executors failed. ", t)
}
@@ -77,22 +76,19 @@ object EngineConnServer extends Logging {
info("Finished to execute hook of afterExecutionExecute")
EngineConnHook.getEngineConnHooks.foreach(_.afterEngineServerStartSuccess(getEngineCreationContext, engineConn))
} catch {
- case t: Throwable =>
- error("EngineConnServer Start Failed", t)
- EngineConnHook.getEngineConnHooks.foreach(_.afterEngineServerStartFailed(getEngineCreationContext, t))
- System.exit(1)
+ case t: Throwable =>
+ error("EngineConnServer Start Failed.", t)
+ EngineConnHook.getEngineConnHooks.foreach(_.afterEngineServerStartFailed(getEngineCreationContext, t))
+ System.exit(1)
}
- //4. 等待Executions执行完毕
+ //4. wait Executions execute
ShutdownHook.getShutdownHook.waitForStopOrError()
info("<<---------------------EngineConnServer Exit --------------------->>")
System.exit(ShutdownHook.getShutdownHook.getExitCode())
}
- /**
- *
- * @param args main函数入参
- */
+
private def init(args: Array[String]): Unit = {
val arguments = EngineConnArgumentsParser.getEngineConnArgumentsParser.parseToObj(args)
val engineConf = arguments.getEngineConnConfMap
@@ -118,14 +114,15 @@ object EngineConnServer extends Logging {
}
private def executeEngineConn(engineConn: EngineConn): Unit = {
- EngineConnExecution.getEngineConnExecutions.foreach{
+ EngineConnExecution.getEngineConnExecutions.foreach {
case execution: AbstractEngineConnExecution =>
info(s"Ready to execute ${execution.getClass.getSimpleName}.")
execution.execute(getEngineCreationContext, engineConn)
- if(execution.returnAfterMeExecuted(getEngineCreationContext, engineConn)) return
+ if (execution.returnAfterMeExecuted(getEngineCreationContext, engineConn)) return
case execution =>
info(s"Ready to execute ${execution.getClass.getSimpleName}.")
- execution.execute(getEngineCreationContext, engineConn)}
+ execution.execute(getEngineCreationContext, engineConn)
+ }
}
def getEngineCreationContext: EngineCreationContext = this.engineCreationContext
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/pom.xml b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/pom.xml
index f03333f..c69c54a 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/pom.xml
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/pom.xml
@@ -38,18 +38,18 @@
<dependency>
<groupId>org.apache.linkis</groupId>
- <artifactId>linkis-engineconn-launch</artifactId>
+ <artifactId>linkis-engineconn-core</artifactId>
<version>${linkis.version}</version>
</dependency>
- <!--<dependency>
+ <dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-scheduler</artifactId>
<version>${linkis.version}</version>
- </dependency>-->
+ </dependency>
<dependency>
<groupId>org.apache.linkis</groupId>
- <artifactId>linkis-message-scheduler</artifactId>
+ <artifactId>linkis-rpc</artifactId>
<version>${linkis.version}</version>
<exclusions>
<exclusion>
@@ -57,7 +57,9 @@
<groupId>org.reflections</groupId>
</exclusion>
</exclusions>
+ <scope>provided</scope>
</dependency>
+
</dependencies>
<build>
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/conf/AccessibleExecutorConfiguration.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/conf/AccessibleExecutorConfiguration.scala
index feed3d1..4bea680 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/conf/AccessibleExecutorConfiguration.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/conf/AccessibleExecutorConfiguration.scala
@@ -32,7 +32,7 @@ object AccessibleExecutorConfiguration {
val ENGINECONN_LOG_SEND_TIME_INTERVAL = CommonVars("wds.linkis.engineconn.log.send.time.interval", 200)
- val ENGINECONN_LOG_SEND_SIZE = CommonVars[Int]("wds.linkis.engineconn.log.send.cache.size", 5)
+ val ENGINECONN_LOG_SEND_SIZE = CommonVars[Int]("wds.linkis.engineconn.log.send.cache.size", 300)
val ENGINECONN_MAX_FREE_TIME = CommonVars("wds.linkis.engineconn.max.free.time", new TimeType("0.5h"))
@@ -43,6 +43,11 @@ object AccessibleExecutorConfiguration {
val ENGINECONN_SUPPORT_PARALLELISM = CommonVars("wds.linkis.engineconn.support.parallelism", false)
- val ENGINECONN_HEARTBEAT_TIME = CommonVars("wds.linkis.engineconn.heartbeat.time", new TimeType("3m"))
+ val ENGINECONN_HEARTBEAT_TIME = CommonVars("wds.linkis.engineconn.heartbeat.time", new TimeType("2m"))
+
+
+ val ENABLE_MAINTAIN = CommonVars("wds.linkis.engineconn.maintain.enable", false)
+
+ val ENABLE_MAINTAIN_CREATORS = CommonVars("wds.linkis.engineconn.maintain.cretors", "IDE")
}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/execution/AccessibleEngineConnExecution.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/execution/AccessibleEngineConnExecution.scala
index 63a303e..057088c 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/execution/AccessibleEngineConnExecution.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/execution/AccessibleEngineConnExecution.scala
@@ -18,7 +18,6 @@
package org.apache.linkis.engineconn.acessible.executor.execution
import java.util.concurrent.TimeUnit
-
import org.apache.linkis.common.utils.{Logging, Utils}
import org.apache.linkis.engineconn.acessible.executor.conf.AccessibleExecutorConfiguration
import org.apache.linkis.engineconn.acessible.executor.entity.AccessibleExecutor
@@ -32,10 +31,11 @@ import org.apache.linkis.engineconn.executor.entity.{Executor, LabelExecutor, Re
import org.apache.linkis.engineconn.executor.listener.ExecutorListenerBusContext
import org.apache.linkis.engineconn.executor.service.ManagerService
import org.apache.linkis.manager.common.entity.enumeration.NodeStatus
-import org.apache.linkis.manager.common.protocol.engine.EngineConnReleaseRequest
+import org.apache.linkis.manager.common.protocol.engine.{ECCanKillRequest, EngineConnReleaseRequest}
import org.apache.linkis.manager.common.protocol.resource.ResourceUsedProtocol
import org.apache.linkis.rpc.Sender
import org.apache.commons.lang.exception.ExceptionUtils
+import org.apache.linkis.manager.label.utils.LabelUtil
class AccessibleEngineConnExecution extends EngineConnExecution with Logging {
@@ -74,37 +74,32 @@ class AccessibleEngineConnExecution extends EngineConnExecution with Logging {
val maxFreeTimeVar = AccessibleExecutorConfiguration.ENGINECONN_MAX_FREE_TIME.getValue(context.getOptions)
val maxFreeTimeStr = maxFreeTimeVar.toString
val maxFreeTime = maxFreeTimeVar.toLong
- info("executorStatusChecker created, maxFreeTimeMills is " + maxFreeTime)
+ logger.info("executorStatusChecker created, maxFreeTimeMills is " + maxFreeTime)
Utils.defaultScheduler.scheduleAtFixedRate(new Runnable {
override def run(): Unit = Utils.tryAndWarn {
val accessibleExecutor = ExecutorManager.getInstance.getReportExecutor match {
case executor: AccessibleExecutor => executor
case executor: Executor =>
- warn(s"Executor(${executor.getId}) is not a AccessibleExecutor, do noting when reached max free time .")
+ logger.warn(s"Executor(${executor.getId}) is not a AccessibleExecutor, do noting when reached max free time .")
return
}
if (NodeStatus.isCompleted(accessibleExecutor.getStatus)) {
error(s"${accessibleExecutor.getId} has completed with status ${accessibleExecutor.getStatus}, now stop it.")
ShutdownHook.getShutdownHook.notifyStop()
} else if (accessibleExecutor.getStatus == NodeStatus.ShuttingDown) {
- warn(s"${accessibleExecutor.getId} is ShuttingDown...")
+ logger.warn(s"${accessibleExecutor.getId} is ShuttingDown...")
ShutdownHook.getShutdownHook.notifyStop()
- } else if (maxFreeTime > 0 && (NodeStatus.Unlock.equals(accessibleExecutor.getStatus) || NodeStatus.Idle.equals(accessibleExecutor.getStatus) )
+ } else if (maxFreeTime > 0 && (NodeStatus.Unlock.equals(accessibleExecutor.getStatus) || NodeStatus.Idle.equals(accessibleExecutor.getStatus))
&& System.currentTimeMillis - accessibleExecutor.getLastActivityTime > maxFreeTime) {
- warn(s"${accessibleExecutor.getId} has not been used for $maxFreeTimeStr, now try to shutdown it.")
- ShutdownHook.getShutdownHook.notifyStop()
- requestManagerReleaseExecutor(" idle release")
- Utils.defaultScheduler.scheduleWithFixedDelay(new Runnable {
- override def run(): Unit = {
- Utils.tryCatch {
- warn(s"Now exit with code ${ShutdownHook.getShutdownHook.getExitCode()}")
- System.exit(ShutdownHook.getShutdownHook.getExitCode())
- } { t =>
- error(s"Exit error : ${ExceptionUtils.getRootCauseMessage(t)}.", t)
- System.exit(-1)
- }
- }
- }, 3000,1000*10, TimeUnit.MILLISECONDS)
+ if (ifECCanMaintain()) {
+ logger.info("ec will not be killed at this time")
+ accessibleExecutor.updateLastActivityTime()
+ } else {
+ logger.warn(s"${accessibleExecutor.getId} has not been used for $maxFreeTimeStr, now try to shutdown it.")
+ requestManagerReleaseExecutor(" idle release")
+ ShutdownHook.getShutdownHook.notifyStop()
+ }
+
}
}
}, 3 * 60 * 1000, AccessibleExecutorConfiguration.ENGINECONN_HEARTBEAT_TIME.getValue.toLong, TimeUnit.MILLISECONDS)
@@ -115,6 +110,37 @@ class AccessibleEngineConnExecution extends EngineConnExecution with Logging {
ManagerService.getManagerService.requestReleaseEngineConn(engineReleaseRequest)
}
+ private def isMaintainSupported(): Boolean = {
+ if (! AccessibleExecutorConfiguration.ENABLE_MAINTAIN.getValue) return false
+ val userCreator = LabelUtil.getUserCreatorLabel(EngineConnObject.getEngineCreationContext.getLabels())
+ if (null != userCreator && AccessibleExecutorConfiguration.ENABLE_MAINTAIN_CREATORS.getValue.contains(userCreator.getCreator)) {
+ logger.info(s"${userCreator.getStringValue} maintain enabled")
+ true
+ } else {
+ false
+ }
+ }
+
+ private def ifECCanMaintain(): Boolean = {
+ if (! isMaintainSupported()) return false
+ val engineTypeLabel = LabelUtil.getEngineTypeLabel(EngineConnObject.getEngineCreationContext.getLabels())
+ val userCreator = LabelUtil.getUserCreatorLabel(EngineConnObject.getEngineCreationContext.getLabels())
+ if (null == engineTypeLabel) return false
+ val ecCanKillRequest = new ECCanKillRequest
+ ecCanKillRequest.setEngineConnInstance(Sender.getThisServiceInstance)
+ ecCanKillRequest.setUser(userCreator.getUser)
+ ecCanKillRequest.setUserCreatorLabel(userCreator)
+ ecCanKillRequest.setEngineTypeLabel(engineTypeLabel)
+ Utils.tryCatch{
+ val response = ManagerService.getManagerService.ecCanKillRequest(ecCanKillRequest)
+ logger.info(s"From manager get $response")
+ ! response.getFlag
+ } { throwable: Throwable =>
+ logger.warn("Failed to ecCanKillRequestManager, will be default exit", throwable)
+ false
+ }
+ }
+
protected def reportUsedResource(executor: Executor, engineCreationContext: EngineCreationContext): Unit = executor match {
case resourceExecutor: ResourceExecutor =>
ManagerService.getManagerService
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/listener/event/TaskEvent.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/listener/event/TaskEvent.scala
index 6be4815..f73203a 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/listener/event/TaskEvent.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/listener/event/TaskEvent.scala
@@ -33,4 +33,6 @@ case class TaskStatusChangedEvent(taskId: String, fromStatus: ExecutionNodeStatu
case class TaskResultCreateEvent(taskId: String, resStr: String, alias: String) extends TaskEvent
-case class TaskResultSizeCreatedEvent(taskId: String, resultSize: Int) extends TaskEvent
\ No newline at end of file
+case class TaskResultSizeCreatedEvent(taskId: String, resultSize: Int) extends TaskEvent
+
+case class TaskResponseErrorEvent(taskId: String, errorMsg: String) extends TaskEvent
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/AccessibleService.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/AccessibleService.scala
index 64b6da5..71beaf4 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/AccessibleService.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/AccessibleService.scala
@@ -20,7 +20,7 @@ package org.apache.linkis.engineconn.acessible.executor.service
import org.apache.linkis.engineconn.acessible.executor.listener.ExecutorStatusListener
import org.apache.linkis.manager.common.protocol.engine.EngineSuicideRequest
import org.apache.linkis.manager.common.protocol.node.{RequestNodeStatus, ResponseNodeStatus}
-import org.apache.linkis.message.builder.ServiceMethodContext
+import org.apache.linkis.rpc.Sender
trait AccessibleService extends ExecutorStatusListener {
@@ -30,7 +30,7 @@ trait AccessibleService extends ExecutorStatusListener {
def reStartExecutor: Boolean
- def dealEngineStopRequest(engineSuicideRequest: EngineSuicideRequest, smc: ServiceMethodContext): Unit
+ def dealEngineStopRequest(engineSuicideRequest: EngineSuicideRequest, sender: Sender): Unit
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultAccessibleService.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultAccessibleService.scala
index 993cb9f..600e0d2 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultAccessibleService.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultAccessibleService.scala
@@ -30,15 +30,14 @@ import org.apache.linkis.engineconn.executor.service.ManagerService
import org.apache.linkis.manager.common.entity.enumeration.NodeStatus
import org.apache.linkis.manager.common.protocol.engine.{EngineConnReleaseRequest, EngineSuicideRequest}
import org.apache.linkis.manager.common.protocol.node.{RequestNodeStatus, ResponseNodeStatus}
-import org.apache.linkis.message.annotation.Receiver
-import org.apache.linkis.message.builder.ServiceMethodContext
import org.apache.linkis.rpc.Sender
-
-import javax.annotation.PostConstruct
+import org.apache.linkis.rpc.serializer.annotation.Receiver
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.event.{ContextClosedEvent, EventListener}
import org.springframework.stereotype.Service
+import javax.annotation.PostConstruct
+
@Service
class DefaultAccessibleService extends AccessibleService with Logging {
@@ -48,8 +47,10 @@ class DefaultAccessibleService extends AccessibleService with Logging {
private val asyncListenerBusContext = ExecutorListenerBusContext.getExecutorListenerBusContext().getEngineConnAsyncListenerBus
+ private var shutDownHooked: Boolean = false
+
@Receiver
- override def dealEngineStopRequest(engineSuicideRequest: EngineSuicideRequest, smc: ServiceMethodContext): Unit = {
+ override def dealEngineStopRequest(engineSuicideRequest: EngineSuicideRequest, sender: Sender): Unit = {
// todo check user
if (DataWorkCloudApplication.getServiceInstance.equals(engineSuicideRequest.getServiceInstance)) {
stopEngine()
@@ -64,6 +65,7 @@ class DefaultAccessibleService extends AccessibleService with Logging {
}
}
+
@EventListener
def executorShutDownHook(event: ContextClosedEvent): Unit = {
info("executorShutDownHook start to execute.")
@@ -71,13 +73,16 @@ class DefaultAccessibleService extends AccessibleService with Logging {
warn("EngineConn not ready, do not shutdown")
return
}
+ if (shutDownHooked) {
+ warn("had stop, do not shutdown")
+ return
+ }
var executor: Executor = ExecutorManager.getInstance.getReportExecutor
- if (null != executor){
+ if (null != executor) {
Utils.tryAndWarn{
executor.tryShutdown()
}
warn(s"Engine : ${Sender.getThisInstance} with state has stopped successfully.")
-
} else {
executor = SensibleExecutor.getDefaultErrorSensibleExecutor
}
@@ -87,13 +92,16 @@ class DefaultAccessibleService extends AccessibleService with Logging {
}
executorHeartbeatService.reportHeartBeatMsg(executor)
info("Reported status shuttingDown to manager.")
- Thread.sleep(2000)
+ Utils.tryQuietly(Thread.sleep(2000))
+ shutDownHooked = true
+ ShutdownHook.getShutdownHook.notifyStop()
}
override def stopExecutor: Unit = {
// todo
}
+
override def pauseExecutor: Unit = {
}
@@ -114,9 +122,7 @@ class DefaultAccessibleService extends AccessibleService with Logging {
}
}
- /**
- * service 需要加定时任务判断Executor是否空闲很久,然后调用该方法进行释放
- */
+
override def requestManagerReleaseExecutor(msg: String): Unit = {
val engineReleaseRequest = new EngineConnReleaseRequest(Sender.getThisServiceInstance, Utils.getJvmUser, msg, EngineConnObject.getEngineCreationContext.getTicketId)
@@ -127,10 +133,10 @@ class DefaultAccessibleService extends AccessibleService with Logging {
override def dealRequestNodeStatus(requestNodeStatus: RequestNodeStatus): ResponseNodeStatus = {
val status = if (EngineConnObject.isReady) {
ExecutorManager.getInstance.getReportExecutor match {
- case executor: SensibleExecutor =>
- executor.getStatus
- case _ => NodeStatus.Starting
- }
+ case executor: SensibleExecutor =>
+ executor.getStatus
+ case _ => NodeStatus.Starting
+ }
} else {
NodeStatus.Starting
}
@@ -162,4 +168,3 @@ class DefaultAccessibleService extends AccessibleService with Logging {
}
}
-
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultExecutorHeartbeatService.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultExecutorHeartbeatService.scala
index ade5afc..6b4205b 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultExecutorHeartbeatService.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultExecutorHeartbeatService.scala
@@ -31,7 +31,7 @@ import org.apache.linkis.engineconn.executor.listener.ExecutorListenerBusContext
import org.apache.linkis.engineconn.executor.service.ManagerService
import org.apache.linkis.manager.common.entity.enumeration.NodeStatus
import org.apache.linkis.manager.common.protocol.node.{NodeHeartbeatMsg, NodeHeartbeatRequest}
-import org.apache.linkis.message.annotation.Receiver
+import org.apache.linkis.rpc.serializer.annotation.Receiver
import org.apache.linkis.rpc.Sender
import javax.annotation.PostConstruct
import org.springframework.beans.factory.annotation.Autowired
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultManagerService.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultManagerService.scala
index 3039cd0..3e280d0 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultManagerService.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultManagerService.scala
@@ -18,12 +18,11 @@
package org.apache.linkis.engineconn.acessible.executor.service
import java.util
-
import org.apache.linkis.common.utils.Logging
import org.apache.linkis.engineconn.executor.service.ManagerService
import org.apache.linkis.governance.common.conf.GovernanceCommonConf
import org.apache.linkis.manager.common.entity.enumeration.NodeStatus
-import org.apache.linkis.manager.common.protocol.engine.EngineConnReleaseRequest
+import org.apache.linkis.manager.common.protocol.engine.{ECCanKillRequest, ECCanKillResponse, EngineConnReleaseRequest}
import org.apache.linkis.manager.common.protocol.label.LabelReportRequest
import org.apache.linkis.manager.common.protocol.node.{NodeHeartbeatMsg, ResponseNodeStatus}
import org.apache.linkis.manager.common.protocol.resource.ResourceUsedProtocol
@@ -79,4 +78,10 @@ class DefaultManagerService extends ManagerService with Logging{
getManagerSender.send(resourceUsedProtocol)
}
+ override def ecCanKillRequest(ecCanKillRequest: ECCanKillRequest): ECCanKillResponse = {
+ getManagerSender.ask(ecCanKillRequest) match {
+ case ecCanKillResponse: ECCanKillResponse => ecCanKillResponse
+ case _ => new ECCanKillResponse()
+ }
+ }
}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultOperateService.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultOperateService.scala
index 35e723c..2537b04 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultOperateService.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/DefaultOperateService.scala
@@ -20,7 +20,7 @@ import org.apache.commons.lang.exception.ExceptionUtils
import org.apache.linkis.common.utils.{Logging, Utils}
import org.apache.linkis.manager.common.operator.OperatorFactory
import org.apache.linkis.manager.common.protocol.engine.{EngineOperateRequest, EngineOperateResponse}
-import org.apache.linkis.message.annotation.Receiver
+import org.apache.linkis.rpc.serializer.annotation.Receiver
import org.springframework.stereotype.Service
import scala.collection.JavaConverters.mapAsScalaMapConverter
@@ -31,7 +31,7 @@ class DefaultOperateService extends OperateService with Logging {
@Receiver
override def executeOperation(engineOperateRequest: EngineOperateRequest): EngineOperateResponse = {
val parameters = engineOperateRequest.parameters.asScala.toMap
- val operator = Utils.tryCatch(OperatorFactory().getOperatorRequest(parameters)){ t =>
+ val operator = Utils.tryCatch(OperatorFactory().getOperatorRequest(parameters)) { t =>
error(s"Get operator failed, parameters is ${engineOperateRequest.parameters}.", t)
return EngineOperateResponse(Map.empty, true, ExceptionUtils.getRootCauseMessage(t))
}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/EngineConnTimedLockService.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/EngineConnTimedLockService.scala
index 5d13cbc..02d5b3a 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/EngineConnTimedLockService.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/accessible-executor/src/main/scala/org/apache/linkis/engineconn/acessible/executor/service/EngineConnTimedLockService.scala
@@ -28,7 +28,7 @@ import org.apache.linkis.governance.common.exception.engineconn.{EngineConnExecu
import org.apache.linkis.manager.common.entity.enumeration.NodeStatus
import org.apache.linkis.manager.common.protocol.engine.EngineLockType
import org.apache.linkis.manager.common.protocol.{RequestEngineLock, RequestEngineUnlock, ResponseEngineLock, ResponseEngineUnlock}
-import org.apache.linkis.message.annotation.Receiver
+import org.apache.linkis.rpc.serializer.annotation.Receiver
import org.apache.linkis.server.BDPJettyServerHelper
import org.apache.commons.lang.StringUtils
@@ -109,7 +109,7 @@ class EngineConnTimedLockService extends LockService with Logging {
})
} else {
error("No valid executors while adding lock.")
- accessibleExecutor.transition(NodeStatus.Idle)
+ accessibleExecutor.transition(NodeStatus.Idle)
}
ExecutorListenerBusContext.getExecutorListenerBusContext().getEngineConnAsyncListenerBus.post(ExecutorLockEvent(accessibleExecutor, lockString))
Some(lockString)
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/callback-service/pom.xml b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/callback-service/pom.xml
index 5c42d53..ef9c4f6 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/callback-service/pom.xml
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/callback-service/pom.xml
@@ -37,8 +37,9 @@
<dependency>
<groupId>org.apache.linkis</groupId>
- <artifactId>linkis-message-scheduler</artifactId>
+ <artifactId>linkis-rpc</artifactId>
<version>${linkis.version}</version>
+ <scope>provided</scope>
</dependency>
<dependency>
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/callback-service/src/main/scala/org/apache/linkis/engineconn/callback/service/EngineConnCallback.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/callback-service/src/main/scala/org/apache/linkis/engineconn/callback/service/EngineConnCallback.scala
index d07e6ba..6cfd255 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/callback-service/src/main/scala/org/apache/linkis/engineconn/callback/service/EngineConnCallback.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/callback-service/src/main/scala/org/apache/linkis/engineconn/callback/service/EngineConnCallback.scala
@@ -42,13 +42,13 @@ abstract class AbstractEngineConnStartUpCallback(emInstance: ServiceInstance) ex
def callback(protocol: RequestProtocol): Unit = {
protocol match {
case protocol: EngineConnStatusCallback => {
- if(protocol.status.equals(NodeStatus.Failed)){
- error(s"protocol will send to em: ${protocol}")
- }else{
- info(s"protocol will send to em: ${protocol}")
+ if (protocol.status.equals(NodeStatus.Failed)) {
+ logger.error(s"protocol will send to em: ${protocol}")
+ } else {
+ logger.info(s"protocol will send to em: ${protocol}")
}
}
- case _=>
+ case _ =>
}
getEMSender.send(protocol)
}
diff --git a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/exception/ECMErrorCode.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/executor-core/src/main/scala/org/apache/linkis/engineconn/executor/entity/ResourceFetchExecutor.scala
similarity index 77%
copy from linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/exception/ECMErrorCode.scala
copy to linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/executor-core/src/main/scala/org/apache/linkis/engineconn/executor/entity/ResourceFetchExecutor.scala
index 8302e45..41641ad 100644
--- a/linkis-computation-governance/linkis-engineconn-manager/linkis-engineconn-manager-server/src/main/scala/org/apache/linkis/ecm/server/exception/ECMErrorCode.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/executor-core/src/main/scala/org/apache/linkis/engineconn/executor/entity/ResourceFetchExecutor.scala
@@ -15,16 +15,14 @@
* limitations under the License.
*/
-package org.apache.linkis.ecm.server.exception
+package org.apache.linkis.engineconn.executor.entity
-object ECMErrorCode {
+import org.apache.linkis.manager.common.protocol.resource.ResourceWithStatus
- val EC_START_TIME_OUT = 11100
+import java.util
- val EC_INTERRUPT_TIME_OUT = 11101
+trait ResourceFetchExecutor {
- val EC_START_FAILED = 11102
-
- val EC_FETCH_LOG_FAILED = 11110
+ def FetchResource: util.HashMap[String, ResourceWithStatus]
}
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/executor-core/src/main/scala/org/apache/linkis/engineconn/executor/service/ManagerService.scala b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/executor-core/src/main/scala/org/apache/linkis/engineconn/executor/service/ManagerService.scala
index 00b1563..e0312ef 100644
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/executor-core/src/main/scala/org/apache/linkis/engineconn/executor/service/ManagerService.scala
+++ b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-executor/executor-core/src/main/scala/org/apache/linkis/engineconn/executor/service/ManagerService.scala
@@ -20,7 +20,7 @@ package org.apache.linkis.engineconn.executor.service
import org.apache.linkis.common.utils.Utils
import org.apache.linkis.engineconn.executor.conf.EngineConnExecutorConfiguration
import org.apache.linkis.manager.common.entity.enumeration.NodeStatus
-import org.apache.linkis.manager.common.protocol.engine.EngineConnReleaseRequest
+import org.apache.linkis.manager.common.protocol.engine.{ECCanKillRequest, ECCanKillResponse, EngineConnReleaseRequest}
import org.apache.linkis.manager.common.protocol.node.NodeHeartbeatMsg
import org.apache.linkis.manager.common.protocol.resource.ResourceUsedProtocol
import org.apache.linkis.manager.label.entity.Label
@@ -37,6 +37,8 @@ trait ManagerService {
def reportUsedResource(resourceUsedProtocol: ResourceUsedProtocol): Unit
+ def ecCanKillRequest(ecCanKillRequest: ECCanKillRequest): ECCanKillResponse
+
}
object ManagerService {
diff --git a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-launch/pom.xml b/linkis-computation-governance/linkis-engineconn/linkis-engineconn-launch/pom.xml
deleted file mode 100644
index 5447138..0000000
--- a/linkis-computation-governance/linkis-engineconn/linkis-engineconn-launch/pom.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ 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.
- -->
-
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://maven.apache.org/POM/4.0.0"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <artifactId>linkis</artifactId>
- <groupId>org.apache.linkis</groupId>
- <version>1.0.3</version>
- <relativePath>../../../pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
-
- <artifactId>linkis-engineconn-launch</artifactId>
-
- <dependencies>
-
- <dependency>
- <groupId>org.apache.linkis</groupId>
- <artifactId>linkis-engineconn-core</artifactId>
- <version>${linkis.version}</version>
- </dependency>
-
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-deploy-plugin</artifactId>
- </plugin>
-
- <plugin>
- <groupId>net.alchim31.maven</groupId>
- <artifactId>scala-maven-plugin</artifactId>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <configuration>
- <!--<excludes>-->
- <!--<exclude>**/*.yml</exclude>-->
- <!--<exclude>**/*.properties</exclude>-->
- <!--<exclude>**/*.sh</exclude>-->
- <!--</excludes>-->
- </configuration>
- </plugin>
- </plugins>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- </resource>
- </resources>
- <finalName>${project.artifactId}-${project.version}</finalName>
- </build>
-
-</project>
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-engineconn/pom.xml b/linkis-computation-governance/linkis-engineconn/pom.xml
index e2ba47a..b6fa1e7 100644
--- a/linkis-computation-governance/linkis-engineconn/pom.xml
+++ b/linkis-computation-governance/linkis-engineconn/pom.xml
@@ -32,7 +32,6 @@
<module>linkis-engineconn-common</module>
<module>linkis-engineconn-core</module>
<module>linkis-engineconn-executor/executor-core</module>
- <module>linkis-engineconn-launch</module>
<module>linkis-engineconn-executor/accessible-executor</module>
<module>linkis-engineconn-executor/resource-executor</module>
<module>linkis-engineconn-executor/callback-service</module>
diff --git a/linkis-computation-governance/linkis-entrance-client/pom.xml b/linkis-computation-governance/linkis-entrance-client/pom.xml
deleted file mode 100644
index 54aa4a4..0000000
--- a/linkis-computation-governance/linkis-entrance-client/pom.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ 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.
- -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <artifactId>linkis</artifactId>
- <groupId>org.apache.linkis</groupId>
- <version>1.0.3</version>
- </parent>
-
- <artifactId>linkis-entrance-client</artifactId>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.linkis</groupId>
- <artifactId>linkis-entrance</artifactId>
- <version>${linkis.version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.apache.linkis</groupId>
- <artifactId>linkis-io-entrance</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.linkis</groupId>
- <artifactId>linkis-rpc</artifactId>
- <version>${linkis.version}</version>
- <scope>provided</scope>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-deploy-plugin</artifactId>
- </plugin>
-
- <plugin>
- <groupId>net.alchim31.maven</groupId>
- <artifactId>scala-maven-plugin</artifactId>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- </plugin>
- </plugins>
- <resources>
- <resource>
- <directory>${basedir}/src/main/resources</directory>
- </resource>
- </resources>
- <finalName>${project.artifactId}-${project.version}</finalName>
- </build>
-
-
-</project>
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientEngineBuilderBeanAnnotation.java b/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientEngineBuilderBeanAnnotation.java
deleted file mode 100644
index 276b4b0..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientEngineBuilderBeanAnnotation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.linkis.entranceclient.annotation;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.annotation.AliasFor;
-import org.springframework.stereotype.Component;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Bean(value = ClientEngineBuilderBeanAnnotation.BEAN_NAME)
-@Component(value = ClientEngineBuilderBeanAnnotation.BEAN_NAME)
-public @interface ClientEngineBuilderBeanAnnotation {
- String BEAN_NAME = "clientEngineBuilder";
- @AliasFor(annotation = Component.class)
- String value() default BEAN_NAME;
-
- @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
- @Retention(RetentionPolicy.RUNTIME)
- @Qualifier(BEAN_NAME)
- @Autowired
- @interface ClientEngineBuilderAutowiredAnnotation {
- @AliasFor(annotation = Qualifier.class)
- String value() default BEAN_NAME;
- @AliasFor(annotation = Autowired.class)
- boolean required() default true;
- }
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientEngineRequesterBeanAnnotation.java b/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientEngineRequesterBeanAnnotation.java
deleted file mode 100644
index 789ed22..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientEngineRequesterBeanAnnotation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.linkis.entranceclient.annotation;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.annotation.AliasFor;
-import org.springframework.stereotype.Component;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Bean(value = ClientEngineRequesterBeanAnnotation.BEAN_NAME)
-@Component(value = ClientEngineRequesterBeanAnnotation.BEAN_NAME)
-public @interface ClientEngineRequesterBeanAnnotation {
- String BEAN_NAME = "clientEngineRequester";
- @AliasFor(annotation = Component.class)
- String value() default BEAN_NAME;
-
- @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
- @Retention(RetentionPolicy.RUNTIME)
- @Qualifier(BEAN_NAME)
- @Autowired
- @interface ClientEngineRequesterAutowiredAnnotation {
- @AliasFor(annotation = Qualifier.class)
- String value() default BEAN_NAME;
- @AliasFor(annotation = Autowired.class)
- boolean required() default true;
- }
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientEngineSelectorBeanAnnotation.java b/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientEngineSelectorBeanAnnotation.java
deleted file mode 100644
index 97460a5..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientEngineSelectorBeanAnnotation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.linkis.entranceclient.annotation;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.annotation.AliasFor;
-import org.springframework.stereotype.Component;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Bean(value = ClientEngineSelectorBeanAnnotation.BEAN_NAME)
-@Component(value = ClientEngineSelectorBeanAnnotation.BEAN_NAME)
-public @interface ClientEngineSelectorBeanAnnotation {
- String BEAN_NAME = "clientEngineSelector";
- @AliasFor(annotation = Component.class)
- String value() default BEAN_NAME;
-
- @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
- @Retention(RetentionPolicy.RUNTIME)
- @Qualifier(BEAN_NAME)
- @Autowired
- @interface ClientEngineSelectorAutowiredAnnotation {
- @AliasFor(annotation = Qualifier.class)
- String value() default BEAN_NAME;
- @AliasFor(annotation = Autowired.class)
- boolean required() default true;
- }
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientEntranceParserBeanAnnotation.java b/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientEntranceParserBeanAnnotation.java
deleted file mode 100644
index 885c808..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientEntranceParserBeanAnnotation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.linkis.entranceclient.annotation;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.annotation.AliasFor;
-import org.springframework.stereotype.Component;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Bean(value = ClientEntranceParserBeanAnnotation.BEAN_NAME)
-@Component(value = ClientEntranceParserBeanAnnotation.BEAN_NAME)
-public @interface ClientEntranceParserBeanAnnotation {
- String BEAN_NAME = "clientEntranceParser";
- @AliasFor(annotation = Component.class)
- String value() default BEAN_NAME;
-
- @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
- @Retention(RetentionPolicy.RUNTIME)
- @Qualifier(BEAN_NAME)
- @Autowired
- @interface ClientEntranceParserAutowiredAnnotation {
- @AliasFor(annotation = Qualifier.class)
- String value() default BEAN_NAME;
- @AliasFor(annotation = Autowired.class)
- boolean required() default true;
- }
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientGroupFactoryBeanAnnotation.java b/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientGroupFactoryBeanAnnotation.java
deleted file mode 100644
index 854cce3..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientGroupFactoryBeanAnnotation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.linkis.entranceclient.annotation;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.annotation.AliasFor;
-import org.springframework.stereotype.Component;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Bean(value = ClientGroupFactoryBeanAnnotation.BEAN_NAME)
-@Component(value = ClientGroupFactoryBeanAnnotation.BEAN_NAME)
-public @interface ClientGroupFactoryBeanAnnotation {
- String BEAN_NAME = "clientGroupFactory";
- @AliasFor(annotation = Component.class)
- String value() default BEAN_NAME;
-
- @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
- @Retention(RetentionPolicy.RUNTIME)
- @Qualifier(BEAN_NAME)
- @Autowired
- @interface ClientGroupFactoryAutowiredAnnotation {
- @AliasFor(annotation = Qualifier.class)
- String value() default BEAN_NAME;
- @AliasFor(annotation = Autowired.class)
- boolean required() default true;
- }
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientInterceptorsBeanAnnotation.java b/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientInterceptorsBeanAnnotation.java
deleted file mode 100644
index fbd575e..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/ClientInterceptorsBeanAnnotation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.linkis.entranceclient.annotation;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.annotation.AliasFor;
-import org.springframework.stereotype.Component;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Bean(value = ClientInterceptorsBeanAnnotation.BEAN_NAME)
-@Component(value = ClientInterceptorsBeanAnnotation.BEAN_NAME)
-public @interface ClientInterceptorsBeanAnnotation {
- String BEAN_NAME = "clientInterceptors";
- @AliasFor(annotation = Component.class)
- String value() default BEAN_NAME;
-
- @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
- @Retention(RetentionPolicy.RUNTIME)
- @Qualifier(BEAN_NAME)
- @Autowired
- @interface ClientInterceptorsAutowiredAnnotation {
- @AliasFor(annotation = Qualifier.class)
- String value() default BEAN_NAME;
- @AliasFor(annotation = Autowired.class)
- boolean required() default true;
- }
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/DefaultEntranceClientBeanAnnotation.java b/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/DefaultEntranceClientBeanAnnotation.java
deleted file mode 100644
index 85353f3..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/annotation/DefaultEntranceClientBeanAnnotation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.linkis.entranceclient.annotation;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.annotation.AliasFor;
-import org.springframework.stereotype.Component;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Bean(value = DefaultEntranceClientBeanAnnotation.BEAN_NAME)
-@Component(value = DefaultEntranceClientBeanAnnotation.BEAN_NAME)
-public @interface DefaultEntranceClientBeanAnnotation {
- String BEAN_NAME = "entranceClient";
- @AliasFor(annotation = Component.class)
- String value() default BEAN_NAME;
-
- @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
- @Retention(RetentionPolicy.RUNTIME)
- @Qualifier(BEAN_NAME)
- @Autowired
- @interface DefaultEntranceClientAutowiredAnnotation {
- @AliasFor(annotation = Qualifier.class)
- String value() default BEAN_NAME;
- @AliasFor(annotation = Autowired.class)
- boolean required() default true;
- }
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/conf/ClientSpringConfiguration.java b/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/conf/ClientSpringConfiguration.java
deleted file mode 100644
index 8088e9d..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/java/org/apache/linkis/entranceclient/conf/ClientSpringConfiguration.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.linkis.entranceclient.conf;
-
-import org.apache.linkis.DataWorkCloudApplication;
-import org.apache.linkis.common.conf.CommonVars;
-import org.apache.linkis.entrance.conf.EntranceSpringConfiguration;
-import org.apache.linkis.entrance.interceptor.EntranceInterceptor;
-import org.apache.linkis.entrance.scheduler.EntranceSchedulerContext;
-import org.apache.linkis.entranceclient.EntranceClient;
-import org.apache.linkis.entranceclient.EntranceClientImpl;
-import org.apache.linkis.entranceclient.annotation.ClientEntranceParserBeanAnnotation;
-import org.apache.linkis.entranceclient.annotation.ClientInterceptorsBeanAnnotation;
-import org.apache.linkis.entranceclient.annotation.DefaultEntranceClientBeanAnnotation;
-import org.apache.linkis.entranceclient.context.ClientEntranceParser;
-import org.apache.linkis.rpc.RPCReceiveRestful;
-import org.apache.linkis.rpc.conf.RPCConfiguration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.context.annotation.Conditional;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@AutoConfigureBefore({EntranceSpringConfiguration.class, RPCReceiveRestful.class})
-class ClientSpringConfiguration {
-
- private Logger logger = LoggerFactory.getLogger(getClass());
-
- {
- logger.info("start a multi-entrance application...");
- }
-
- @ClientEntranceParserBeanAnnotation
- @ConditionalOnMissingBean(name = {ClientEntranceParserBeanAnnotation.BEAN_NAME})
- public ClientEntranceParser generateClientEntranceParser() {
- return new ClientEntranceParser();
- }
-
-
- @ClientInterceptorsBeanAnnotation
- @ConditionalOnMissingBean(name = {ClientInterceptorsBeanAnnotation.BEAN_NAME})
- public EntranceInterceptor[] generateEntranceInterceptor() {
- return new EntranceInterceptor[0];
- }
-
-
- @DefaultEntranceClientBeanAnnotation
- @Conditional(MultiEntranceCondition.class)
- public EntranceClient generateEntranceClient(@ClientEntranceParserBeanAnnotation.ClientEntranceParserAutowiredAnnotation ClientEntranceParser clientEntranceParser,
- @ClientInterceptorsBeanAnnotation.ClientInterceptorsAutowiredAnnotation EntranceInterceptor[] clientInterceptors,
- @Autowired EntranceSchedulerContext entranceSchedulerContext) {
- logger.warn("try to check the rpc receiver consumer threadPool...");
- setClientValue(RPCConfiguration.BDP_RPC_RECEIVER_ASYN_QUEUE_CAPACITY(), ClientConfiguration.BDP_RPC_RECEIVER_ASYN_QUEUE_CAPACITY_FOR_CLIENT());
- setClientValue(RPCConfiguration.BDP_RPC_RECEIVER_ASYN_CONSUMER_THREAD_MAX(), ClientConfiguration.BDP_RPC_RECEIVER_ASYN_CONSUMER_THREAD_MAX_FOR_CLIENT());
- EntranceClientImpl client = EntranceClientImpl.apply(ClientConfiguration.CLIENT_DEFAULT_NAME());
- logger.warn("Multi-entrance application is ready to initial EntranceClient " + client.getEntranceClientName());
- client.init(clientEntranceParser, entranceSchedulerContext, clientInterceptors, ClientConfiguration.CLIENT_DEFAULT_PARALLELISM_USERS().getValue());
- return client;
- }
-
-// @EventListener
-// public void onApplicationStarting(ApplicationStartingEvent applicationStartingEvent) {
-// if(MultiEntranceCondition.isMultiEntranceApplication()) {
-// logger.warn("start a multi-entrance application, now try to check the rpc receiver consumer threadPool...");
-// setClientValue(RPCConfiguration.BDP_RPC_RECEIVER_ASYN_QUEUE_CAPACITY(), ClientConfiguration.BDP_RPC_RECEIVER_ASYN_QUEUE_CAPACITY_FOR_CLIENT());
-// setClientValue(RPCConfiguration.BDP_RPC_RECEIVER_ASYN_CONSUMER_THREAD_MAX(), ClientConfiguration.BDP_RPC_RECEIVER_ASYN_CONSUMER_THREAD_MAX_FOR_CLIENT());
-// setClientValue(EntranceConfiguration.CONCURRENT_ENGINE_MAX_PARALLELISM(), ClientConfiguration.CONCURRENT_ENGINE_MAX_PARALLELISM_FOR_CLIENT());
-// }
-// }
-
- private void setClientValue(CommonVars<?> fromConf, CommonVars<Integer> toConf) {
- int queueSize = Integer.parseInt(fromConf.getValue().toString());
- int queueSizeValue = toConf.getValue();
- if (queueSize < queueSizeValue) {
- String key = fromConf.key();
- DataWorkCloudApplication.setProperty(key, String.valueOf(queueSizeValue));
- logger.warn("Multi-entrance application set " + key + "=" + queueSizeValue);
- }
- }
-}
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/resources/META-INF/spring.factories b/linkis-computation-governance/linkis-entrance-client/src/main/resources/META-INF/spring.factories
deleted file mode 100644
index 1607e90..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/resources/META-INF/spring.factories
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# 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.
-#
-
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-org.apache.linkis.entranceclient.conf.ClientForEntranceSpringConfiguration,\
-org.apache.linkis.entranceclient.conf.ClientSpringConfiguration
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/EngineApplicationNameFactory.scala b/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/EngineApplicationNameFactory.scala
deleted file mode 100644
index e399ffb..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/EngineApplicationNameFactory.scala
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.linkis.entranceclient
-
-import org.apache.linkis.entranceclient.conf.ClientConfiguration.{CLIENT_ENGINE_MANAGER_SPRING_APPLICATION_NAME, CLIENT_ENGINE_SPRING_APPLICATION_NAME}
-
-trait EngineApplicationNameFactory {
- private var engineApplicationName: String = CLIENT_ENGINE_SPRING_APPLICATION_NAME.getValue
-
- def setEngineApplicationName(engineApplicationName: String): Unit = this.engineApplicationName = engineApplicationName
- def getEngineApplicationName: String = engineApplicationName
-
- def isEngineApplicationNameEmpty: Boolean = engineApplicationName == CLIENT_ENGINE_SPRING_APPLICATION_NAME.getValue
-
-}
-trait EngineManagerApplicationNameFactory {
- private var engineManagerApplicationName: String = CLIENT_ENGINE_MANAGER_SPRING_APPLICATION_NAME.getValue
- def setEngineManagerApplicationName(engineManagerApplicationName: String): Unit = this.engineManagerApplicationName = engineManagerApplicationName
- def getEngineManagerApplicationName: String = engineManagerApplicationName
- def isEngineManagerApplicationNameEmpty: Boolean = engineManagerApplicationName == CLIENT_ENGINE_MANAGER_SPRING_APPLICATION_NAME.getValue
-}
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/EntranceClient.scala b/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/EntranceClient.scala
deleted file mode 100644
index 344b2f5..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/EntranceClient.scala
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.linkis.entranceclient
-
-import org.apache.linkis.entranceclient.execute.ClientJob
-
-trait EntranceClient {
-
- def getEntranceClientName: String
-
- def execute(code: String, user: String, creator: String): Boolean
-
- def execute(code: String, user: String, creator: String,
- params: java.util.Map[String, Any]): Boolean
-
- def executeJob(code: String, user: String, creator: String): String
-
- def executeJob(code: String, user: String, creator: String,
- params: java.util.Map[String, Any]): String
-
- def getJob(jobId: String): Option[ClientJob]
-
- def executeResult(code: String, user: String, creator: String): Array[String]
-
- def executeResult(code: String, user: String, creator: String,
- params: java.util.Map[String, Any]): Array[String]
-
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/EntranceClientImpl.scala b/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/EntranceClientImpl.scala
deleted file mode 100644
index f29a2b0..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/EntranceClientImpl.scala
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * 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.linkis.entranceclient
-
-import java.util
-
-import org.apache.linkis.common.utils.Logging
-import org.apache.linkis.entrance.context.DefaultEntranceContext
-import org.apache.linkis.entrance.exception.EntranceErrorException
-import org.apache.linkis.entrance.interceptor.EntranceInterceptor
-import org.apache.linkis.entrance.scheduler.EntranceSchedulerContext
-import org.apache.linkis.entrance.server.DefaultEntranceServer
-import org.apache.linkis.entrance.{EntranceContext, EntranceServer}
-import org.apache.linkis.entranceclient.execute._
-import org.apache.linkis.protocol.constants.TaskConstant
-import org.apache.linkis.scheduler.queue.parallelqueue.ParallelScheduler
-import org.apache.linkis.server.JMap
-import org.apache.commons.lang.StringUtils
-
-class EntranceClientImpl private() extends EntranceClient with EngineApplicationNameFactory
- with EngineManagerApplicationNameFactory with Logging {
-
- private var entranceServer: EntranceServer = _
- private var clientName: String = _
-
-
- def setClientName(clientName: String): Unit = this.clientName = clientName
-
-
- def init(entranceServer: EntranceServer): Unit = {
- this.entranceServer = entranceServer
- }
-
- def init(entranceContext: EntranceContext): Unit = init(new DefaultEntranceServer(entranceContext))
-
- def init(clientEntranceParser: context.ClientEntranceParser, schedulerContext: EntranceSchedulerContext, interceptors: Array[EntranceInterceptor],
- maxParallelismUsers: Int): Unit = if (entranceServer == null) synchronized {
- if (entranceServer == null) {
- val scheduler = new ParallelScheduler(schedulerContext)
- scheduler.init()
- scheduler.start()
- val entranceContext = new DefaultEntranceContext(clientEntranceParser, new context.ClientPersistenceManager, new context.ClientLogManager,
- scheduler, interceptors, null, Array.empty)
- init(entranceContext)
- }
- }
-
- private def executeUntil[T](code: String, user: String, creator: String,
- params: java.util.Map[String, Any], op: ClientJob => T): T = {
- val execId = executeJob(code, user, creator, params)
- entranceServer.getJob(execId).foreach {
- case job: ClientJob =>
- job.waitForComplete()
- return op(job)
- }
- throw new EntranceErrorException(50003, s"execute failed, cannot find the job $execId.")
- }
-
- override def getEntranceClientName: String = if(StringUtils.isNotEmpty(clientName)) clientName else entranceServer.getName
-
- override def execute(code: String, user: String, creator: String): Boolean = execute(code, user, creator, null)
-
- override def execute(code: String, user: String, creator: String,
- params: java.util.Map[String, Any]): Boolean =
- executeUntil(code, user, creator, params, job =>
- if (job.isSucceed) true else false)
-
- override def executeJob(code: String, user: String, creator: String): String = executeJob(code, user, creator, null)
-
- override def executeJob(code: String, user: String, creator: String, params: util.Map[String, Any]): String = {
- val requestMap = new JMap[String, Any]
- requestMap.put(TaskConstant.EXECUTIONCODE, code)
- requestMap.put(TaskConstant.UMUSER, user)
- requestMap.put(TaskConstant.REQUESTAPPLICATIONNAME, creator)
- if(params != null && !params.isEmpty) {
- if(params.containsKey(EntranceServer.DO_NOT_PRINT_PARAMS_LOG)) {
- requestMap.put(EntranceServer.DO_NOT_PRINT_PARAMS_LOG, params.get(EntranceServer.DO_NOT_PRINT_PARAMS_LOG))
- params.remove(EntranceServer.DO_NOT_PRINT_PARAMS_LOG)
- }
- if(!params.isEmpty) requestMap.put(TaskConstant.PARAMS, params)
- }
- entranceServer.execute(requestMap)
- }
-
- override def getJob(jobId: String): Option[ClientJob] = entranceServer.getJob(jobId).map { case job: ClientJob => job }
-
- override def executeResult(code: String, user: String, creator: String): Array[String] =
- executeResult(code, user, creator, null)
-
- override def executeResult(code: String, user: String, creator: String,
- params: java.util.Map[String, Any]): Array[String] =
- executeUntil(code, user, creator, params, job =>
- if(job.isSucceed) job.getResultSets
- else if(job.getErrorResponse != null) {
- val exception = new EntranceErrorException(22001, job.getErrorResponse.message)
- if(job.getErrorResponse.t != null) exception.initCause(job.getErrorResponse.t)
- throw exception
- } else throw new EntranceErrorException(22002, "execute failed, unknown reason."))
-
-}
-object EntranceClientImpl {
-
- private val clientNameToEntranceClient = new JMap[String, EntranceClientImpl]
-
- def apply(clientName: String): EntranceClientImpl = {
- if(!clientNameToEntranceClient.containsKey(clientName)) synchronized {
- if(!clientNameToEntranceClient.containsKey(clientName)) {
- val client = new EntranceClientImpl
- client.setClientName(clientName)
- clientNameToEntranceClient.put(clientName, client)
- }
- }
- clientNameToEntranceClient.get(clientName)
- }
-
- def getClientNames = clientNameToEntranceClient.keySet()
-}
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/conf/ClientConfiguration.scala b/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/conf/ClientConfiguration.scala
deleted file mode 100644
index 2524a6e..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/conf/ClientConfiguration.scala
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.linkis.entranceclient.conf
-
-import org.apache.linkis.common.conf.CommonVars
-
-object ClientConfiguration {
-
- val CLIENT_ENGINE_MANAGER_SPRING_APPLICATION_NAME = CommonVars("wds.linkis.client.enginemanager.application.name.default", "IOEngineManager")
- val CLIENT_ENGINE_SPRING_APPLICATION_NAME = CommonVars("wds.linkis.client.engine.application.name.default", "IOEngine")
-
- val CLIENT_DEFAULT_NAME: String = CommonVars("wds.linkis.client.name.default", "storageClient").getValue
- val CLIENT_DEFAULT_PARALLELISM_USERS = CommonVars("wds.linkis.client.parallelism.users.max", new Integer(100))
-
- val BDP_RPC_RECEIVER_ASYN_QUEUE_CAPACITY_FOR_CLIENT = CommonVars("wds.linkis.client.rpc.receiver.asyn.queue.size.max", new Integer(3000))
- val BDP_RPC_RECEIVER_ASYN_CONSUMER_THREAD_MAX_FOR_CLIENT = CommonVars("wds.linkis.client.rpc.receiver.asyn.consumer.thread.max", new Integer(120))
- val CONCURRENT_ENGINE_MAX_PARALLELISM_FOR_CLIENT = CommonVars("wds.linkis.client.engine.maxParallelismJobs", new Integer(25))
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/conf/ClientForEntranceSpringConfiguration.scala b/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/conf/ClientForEntranceSpringConfiguration.scala
deleted file mode 100644
index 77fe250..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/conf/ClientForEntranceSpringConfiguration.scala
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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.linkis.entranceclient.conf
-
-import org.apache.linkis.common.utils.Logging
-//import org.apache.linkis.entrance.annotation.EntranceServerBeanAnnotation.EntranceServerAutowiredAnnotation
-//import org.apache.linkis.entrance.annotation._
-//import org.apache.linkis.entrance.conf.EntranceSpringConfiguration
-//import org.apache.linkis.entrance.execute._
-//import org.apache.linkis.entrance.interceptor.EntranceInterceptor
-//import org.apache.linkis.entrance.log.LogManager
-//import org.apache.linkis.entrance.persistence.PersistenceManager
-//import org.apache.linkis.entrance.{EntranceParser, EntranceServer}
-//import org.apache.linkis.entranceclient.annotation.ClientEngineSelectorBeanAnnotation.ClientEngineSelectorAutowiredAnnotation
-//import org.apache.linkis.entranceclient.annotation.ClientEntranceParserBeanAnnotation.ClientEntranceParserAutowiredAnnotation
-//import org.apache.linkis.entranceclient.annotation.ClientInterceptorsBeanAnnotation.ClientInterceptorsAutowiredAnnotation
-//import org.apache.linkis.entranceclient.annotation.DefaultEntranceClientBeanAnnotation
-//import org.apache.linkis.entranceclient.{EntranceClient, EntranceClientImpl, _}
-//import org.apache.linkis.rpc.{RPCMessageEvent, Receiver, ReceiverChooser}
-//import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
-//import org.springframework.boot.autoconfigure.{AutoConfigureAfter, AutoConfigureBefore}
-//import org.springframework.context.annotation.{Conditional, Configuration}
-
-/*@Configuration
-@AutoConfigureBefore(Array(classOf[EntranceSpringConfiguration]))
-@AutoConfigureAfter(Array(classOf[ClientSpringConfiguration]))
-@Conditional(Array(classOf[SingleEntranceCondition]))*/
-class ClientForEntranceSpringConfiguration extends Logging {
-
- warn(s"start a single-entrance application...")
-
- /*@DefaultEntranceClientBeanAnnotation
- def generateEntranceClient(@EntranceServerAutowiredAnnotation entranceServer: EntranceServer): EntranceClient = {
- val client = EntranceClientImpl(ClientConfiguration.CLIENT_DEFAULT_NAME)
- warn(s"ready to initial EntranceClient ${client.getEntranceClientName}...")
- client.init(entranceServer)
- client
- }*/
-/*
-
- @ReceiverChooserBeanAnnotation
- def generateEntranceReceiverChooser(): ReceiverChooser = new ReceiverChooser{
- override def chooseReceiver(event: RPCMessageEvent): Option[Receiver] = None
- }
-
- @PersistenceManagerBeanAnnotation
- @ConditionalOnMissingBean(value = Array(classOf[context.ClientPersistenceManager]))
- def generatePersistenceManager(): PersistenceManager = new context.ClientPersistenceManager
-
- @EntranceParserBeanAnnotation
- def generateEntranceParser(@ClientEntranceParserAutowiredAnnotation clientEntranceParser: context.ClientEntranceParser): EntranceParser = clientEntranceParser
-
- @LogManagerBeanAnnotation
- @ConditionalOnMissingBean(value = Array(classOf[context.ClientLogManager]))
- def generateLogManager(): LogManager = new context.ClientLogManager
-
-
- @EntranceInterceptorBeanAnnotation
- def generateEntranceInterceptor(@ClientInterceptorsAutowiredAnnotation clientInterceptors: Array[EntranceInterceptor]): Array[EntranceInterceptor] = clientInterceptors
-*/
-
-
-// @EngineSelectorBeanAnnotation
-// def generateEngineSelector(@ClientEngineSelectorAutowiredAnnotation clientEngineSelector: EngineSelector): EngineSelector = clientEngineSelector
-
-
-}
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/conf/MultiEntranceCondition.scala b/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/conf/MultiEntranceCondition.scala
deleted file mode 100644
index 4e0a5bb..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/conf/MultiEntranceCondition.scala
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.linkis.entranceclient.conf
-
-import org.apache.linkis.entrance.conf.EntranceConfiguration
-import org.apache.linkis.entranceclient
-import org.springframework.context.annotation.{Condition, ConditionContext}
-import org.springframework.core.`type`.AnnotatedTypeMetadata
-
-class MultiEntranceCondition extends Condition {
- override def matches(conditionContext: ConditionContext, annotatedTypeMetadata: AnnotatedTypeMetadata): Boolean =
- entranceclient.conf.MultiEntranceCondition.isMultiEntranceApplication
-}
-class SingleEntranceCondition extends Condition {
- override def matches(conditionContext: ConditionContext, annotatedTypeMetadata: AnnotatedTypeMetadata): Boolean =
- !entranceclient.conf.MultiEntranceCondition.isMultiEntranceApplication
-}
-object MultiEntranceCondition {
- def isMultiEntranceApplication: Boolean = EntranceConfiguration.MULTI_ENTRANCE_CONDITION.getValue
-}
\ No newline at end of file
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/context/ClientEntranceParser.scala b/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/context/ClientEntranceParser.scala
deleted file mode 100644
index 6c845f9..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/context/ClientEntranceParser.scala
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.linkis.entranceclient.context
-
-import java.util
-
-import org.apache.linkis.entrance.parser.CommonEntranceParser
-import org.apache.linkis.entranceclient.execute
-import org.apache.linkis.governance.common.entity.task.RequestPersistTask
-import org.apache.linkis.protocol.task.Task
-import org.apache.linkis.scheduler.queue.Job
-
-class ClientEntranceParser extends CommonEntranceParser {
-
- override def parseToTask(job: Job): Task = job match {
- case j: execute.ClientJob => j.getTask
- }
-
- override def parseToJob(task: Task): Job = {
- val job = new execute.ClientJob
- task match {
- case t: RequestPersistTask =>
- job.setTask(t)
- job.setCreator(t.getRequestApplicationName)
- job.setUser(t.getUmUser)
- if (t.getParams != null) job.setParams(t.getParams.asInstanceOf[util.Map[String, Any]])
- }
- job
- }
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/context/ClientLogManager.scala b/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/context/ClientLogManager.scala
deleted file mode 100644
index 5f0cc2f..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/context/ClientLogManager.scala
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.linkis.entranceclient.context
-
-import java.io.{InputStream, OutputStream}
-
-import org.apache.linkis.entrance.log._
-import org.apache.linkis.scheduler.queue.Job
-import org.apache.linkis.server.conf.ServerConfiguration
-import org.apache.commons.io.input.NullInputStream
-import org.apache.commons.io.output.NullOutputStream
-
-class ClientLogManager extends CacheLogManager {
- override def getLogReader(execId: String): LogReader = {
- new CacheLogReader("", ServerConfiguration.BDP_SERVER_ENCODING.getValue,
- new Cache(10), "") {
- override def getInputStream: InputStream = new NullInputStream(0)
- }
- }
-
- override def createLogWriter(job: Job): LogWriter = {
- new NullCacheLogWriter(ServerConfiguration.BDP_SERVER_ENCODING.getValue,
- new Cache(20))
- }
- class NullCacheLogWriter(charset:String,
- sharedCache:Cache,
- override protected val outputStream: OutputStream = new NullOutputStream)
- extends CacheLogWriter("", charset, sharedCache, "")
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/context/ClientPersistenceEngine.scala b/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/context/ClientPersistenceEngine.scala
deleted file mode 100644
index dbd1515..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/context/ClientPersistenceEngine.scala
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.linkis.entranceclient.context
-
-import java.lang
-
-import org.apache.linkis.entrance.persistence.PersistenceEngine
-import org.apache.linkis.protocol.task.Task
-
-class ClientPersistenceEngine extends PersistenceEngine {
- override def persist(task: Task): Unit = {}
-
- /**
- * If a task's progress, status, logs, and result set are updated, this method is updated <br>
- * 如果一个任务的进度、状态、日志和结果集发生更新,由此方法进行更新<br>
- *
- * @param task
- */
- override def updateIfNeeded(task: Task): Unit = {}
-
- /**
- * Used to hang up a unified import task through this method, and continue to do the processing.
- * 用于如果某一个统一入口挂掉了,通过这个方法,将挂掉的统一入口tasks读取过来,继续做处理
- *
- * @param instance
- * @return
- */
-override def readAll(instance: String): Array[Task] = Array.empty
-
- /**
- * Return a task information in the database through a taskID, such as query log storage address, etc.
- * 通过一个taskID,返回数据库中的一条task信息,这种情况包括如 查询日志存放地址等
- *
- * @param taskID
- * @return
- */
- override def retrieve(taskID: lang.Long): Task = null
-
- override def close(): Unit = {}
-
- override def flush(): Unit = {}
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/context/ClientPersistenceManager.scala b/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/context/ClientPersistenceManager.scala
deleted file mode 100644
index 0bdd575..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/context/ClientPersistenceManager.scala
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.linkis.entranceclient.context
-
-import org.apache.linkis.entrance.EntranceContext
-import org.apache.linkis.entrance.persistence.{PersistenceEngine, PersistenceManager, ResultSetEngine}
-import org.apache.linkis.entranceclient.execute
-import org.apache.linkis.protocol.engine.JobProgressInfo
-import org.apache.linkis.scheduler.executer.OutputExecuteResponse
-import org.apache.linkis.scheduler.queue.Job
-
-class ClientPersistenceManager extends PersistenceManager {
- private val persistenceEngine = new ClientPersistenceEngine
- override def getEntranceContext: EntranceContext = null
-
- override def setEntranceContext(entranceContext: EntranceContext): Unit = null
-
- override def createPersistenceEngine(): PersistenceEngine = persistenceEngine
-
- override def createResultSetEngine(): ResultSetEngine = null
-
- override def onProgressUpdate(job: Job, progress: Float, progressInfo: Array[JobProgressInfo]): Unit = {}
-
- override def onJobScheduled(job: Job): Unit = {}
-
- override def onJobInited(job: Job): Unit = {}
-
- override def onJobRunning(job: Job): Unit = {}
-
- override def onJobCompleted(job: Job): Unit = {
-
- }
-
- override def onResultSetCreated(job: Job, response: OutputExecuteResponse): Unit = job match {
- case j: execute.ClientJob =>
- j.addResultSet(response.getOutput)
- j.incrementResultSetPersisted()
- }
-
-
- override def onResultSizeCreated(job: Job, resultSize: Int): Unit = job match {
- case j: execute.ClientJob => j.setResultSize(resultSize)
- }
-
- override def onJobWaitForRetry(job: Job): Unit = {}
-}
diff --git a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/execute/ClientJob.scala b/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/execute/ClientJob.scala
deleted file mode 100644
index 09faec5..0000000
--- a/linkis-computation-governance/linkis-entrance-client/src/main/scala/org/apache/linkis/entranceclient/execute/ClientJob.scala
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.linkis.entranceclient.execute
-
-import org.apache.linkis.entrance.execute.EntranceJob
-import org.apache.linkis.governance.common.entity.task.RequestPersistTask
-import org.apache.linkis.scheduler.executer.{ExecuteRequest, JobExecuteRequest}
-import org.apache.linkis.scheduler.queue.SchedulerEventState.SchedulerEventState
-import org.apache.linkis.scheduler.queue.{JobInfo, SchedulerEventState}
-
-import scala.collection.mutable.ArrayBuffer
-
-class ClientJob extends EntranceJob {
-
- private val resultSets = ArrayBuffer[String]()
-
- def addResultSet(resultSet: String): Unit = resultSets += resultSet
-
- def getResultSets: Array[String] = resultSets.toArray
-
- def waitForComplete(): Unit = {
- if (SchedulerEventState.isCompleted(this.getState)) return
- resultSets synchronized {
- while (!SchedulerEventState.isCompleted(this.getState)) resultSets.wait()
- }
- }
-
- override protected def isWaitForPersistedTimeout(startWaitForPersistedTime: Long): Boolean = System.currentTimeMillis() - startWaitForPersistedTime >= 3000
-
- override def afterStateChanged(fromState: SchedulerEventState, toState: SchedulerEventState): Unit = {
- super.afterStateChanged(fromState, toState)
- if(SchedulerEventState.isCompleted(this.getState)) resultSets synchronized resultSets.notify()
- }
-
- override def init(): Unit = {}
-
- override protected def jobToExecuteRequest: ExecuteRequest = new ExecuteRequest with JobExecuteRequest {
- override val code: String = getTask.asInstanceOf[RequestPersistTask].getCode
- override val jobId: String = getId
- }
-
- override def getName: String = getTask.asInstanceOf[RequestPersistTask].getRequestApplicationName + "_" + getTask.asInstanceOf[RequestPersistTask].getUmUser + "_" + getId
-
- override def getJobInfo: JobInfo = null
-
- override def close(): Unit = {}
-}
diff --git a/linkis-computation-governance/linkis-entrance/pom.xml b/linkis-computation-governance/linkis-entrance/pom.xml
index 99d8cd5..a91d16c 100644
--- a/linkis-computation-governance/linkis-entrance/pom.xml
+++ b/linkis-computation-governance/linkis-entrance/pom.xml
@@ -58,7 +58,7 @@
<dependency>
<groupId>org.apache.linkis</groupId>
- <artifactId>linkis-message-scheduler</artifactId>
+ <artifactId>linkis-rpc</artifactId>
<version>${linkis.version}</version>
<scope>provided</scope>
</dependency>
diff --git a/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/conf/EntranceSpringConfiguration.java b/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/conf/EntranceSpringConfiguration.java
index eecc472..91519f5 100644
--- a/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/conf/EntranceSpringConfiguration.java
+++ b/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/conf/EntranceSpringConfiguration.java
@@ -59,7 +59,7 @@ public class EntranceSpringConfiguration {
private Logger logger = LoggerFactory.getLogger(getClass());
{
- logger.info("load the ujes-entrance spring configuration.");
+ logger.info("load the linkis-cg-entrance spring configuration.");
}
@PersistenceEngineBeanAnnotation
@@ -118,8 +118,8 @@ public class EntranceSpringConfiguration {
new OnceJobInterceptor(),
new CSEntranceInterceptor(),
new ShellDangerousGrammerInterceptor(),
- new PythonCodeCheckInterceptor(),
- new DBInfoCompleteInterceptor(),
+ // new PythonCodeCheckInterceptor(),
+ // new DBInfoCompleteInterceptor(),
new SparkCodeCheckInterceptor(),
new SQLCodeCheckInterceptor(),
new LabelCheckInterceptor(),
@@ -193,38 +193,6 @@ public class EntranceSpringConfiguration {
return new EntranceSchedulerContext(groupFactory, consumerManager, executorManager);
}
- /* @EngineRequesterBeanAnnotation
- @ConditionalOnMissingBean(name = {EngineRequesterBeanAnnotation.BEAN_NAME})
- public EngineRequester generateEngineRequester(){
- return new EngineRequesterImpl();
- }
- */
- /* @EngineSelectorBeanAnnotation
- @ConditionalOnMissingBean(name = {EngineSelectorBeanAnnotation.BEAN_NAME})
- public EngineSelector generateEngineSelector(@EntranceListenerBusBeanAnnotation.EntranceListenerBusAutowiredAnnotation
- EntranceEventListenerBus<EntranceEventListener, EntranceEvent> entranceEventListenerBus) {
- SingleEngineSelector singleEngineSelector = new SingleEngineSelector();
- singleEngineSelector.setEntranceEventListenerBus(entranceEventListenerBus);
- return singleEngineSelector;
- }
- */
- /*@EngineBuilderBeanAnnotation
- @ConditionalOnMissingBean(name = {EngineBuilderBeanAnnotation.BEAN_NAME})
- public EngineBuilder generateEngineBuilder(@GroupFactoryBeanAnnotation.GroupFactoryAutowiredAnnotation GroupFactory groupFactory) {
- return new AbstractEngineBuilder(groupFactory) {
- @Override
- public EntranceEngine createEngine(long id) {
- return new SingleEntranceEngine(id);
- }
- };
- }*/
-
- /* @EngineManagerBeanAnnotation
- @ConditionalOnMissingBean(name = {EngineManagerBeanAnnotation.BEAN_NAME})
- public EngineManager generateEngineManager() {
- return new EngineManagerImpl();
- }*/
-
@EntranceExecutorManagerBeanAnnotation
@ConditionalOnMissingBean(name = {EntranceExecutorManagerBeanAnnotation.BEAN_NAME})
public ExecutorManager generateExecutorManager(
@@ -245,22 +213,4 @@ public class EntranceSpringConfiguration {
scheduler.start();
return scheduler;
}
-
- /* @NewEngineBroadcastListenerBeanAnnotation
- @ConditionalOnMissingBean(name = {NewEngineBroadcastListenerBeanAnnotation.BEAN_NAME})
- public NewEngineBroadcastListener generateNewEngineBroadcastListener(@EntranceExecutorManagerBeanAnnotation.EntranceExecutorManagerAutowiredAnnotation
- EntranceExecutorManager entranceExecutorManager) {
- NewEngineBroadcastListener newEngineBroadcastListener = new NewEngineBroadcastListener();
- newEngineBroadcastListener.setEntranceExecutorManager(entranceExecutorManager);
- return newEngineBroadcastListener;
- }
-
- @ResponseEngineStatusChangedBroadcastListenerBeanAnnotation
- @ConditionalOnMissingBean(name = {ResponseEngineStatusChangedBroadcastListenerBeanAnnotation.BEAN_NAME})
- public ResponseEngineStatusChangedBroadcastListener generateResponseEngineStatusChangedBroadcastListener(@EntranceExecutorManagerBeanAnnotation.EntranceExecutorManagerAutowiredAnnotation
- EntranceExecutorManager entranceExecutorManager) {
- ResponseEngineStatusChangedBroadcastListener broadcastListener = new ResponseEngineStatusChangedBroadcastListener();
- broadcastListener.setEntranceExecutorManager(entranceExecutorManager);
- return broadcastListener;
- }*/
}
diff --git a/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/persistence/QueryPersistenceManager.java b/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/persistence/QueryPersistenceManager.java
index cddd368..f16ddbd 100644
--- a/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/persistence/QueryPersistenceManager.java
+++ b/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/persistence/QueryPersistenceManager.java
@@ -22,6 +22,7 @@ import org.apache.linkis.common.io.FsPath;
import org.apache.linkis.entrance.EntranceContext;
import org.apache.linkis.entrance.cs.CSEntranceHelper;
import org.apache.linkis.entrance.execute.EntranceJob;
+import org.apache.linkis.entrance.log.FlexibleErrorCodeManager;
import org.apache.linkis.governance.common.entity.job.JobRequest;
import org.apache.linkis.governance.common.entity.job.SubJobInfo;
import org.apache.linkis.protocol.engine.JobProgressInfo;
@@ -34,6 +35,9 @@ import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import scala.Option;
+import scala.Tuple2;
+
public class QueryPersistenceManager extends PersistenceManager {
private EntranceContext entranceContext;
@@ -133,11 +137,20 @@ public class QueryPersistenceManager extends PersistenceManager {
// todo check
updatedProgress = -1 * progress;
}
- if (job.getProgress() >= 0 && job.getProgress() == updatedProgress) {
+ if (Double.isNaN(updatedProgress)) {
return;
}
- job.setProgress(updatedProgress);
EntranceJob entranceJob = (EntranceJob) job;
+ float persistedProgress = 0.0f;
+ try {
+ persistedProgress = Float.parseFloat(entranceJob.getJobRequest().getProgress());
+ } catch (Exception e) {
+ logger.warn("Invalid progress : " + entranceJob.getJobRequest().getProgress(), e);
+ }
+ if (job.getProgress() >= 0 && persistedProgress >= updatedProgress) {
+ return;
+ }
+ job.setProgress(updatedProgress);
entranceJob.getJobRequest().setProgress(String.valueOf(updatedProgress));
updateJobStatus(job);
}
@@ -168,6 +181,19 @@ public class QueryPersistenceManager extends PersistenceManager {
try {
if (job.isSucceed()) {
CSEntranceHelper.registerCSRSData(job);
+ } else {
+ JobRequest jobRequest =
+ this.entranceContext.getOrCreateEntranceParser().parseToJobRequest(job);
+ if (null == jobRequest.getErrorCode() || jobRequest.getErrorCode() == 0) {
+ Option<Tuple2<String, String>> tuple2Option =
+ FlexibleErrorCodeManager.errorMatch(jobRequest.getErrorDesc());
+ if (tuple2Option.isDefined()) {
+ logger.info(jobRequest.getId() + " to reset errorCode by errorMsg");
+ Tuple2<String, String> errorCodeContent = tuple2Option.get();
+ jobRequest.setErrorCode(Integer.parseInt(errorCodeContent._1));
+ jobRequest.setErrorDesc(errorCodeContent._2);
+ }
+ }
}
} catch (Throwable e) {
logger.error("Failed to register cs rs data ", e);
@@ -185,7 +211,7 @@ public class QueryPersistenceManager extends PersistenceManager {
if (job.isSucceed()) {
// 如果是job是成功的,那么需要将task的错误描述等都要设置为null
jobRequest.setErrorCode(0);
- jobRequest.setErrorDesc(null);
+ jobRequest.setErrorDesc("");
}
} catch (Exception e) {
entranceContext.getOrCreateLogManager().onLogUpdate(job, e.getMessage());
diff --git a/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/restful/EntranceRestfulApi.java b/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/restful/EntranceRestfulApi.java
index a6351b3..867b6ee 100644
--- a/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/restful/EntranceRestfulApi.java
+++ b/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/restful/EntranceRestfulApi.java
@@ -72,7 +72,6 @@ public class EntranceRestfulApi implements EntranceRestfulRemote {
@RequestMapping(path = "/execute", method = RequestMethod.POST)
public Message execute(HttpServletRequest req, @RequestBody Map<String, Object> json) {
Message message = null;
- // try{
logger.info("Begin to get an execID");
json.put(TaskConstant.UMUSER, SecurityFilter.getLoginUsername(req));
HashMap<String, String> map = (HashMap) json.get(TaskConstant.SOURCE);
@@ -117,11 +116,6 @@ public class EntranceRestfulApi implements EntranceRestfulRemote {
message.data("execID", execID);
message.data("taskID", taskID);
logger.info("End to get an an execID: {}, taskID: {}", execID, taskID);
- // }catch(ErrorException e){
- // message = Message.error(e.getDesc());
- // message.setStatus(1);
- // message.setMethod("/api/entrance/execute");
- // }
return message;
}
@@ -231,7 +225,7 @@ public class EntranceRestfulApi implements EntranceRestfulRemote {
}
message = Message.ok();
message.setMethod("/api/entrance/" + id + "/progress");
- // TODO 去掉绝对值判断
+
message.data("progress", Math.abs(job.get().getProgress()))
.data("execID", id)
.data("progressInfo", list);
@@ -374,7 +368,6 @@ public class EntranceRestfulApi implements EntranceRestfulRemote {
String id = idNode.get(i).asText();
Long taskID = taskIDNode.get(i).asLong();
String realId = ZuulEntranceUtils.parseExecID(id)[3];
- // 通过jobid获取job,可能会由于job找不到而导致有looparray的报错,一旦报错的话,就可以将该任务直接置为Cancenlled
Option<Job> job = Option.apply(null);
try {
job = entranceServer.getJob(realId);
@@ -453,7 +446,6 @@ public class EntranceRestfulApi implements EntranceRestfulRemote {
@PathVariable("id") String id,
@RequestParam(value = "taskID", required = false) long taskID) {
String realId = ZuulEntranceUtils.parseExecID(id)[3];
- // 通过jobid获取job,可能会由于job找不到而导致有looparray的报错,一旦报错的话,就可以将该任务直接置为Cancenlled
Option<Job> job = Option.apply(null);
try {
job = entranceServer.getJob(realId);
diff --git a/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/vo/YarnResourceWithStatusVo.java b/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/vo/YarnResourceWithStatusVo.java
new file mode 100644
index 0000000..6b50a88
--- /dev/null
+++ b/linkis-computation-governance/linkis-entrance/src/main/java/org/apache/linkis/entrance/vo/YarnResourceWithStatusVo.java
@@ -0,0 +1,109 @@
+/*
+ * 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.linkis.entrance.vo;
+
+import org.apache.linkis.manager.common.protocol.resource.ResourceWithStatus;
+
+import java.io.Serializable;
+
+public class YarnResourceWithStatusVo implements Serializable {
+
+ public Long queueMemory;
+
+ public Integer queueCores;
+
+ public Integer queueInstances;
+
+ public String jobStatus;
+
+ public String applicationId;
+
+ public String queue;
+
+ public YarnResourceWithStatusVo(String applicationId, ResourceWithStatus resourceWithStatus) {
+ this.queueMemory = resourceWithStatus.queueMemory();
+ this.queueCores = resourceWithStatus.queueCores();
+ this.queueInstances = resourceWithStatus.queueInstances();
+ this.jobStatus = resourceWithStatus.jobStatus();
+ this.applicationId = applicationId;
+ this.queue = resourceWithStatus.queue();
+ }
+
+ public YarnResourceWithStatusVo(
+ String applicationId,
+ Long queueMemory,
+ Integer queueCores,
+ Integer queueInstances,
+ String jobStatus,
+ String queue) {
+ this.applicationId = applicationId;
+ this.queueMemory = queueMemory;
+ this.queueCores = queueCores;
+ this.queueInstances = queueInstances;
+ this.jobStatus = jobStatus;
+ this.queue = queue;
+ }
+
+ public String getApplicationId() {
+ return applicationId;
+ }
+
+ public void setApplicationId(String applicationId) {
+ this.applicationId = applicationId;
+ }
+
+ public Long getQueueMemory() {
+ return queueMemory;
+ }
+
+ public void setQueueMemory(Long queueMemory) {
+ this.queueMemory = queueMemory;
+ }
+
+ public Integer getQueueCores() {
+ return queueCores;
+ }
+
+ public void setQueueCores(Integer queueCores) {
+ this.queueCores = queueCores;
+ }
+
+ public Integer getQueueInstances() {
+ return queueInstances;
+ }
+
+ public void setQueueInstances(Integer queueInstances) {
+ this.queueInstances = queueInstances;
+ }
+
+ public String getJobStatus() {
+ return jobStatus;
+ }
+
+ public void setJobStatus(String jobStatus) {
+ this.jobStatus = jobStatus;
+ }
+
+ public String getQueue() {
+ return queue;
+ }
+
+ public void setQueue(String queue) {
+ this.queue = queue;
+ }
+}
diff --git a/linkis-computation-governance/linkis-entrance/src/main/scala/org/apache/linkis/entrance/conf/EntranceConfiguration.scala b/linkis-computation-governance/linkis-entrance/src/main/scala/org/apache/linkis/entrance/conf/EntranceConfiguration.scala
index 9c28890..a69320a 100644
--- a/linkis-computation-governance/linkis-entrance/src/main/scala/org/apache/linkis/entrance/conf/EntranceConfiguration.scala
+++ b/linkis-computation-governance/linkis-entrance/src/main/scala/org/apache/linkis/entrance/conf/EntranceConfiguration.scala
@@ -127,7 +127,7 @@ object EntranceConfiguration {
val SKIP_AUTH = CommonVars("wds.linkis.entrance.skip.auth", true)
- val PROGRESS_PUSH = CommonVars[String]("wds.linkis.entrance.push.progress", "false")
+ val PROGRESS_PUSH = CommonVars[String]("wds.linkis.entrance.push.progress", "true")
val CONCURRENT_FACTORY_MAX_CAPACITY = CommonVars("wds.linkis.concurrent.group.factory.capacity", 1000)
diff --git a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/constant/LabelKeyConstant.java b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/constant/LabelKeyConstant.java
index 3e53235..9a951bf 100644
--- a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/constant/LabelKeyConstant.java
+++ b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/constant/LabelKeyConstant.java
@@ -51,6 +51,8 @@ public class LabelKeyConstant {
public static final String JOB_RUNNING_TIMEOUT_KEY = "jobRunningTimeout";
+ public static final String RETRY_TIMEOUT_KEY = "jobRetryTimeout";
+
public static final String EXECUTE_ONCE_KEY = "executeOnce";
public static final String LOAD_BALANCE_KEY = "loadBalance";
diff --git a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/SerializableLabel.java b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/SerializableLabel.java
index 581cf5b..02c7552 100644
--- a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/SerializableLabel.java
+++ b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/SerializableLabel.java
@@ -108,9 +108,6 @@ public abstract class SerializableLabel<T> implements Label<T> {
CACHE.put(this.getClass(), orderedValueNames);
}
if (stringValueArray.length != orderedValueNames.size()) {
- // Warn
- // LOG.info("str_value: [" + stringValue + "] doesn't match ordered_value_name: [" +
- // StringUtils.join(orderedValueNames, ",") + "]");
return;
}
for (int i = 0; i < orderedValueNames.size(); i++) {
diff --git a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/TenantLabel.java b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/TenantLabel.java
index 9c85a9f..6496183 100644
--- a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/TenantLabel.java
+++ b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/TenantLabel.java
@@ -64,7 +64,8 @@ public class TenantLabel extends GenericLabel
if (stringValue.split(SerializableLabel.VALUE_SEPARATOR).length != 1) {
throw new LabelErrorException(
LabelConstant.LABEL_BUILDER_ERROR_CODE,
- "标签route的值设置错误,只能设置1个值,并且不能使用符号" + VALUE_SEPARATOR);
+ "The value of the label is set incorrectly, only one value can be set, and the symbol cannot be used"
+ + VALUE_SEPARATOR);
}
}
}
diff --git a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/engine/RunType.scala b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/engine/RunType.scala
index 515cb1a..3ff83ba 100644
--- a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/engine/RunType.scala
+++ b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/engine/RunType.scala
@@ -31,6 +31,7 @@ object RunType extends Enumeration {
val SHELL = Value("shell")
val IO_FILE = Value("io_file")
val IO_HDFS = Value("io_hdfs")
+ val FPS = Value("fps")
val PIPELINE = Value("pipeline")
val JDBC = Value("jdbc")
val PRESTO_SQL = Value("psql")
diff --git a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/engine/UserCreatorLabel.java b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/engine/UserCreatorLabel.java
index cf89dac..e91da1a 100644
--- a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/engine/UserCreatorLabel.java
+++ b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/engine/UserCreatorLabel.java
@@ -79,7 +79,9 @@ public class UserCreatorLabel extends GenericLabel implements EngineNodeLabel, U
if (stringValue.split(SerializableLabel.VALUE_SEPARATOR).length != 2) {
throw new LabelErrorException(
LabelConstant.LABEL_BUILDER_ERROR_CODE,
- "标签usercreator的值设置错误,需要2个值,并且需要使用" + VALUE_SEPARATOR + "隔开");
+ "The value of the label is set incorrectly, only one value can be set, and the symbol cannot be used"
+ + VALUE_SEPARATOR
+ + "隔开");
}
}
}
diff --git a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/entrance/RetryWaitTimeOutLabel.java b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/entrance/RetryWaitTimeOutLabel.java
new file mode 100644
index 0000000..2570fa9
--- /dev/null
+++ b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/entrance/RetryWaitTimeOutLabel.java
@@ -0,0 +1,46 @@
+/*
+ * 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.linkis.manager.label.entity.entrance;
+
+import org.apache.linkis.manager.label.constant.LabelKeyConstant;
+import org.apache.linkis.manager.label.entity.GenericLabel;
+import org.apache.linkis.manager.label.entity.annon.ValueSerialNum;
+
+import java.util.HashMap;
+
+public class RetryWaitTimeOutLabel extends GenericLabel implements JobStrategyLabel {
+
+ public RetryWaitTimeOutLabel() {
+ setLabelKey(LabelKeyConstant.RETRY_TIMEOUT_KEY);
+ }
+
+ public Long getJobRetryTimeout() {
+ if (null == getValue()) {
+ return -1L;
+ }
+ return Long.parseLong(getValue().getOrDefault(LabelKeyConstant.RETRY_TIMEOUT_KEY, "-1"));
+ }
+
+ @ValueSerialNum(0)
+ public void setJobRetryTimeout(String timeout) {
+ if (null == getValue()) {
+ setValue(new HashMap<>());
+ }
+ getValue().put(LabelKeyConstant.RETRY_TIMEOUT_KEY, timeout);
+ }
+}
diff --git a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/route/RouteLabel.java b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/route/RouteLabel.java
index 5bd2f12..c611735 100644
--- a/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/route/RouteLabel.java
+++ b/linkis-computation-governance/linkis-manager/label-common/src/main/java/org/apache/linkis/manager/label/entity/route/RouteLabel.java
@@ -49,7 +49,8 @@ public class RouteLabel extends InheritableLabel<String> implements UserModifiab
if (stringValue.split(SerializableLabel.VALUE_SEPARATOR).length != 1) {
throw new LabelErrorException(
LabelConstant.LABEL_BUILDER_ERROR_CODE,
- "标签route的值设置错误,只能设置1个值,并且不能使用符号" + VALUE_SEPARATOR);
+ "The value of the label is set incorrectly, only 1 value can be set, and the symbol cannot be used"
+ + VALUE_SEPARATOR);
}
}
}
diff --git a/linkis-computation-governance/linkis-manager/label-manager/pom.xml b/linkis-computation-governance/linkis-manager/label-manager/pom.xml
index 75bf906..ac3f07d 100644
--- a/linkis-computation-governance/linkis-manager/label-manager/pom.xml
+++ b/linkis-computation-governance/linkis-manager/label-manager/pom.xml
@@ -45,8 +45,9 @@
<dependency>
<groupId>org.apache.linkis</groupId>
- <artifactId>linkis-message-scheduler</artifactId>
+ <artifactId>linkis-rpc</artifactId>
<version>${linkis.version}</version>
+ <scope>provided</scope>
</dependency>
</dependencies>
diff --git a/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/ResourceLabelService.scala b/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/ResourceLabelService.scala
index ef9eb9c..ea1f59e 100644
--- a/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/ResourceLabelService.scala
+++ b/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/ResourceLabelService.scala
@@ -17,6 +17,7 @@
package org.apache.linkis.manager.label.service
+import org.apache.linkis.manager.common.entity.persistence.PersistenceResource
import org.apache.linkis.manager.common.entity.resource.NodeResource
import org.apache.linkis.manager.label.entity.Label
@@ -65,5 +66,7 @@ trait ResourceLabelService {
def removeResourceByLabels(labels: java.util.List[Label[_]]): Unit
+ def getPersistenceResourceByLabel(label: Label[_]): PersistenceResource
+
}
diff --git a/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/impl/DefaultNodeLabelAddService.scala b/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/impl/DefaultNodeLabelAddService.scala
index 8f6d034..95221ff 100644
--- a/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/impl/DefaultNodeLabelAddService.scala
+++ b/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/impl/DefaultNodeLabelAddService.scala
@@ -24,7 +24,7 @@ import org.apache.linkis.manager.common.protocol.label.LabelReportRequest
import org.apache.linkis.manager.label.builder.factory.LabelBuilderFactoryContext
import org.apache.linkis.manager.label.entity.Label
import org.apache.linkis.manager.label.service.{NodeLabelAddService, NodeLabelService}
-import org.apache.linkis.message.annotation.Receiver
+import org.apache.linkis.rpc.serializer.annotation.Receiver
import org.apache.linkis.protocol.label.NodeLabelAddRequest
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
diff --git a/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/impl/DefaultNodeLabelRemoveService.scala b/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/impl/DefaultNodeLabelRemoveService.scala
index 14ed9d6..87a39ff 100644
--- a/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/impl/DefaultNodeLabelRemoveService.scala
+++ b/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/impl/DefaultNodeLabelRemoveService.scala
@@ -24,9 +24,10 @@ import org.apache.linkis.manager.label.entity.em.EMInstanceLabel
import org.apache.linkis.manager.label.entity.engine.EngineInstanceLabel
import org.apache.linkis.manager.label.service.{NodeLabelRemoveService, NodeLabelService}
import org.apache.linkis.manager.persistence.LabelManagerPersistence
-import org.apache.linkis.message.annotation.Receiver
+import org.apache.linkis.rpc.serializer.annotation.Receiver
import org.apache.linkis.protocol.label.NodeLabelRemoveRequest
import org.apache.linkis.manager.label.conf.LabelCommonConfig
+import org.apache.linkis.manager.label.exception.LabelRuntimeException
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
@@ -45,6 +46,9 @@ class DefaultNodeLabelRemoveService extends NodeLabelRemoveService with Logging
@Receiver
override def removeNodeLabel(nodeLabelRemoveRequest: NodeLabelRemoveRequest): Unit = {
info(s"Start to remove labels from node ${nodeLabelRemoveRequest.getServiceInstance}")
+ if(nodeLabelRemoveRequest.getServiceInstance == null) {
+ throw new LabelRuntimeException(130001, "ServiceInstance in request is null, please check label remove request!")
+ }
nodeLabelService.removeLabelsFromNode(nodeLabelRemoveRequest.getServiceInstance)
val persistenceLabel = if (nodeLabelRemoveRequest.isEngine) {
val engineLabel = labelFactory.createLabel(classOf[EngineInstanceLabel])
diff --git a/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/impl/DefaultNodeLabelService.scala b/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/impl/DefaultNodeLabelService.scala
index 85014ab..eeaf1f6 100644
--- a/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/impl/DefaultNodeLabelService.scala
+++ b/linkis-computation-governance/linkis-manager/label-manager/src/main/scala/org/apache/linkis/manager/label/service/impl/DefaultNodeLabelService.scala
@@ -114,9 +114,9 @@ class DefaultNodeLabelService extends NodeLabelService with Logging {
val willBeAdd = newKeyList.diff(oldKeyList)
val willBeUpdate = oldKeyList.diff(willBeDelete)
val modifiableKeyList = LabelUtils.listAllUserModifiableLabel()
- if(!CollectionUtils.isEmpty(willBeDelete)){
- nodeLabels.foreach(nodeLabel => {
- if(modifiableKeyList.contains(nodeLabel.getLabelKey) && willBeDelete.contains(nodeLabel.getLabelKey)){
+ if (!CollectionUtils.isEmpty(willBeDelete)) {
+ nodeLabels.foreach(nodeLabel => {
+ if (modifiableKeyList.contains(nodeLabel.getLabelKey) && willBeDelete.contains(nodeLabel.getLabelKey)) {
... 16969 lines suppressed ...
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@linkis.apache.org
For additional commands, e-mail: commits-help@linkis.apache.org