From 3e964a06c04c24eb95171b4071ef6de959af3b1f Mon Sep 17 00:00:00 2001 From: shirley118146 Date: Sat, 12 Oct 2024 00:31:35 +0800 Subject: [PATCH 1/3] support computer do schedule Signed-off-by: shirley118146 --- .../org/apache/hugegraph/task/ServerInfoManager.java | 12 +++++++++++- .../apache/hugegraph/task/StandardTaskScheduler.java | 1 + .../org/apache/hugegraph/type/define/NodeRole.java | 6 ++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/ServerInfoManager.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/ServerInfoManager.java index bcef869017..e865263b6d 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/ServerInfoManager.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/ServerInfoManager.java @@ -173,7 +173,17 @@ public NodeRole selfNodeRole() { } public boolean selfIsMaster() { - return this.selfNodeRole() != null && this.selfNodeRole().master(); + //return this.selfNodeRole() != null && this.selfNodeRole().master(); + return true; + } + + public boolean selfIsComputer() { + return this.selfNodeRole() != null && this.selfNodeRole().computer(); + } + + public boolean isStandAloneComputer(){ + //return this.onlySingleNode() && this.selfIsComputer(); + return true; } public boolean onlySingleNode() { diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/StandardTaskScheduler.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/StandardTaskScheduler.java index 1395888611..80089744f4 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/StandardTaskScheduler.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/StandardTaskScheduler.java @@ -720,6 +720,7 @@ public V call(Callable callable) { } private void checkOnMasterNode(String op) { + LOG.info("[test]checkOnMasterNode {}", this.serverManager().onlySingleNode()); if (!this.serverManager().selfIsMaster()) { throw new HugeException("Can't %s task on non-master server", op); } diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/NodeRole.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/NodeRole.java index de2b92cc48..9530447cfa 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/NodeRole.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/NodeRole.java @@ -48,7 +48,8 @@ public String string() { } public boolean master() { - return this == MASTER; + // return this == MASTER; + return true; } public boolean worker() { @@ -56,6 +57,7 @@ public boolean worker() { } public boolean computer() { - return this == COMPUTER; + // return this == COMPUTER; + return false; } } From 9159a49e5544e4bc18e0fbbeebba692372bd2c89 Mon Sep 17 00:00:00 2001 From: shirley118146 Date: Sat, 12 Oct 2024 01:38:36 +0800 Subject: [PATCH 2/3] update single node Signed-off-by: shirley118146 --- .../hugegraph/task/ServerInfoManager.java | 36 ++++++++++++++++--- .../hugegraph/task/StandardTaskScheduler.java | 1 + .../apache/hugegraph/task/TaskManager.java | 1 + .../hugegraph/type/define/NodeRole.java | 6 ++-- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/ServerInfoManager.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/ServerInfoManager.java index e865263b6d..5db0d9190b 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/ServerInfoManager.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/ServerInfoManager.java @@ -173,8 +173,11 @@ public NodeRole selfNodeRole() { } public boolean selfIsMaster() { - //return this.selfNodeRole() != null && this.selfNodeRole().master(); - return true; + boolean isMaster=this.selfNodeRole() != null && this.selfNodeRole().master(); + boolean isSingleComputer=isStandAloneComputer(); + + return isMaster||isSingleComputer; + //return true; } public boolean selfIsComputer() { @@ -182,8 +185,7 @@ public boolean selfIsComputer() { } public boolean isStandAloneComputer(){ - //return this.onlySingleNode() && this.selfIsComputer(); - return true; + return this.onlySingleNode() && this.selfIsComputer(); } public boolean onlySingleNode() { @@ -238,6 +240,32 @@ protected boolean graphIsReady() { return !this.closed && this.graph.started() && this.graph.initialized(); } + protected synchronized void updateIsSingleNode(){ + Collection servers=this.allServerInfos(); + boolean hasWorkerNode = false; + long now = DateUtil.now().getTime(); + int computerNodeCount=0; + + // Iterate servers to find suitable one + for (HugeServerInfo server : servers) { + if (!server.alive()) { + continue; + } + if (server.role().master()) { + continue; + }else if (server.role().computer()){ + computerNodeCount++; + } + hasWorkerNode = true; + } + + boolean singleNode = !hasWorkerNode||computerNodeCount==1; + if (singleNode != this.onlySingleNode) { + LOG.info("Switch only_single_node 02 to {}", singleNode); + this.onlySingleNode = singleNode; + } + } + protected synchronized HugeServerInfo pickWorkerNode(Collection servers, HugeTask task) { HugeServerInfo master = null; diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/StandardTaskScheduler.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/StandardTaskScheduler.java index 80089744f4..95b40c8852 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/StandardTaskScheduler.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/StandardTaskScheduler.java @@ -299,6 +299,7 @@ public ServerInfoManager serverManager() { return this.serverManager; } + protected synchronized void scheduleTasksOnMaster() { // Master server schedule all scheduling tasks to suitable worker nodes Collection serverInfos = this.serverManager().allServerInfos(); diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/TaskManager.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/TaskManager.java index f8e5602048..9075ef3f26 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/TaskManager.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/TaskManager.java @@ -439,6 +439,7 @@ private void scheduleOrExecuteJobForGraph(TaskScheduler scheduler) { // Update server heartbeat serverManager.heartbeat(); + serverManager.updateIsSingleNode(); /* * Master will schedule tasks to suitable servers. * Note a Worker may become to a Master, so elected-Master also needs to diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/NodeRole.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/NodeRole.java index 9530447cfa..c9b07d5f37 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/NodeRole.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/NodeRole.java @@ -48,8 +48,7 @@ public String string() { } public boolean master() { - // return this == MASTER; - return true; + return this == MASTER; } public boolean worker() { @@ -57,7 +56,6 @@ public boolean worker() { } public boolean computer() { - // return this == COMPUTER; - return false; + return this == COMPUTER; } } From 62a21f48b6006ed8e3fb36428a202c98d01fef47 Mon Sep 17 00:00:00 2001 From: shirley118146 Date: Sat, 12 Oct 2024 01:44:28 +0800 Subject: [PATCH 3/3] code format Signed-off-by: shirley118146 --- .../apache/hugegraph/task/DistributedTaskScheduler.java | 2 +- .../java/org/apache/hugegraph/task/ServerInfoManager.java | 6 ++---- .../org/apache/hugegraph/task/StandardTaskScheduler.java | 8 +++----- .../main/java/org/apache/hugegraph/task/TaskManager.java | 2 +- .../java/org/apache/hugegraph/type/define/NodeRole.java | 2 +- 5 files changed, 8 insertions(+), 12 deletions(-) diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/DistributedTaskScheduler.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/DistributedTaskScheduler.java index 677314ca79..f904bf3134 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/DistributedTaskScheduler.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/DistributedTaskScheduler.java @@ -441,7 +441,7 @@ public void waitUntilAllTasksCompleted(long seconds) @Override public void checkRequirement(String op) { - if (!this.serverManager().selfIsMaster()) { + if (!this.serverManager().selfIsMasterOrSingleComputer()) { throw new HugeException("Can't %s task on non-master server", op); } } diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/ServerInfoManager.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/ServerInfoManager.java index 5db0d9190b..e72d5a816e 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/ServerInfoManager.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/ServerInfoManager.java @@ -172,12 +172,10 @@ public NodeRole selfNodeRole() { return this.globalNodeInfo.nodeRole(); } - public boolean selfIsMaster() { + public boolean selfIsMasterOrSingleComputer() { boolean isMaster=this.selfNodeRole() != null && this.selfNodeRole().master(); boolean isSingleComputer=isStandAloneComputer(); - return isMaster||isSingleComputer; - //return true; } public boolean selfIsComputer() { @@ -210,7 +208,7 @@ public synchronized void heartbeat() { LOG.info("ServerInfo is missing: {}, may not be initialized yet", this.selfNodeId()); return; } - if (this.selfIsMaster()) { + if (this.selfIsMasterOrSingleComputer()) { // On the master node, just wait for ServerInfo re-init LOG.warn("ServerInfo is missing: {}, may be cleared before", this.selfNodeId()); return; diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/StandardTaskScheduler.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/StandardTaskScheduler.java index 95b40c8852..1d30b88797 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/StandardTaskScheduler.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/StandardTaskScheduler.java @@ -273,7 +273,7 @@ public synchronized void cancel(HugeTask task) { // The task scheduled to workers, let the worker node to cancel this.save(task); assert task.server() != null : task; - assert this.serverManager().selfIsMaster(); + assert this.serverManager().selfIsMasterOrSingleComputer(); if (!task.server().equals(this.serverManager().selfNodeId())) { /* * Remove the task from memory if it's running on worker node, @@ -299,7 +299,6 @@ public ServerInfoManager serverManager() { return this.serverManager; } - protected synchronized void scheduleTasksOnMaster() { // Master server schedule all scheduling tasks to suitable worker nodes Collection serverInfos = this.serverManager().allServerInfos(); @@ -313,7 +312,7 @@ protected synchronized void scheduleTasksOnMaster() { continue; } - if (!this.serverManager.selfIsMaster()) { + if (!this.serverManager.selfIsMasterOrSingleComputer()) { return; } @@ -721,8 +720,7 @@ public V call(Callable callable) { } private void checkOnMasterNode(String op) { - LOG.info("[test]checkOnMasterNode {}", this.serverManager().onlySingleNode()); - if (!this.serverManager().selfIsMaster()) { + if (!this.serverManager().selfIsMasterOrSingleComputer()) { throw new HugeException("Can't %s task on non-master server", op); } } diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/TaskManager.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/TaskManager.java index 9075ef3f26..d17c79466b 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/TaskManager.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/TaskManager.java @@ -447,7 +447,7 @@ private void scheduleOrExecuteJobForGraph(TaskScheduler scheduler) { * However, when enableRoleElected=false, a Master is only set by the * config assignment, assigned-Master always stays the same state. */ - if (serverManager.selfIsMaster()) { + if (serverManager.selfIsMasterOrSingleComputer()) { standardTaskScheduler.scheduleTasksOnMaster(); if (!this.enableRoleElected && !serverManager.onlySingleNode()) { // assigned-Master + non-single-node don't need to execute tasks diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/NodeRole.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/NodeRole.java index c9b07d5f37..de2b92cc48 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/NodeRole.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/NodeRole.java @@ -56,6 +56,6 @@ public boolean worker() { } public boolean computer() { - return this == COMPUTER; + return this == COMPUTER; } }