Repository: ambari Updated Branches: refs/heads/branch-2.5 f4e65c276 -> 711a92dfa
AMBARI-19904. Upgrade: Package Install stuck in Installing state forever. (stoader) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/711a92df Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/711a92df Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/711a92df Branch: refs/heads/branch-2.5 Commit: 711a92dfa60e58d11def0b3fd8888b2d7c1d1e28 Parents: f4e65c2 Author: Toader, Sebastian <stoa...@hortonworks.com> Authored: Fri Feb 10 09:57:35 2017 +0100 Committer: Toader, Sebastian <stoa...@hortonworks.com> Committed: Fri Feb 10 09:58:29 2017 +0100 ---------------------------------------------------------------------- .../server/actionmanager/ActionDBAccessor.java | 5 +- .../actionmanager/ActionDBAccessorImpl.java | 6 +- .../server/actionmanager/ActionScheduler.java | 15 ++--- .../actionmanager/TestActionScheduler.java | 66 +++++++++++++++----- 4 files changed, 67 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/711a92df/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java index 8aef70d..217fe0a 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java @@ -24,6 +24,7 @@ import java.util.Map; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.agent.CommandReport; import org.apache.ambari.server.agent.ExecutionCommand; +import org.apache.ambari.server.orm.entities.HostRoleCommandEntity; import org.apache.ambari.server.orm.entities.RequestEntity; public interface ActionDBAccessor { @@ -58,8 +59,10 @@ public interface ActionDBAccessor { * Abort all outstanding operations associated with the given request. This * method uses the {@link HostRoleStatus#SCHEDULED_STATES} to determine which * {@link HostRoleCommand} instances to abort. + * + * Returns the list of the aborted operations. */ - public void abortOperation(long requestId); + public Collection<HostRoleCommandEntity> abortOperation(long requestId); /** * Mark the task as to have timed out http://git-wip-us.apache.org/repos/asf/ambari/blob/711a92df/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java index 7837a7b..7881a4b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java @@ -202,7 +202,7 @@ public class ActionDBAccessorImpl implements ActionDBAccessor { * {@inheritDoc} */ @Override - public void abortOperation(long requestId) { + public Collection<HostRoleCommandEntity> abortOperation(long requestId) { long now = System.currentTimeMillis(); endRequest(requestId); @@ -226,8 +226,10 @@ public class ActionDBAccessorImpl implements ActionDBAccessor { // no need to merge if there's nothing to merge if (!commands.isEmpty()) { - hostRoleCommandDAO.mergeAll(commands); + return hostRoleCommandDAO.mergeAll(commands); } + + return Collections.emptyList(); } /* (non-Javadoc) http://git-wip-us.apache.org/repos/asf/ambari/blob/711a92df/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java index dabcb98..edf182e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java @@ -907,15 +907,16 @@ class ActionScheduler implements Runnable { ExecutionCommand c = wrapper.getExecutionCommand(); transitionToFailedState(stage.getClusterName(), c.getServiceName(), c.getRole(), hostName, now, true); - if (c.getRoleCommand().equals(RoleCommand.ACTIONEXECUTE)) { - String clusterName = c.getClusterName(); - processActionDeath(clusterName, - c.getHostname(), - c.getRole()); - } } } - db.abortOperation(stage.getRequestId()); + Collection<HostRoleCommandEntity> abortedOperations = db.abortOperation(stage.getRequestId()); + + for (HostRoleCommandEntity command: abortedOperations) { + if (command.getRoleCommand().equals(RoleCommand.ACTIONEXECUTE)) { + String clusterName = stage.getClusterName(); + processActionDeath(clusterName, command.getHostName(), command.getRole().name()); + } + } } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/711a92df/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionScheduler.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionScheduler.java b/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionScheduler.java index 23f8721..5caff7d 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionScheduler.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionScheduler.java @@ -109,6 +109,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.google.common.reflect.TypeToken; import com.google.inject.AbstractModule; @@ -516,10 +517,12 @@ public class TestActionScheduler { } }).when(db).timeoutHostRole(anyString(), anyLong(), anyLong(), anyString(), anyBoolean()); - doAnswer(new Answer<Void>() { + doAnswer(new Answer<Collection<HostRoleCommandEntity>>() { @Override - public Void answer(InvocationOnMock invocation) throws Throwable { + public Collection<HostRoleCommandEntity> answer(InvocationOnMock invocation) throws Throwable { Long requestId = (Long) invocation.getArguments()[0]; + List<HostRoleCommandEntity> abortedCommands = Lists.newArrayList(); + for (Stage stage : stages) { if (requestId.equals(stage.getRequestId())) { for (HostRoleCommand command : stage.getOrderedHostRoleCommands()) { @@ -527,12 +530,17 @@ public class TestActionScheduler { command.getStatus() == HostRoleStatus.IN_PROGRESS || command.getStatus() == HostRoleStatus.PENDING) { command.setStatus(HostRoleStatus.ABORTED); + + HostRoleCommandEntity hostRoleCommandEntity = command.constructNewPersistenceEntity(); + hostRoleCommandEntity.setStage(stage.constructNewPersistenceEntity()); + + abortedCommands.add(hostRoleCommandEntity); } } } } - return null; + return abortedCommands; } }).when(db).abortOperation(anyLong()); @@ -1400,10 +1408,12 @@ public class TestActionScheduler { return null; } }); - doAnswer(new Answer<Void>() { + doAnswer(new Answer<Collection<HostRoleCommandEntity>>() { @Override - public Void answer(InvocationOnMock invocation) throws Throwable { + public Collection<HostRoleCommandEntity> answer(InvocationOnMock invocation) throws Throwable { Long requestId = (Long) invocation.getArguments()[0]; + List<HostRoleCommandEntity> abortedCommands = Lists.newArrayList(); + for (Stage stage : stages) { if (requestId.equals(stage.getRequestId())) { for (HostRoleCommand command : stage.getOrderedHostRoleCommands()) { @@ -1411,12 +1421,17 @@ public class TestActionScheduler { command.getStatus() == HostRoleStatus.IN_PROGRESS || command.getStatus() == HostRoleStatus.PENDING) { command.setStatus(HostRoleStatus.ABORTED); + + HostRoleCommandEntity hostRoleCommandEntity = command.constructNewPersistenceEntity(); + hostRoleCommandEntity.setStage(stage.constructNewPersistenceEntity()); + + abortedCommands.add(hostRoleCommandEntity); } } } } - return null; + return abortedCommands; } }).when(db).abortOperation(anyLong()); @@ -1580,10 +1595,12 @@ public class TestActionScheduler { return null; } }); - doAnswer(new Answer<Void>() { + doAnswer(new Answer<Collection<HostRoleCommandEntity>>() { @Override - public Void answer(InvocationOnMock invocation) throws Throwable { + public Collection<HostRoleCommandEntity> answer(InvocationOnMock invocation) throws Throwable { Long requestId = (Long) invocation.getArguments()[0]; + List<HostRoleCommandEntity> abortedCommands = Lists.newArrayList(); + for (Stage stage : stages) { if (requestId.equals(stage.getRequestId())) { for (HostRoleCommand command : stage.getOrderedHostRoleCommands()) { @@ -1591,12 +1608,17 @@ public class TestActionScheduler { command.getStatus() == HostRoleStatus.IN_PROGRESS || command.getStatus() == HostRoleStatus.PENDING) { command.setStatus(HostRoleStatus.ABORTED); + + HostRoleCommandEntity hostRoleCommandEntity = command.constructNewPersistenceEntity(); + hostRoleCommandEntity.setStage(stage.constructNewPersistenceEntity()); + + abortedCommands.add(hostRoleCommandEntity); } } } } - return null; + return abortedCommands; } }).when(db).abortOperation(anyLong()); @@ -1765,10 +1787,12 @@ public class TestActionScheduler { return null; } }); - doAnswer(new Answer<Void>() { + doAnswer(new Answer<Collection<HostRoleCommandEntity>>() { @Override - public Void answer(InvocationOnMock invocation) throws Throwable { + public Collection<HostRoleCommandEntity> answer(InvocationOnMock invocation) throws Throwable { Long requestId = (Long) invocation.getArguments()[0]; + List<HostRoleCommandEntity> abortedCommands = Lists.newArrayList(); + for (Stage stage : stages) { if (requestId.equals(stage.getRequestId())) { for (HostRoleCommand command : stage.getOrderedHostRoleCommands()) { @@ -1776,12 +1800,17 @@ public class TestActionScheduler { command.getStatus() == HostRoleStatus.IN_PROGRESS || command.getStatus() == HostRoleStatus.PENDING) { command.setStatus(HostRoleStatus.ABORTED); + + HostRoleCommandEntity hostRoleCommandEntity = command.constructNewPersistenceEntity(); + hostRoleCommandEntity.setStage(stage.constructNewPersistenceEntity()); + + abortedCommands.add(hostRoleCommandEntity); } } } } - return null; + return abortedCommands; } }).when(db).abortOperation(anyLong()); @@ -2326,10 +2355,12 @@ public class TestActionScheduler { } }); - doAnswer(new Answer<Void>() { + doAnswer(new Answer<Collection<HostRoleCommandEntity>>() { @Override - public Void answer(InvocationOnMock invocation) throws Throwable { + public Collection<HostRoleCommandEntity> answer(InvocationOnMock invocation) throws Throwable { Long requestId = (Long) invocation.getArguments()[0]; + List<HostRoleCommandEntity> abortedCommands = Lists.newArrayList(); + for (Stage stage : stagesInProgress) { if (requestId.equals(stage.getRequestId())) { for (HostRoleCommand command : stage.getOrderedHostRoleCommands()) { @@ -2337,12 +2368,17 @@ public class TestActionScheduler { command.getStatus() == HostRoleStatus.IN_PROGRESS || command.getStatus() == HostRoleStatus.PENDING) { command.setStatus(HostRoleStatus.ABORTED); + + HostRoleCommandEntity hostRoleCommandEntity = command.constructNewPersistenceEntity(); + hostRoleCommandEntity.setStage(stage.constructNewPersistenceEntity()); + + abortedCommands.add(hostRoleCommandEntity); } } } } - return null; + return abortedCommands; } }).when(db).abortOperation(anyLong());