Repository: ambari Updated Branches: refs/heads/trunk a0ba7fbe7 -> 33caec24a
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/33caec24 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/33caec24 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/33caec24 Branch: refs/heads/trunk Commit: 33caec24a8742666a7190f38f5ebd71c54b2a405 Parents: a0ba7fb Author: Toader, Sebastian <stoa...@hortonworks.com> Authored: Fri Feb 10 18:38:37 2017 +0100 Committer: Toader, Sebastian <stoa...@hortonworks.com> Committed: Fri Feb 10 18:38:37 2017 +0100 ---------------------------------------------------------------------- .../server/actionmanager/ActionDBAccessor.java | 5 +- .../actionmanager/ActionDBAccessorImpl.java | 6 +- .../server/actionmanager/ActionScheduler.java | 15 ++--- .../actionmanager/TestActionScheduler.java | 65 +++++++++++++++----- 4 files changed, 66 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/33caec24/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/33caec24/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/33caec24/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 fa2ad4f..680c0a6 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 @@ -929,15 +929,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/33caec24/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 653ad2c..6519126 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; @@ -508,10 +509,11 @@ public class TestActionScheduler { when(db.getCommandsInProgressCount()).thenReturn(stages.size()); when(db.getStagesInProgress()).thenReturn(stages); - 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()[1]; + List<HostRoleCommandEntity> abortedCommands = Lists.newArrayList(); for (Stage stage : stages) { if (requestId.equals(stage.getRequestId())) { for (HostRoleCommand command : stage.getOrderedHostRoleCommands()) { @@ -519,12 +521,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).abortHostRole(anyString(), anyLong(), anyLong(), anyString(), anyString()); @@ -1390,10 +1397,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()) { @@ -1401,12 +1410,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()); @@ -1570,10 +1584,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()) { @@ -1581,12 +1597,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()); @@ -1755,10 +1776,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()) { @@ -1766,12 +1789,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()); @@ -2316,10 +2344,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()) { @@ -2327,12 +2357,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());