This is an automated email from the ASF dual-hosted git repository.
zhouky pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-celeborn.git
The following commit(s) were added to refs/heads/main by this push:
new 7e9ba19d [CELEBORN-302] Fix workers count out of sync in HA mode.
(#1239)
7e9ba19d is described below
commit 7e9ba19d583ebc8e89abee72a2622154ffc4152a
Author: Ethan Feng <[email protected]>
AuthorDate: Mon Feb 20 21:46:33 2023 +0800
[CELEBORN-302] Fix workers count out of sync in HA mode. (#1239)
---
.../apache/celeborn/common/meta/WorkerInfo.scala | 18 ++++++------
.../master/clustermeta/AbstractMetaManager.java | 13 +++++++--
.../celeborn/service/deploy/master/Master.scala | 32 ++++++++++++----------
3 files changed, 38 insertions(+), 25 deletions(-)
diff --git
a/common/src/main/scala/org/apache/celeborn/common/meta/WorkerInfo.scala
b/common/src/main/scala/org/apache/celeborn/common/meta/WorkerInfo.scala
index dca13b13..eabe9ae2 100644
--- a/common/src/main/scala/org/apache/celeborn/common/meta/WorkerInfo.scala
+++ b/common/src/main/scala/org/apache/celeborn/common/meta/WorkerInfo.scala
@@ -259,17 +259,19 @@ class WorkerInfo(
|""".stripMargin
}
- override def equals(obj: Any): Boolean = {
- val other = obj.asInstanceOf[WorkerInfo]
- host == other.host &&
- rpcPort == other.rpcPort &&
- pushPort == other.pushPort &&
- fetchPort == other.fetchPort &&
- replicatePort == other.replicatePort
+ override def equals(other: Any): Boolean = other match {
+ case that: WorkerInfo =>
+ host == that.host &&
+ rpcPort == that.rpcPort &&
+ pushPort == that.pushPort &&
+ fetchPort == that.fetchPort &&
+ replicatePort == that.replicatePort
+ case _ => false
}
override def hashCode(): Int = {
- Objects.hashCode(host, rpcPort, pushPort, fetchPort, replicatePort)
+ val state = Seq(host, rpcPort, pushPort, fetchPort, replicatePort)
+ state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b)
}
}
diff --git
a/master/src/main/java/org/apache/celeborn/service/deploy/master/clustermeta/AbstractMetaManager.java
b/master/src/main/java/org/apache/celeborn/service/deploy/master/clustermeta/AbstractMetaManager.java
index 75f18c26..19c3ce67 100644
---
a/master/src/main/java/org/apache/celeborn/service/deploy/master/clustermeta/AbstractMetaManager.java
+++
b/master/src/main/java/org/apache/celeborn/service/deploy/master/clustermeta/AbstractMetaManager.java
@@ -227,13 +227,20 @@ public abstract class AbstractMetaManager implements
IMetadataHandler {
try {
workerInfo.setupEndpoint(rpcEnv.setupEndpointRef(RpcAddress.apply(host,
rpcPort), WORKER_EP));
} catch (Exception e) {
- LOG.error("Worker register failed", e);
- return;
+ LOG.warn("Worker register setupEndpoint failed {}, will retry", e);
+ try {
+ workerInfo.setupEndpoint(
+ rpcEnv.setupEndpointRef(RpcAddress.apply(host, rpcPort),
WORKER_EP));
+ } catch (Exception e1) {
+ workerInfo.setupEndpoint(null);
+ }
}
workerInfo.updateDiskMaxSlots(estimatedPartitionSize);
synchronized (workers) {
- workers.add(workerInfo);
+ if (!workers.contains(workerInfo)) {
+ workers.add(workerInfo);
+ }
}
}
diff --git
a/master/src/main/scala/org/apache/celeborn/service/deploy/master/Master.scala
b/master/src/main/scala/org/apache/celeborn/service/deploy/master/Master.scala
index 0e1a7453..79603a31 100644
---
a/master/src/main/scala/org/apache/celeborn/service/deploy/master/Master.scala
+++
b/master/src/main/scala/org/apache/celeborn/service/deploy/master/Master.scala
@@ -751,32 +751,36 @@ private[celeborn] class Master(
private def requestGetWorkerInfos(endpoint: RpcEndpointRef):
GetWorkerInfosResponse = {
try {
- endpoint.askSync[GetWorkerInfosResponse](GetWorkerInfos)
+ if (endpoint != null) {
+ return endpoint.askSync[GetWorkerInfosResponse](GetWorkerInfos)
+ }
} catch {
case e: Exception =>
logError(s"AskSync GetWorkerInfos failed.", e)
- val result = new util.ArrayList[WorkerInfo]
- result.add(new WorkerInfo(
- "unknown",
- -1,
- -1,
- -1,
- -1,
- new util.HashMap[String, DiskInfo](),
- new ConcurrentHashMap[UserIdentifier, ResourceConsumption](),
- null))
- GetWorkerInfosResponse(StatusCode.REQUEST_FAILED, result.asScala: _*)
}
+ val result = new util.ArrayList[WorkerInfo]
+ result.add(new WorkerInfo(
+ "unknown",
+ -1,
+ -1,
+ -1,
+ -1,
+ new util.HashMap[String, DiskInfo](),
+ new ConcurrentHashMap[UserIdentifier, ResourceConsumption](),
+ null))
+ GetWorkerInfosResponse(StatusCode.REQUEST_FAILED, result.asScala: _*)
}
private def requestThreadDump(endpoint: RpcEndpointRef): ThreadDumpResponse
= {
try {
- endpoint.askSync[ThreadDumpResponse](ThreadDump)
+ if (endpoint != null) {
+ return endpoint.askSync[ThreadDumpResponse](ThreadDump)
+ }
} catch {
case e: Exception =>
logError(s"AskSync ThreadDump failed.", e)
- ThreadDumpResponse("Unknown")
}
+ ThreadDumpResponse("Unknown")
}
private def isMasterActive: Int = {