AMBARI-10169. Full Delete of Host : Switch host_version and host_role_command tables to use host_id instead of host_name column (alejandro)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/ee79dd21 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/ee79dd21 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/ee79dd21 Branch: refs/heads/trunk Commit: ee79dd21cca51646e3344c161ea61bc2e68f21fb Parents: 8102135 Author: Alejandro Fernandez <[email protected]> Authored: Wed Apr 15 17:00:18 2015 -0700 Committer: Alejandro Fernandez <[email protected]> Committed: Sat Apr 18 16:18:05 2015 -0700 ---------------------------------------------------------------------- .../actionmanager/ActionDBAccessorImpl.java | 2 +- .../server/actionmanager/HostRoleCommand.java | 60 +++-- .../actionmanager/HostRoleCommandFactory.java | 30 +++ .../HostRoleCommandFactoryImpl.java | 48 +++- .../ambari/server/actionmanager/Stage.java | 24 +- .../server/actionmanager/StageFactoryImpl.java | 81 ++++++ .../controller/AmbariManagementController.java | 8 + .../AmbariManagementControllerImpl.java | 14 +- .../server/controller/ControllerModule.java | 12 +- .../server/controller/KerberosHelper.java | 20 +- .../ClusterStackVersionResourceProvider.java | 26 +- .../internal/UpgradeResourceProvider.java | 4 +- .../upgrade/HostVersionOutOfSyncListener.java | 5 +- .../ambari/server/orm/DBAccessorImpl.java | 17 +- .../server/orm/dao/HostRoleCommandDAO.java | 10 +- .../ambari/server/orm/entities/HostEntity.java | 2 +- .../orm/entities/HostRoleCommandEntity.java | 26 +- .../server/orm/entities/HostVersionEntity.java | 81 ++---- .../ambari/server/stageplanner/RoleGraph.java | 19 +- .../server/stageplanner/RoleGraphFactory.java | 35 +++ .../stageplanner/RoleGraphFactoryImpl.java | 54 ++++ .../server/state/cluster/ClusterImpl.java | 15 +- .../server/upgrade/UpgradeCatalog210.java | 63 ++++- .../apache/ambari/server/utils/StageUtils.java | 14 +- .../main/resources/Ambari-DDL-MySQL-CREATE.sql | 13 +- .../main/resources/Ambari-DDL-Oracle-CREATE.sql | 13 +- .../resources/Ambari-DDL-Postgres-CREATE.sql | 13 +- .../Ambari-DDL-Postgres-EMBEDDED-CREATE.sql | 13 +- .../resources/Ambari-DDL-SQLServer-CREATE.sql | 11 +- .../ExecutionCommandWrapperTest.java | 98 +++---- .../ambari/server/actionmanager/StageTest.java | 19 +- .../actionmanager/TestActionDBAccessorImpl.java | 14 +- .../server/actionmanager/TestActionManager.java | 5 +- .../actionmanager/TestActionScheduler.java | 64 +++-- .../ambari/server/actionmanager/TestStage.java | 26 +- .../ambari/server/agent/AgentResourceTest.java | 4 +- .../server/agent/TestHeartbeatHandler.java | 263 +++++++------------ .../AmbariCustomCommandExecutionHelperTest.java | 7 +- .../AmbariManagementControllerTest.java | 15 +- .../server/controller/KerberosHelperTest.java | 20 +- .../internal/CalculatedStatusTest.java | 32 ++- ...ClusterStackVersionResourceProviderTest.java | 60 ++++- .../apache/ambari/server/orm/OrmTestHelper.java | 10 +- .../server/orm/dao/HostVersionDAOTest.java | 48 ++-- .../ambari/server/orm/dao/RequestDAOTest.java | 2 +- .../serveraction/ServerActionExecutorTest.java | 74 ++++-- .../upgrades/UpgradeActionTest.java | 90 +++---- .../server/stageplanner/TestStagePlanner.java | 15 +- .../server/state/cluster/ClusterTest.java | 3 +- .../ambari/server/upgrade/UpgradeTest.java | 9 - 50 files changed, 1040 insertions(+), 571 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/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 7447a2d..8444862 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 @@ -268,7 +268,7 @@ public class ActionDBAccessorImpl implements ActionDBAccessor { LOG.error(msg); throw new AmbariException(msg); } - hostRoleCommandEntity.setHost(hostEntity); + hostRoleCommandEntity.setHostEntity(hostEntity); hostRoleCommandDAO.create(hostRoleCommandEntity); assert hostRoleCommandEntity.getTaskId() != null; http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java index f37e937..662a545 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java @@ -17,10 +17,13 @@ */ package org.apache.ambari.server.actionmanager; +import com.google.inject.Inject; import org.apache.ambari.server.Role; import org.apache.ambari.server.RoleCommand; import org.apache.ambari.server.orm.dao.ExecutionCommandDAO; +import org.apache.ambari.server.orm.dao.HostDAO; import org.apache.ambari.server.orm.entities.ExecutionCommandEntity; +import org.apache.ambari.server.orm.entities.HostEntity; import org.apache.ambari.server.orm.entities.HostRoleCommandEntity; import org.apache.ambari.server.state.ServiceComponentHostEvent; @@ -40,7 +43,7 @@ public class HostRoleCommand { private long taskId = -1; private long stageId = -1; private long requestId = -1; - private String hostName; + private HostEntity hostEntity; private HostRoleStatus status = HostRoleStatus.PENDING; private String stdout = ""; private String stderr = ""; @@ -57,28 +60,58 @@ public class HostRoleCommand { private String commandDetail; private String customCommandName; private ExecutionCommandWrapper executionCommandWrapper; + + @Inject private ExecutionCommandDAO executionCommandDAO; - public HostRoleCommand(String host, Role role, - ServiceComponentHostEvent event, RoleCommand command) { - this(host, role, event, command, false); - } + @Inject + private HostDAO hostDAO; + + /** + * Simple constructor, should be created using the Factory class. + * @param hostName Host name + * @param role Action to run + * @param event Event on the host and component + * @param command Type of command + * @param hostDAO {@link org.apache.ambari.server.orm.dao.HostDAO} instance being injected + */ + @AssistedInject + public HostRoleCommand(String hostName, Role role, + ServiceComponentHostEvent event, RoleCommand command, HostDAO hostDAO, ExecutionCommandDAO executionCommandDAO) { + this(hostName, role, event, command, false, hostDAO, executionCommandDAO); + } + + /** + * Simple constructor, should be created using the Factory class. + * @param hostName Host name + * @param role Action to run + * @param event Event on the host and component + * @param command Type of command + * @param retryAllowed Whether the command can be repeated + * @param hostDAO {@link org.apache.ambari.server.orm.dao.HostDAO} instance being injected + */ + @AssistedInject + public HostRoleCommand(String hostName, Role role, + ServiceComponentHostEvent event, RoleCommand command, boolean retryAllowed, HostDAO hostDAO, ExecutionCommandDAO executionCommandDAO) { + this.hostDAO = hostDAO; + this.executionCommandDAO = executionCommandDAO; - public HostRoleCommand(String host, Role role, - ServiceComponentHostEvent event, RoleCommand command, boolean retryAllowed) { - this.hostName = host; this.role = role; this.event = new ServiceComponentHostEventWrapper(event); this.roleCommand = command; this.retryAllowed = retryAllowed; + this.hostEntity = this.hostDAO.findByName(hostName); } @AssistedInject - public HostRoleCommand(@Assisted HostRoleCommandEntity hostRoleCommandEntity, Injector injector) { + public HostRoleCommand(@Assisted HostRoleCommandEntity hostRoleCommandEntity, HostDAO hostDAO, ExecutionCommandDAO executionCommandDAO) { + this.hostDAO = hostDAO; + this.executionCommandDAO = executionCommandDAO; + taskId = hostRoleCommandEntity.getTaskId(); stageId = hostRoleCommandEntity.getStage().getStageId(); requestId = hostRoleCommandEntity.getStage().getRequestId(); - this.hostName = hostRoleCommandEntity.getHostName(); + this.hostEntity = hostRoleCommandEntity.getHostEntity(); role = hostRoleCommandEntity.getRole(); status = hostRoleCommandEntity.getStatus(); stdout = hostRoleCommandEntity.getStdOut() != null ? new String(hostRoleCommandEntity.getStdOut()) : ""; @@ -96,14 +129,11 @@ public class HostRoleCommand { event = new ServiceComponentHostEventWrapper(hostRoleCommandEntity.getEvent()); commandDetail = hostRoleCommandEntity.getCommandDetail(); customCommandName = hostRoleCommandEntity.getCustomCommandName(); - //make use of lazy loading - - executionCommandDAO = injector.getInstance(ExecutionCommandDAO.class); } HostRoleCommandEntity constructNewPersistenceEntity() { HostRoleCommandEntity hostRoleCommandEntity = new HostRoleCommandEntity(); - hostRoleCommandEntity.setHostName(hostName); + hostRoleCommandEntity.setHostEntity(hostEntity); hostRoleCommandEntity.setRole(role); hostRoleCommandEntity.setStatus(status); hostRoleCommandEntity.setStdError(stderr.getBytes()); @@ -145,7 +175,7 @@ public class HostRoleCommand { } public String getHostName() { - return hostName; + return hostEntity != null ? hostEntity.getHostName() : null; } public Role getRole() { http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactory.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactory.java index 1126666..0c92526 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactory.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactory.java @@ -18,8 +18,38 @@ package org.apache.ambari.server.actionmanager; +import org.apache.ambari.server.Role; +import org.apache.ambari.server.RoleCommand; import org.apache.ambari.server.orm.entities.HostRoleCommandEntity; +import org.apache.ambari.server.state.ServiceComponentHostEvent; public interface HostRoleCommandFactory { + + /** + * Constructor via factory. + * @param hostName Host name + * @param role Action to run + * @param event Event on the host and component + * @param command Type of command + * @return An instance constructed where retryAllowed defaults to false + */ + HostRoleCommand create(String hostName, Role role, ServiceComponentHostEvent event, RoleCommand command); + + /** + * Constructor via factory. + * @param hostName Host name + * @param role Action to run + * @param event Event on the host and component + * @param command Type of command + * @param retryAllowed Whether the command can be repeated + * @return An instance of a HostRoleCommand. + */ + HostRoleCommand create(String hostName, Role role, ServiceComponentHostEvent event, RoleCommand command, boolean retryAllowed); + + /** + * Constructor via factory + * @param hostRoleCommandEntity Object to copy fields from. + * @return An instance constructed from the input object. + */ HostRoleCommand createExisting(HostRoleCommandEntity hostRoleCommandEntity); } http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactoryImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactoryImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactoryImpl.java index b63adfa..653da89 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactoryImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactoryImpl.java @@ -21,10 +21,16 @@ package org.apache.ambari.server.actionmanager; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Singleton; +import org.apache.ambari.server.Role; +import org.apache.ambari.server.RoleCommand; +import org.apache.ambari.server.orm.dao.ExecutionCommandDAO; +import org.apache.ambari.server.orm.dao.HostDAO; import org.apache.ambari.server.orm.entities.HostRoleCommandEntity; +import org.apache.ambari.server.state.ServiceComponentHostEvent; @Singleton public class HostRoleCommandFactoryImpl implements HostRoleCommandFactory { + private Injector injector; @Inject @@ -32,8 +38,48 @@ public class HostRoleCommandFactoryImpl implements HostRoleCommandFactory { this.injector = injector; } + /** + * Constructor via factory. + * @param hostName Host name + * @param role Action to run + * @param event Event on the host and component + * @param command Type of command + * @return An instance constructed where retryAllowed defaults to false + */ + @Override + public HostRoleCommand create(String hostName, Role role, + ServiceComponentHostEvent event, RoleCommand command) { + return new HostRoleCommand(hostName, role, event, command, + this.injector.getInstance(HostDAO.class), + this.injector.getInstance(ExecutionCommandDAO.class)); + } + + /** + * Constructor via factory. + * @param hostName Host name + * @param role Action to run + * @param event Event on the host and component + * @param command Type of command + * @param retryAllowed Whether the command can be repeated + * @return An instance of a HostRoleCommand. + */ + @Override + public HostRoleCommand create(String hostName, Role role, + ServiceComponentHostEvent event, RoleCommand command, boolean retryAllowed) { + return new HostRoleCommand(hostName, role, event, command, retryAllowed, + this.injector.getInstance(HostDAO.class), + this.injector.getInstance(ExecutionCommandDAO.class)); + } + + /** + * Constructor via factory + * @param hostRoleCommandEntity Object to copy fields from. + * @return An instance constructed from the input object. + */ @Override public HostRoleCommand createExisting(HostRoleCommandEntity hostRoleCommandEntity) { - return new HostRoleCommand(hostRoleCommandEntity, injector); + return new HostRoleCommand(hostRoleCommandEntity, + this.injector.getInstance(HostDAO.class), + this.injector.getInstance(ExecutionCommandDAO.class)); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java index 51d5e8a..03b3648 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java @@ -28,6 +28,7 @@ import java.util.TreeMap; import javax.annotation.Nullable; +import com.google.inject.Inject; import org.apache.ambari.server.Role; import org.apache.ambari.server.RoleCommand; import org.apache.ambari.server.agent.AgentCommand.AgentCommandType; @@ -80,6 +81,15 @@ public class Stage { private Map<String, List<ExecutionCommandWrapper>> commandsToSend = new TreeMap<String, List<ExecutionCommandWrapper>>(); + @Inject + private HostRoleCommandFactory hostRoleCommandFactory; + + @Inject + private HostRoleCommandDAO hostRoleCommandDAO; + + @Inject + private ActionDBAccessor dbAccessor; + @AssistedInject public Stage(@Assisted long requestId, @Assisted("logDir") String logDir, @@ -88,7 +98,8 @@ public class Stage { @Assisted("requestContext") @Nullable String requestContext, @Assisted("clusterHostInfo") String clusterHostInfo, @Assisted("commandParamsStage") String commandParamsStage, - @Assisted("hostParamsStage") String hostParamsStage) { + @Assisted("hostParamsStage") String hostParamsStage, + HostRoleCommandFactory hostRoleCommandFactory) { this.wrappersLoaded = true; this.requestId = requestId; this.logDir = logDir; @@ -99,11 +110,15 @@ public class Stage { this.commandParamsStage = commandParamsStage; this.hostParamsStage = hostParamsStage; this.skippable = false; + this.hostRoleCommandFactory = hostRoleCommandFactory; } @AssistedInject public Stage(@Assisted StageEntity stageEntity, HostRoleCommandDAO hostRoleCommandDAO, - ActionDBAccessor dbAccessor, Clusters clusters) { + ActionDBAccessor dbAccessor, Clusters clusters, HostRoleCommandFactory hostRoleCommandFactory) { + this.hostRoleCommandFactory = hostRoleCommandFactory; + this.hostRoleCommandDAO = hostRoleCommandDAO; + this.dbAccessor = dbAccessor; requestId = stageEntity.getRequestId(); stageId = stageEntity.getStageId(); @@ -125,19 +140,16 @@ public class Stage { commandParamsStage = stageEntity.getCommandParamsStage(); hostParamsStage = stageEntity.getHostParamsStage(); - List<Long> taskIds = hostRoleCommandDAO.findTaskIdsByStage(requestId, stageId); Collection<HostRoleCommand> commands = dbAccessor.getTasks(taskIds); for (HostRoleCommand command : commands) { String hostname = command.getHostName(); if (!hostRoleCommands.containsKey(hostname)) { -// commandsToSend.put(hostname, new ArrayList<ExecutionCommandWrapper>()); hostRoleCommands.put(hostname, new LinkedHashMap<String, HostRoleCommand>()); } hostRoleCommands.get(hostname).put(command.getRole().toString(), command); -// commandsToSend.get(hostname).add(command.getExecutionCommandWrapper()); } for (RoleSuccessCriteriaEntity successCriteriaEntity : stageEntity.getRoleSuccessCriterias()) { @@ -257,7 +269,7 @@ public class Stage { RoleCommand command, ServiceComponentHostEvent event, boolean retryAllowed){ //used on stage creation only, no need to check if wrappers loaded - HostRoleCommand hrc = new HostRoleCommand(hostName, role, event, command, retryAllowed); + HostRoleCommand hrc = hostRoleCommandFactory.create(hostName, role, event, command, retryAllowed); ExecutionCommand cmd = new ExecutionCommand(); ExecutionCommandWrapper wrapper = new ExecutionCommandWrapper(cmd); hrc.setExecutionCommandWrapper(wrapper); http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/StageFactoryImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/StageFactoryImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/StageFactoryImpl.java new file mode 100644 index 0000000..9ee7c16 --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/StageFactoryImpl.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ambari.server.actionmanager; + +import com.google.inject.Inject; +import com.google.inject.Injector; +import com.google.inject.Singleton; +import com.google.inject.assistedinject.Assisted; +import org.apache.ambari.server.Role; +import org.apache.ambari.server.RoleCommand; +import org.apache.ambari.server.orm.DBAccessor; +import org.apache.ambari.server.orm.dao.HostRoleCommandDAO; +import org.apache.ambari.server.orm.entities.HostEntity; +import org.apache.ambari.server.orm.entities.HostRoleCommandEntity; +import org.apache.ambari.server.orm.entities.StageEntity; +import org.apache.ambari.server.state.Clusters; +import org.apache.ambari.server.state.ServiceComponentHostEvent; +import org.apache.ambari.server.state.cluster.ClusterImpl; + +@Singleton +public class StageFactoryImpl implements StageFactory { + private Injector injector; + + @Inject + public StageFactoryImpl(Injector injector) { + this.injector = injector; + } + + /** + * Constructor via the factory. + * @param requestId Unique identifier for the request + * @param logDir Directory to log to + * @param clusterName Cluster name + * @param clusterId Cluster ID + * @param requestContext Information about the context of the request + * @param clusterHostInfo Information about the host + * @param commandParamsStage Information about the command parameters + * @param hostParamsStage Information about the host parameters for the stage + * @return An instance of a Stage with the provided params. + */ + @Override + public Stage createNew(long requestId, + @Assisted("logDir") String logDir, + @Assisted("clusterName") String clusterName, + @Assisted("clusterId") long clusterId, + @Assisted("requestContext") String requestContext, + @Assisted("clusterHostInfo") String clusterHostInfo, + @Assisted("commandParamsStage") String commandParamsStage, + @Assisted("hostParamsStage") String hostParamsStage) { + return new Stage(requestId, logDir, clusterName, clusterId, requestContext, clusterHostInfo, commandParamsStage, hostParamsStage, + injector.getInstance(HostRoleCommandFactory.class)); + } + + /** + * Constructor via the factory. + * @param stageEntity Existing stage entity to copy fields form. + * @return An instance of a Stage that is created using the provided stage as input. + */ + @Override + public Stage createExisting(@Assisted StageEntity stageEntity) { + return new Stage(stageEntity, injector.getInstance(HostRoleCommandDAO.class), + injector.getInstance(ActionDBAccessor.class), injector.getInstance(Clusters.class), + injector.getInstance(HostRoleCommandFactory.class)); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java index 38c222d..828df47 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java @@ -28,6 +28,7 @@ import org.apache.ambari.server.metadata.RoleCommandOrder; import org.apache.ambari.server.scheduler.ExecutionScheduleManager; import org.apache.ambari.server.security.ldap.LdapBatchDto; import org.apache.ambari.server.security.ldap.LdapSyncDto; +import org.apache.ambari.server.stageplanner.RoleGraphFactory; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.ConfigHelper; @@ -523,6 +524,13 @@ public interface AmbariManagementController { public ConfigGroupFactory getConfigGroupFactory(); /** + * Get the role graph factory for this management controller. + * + * @return the role graph factory + */ + public RoleGraphFactory getRoleGraphFactory(); + + /** * Get the action manager for this management controller. * * @return the action manager http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java index b2120ab..614134e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java @@ -111,6 +111,7 @@ import org.apache.ambari.server.security.ldap.LdapSyncDto; import org.apache.ambari.server.serveraction.kerberos.KerberosInvalidConfigurationException; import org.apache.ambari.server.serveraction.kerberos.KerberosOperationException; import org.apache.ambari.server.stageplanner.RoleGraph; +import org.apache.ambari.server.stageplanner.RoleGraphFactory; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.CommandScriptDefinition; @@ -211,6 +212,8 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle @Inject private AbstractRootServiceResponseFactory rootServiceResponseFactory; @Inject + private RoleGraphFactory roleGraphFactory; + @Inject private ConfigGroupFactory configGroupFactory; @Inject private ConfigHelper configHelper; @@ -2230,7 +2233,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle } RoleCommandOrder rco = getRoleCommandOrder(cluster); - RoleGraph rg = new RoleGraph(rco); + RoleGraph rg = roleGraphFactory.createNew(rco); rg.build(stage); requestStages.addStages(rg.getStages()); @@ -3093,9 +3096,9 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle RoleGraph rg; if (null != cluster) { RoleCommandOrder rco = getRoleCommandOrder(cluster); - rg = new RoleGraph(rco); + rg = roleGraphFactory.createNew(rco); } else { - rg = new RoleGraph(); + rg = roleGraphFactory.createNew(); } rg.build(stage); @@ -3767,6 +3770,11 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle } @Override + public RoleGraphFactory getRoleGraphFactory() { + return roleGraphFactory; + } + + @Override public AbstractRootServiceResponseFactory getRootServiceResponseFactory() { return rootServiceResponseFactory; http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java index 0c5e04a..36ae66b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java @@ -55,6 +55,7 @@ import org.apache.ambari.server.actionmanager.HostRoleCommandFactory; import org.apache.ambari.server.actionmanager.HostRoleCommandFactoryImpl; import org.apache.ambari.server.actionmanager.RequestFactory; import org.apache.ambari.server.actionmanager.StageFactory; +import org.apache.ambari.server.actionmanager.StageFactoryImpl; import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.configuration.Configuration.ConnectionPoolType; import org.apache.ambari.server.configuration.Configuration.DatabaseType; @@ -75,6 +76,8 @@ import org.apache.ambari.server.security.SecurityHelper; import org.apache.ambari.server.security.SecurityHelperImpl; import org.apache.ambari.server.serveraction.kerberos.KerberosOperationHandlerFactory; import org.apache.ambari.server.stack.StackManagerFactory; +import org.apache.ambari.server.stageplanner.RoleGraphFactory; +import org.apache.ambari.server.stageplanner.RoleGraphFactoryImpl; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.Config; @@ -359,6 +362,10 @@ public class ControllerModule extends AbstractModule { return jpaPersistModule; } + /** + * Bind classes to their Factories, which can be built on-the-fly. + * Often, will also have to edit AgentResourceTest.java + */ private void installFactories() { install(new FactoryModuleBuilder().implement( Cluster.class, ClusterImpl.class).build(ClusterFactory.class)); @@ -389,10 +396,11 @@ public class ControllerModule extends AbstractModule { install(new FactoryModuleBuilder().implement(RequestExecution.class, RequestExecutionImpl.class).build(RequestExecutionFactory.class)); - install(new FactoryModuleBuilder().build(StageFactory.class)); + bind(StageFactory.class).to(StageFactoryImpl.class); + bind(RoleGraphFactory.class).to(RoleGraphFactoryImpl.class); install(new FactoryModuleBuilder().build(RequestFactory.class)); install(new FactoryModuleBuilder().build(StackManagerFactory.class)); - + bind(HostRoleCommandFactory.class).to(HostRoleCommandFactoryImpl.class); bind(SecurityHelper.class).toInstance(SecurityHelperImpl.getInstance()); } http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java index 1bb0d0f..f198523 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java @@ -19,6 +19,7 @@ package org.apache.ambari.server.controller; import com.google.inject.Inject; +import com.google.inject.Injector; import com.google.inject.persist.Transactional; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.Role; @@ -68,6 +69,7 @@ import org.apache.ambari.server.serveraction.kerberos.KerberosRealmException; import org.apache.ambari.server.serveraction.kerberos.KerberosServerAction; import org.apache.ambari.server.serveraction.kerberos.UpdateKerberosConfigsServerAction; import org.apache.ambari.server.stageplanner.RoleGraph; +import org.apache.ambari.server.stageplanner.RoleGraphFactory; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.Config; @@ -155,6 +157,9 @@ public class KerberosHelper { private StageFactory stageFactory; @Inject + private RoleGraphFactory roleGraphFactory; + + @Inject private Clusters clusters; @Inject @@ -181,7 +186,6 @@ public class KerberosHelper { */ private static ClusterController clusterController = null; - /** * Toggles Kerberos security to enable it or remove it depending on the state of the cluster. * <p/> @@ -2097,7 +2101,7 @@ public class KerberosHelper { "Create Principals", 1200); - RoleGraph roleGraph = new RoleGraph(roleCommandOrder); + RoleGraph roleGraph = roleGraphFactory.createNew(roleCommandOrder); roleGraph.build(stage); requestStageContainer.addStages(roleGraph.getStages()); } @@ -2120,7 +2124,7 @@ public class KerberosHelper { "Destroy Principals", 1200); - RoleGraph roleGraph = new RoleGraph(roleCommandOrder); + RoleGraph roleGraph = roleGraphFactory.createNew(roleCommandOrder); roleGraph.build(stage); requestStageContainer.addStages(roleGraph.getStages()); } @@ -2143,7 +2147,7 @@ public class KerberosHelper { "Create Keytabs", 1200); - RoleGraph roleGraph = new RoleGraph(roleCommandOrder); + RoleGraph roleGraph = roleGraphFactory.createNew(roleCommandOrder); roleGraph.build(stage); requestStageContainer.addStages(roleGraph.getStages()); } @@ -2182,7 +2186,7 @@ public class KerberosHelper { customCommandExecutionHelper.addExecutionCommandsToStage(actionExecContext, stage, requestParams, false); } - RoleGraph roleGraph = new RoleGraph(roleCommandOrder); + RoleGraph roleGraph = roleGraphFactory.createNew(roleCommandOrder); roleGraph.build(stage); requestStageContainer.addStages(roleGraph.getStages()); } @@ -2247,7 +2251,7 @@ public class KerberosHelper { customCommandExecutionHelper.addExecutionCommandsToStage(actionExecContext, stage, requestParams, false); } - RoleGraph roleGraph = new RoleGraph(roleCommandOrder); + RoleGraph roleGraph = roleGraphFactory.createNew(roleCommandOrder); roleGraph.build(stage); requestStageContainer.addStages(roleGraph.getStages()); } @@ -2270,7 +2274,7 @@ public class KerberosHelper { "Update Service Configurations", 1200); - RoleGraph roleGraph = new RoleGraph(roleCommandOrder); + RoleGraph roleGraph = roleGraphFactory.createNew(roleCommandOrder); roleGraph.build(stage); requestStageContainer.addStages(roleGraph.getStages()); } @@ -2298,7 +2302,7 @@ public class KerberosHelper { commandParameters, "Finalize Operations", 300); - RoleGraph roleGraph = new RoleGraph(roleCommandOrder); + RoleGraph roleGraph = roleGraphFactory.createNew(roleCommandOrder); roleGraph.build(stage); requestStageContainer.addStages(roleGraph.getStages()); } http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java index b952c7c..4e6877e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java @@ -33,6 +33,7 @@ import org.apache.ambari.server.Role; import org.apache.ambari.server.StaticallyInject; import org.apache.ambari.server.actionmanager.ActionManager; import org.apache.ambari.server.actionmanager.HostRoleCommand; +import org.apache.ambari.server.actionmanager.HostRoleCommandFactory; import org.apache.ambari.server.actionmanager.HostRoleStatus; import org.apache.ambari.server.actionmanager.RequestFactory; import org.apache.ambari.server.actionmanager.Stage; @@ -55,10 +56,13 @@ import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException; import org.apache.ambari.server.controller.spi.SystemException; import org.apache.ambari.server.controller.spi.UnsupportedPropertyException; import org.apache.ambari.server.controller.utilities.PropertyHelper; +import org.apache.ambari.server.orm.dao.ClusterDAO; import org.apache.ambari.server.orm.dao.ClusterVersionDAO; import org.apache.ambari.server.orm.dao.HostVersionDAO; import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; +import org.apache.ambari.server.orm.entities.ClusterEntity; import org.apache.ambari.server.orm.entities.ClusterVersionEntity; +import org.apache.ambari.server.orm.entities.HostEntity; import org.apache.ambari.server.orm.entities.HostVersionEntity; import org.apache.ambari.server.orm.entities.OperatingSystemEntity; import org.apache.ambari.server.orm.entities.RepositoryEntity; @@ -143,6 +147,9 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou @Inject private static RepositoryVersionDAO repositoryVersionDAO; + @Inject + private static HostRoleCommandFactory hostRoleCommandFactory; + private static Gson gson = StageUtils.getGson(); @Inject @@ -152,6 +159,9 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou private static StageFactory stageFactory; @Inject + private static ClusterDAO clusterDAO; + + @Inject private static RequestFactory requestFactory; @Inject @@ -497,6 +507,19 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou String.format("Invalid desired state %s. Should be either CURRENT or INSTALLED", newStateStr)); } + + // Get a host name to populate the hostrolecommand table's hostEntity. + ClusterEntity cluster = clusterDAO.findByName(clName); + String defaultHostName = null; + List<HostEntity> hosts = new ArrayList(cluster.getHostEntities()); + if (hosts != null && !hosts.isEmpty()) { + Collections.sort(hosts); + defaultHostName = hosts.get(0).getHostName(); + } + if (defaultHostName == null) { + throw new AmbariException("Could not find at least one host to set the command for"); + } + args.put(FinalizeUpgradeAction.VERSION_KEY, desiredRepoVersion); args.put(FinalizeUpgradeAction.CLUSTER_NAME_KEY, clName); @@ -504,7 +527,8 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou command.setCommandParams(args); command.setClusterName(clName); finalizeUpgradeAction.setExecutionCommand(command); - HostRoleCommand hostRoleCommand = new HostRoleCommand("none", + + HostRoleCommand hostRoleCommand = hostRoleCommandFactory.create(defaultHostName, Role.AMBARI_SERVER_ACTION, null, null); finalizeUpgradeAction.setHostRoleCommand(hostRoleCommand); http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java index 926d9bb..483e169 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java @@ -789,7 +789,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider private void makeServerSideStage(UpgradeContext context, RequestStageContainer request, UpgradeItemEntity entity, ServerSideActionTask task, - boolean skippable, boolean allowRtery) throws AmbariException { + boolean skippable, boolean allowRetry) throws AmbariException { Cluster cluster = context.getCluster(); @@ -894,7 +894,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider itemDetail, null, Integer.valueOf(1200), - allowRtery); + allowRetry); request.addStages(Collections.singletonList(stage)); } http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/HostVersionOutOfSyncListener.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/HostVersionOutOfSyncListener.java b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/HostVersionOutOfSyncListener.java index dcc06a7..7a8c4b9 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/HostVersionOutOfSyncListener.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/HostVersionOutOfSyncListener.java @@ -31,6 +31,7 @@ import org.apache.ambari.server.events.publishers.AmbariEventPublisher; import org.apache.ambari.server.orm.dao.HostDAO; import org.apache.ambari.server.orm.dao.HostVersionDAO; import org.apache.ambari.server.orm.entities.ClusterVersionEntity; +import org.apache.ambari.server.orm.entities.HostEntity; import org.apache.ambari.server.orm.entities.HostVersionEntity; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; @@ -154,9 +155,9 @@ public class HostVersionOutOfSyncListener { for (ClusterVersionEntity clusterVersion : allClusterVersions) { if (clusterVersion.getState() != RepositoryVersionState.CURRENT) { // Current version is taken care of automatically String hostName = event.getHostName(); - HostVersionEntity missingHostVersion = new HostVersionEntity(hostName, + HostEntity hostEntity = hostDAO.get().findByName(hostName); + HostVersionEntity missingHostVersion = new HostVersionEntity(hostEntity, clusterVersion.getRepositoryVersion(), RepositoryVersionState.OUT_OF_SYNC); - missingHostVersion.setHostEntity(hostDAO.get().findByName(hostName)); hostVersionDAO.get().create(missingHostVersion); changedRepositoryVersions.add(clusterVersion.getRepositoryVersion().getVersion()); } http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java index 279c78f..29cf755 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java @@ -204,11 +204,20 @@ public class DBAccessorImpl implements DBAccessor { public boolean tableHasData(String tableName) throws SQLException { String query = "SELECT count(*) from " + tableName; Statement statement = getConnection().createStatement(); - ResultSet rs = statement.executeQuery(query); boolean retVal = false; - if (rs != null) { - if (rs.next()) { - return rs.getInt(1) > 0; + ResultSet rs = null; + try { + rs = statement.executeQuery(query); + if (rs != null) { + if (rs.next()) { + return rs.getInt(1) > 0; + } + } + } catch (Exception e) { + LOG.error("Unable to check if table " + tableName + " has any data. Exception: " + e.getMessage()); + } finally { + if (rs != null) { + rs.close(); } } return retVal; http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java index f927197..7d3f4e4 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java @@ -167,7 +167,7 @@ public class HostRoleCommandDAO { public List<Long> findTaskIdsByHostRoleAndStatus(String hostname, String role, HostRoleStatus status) { TypedQuery<Long> query = entityManagerProvider.get().createQuery( "SELECT DISTINCT task.taskId FROM HostRoleCommandEntity task " + - "WHERE task.hostName=?1 AND task.role=?2 AND task.status=?3 " + + "WHERE task.hostEntity.hostName=?1 AND task.role=?2 AND task.status=?3 " + "ORDER BY task.taskId", Long.class ); @@ -188,9 +188,9 @@ public class HostRoleCommandDAO { public List<HostRoleCommandEntity> findSortedCommandsByStageAndHost(StageEntity stageEntity, HostEntity hostEntity) { TypedQuery<HostRoleCommandEntity> query = entityManagerProvider.get().createQuery("SELECT hostRoleCommand " + "FROM HostRoleCommandEntity hostRoleCommand " + - "WHERE hostRoleCommand.stage=?1 AND hostRoleCommand.host=?2 " + + "WHERE hostRoleCommand.stage=?1 AND hostRoleCommand.hostEntity.hostName=?2 " + "ORDER BY hostRoleCommand.taskId", HostRoleCommandEntity.class); - return daoUtils.selectList(query, stageEntity, hostEntity); + return daoUtils.selectList(query, stageEntity, hostEntity.getHostName()); } @RequiresSession @@ -198,7 +198,7 @@ public class HostRoleCommandDAO { TypedQuery<HostRoleCommandEntity> query = entityManagerProvider.get().createQuery("SELECT hostRoleCommand " + "FROM HostRoleCommandEntity hostRoleCommand " + "WHERE hostRoleCommand.stage=?1 " + - "ORDER BY hostRoleCommand.hostName, hostRoleCommand.taskId", HostRoleCommandEntity.class); + "ORDER BY hostRoleCommand.hostEntity.hostName, hostRoleCommand.taskId", HostRoleCommandEntity.class); List<HostRoleCommandEntity> commandEntities = daoUtils.selectList(query, stageEntity); Map<String, List<HostRoleCommandEntity>> hostCommands = new HashMap<String, List<HostRoleCommandEntity>>(); @@ -229,7 +229,7 @@ public class HostRoleCommandDAO { public List<HostRoleCommandEntity> findByHostRole(String hostName, long requestId, long stageId, String role) { TypedQuery<HostRoleCommandEntity> query = entityManagerProvider.get().createQuery("SELECT command " + "FROM HostRoleCommandEntity command " + - "WHERE command.hostName=?1 AND command.requestId=?2 " + + "WHERE command.hostEntity.hostName=?1 AND command.requestId=?2 " + "AND command.stageId=?3 AND command.role=?4 " + "ORDER BY command.taskId", HostRoleCommandEntity.class); http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostEntity.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostEntity.java index c329f24..1ed1020 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostEntity.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostEntity.java @@ -142,7 +142,7 @@ public class HostEntity implements Comparable<HostEntity> { @OneToOne(mappedBy = "hostEntity", cascade = {CascadeType.REMOVE, CascadeType.PERSIST}) private HostStateEntity hostStateEntity; - @OneToMany(mappedBy = "host", cascade = CascadeType.REMOVE) + @OneToMany(mappedBy = "hostEntity", cascade = CascadeType.REMOVE) private Collection<HostRoleCommandEntity> hostRoleCommandEntities; public Long getHostId() { http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java index c9877fb..a2bbd1c 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java @@ -75,9 +75,9 @@ public class HostRoleCommandEntity { @Basic private Long stageId; - @Column(name = "host_name", insertable = false, updatable = false, nullable = false) + @Column(name = "host_id", insertable = false, updatable = false, nullable = false) @Basic - private String hostName; + private Long hostId; @Column(name = "role") private String role; @@ -161,8 +161,8 @@ public class HostRoleCommandEntity { private StageEntity stage; @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH}) - @JoinColumn(name = "host_name", referencedColumnName = "host_name", nullable = false) - private HostEntity host; + @JoinColumn(name = "host_id", referencedColumnName = "host_id", nullable = false) + private HostEntity hostEntity; public Long getTaskId() { return taskId; @@ -189,11 +189,7 @@ public class HostRoleCommandEntity { } public String getHostName() { - return hostName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; + return hostEntity != null ? hostEntity.getHostName() : null; } public Role getRole() { @@ -360,7 +356,7 @@ public class HostRoleCommandEntity { if (exitcode != null ? !exitcode.equals(that.exitcode) : that.exitcode != null) { return false; } - if (hostName != null ? !hostName.equals(that.hostName) : that.hostName != null) { + if (hostEntity != null ? !hostEntity.equals(that.hostEntity) : that.hostEntity != null) { return false; } if (lastAttemptTime != null ? !lastAttemptTime.equals(that.lastAttemptTime) : that.lastAttemptTime != null) { @@ -411,7 +407,7 @@ public class HostRoleCommandEntity { int result = taskId != null ? taskId.hashCode() : 0; result = 31 * result + (requestId != null ? requestId.hashCode() : 0); result = 31 * result + (stageId != null ? stageId.hashCode() : 0); - result = 31 * result + (hostName != null ? hostName.hashCode() : 0); + result = 31 * result + (hostEntity != null ? hostEntity.hashCode() : 0); result = 31 * result + (role != null ? role.hashCode() : 0); result = 31 * result + (event != null ? event.hashCode() : 0); result = 31 * result + (exitcode != null ? exitcode.hashCode() : 0); @@ -444,11 +440,11 @@ public class HostRoleCommandEntity { this.stage = stage; } - public HostEntity getHost() { - return host; + public HostEntity getHostEntity() { + return hostEntity; } - public void setHost(HostEntity host) { - this.host = host; + public void setHostEntity(HostEntity hostEntity) { + this.hostEntity = hostEntity; } } http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostVersionEntity.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostVersionEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostVersionEntity.java index 5fb024d..9d7d68f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostVersionEntity.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostVersionEntity.java @@ -49,20 +49,20 @@ import org.apache.ambari.server.state.RepositoryVersionState; @NamedQuery(name = "hostVersionByClusterAndHostname", query = "SELECT hostVersion FROM HostVersionEntity hostVersion JOIN hostVersion.hostEntity host JOIN host.clusterEntities clusters " + - "WHERE clusters.clusterName=:clusterName AND hostVersion.hostName=:hostName"), + "WHERE clusters.clusterName=:clusterName AND hostVersion.hostEntity.hostName=:hostName"), @NamedQuery(name = "hostVersionByHostname", query = "SELECT hostVersion FROM HostVersionEntity hostVersion JOIN hostVersion.hostEntity host " + - "WHERE hostVersion.hostName=:hostName"), + "WHERE hostVersion.hostEntity.hostName=:hostName"), @NamedQuery(name = "hostVersionByClusterHostnameAndState", query = "SELECT hostVersion FROM HostVersionEntity hostVersion JOIN hostVersion.hostEntity host JOIN host.clusterEntities clusters " + - "WHERE clusters.clusterName=:clusterName AND hostVersion.hostName=:hostName AND hostVersion.state=:state"), + "WHERE clusters.clusterName=:clusterName AND hostVersion.hostEntity.hostName=:hostName AND hostVersion.state=:state"), @NamedQuery(name = "hostVersionByClusterStackVersionAndHostname", query = "SELECT hostVersion FROM HostVersionEntity hostVersion JOIN hostVersion.hostEntity host JOIN host.clusterEntities clusters " + "WHERE clusters.clusterName=:clusterName AND hostVersion.repositoryVersion.stack.stackName=:stackName AND hostVersion.repositoryVersion.stack.stackVersion=:stackVersion AND hostVersion.repositoryVersion.version=:version AND " + - "hostVersion.hostName=:hostName"), + "hostVersion.hostEntity.hostName=:hostName"), }) public class HostVersionEntity { @@ -71,15 +71,15 @@ public class HostVersionEntity { @GeneratedValue(strategy = GenerationType.TABLE, generator = "host_version_id_generator") private Long id; - @Column(name = "host_name", nullable = false, insertable = false, updatable = false) - private String hostName; - @ManyToOne @JoinColumn(name = "repo_version_id", referencedColumnName = "repo_version_id", nullable = false) private RepositoryVersionEntity repositoryVersion; + @Column(name = "host_id", nullable=false, insertable = false, updatable = false) + private Long hostId; + @ManyToOne - @JoinColumn(name = "host_name", referencedColumnName = "host_name", nullable = false) + @JoinColumn(name = "host_id", referencedColumnName = "host_id", nullable = false) private HostEntity hostEntity; @Column(name = "state", nullable = false, insertable = true, updatable = true) @@ -96,8 +96,8 @@ public class HostVersionEntity { * When using this constructor, you should also call setHostEntity(). Otherwise * you will have persistence errors when persisting the instance. */ - public HostVersionEntity(String hostName, RepositoryVersionEntity repositoryVersion, RepositoryVersionState state) { - this.hostName = hostName; + public HostVersionEntity(HostEntity hostEntity, RepositoryVersionEntity repositoryVersion, RepositoryVersionState state) { + this.hostEntity = hostEntity; this.repositoryVersion = repositoryVersion; this.state = state; } @@ -106,9 +106,9 @@ public class HostVersionEntity { * This constructor is mainly used by the unit tests in order to construct an object without the id. */ public HostVersionEntity(HostVersionEntity other) { - hostName = other.hostName; - repositoryVersion = other.repositoryVersion; - state = other.state; + this.hostEntity = other.hostEntity; + this.repositoryVersion = other.repositoryVersion; + this.state = other.state; } public Long getId() { @@ -120,11 +120,7 @@ public class HostVersionEntity { } public String getHostName() { - return hostName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; + return hostEntity != null ? hostEntity.getHostName() : null; } public HostEntity getHostEntity() { @@ -156,7 +152,7 @@ public class HostVersionEntity { final int prime = 31; int result = 1; result = prime * result + ((hostEntity == null) ? 0 : hostEntity.hashCode()); - result = prime * result + ((hostName == null) ? 0 : hostName.hashCode()); + result = prime * result + ((hostEntity == null) ? 0 : hostEntity.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((repositoryVersion == null) ? 0 : repositoryVersion.hashCode()); result = prime * result + ((state == null) ? 0 : state.hashCode()); @@ -165,48 +161,15 @@ public class HostVersionEntity { @Override public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; HostVersionEntity other = (HostVersionEntity) obj; - if (hostEntity == null) { - if (other.hostEntity != null) { - return false; - } - } else if (!hostEntity.equals(other.hostEntity)) { - return false; - } - if (hostName == null) { - if (other.hostName != null) { - return false; - } - } else if (!hostName.equals(other.hostName)) { - return false; - } - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - if (repositoryVersion == null) { - if (other.repositoryVersion != null) { - return false; - } - } else if (!repositoryVersion.equals(other.repositoryVersion)) { - return false; - } - if (state != other.state) { - return false; - } + if (id != null ? id != other.id : other.id != null) return false; + if (hostEntity != null ? !hostEntity.equals(other.hostEntity) : other.hostEntity != null) return false; + if (repositoryVersion != null ? !repositoryVersion.equals(other.repositoryVersion) : other.repositoryVersion != null) return false; + if (state != other.state) return false; return true; } http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraph.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraph.java b/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraph.java index 4fe3787..0b1854a 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraph.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraph.java @@ -22,8 +22,11 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import com.google.inject.Inject; +import com.google.inject.Injector; import org.apache.ambari.server.actionmanager.HostRoleCommand; import org.apache.ambari.server.actionmanager.Stage; +import org.apache.ambari.server.actionmanager.StageFactory; import org.apache.ambari.server.metadata.RoleCommandOrder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -32,15 +35,23 @@ public class RoleGraph { private static Log LOG = LogFactory.getLog(RoleGraph.class); + Map<String, RoleGraphNode> graph = null; private RoleCommandOrder roleDependencies; private Stage initialStage = null; private boolean sameHostOptimization = true; - public RoleGraph() { + @Inject + private StageFactory stageFactory; + + @Inject + public RoleGraph(StageFactory stageFactory) { + this.stageFactory = stageFactory; } - - public RoleGraph(RoleCommandOrder rd) { + + @Inject + public RoleGraph(RoleCommandOrder rd, StageFactory stageFactory) { + this(stageFactory); this.roleDependencies = rd; } @@ -136,7 +147,7 @@ public class RoleGraph { private Stage getStageFromGraphNodes(Stage origStage, List<RoleGraphNode> stageGraphNodes) { - Stage newStage = new Stage(origStage.getRequestId(), + Stage newStage = stageFactory.createNew(origStage.getRequestId(), origStage.getLogDir(), origStage.getClusterName(), origStage.getClusterId(), origStage.getRequestContext(), origStage.getClusterHostInfo(), http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraphFactory.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraphFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraphFactory.java new file mode 100644 index 0000000..625b168 --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraphFactory.java @@ -0,0 +1,35 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ambari.server.stageplanner; + +import org.apache.ambari.server.metadata.RoleCommandOrder; + +public interface RoleGraphFactory { + /** + * + * @return + */ + public RoleGraph createNew(); + + /** + * + * @param rd + * @return + */ + public RoleGraph createNew(RoleCommandOrder rd); +} http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraphFactoryImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraphFactoryImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraphFactoryImpl.java new file mode 100644 index 0000000..5ca4d88 --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraphFactoryImpl.java @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ambari.server.stageplanner; + +import com.google.inject.Inject; +import com.google.inject.Injector; +import com.google.inject.Singleton; +import org.apache.ambari.server.actionmanager.StageFactory; +import org.apache.ambari.server.metadata.RoleCommandOrder; + + +@Singleton +public class RoleGraphFactoryImpl implements RoleGraphFactory { + private Injector injector; + + @Inject + public RoleGraphFactoryImpl(Injector injector) { + this.injector = injector; + } + + /** + * + * @return + */ + @Override + public RoleGraph createNew() { + return new RoleGraph(this.injector.getInstance(StageFactory.class)); + } + + /** + * + * @param rd + * @return + */ + @Override + public RoleGraph createNew(RoleCommandOrder rd) { + return new RoleGraph(rd, this.injector.getInstance(StageFactory.class)); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java index 9643fe1..0d9c36a 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java @@ -1044,8 +1044,7 @@ public class ClusterImpl implements Cluster { if (!intersection.contains(hostname)) { // According to the business logic, we don't create objects in a CURRENT state. HostEntity hostEntity = hostDAO.findByName(hostname); - HostVersionEntity hostVersionEntity = new HostVersionEntity(hostname, currentClusterVersion.getRepositoryVersion(), desiredState); - hostVersionEntity.setHostEntity(hostEntity); + HostVersionEntity hostVersionEntity = new HostVersionEntity(hostEntity, currentClusterVersion.getRepositoryVersion(), desiredState); hostVersionDAO.create(hostVersionEntity); } else { HostVersionEntity hostVersionEntity = existingHostToHostVersionEntity.get(hostname); @@ -1122,10 +1121,9 @@ public class ClusterImpl implements Cluster { if (hostsMissingRepoVersion.contains(hostname)) { // Create new host stack version HostEntity hostEntity = hostDAO.findByName(hostname); - HostVersionEntity hostVersionEntity = new HostVersionEntity(hostname, + HostVersionEntity hostVersionEntity = new HostVersionEntity(hostEntity, sourceClusterVersion.getRepositoryVersion(), RepositoryVersionState.INSTALLING); - hostVersionEntity.setHostEntity(hostEntity); hostVersionDAO.create(hostVersionEntity); } else { // Update existing host stack version @@ -1347,8 +1345,7 @@ public class ClusterImpl implements Cluster { try { // Create one if it doesn't already exist. It will be possible to make further transitions below. if (hostVersionEntity == null) { - hostVersionEntity = new HostVersionEntity(host.getHostName(), repositoryVersion, RepositoryVersionState.UPGRADING); - hostVersionEntity.setHostEntity(host); + hostVersionEntity = new HostVersionEntity(host, repositoryVersion, RepositoryVersionState.UPGRADING); hostVersionDAO.create(hostVersionEntity); } @@ -1565,11 +1562,7 @@ public class ClusterImpl implements Cluster { } if (null == target) { // If no matching version was found, create one with the desired state - HostVersionEntity hve = new HostVersionEntity(); - hve.setHostEntity(he); - hve.setHostName(he.getHostName()); - hve.setRepositoryVersion(existingClusterVersion.getRepositoryVersion()); - hve.setState(state); + HostVersionEntity hve = new HostVersionEntity(he, existingClusterVersion.getRepositoryVersion(), state); hostVersionDAO.create(hve); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog210.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog210.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog210.java index 8897657..40d2241 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog210.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog210.java @@ -33,6 +33,7 @@ import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.controller.AmbariManagementController; import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo; import org.apache.ambari.server.orm.dao.StackDAO; +import org.apache.ambari.server.orm.dao.DaoUtils; import org.apache.ambari.server.orm.entities.StackEntity; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; @@ -83,6 +84,9 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog { private static final DBColumnInfo CURRENT_STACK_ID_COLUMN = new DBColumnInfo(CURRENT_STACK_ID_COLUMN_NAME, Long.class, null, null, true); private static final DBColumnInfo STACK_ID_COLUMN = new DBColumnInfo(STACK_ID_COLUMN_NAME, Long.class, null, null, true); + @Inject + DaoUtils daoUtils; + /** * {@inheritDoc} */ @@ -123,6 +127,8 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog { public UpgradeCatalog210(Injector injector) { super(injector); this.injector = injector; + + daoUtils = injector.getInstance(DaoUtils.class); } // ----- AbstractUpgradeCatalog -------------------------------------------- @@ -154,6 +160,14 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog { private void executeHostsDDLUpdates() throws AmbariException, SQLException { Configuration.DatabaseType databaseType = configuration.getDatabaseType(); + String randomHostName = null; + if (dbAccessor.tableHasData(HOST_ROLE_COMMAND_TABLE)) { + randomHostName = getRandomHostName(); + if (StringUtils.isBlank(randomHostName)) { + throw new AmbariException("UpgradeCatalog210 could not retrieve a random host_name from the hosts table while running executeHostsDDLUpdates."); + } + } + dbAccessor.addColumn(HOSTS_TABLE, new DBColumnInfo(HOST_ID_COL, Long.class, null, null, true)); // Sequence value for the hosts table primary key. First record will be 1, so ambari_sequence value must be 0. @@ -232,7 +246,7 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog { dbAccessor.executeQuery("ALTER TABLE " + HOSTS_TABLE + " DROP CONSTRAINT " + constraintName); } } else { - dbAccessor.dropConstraint(HOSTS_TABLE, "hosts_pkey"); + dbAccessor.executeQuery("ALTER TABLE " + HOSTS_TABLE + " DROP CONSTRAINT hosts_pkey"); } dbAccessor.executeQuery("ALTER TABLE " + HOSTS_TABLE + " ADD CONSTRAINT PK_hosts_id PRIMARY KEY (host_id)"); dbAccessor.executeQuery("ALTER TABLE " + HOSTS_TABLE + " ADD CONSTRAINT UQ_hosts_host_name UNIQUE (host_name)"); @@ -240,10 +254,6 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog { // TODO, for now, these still point to the host_name and will be fixed one table at a time to point to the host id. // Re-add the FKs - dbAccessor.addFKConstraint(HOST_VERSION_TABLE, "FK_host_version_host_name", - "host_name", HOSTS_TABLE, "host_name", false); - dbAccessor.addFKConstraint(HOST_ROLE_COMMAND_TABLE, "FK_host_role_command_host_name", - "host_name", HOSTS_TABLE, "host_name", false); dbAccessor.addFKConstraint(HOST_CONFIG_MAPPING_TABLE, "FK_hostconfmapping_host_name", "host_name", HOSTS_TABLE, "host_name", false); dbAccessor.addFKConstraint(CONFIG_GROUP_HOST_MAPPING_TABLE, "FK_cghm_hname", @@ -258,12 +268,21 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog { CLUSTER_HOST_MAPPING_TABLE, HOST_COMPONENT_STATE_TABLE, HOST_COMPONENT_DESIRED_STATE_TABLE, - HOST_STATE_TABLE + HOST_ROLE_COMMAND_TABLE, + HOST_STATE_TABLE, + HOST_VERSION_TABLE }; + for (String tableName : tablesToAddHostID) { dbAccessor.addColumn(tableName, new DBColumnInfo(HOST_ID_COL, Long.class, null, null, true)); dbAccessor.executeQuery("UPDATE " + tableName + " t SET host_id = (SELECT host_id FROM hosts h WHERE h.host_name = t.host_name) WHERE t.host_id IS NULL AND t.host_name IS NOT NULL"); + // For legacy reasons, the hostrolecommand table will contain "none" for some records where the host_name was not important. + // These records were populated during Finalize in Rolling Upgrade, so they must be updated to use a valid host_name. + if (tableName == HOST_ROLE_COMMAND_TABLE && StringUtils.isNotBlank(randomHostName)) { + dbAccessor.executeQuery("UPDATE " + tableName + " t SET host_id = (SELECT host_id FROM hosts h WHERE h.host_name = '" + randomHostName + "') WHERE t.host_id IS NULL AND t.host_name = 'none'"); + } + if (databaseType == Configuration.DatabaseType.DERBY) { // This is a workaround for UpgradeTest.java unit test dbAccessor.executeQuery("ALTER TABLE " + tableName + " ALTER column " + HOST_ID_COL + " NOT NULL"); @@ -302,11 +321,10 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog { } } } else { - - dbAccessor.dropConstraint(CLUSTER_HOST_MAPPING_TABLE, "clusterhostmapping_pkey"); - dbAccessor.dropConstraint(HOST_COMPONENT_STATE_TABLE, "hostcomponentstate_pkey"); - dbAccessor.dropConstraint(HOST_COMPONENT_DESIRED_STATE_TABLE, "hostcomponentdesiredstate_pkey"); - dbAccessor.dropConstraint(HOST_STATE_TABLE, "hoststate_pkey"); + dbAccessor.executeQuery("ALTER TABLE " + CLUSTER_HOST_MAPPING_TABLE + " DROP CONSTRAINT clusterhostmapping_pkey"); + dbAccessor.executeQuery("ALTER TABLE " + HOST_COMPONENT_STATE_TABLE + " DROP CONSTRAINT hostcomponentstate_pkey"); + dbAccessor.executeQuery("ALTER TABLE " + HOST_COMPONENT_DESIRED_STATE_TABLE + " DROP CONSTRAINT hostcomponentdesiredstate_pkey"); + dbAccessor.executeQuery("ALTER TABLE " + HOST_STATE_TABLE + " DROP CONSTRAINT hoststate_pkey"); // TODO, include other tables. } dbAccessor.executeQuery("ALTER TABLE " + CLUSTER_HOST_MAPPING_TABLE + @@ -323,7 +341,9 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog { dbAccessor.dropColumn(CLUSTER_HOST_MAPPING_TABLE, "host_name"); dbAccessor.dropColumn(HOST_COMPONENT_STATE_TABLE, "host_name"); dbAccessor.dropColumn(HOST_COMPONENT_DESIRED_STATE_TABLE, "host_name"); + dbAccessor.dropColumn(HOST_ROLE_COMMAND_TABLE, "host_name"); dbAccessor.dropColumn(HOST_STATE_TABLE, "host_name"); + dbAccessor.dropColumn(HOST_VERSION_TABLE, "host_name"); // TODO, include other tables. // view columns for cluster association @@ -565,9 +585,8 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog { while (resultSet.next()) { hostId++; final String hostName = resultSet.getString(1); - Long currHostID = resultSet.getLong(2); // in case of a retry, may not be null - if (currHostID == null && StringUtils.isNotBlank(hostName)) { + if (StringUtils.isNotBlank(hostName)) { dbAccessor.executeQuery("UPDATE " + HOSTS_TABLE + " SET host_id = " + hostId + " WHERE host_name = '" + hostName + "'"); } @@ -579,6 +598,24 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog { return hostId; } + private String getRandomHostName() throws SQLException { + String randomHostName = null; + ResultSet resultSet = null; + try { + resultSet = dbAccessor.executeSelect("SELECT host_name FROM hosts ORDER BY host_name ASC"); + if (resultSet != null && resultSet.next()) { + randomHostName = resultSet.getString(1); + } + } catch (Exception e) { + LOG.error("Failed to retrieve random host name. Exception: " + e.getMessage()); + } finally { + if (resultSet != null) { + resultSet.close(); + } + } + return randomHostName; + } + /** * Get the constraint name created by Derby if one was not specified for the table. * @param type Constraint-type, either, "p" (Primary), "c" (Check), "f" (Foreign), "u" (Unique) http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java b/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java index 020dd4b..9bf2ac4 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java @@ -19,10 +19,12 @@ package org.apache.ambari.server.utils; import com.google.common.base.Joiner; import com.google.gson.Gson; +import com.google.inject.Inject; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.Role; import org.apache.ambari.server.RoleCommand; import org.apache.ambari.server.actionmanager.Stage; +import org.apache.ambari.server.actionmanager.StageFactory; import org.apache.ambari.server.agent.ExecutionCommand; import org.apache.ambari.server.controller.ActionExecutionContext; import org.apache.ambari.server.state.Cluster; @@ -76,6 +78,14 @@ public class StageUtils { new HashMap<String, String>(); private volatile static Gson gson; + @Inject + private static StageFactory stageFactory; + + @Inject + public StageUtils(StageFactory stageFactory) { + StageUtils.stageFactory = stageFactory; + } + private static String server_hostname; static { try { @@ -166,9 +176,9 @@ public class StageUtils { } //For testing only + @Inject public static Stage getATestStage(long requestId, long stageId, String hostname, String clusterHostInfo, String commandParamsStage, String hostParamsStage) { - - Stage s = new Stage(requestId, "/tmp", "cluster1", 1L, "context", clusterHostInfo, commandParamsStage, hostParamsStage); + Stage s = stageFactory.createNew(requestId, "/tmp", "cluster1", 1L, "context", clusterHostInfo, commandParamsStage, hostParamsStage); s.setStageId(stageId); long now = System.currentTimeMillis(); s.addHostRoleExecutionCommand(hostname, Role.NAMENODE, RoleCommand.INSTALL, http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql index 62a8541..b6f2aaa 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql @@ -170,8 +170,7 @@ CREATE TABLE hoststate ( CREATE TABLE host_version ( id BIGINT NOT NULL, repo_version_id BIGINT NOT NULL, - host_name VARCHAR(255) NOT NULL, - -- host_id BIGINT NOT NULL, + host_id BIGINT NOT NULL, state VARCHAR(32) NOT NULL, PRIMARY KEY (id)); @@ -230,8 +229,7 @@ CREATE TABLE host_role_command ( retry_allowed SMALLINT DEFAULT 0 NOT NULL, event LONGTEXT NOT NULL, exitcode INTEGER NOT NULL, - host_name VARCHAR(255) NOT NULL, - -- host_id BIGINT NOT NULL, + host_id BIGINT NOT NULL, last_attempt_time BIGINT NOT NULL, request_id BIGINT NOT NULL, role VARCHAR(255), @@ -608,6 +606,7 @@ ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_display_name UNIQUE (dis ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_stack_version UNIQUE (stack_id, version); -- altering tables by creating foreign keys---------- +-- Note, Oracle has a limitation of 32 chars in the FK name, and we should use the same FK name in all DB types. ALTER TABLE members ADD CONSTRAINT FK_members_group_id FOREIGN KEY (group_id) REFERENCES groups (group_id); ALTER TABLE members ADD CONSTRAINT FK_members_user_id FOREIGN KEY (user_id) REFERENCES users (user_id); ALTER TABLE clusterconfig ADD CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id); @@ -621,15 +620,13 @@ ALTER TABLE hostcomponentdesiredstate ADD CONSTRAINT hstcmpnntdesiredstatecmpnnt ALTER TABLE hostcomponentstate ADD CONSTRAINT hstcomponentstatecomponentname FOREIGN KEY (component_name, cluster_id, service_name) REFERENCES servicecomponentdesiredstate (component_name, cluster_id, service_name); ALTER TABLE hostcomponentstate ADD CONSTRAINT FK_hostcomponentstate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id); ALTER TABLE hoststate ADD CONSTRAINT FK_hoststate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id); -ALTER TABLE host_version ADD CONSTRAINT FK_host_version_host_name FOREIGN KEY (host_name) REFERENCES hosts (host_name); --- ALTER TABLE host_version ADD CONSTRAINT FK_host_version_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id); +ALTER TABLE host_version ADD CONSTRAINT FK_host_version_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id); ALTER TABLE host_version ADD CONSTRAINT FK_host_version_repovers_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id); ALTER TABLE servicecomponentdesiredstate ADD CONSTRAINT srvccmponentdesiredstatesrvcnm FOREIGN KEY (service_name, cluster_id) REFERENCES clusterservices (service_name, cluster_id); ALTER TABLE servicedesiredstate ADD CONSTRAINT servicedesiredstateservicename FOREIGN KEY (service_name, cluster_id) REFERENCES clusterservices (service_name, cluster_id); ALTER TABLE execution_command ADD CONSTRAINT FK_execution_command_task_id FOREIGN KEY (task_id) REFERENCES host_role_command (task_id); ALTER TABLE host_role_command ADD CONSTRAINT FK_host_role_command_stage_id FOREIGN KEY (stage_id, request_id) REFERENCES stage (stage_id, request_id); -ALTER TABLE host_role_command ADD CONSTRAINT FK_host_role_command_host_name FOREIGN KEY (host_name) REFERENCES hosts (host_name); --- ALTER TABLE host_role_command ADD CONSTRAINT FK_host_role_command_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id); +ALTER TABLE host_role_command ADD CONSTRAINT FK_host_role_command_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id); ALTER TABLE role_success_criteria ADD CONSTRAINT role_success_criteria_stage_id FOREIGN KEY (stage_id, request_id) REFERENCES stage (stage_id, request_id); ALTER TABLE stage ADD CONSTRAINT FK_stage_request_id FOREIGN KEY (request_id) REFERENCES request (request_id); ALTER TABLE request ADD CONSTRAINT FK_request_schedule_id FOREIGN KEY (request_schedule_id) REFERENCES requestschedule (schedule_id); http://git-wip-us.apache.org/repos/asf/ambari/blob/ee79dd21/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql index 436e438..25685e5 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql @@ -159,8 +159,7 @@ CREATE TABLE hoststate ( CREATE TABLE host_version ( id NUMBER(19) NOT NULL, repo_version_id NUMBER(19) NOT NULL, - host_name VARCHAR2(255) NOT NULL, - --host_id NUMBER(19) NOT NULL, + host_id NUMBER(19) NOT NULL, state VARCHAR2(32) NOT NULL, PRIMARY KEY (id)); @@ -219,8 +218,7 @@ CREATE TABLE host_role_command ( retry_allowed NUMBER(1) DEFAULT 0 NOT NULL, event CLOB NULL, exitcode NUMBER(10) NOT NULL, - host_name VARCHAR2(255) NOT NULL, - --host_id NUMBER(19) NOT NULL, + host_id NUMBER(19) NOT NULL, last_attempt_time NUMBER(19) NOT NULL, request_id NUMBER(19) NOT NULL, role VARCHAR2(255) NULL, @@ -597,6 +595,7 @@ ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_display_name UNIQUE (dis ALTER TABLE repo_version ADD CONSTRAINT UQ_repo_version_stack_version UNIQUE (stack_id, version); --------altering tables by creating foreign keys---------- +-- Note, Oracle has a limitation of 32 chars in the FK name, and we should use the same FK name in all DB types. ALTER TABLE members ADD CONSTRAINT FK_members_group_id FOREIGN KEY (group_id) REFERENCES groups (group_id); ALTER TABLE members ADD CONSTRAINT FK_members_user_id FOREIGN KEY (user_id) REFERENCES users (user_id); ALTER TABLE clusterconfig ADD CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id); @@ -611,15 +610,13 @@ ALTER TABLE hostcomponentdesiredstate ADD CONSTRAINT hstcmpnntdesiredstatecmpnnt ALTER TABLE hostcomponentstate ADD CONSTRAINT hstcomponentstatecomponentname FOREIGN KEY (component_name, cluster_id, service_name) REFERENCES servicecomponentdesiredstate (component_name, cluster_id, service_name); ALTER TABLE hostcomponentstate ADD CONSTRAINT FK_hostcomponentstate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id); ALTER TABLE hoststate ADD CONSTRAINT FK_hoststate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id); -ALTER TABLE host_version ADD CONSTRAINT FK_host_version_host_name FOREIGN KEY (host_name) REFERENCES hosts (host_name); ---ALTER TABLE host_version ADD CONSTRAINT FK_host_version_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id); +ALTER TABLE host_version ADD CONSTRAINT FK_host_version_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id); ALTER TABLE host_version ADD CONSTRAINT FK_host_version_repovers_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id); ALTER TABLE servicecomponentdesiredstate ADD CONSTRAINT srvccmponentdesiredstatesrvcnm FOREIGN KEY (service_name, cluster_id) REFERENCES clusterservices (service_name, cluster_id); ALTER TABLE servicedesiredstate ADD CONSTRAINT servicedesiredstateservicename FOREIGN KEY (service_name, cluster_id) REFERENCES clusterservices (service_name, cluster_id); ALTER TABLE execution_command ADD CONSTRAINT FK_execution_command_task_id FOREIGN KEY (task_id) REFERENCES host_role_command (task_id); ALTER TABLE host_role_command ADD CONSTRAINT FK_host_role_command_stage_id FOREIGN KEY (stage_id, request_id) REFERENCES stage (stage_id, request_id); -ALTER TABLE host_role_command ADD CONSTRAINT FK_host_role_command_host_name FOREIGN KEY (host_name) REFERENCES hosts (host_name); ---ALTER TABLE host_role_command ADD CONSTRAINT FK_host_role_command_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id); +ALTER TABLE host_role_command ADD CONSTRAINT FK_host_role_command_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id); ALTER TABLE role_success_criteria ADD CONSTRAINT role_success_criteria_stage_id FOREIGN KEY (stage_id, request_id) REFERENCES stage (stage_id, request_id); ALTER TABLE stage ADD CONSTRAINT FK_stage_request_id FOREIGN KEY (request_id) REFERENCES request (request_id); ALTER TABLE request ADD CONSTRAINT FK_request_schedule_id FOREIGN KEY (request_schedule_id) REFERENCES requestschedule (schedule_id);
