From 0e5873ca051f118898dc339d34b2c863ce098465 Mon Sep 17 00:00:00 2001 From: luter Date: Tue, 23 Mar 2021 22:13:28 +0800 Subject: [PATCH] =?UTF-8?q?getWorkerInfoByAddress=20NPE=20=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=9A=84=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worker/WorkerClusterQueryService.java | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/worker/WorkerClusterQueryService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/worker/WorkerClusterQueryService.java index 5cb48004..da555c0b 100644 --- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/worker/WorkerClusterQueryService.java +++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/worker/WorkerClusterQueryService.java @@ -1,14 +1,14 @@ package tech.powerjob.server.remote.worker; +import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import tech.powerjob.common.model.DeployedContainerInfo; import tech.powerjob.server.common.module.WorkerInfo; import tech.powerjob.server.extension.WorkerFilter; import tech.powerjob.server.persistence.remote.model.JobInfoDO; import tech.powerjob.server.remote.server.redirector.DesignateServer; -import com.google.common.collect.Lists; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; @@ -34,6 +34,7 @@ public class WorkerClusterQueryService { /** * get worker for job + * * @param jobInfo job * @return worker cluster info, sorted by metrics desc */ @@ -44,7 +45,7 @@ public class WorkerClusterQueryService { workers.removeIf(workerInfo -> filterWorker(workerInfo, jobInfo)); // 按健康度排序 - workers.sort((o1, o2) -> o2 .getSystemMetrics().calculateScore() - o1.getSystemMetrics().calculateScore()); + workers.sort((o1, o2) -> o2.getSystemMetrics().calculateScore() - o1.getSystemMetrics().calculateScore()); // 限定集群大小(0代表不限制) if (!workers.isEmpty() && jobInfo.getMaxWorkerCount() > 0 && workers.size() > jobInfo.getMaxWorkerCount()) { @@ -56,12 +57,13 @@ public class WorkerClusterQueryService { @DesignateServer public List getAllWorkers(Long appId) { List workers = Lists.newLinkedList(getWorkerInfosByAppId(appId).values()); - workers.sort((o1, o2) -> o2 .getSystemMetrics().calculateScore() - o1.getSystemMetrics().calculateScore()); + workers.sort((o1, o2) -> o2.getSystemMetrics().calculateScore() - o1.getSystemMetrics().calculateScore()); return workers; } /** * get all alive workers + * * @param appId appId * @return alive workers */ @@ -71,8 +73,22 @@ public class WorkerClusterQueryService { return workers; } + /** + * Gets worker info by address. + * + * @param appId the app id + * @param address the address + * @return the worker info by address + */ public Optional getWorkerInfoByAddress(Long appId, String address) { - return Optional.ofNullable(getWorkerInfosByAppId(appId).get(address)); + // this may cause NPE while address value is null . + //return Optional.ofNullable(getWorkerInfosByAppId(appId).get(address)); + final Map workerInfosByAppId = getWorkerInfosByAppId(appId); + //add null check for both workerInfos Map and address + if (null != workerInfosByAppId && null != address) { + return Optional.ofNullable(workerInfosByAppId.get(address)); + } + return Optional.empty(); } public Map getAppId2ClusterStatus() { @@ -81,7 +97,8 @@ public class WorkerClusterQueryService { /** * 获取某个应用容器的部署情况 - * @param appId 应用ID + * + * @param appId 应用ID * @param containerId 容器ID * @return 部署情况 */ @@ -104,8 +121,9 @@ public class WorkerClusterQueryService { /** * filter invalid worker for job + * * @param workerInfo worker info - * @param jobInfo job info + * @param jobInfo job info * @return filter this worker when return true */ private boolean filterWorker(WorkerInfo workerInfo, JobInfoDO jobInfo) {