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 bcef869017..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,8 +172,18 @@ public NodeRole selfNodeRole() { return this.globalNodeInfo.nodeRole(); } - public boolean selfIsMaster() { - return this.selfNodeRole() != null && this.selfNodeRole().master(); + public boolean selfIsMasterOrSingleComputer() { + boolean isMaster=this.selfNodeRole() != null && this.selfNodeRole().master(); + boolean isSingleComputer=isStandAloneComputer(); + return isMaster||isSingleComputer; + } + + public boolean selfIsComputer() { + return this.selfNodeRole() != null && this.selfNodeRole().computer(); + } + + public boolean isStandAloneComputer(){ + return this.onlySingleNode() && this.selfIsComputer(); } public boolean onlySingleNode() { @@ -198,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; @@ -228,6 +238,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 1395888611..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, @@ -312,7 +312,7 @@ protected synchronized void scheduleTasksOnMaster() { continue; } - if (!this.serverManager.selfIsMaster()) { + if (!this.serverManager.selfIsMasterOrSingleComputer()) { return; } @@ -720,7 +720,7 @@ public V call(Callable callable) { } private void checkOnMasterNode(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/TaskManager.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/TaskManager.java index f8e5602048..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 @@ -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 @@ -446,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