diff --git hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/launcher/TestContainerLauncher.java hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/launcher/TestContainerLauncher.java index 563c31b..7942423 100644 --- hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/launcher/TestContainerLauncher.java +++ hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/launcher/TestContainerLauncher.java @@ -54,10 +54,16 @@ import org.apache.hadoop.yarn.api.ContainerManagementProtocol; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusRequest; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusResponse; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesRequest; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ContainerId; @@ -68,6 +74,7 @@ import org.apache.hadoop.yarn.client.api.impl.ContainerManagementProtocolProxy; import org.apache.hadoop.yarn.client.api.impl.ContainerManagementProtocolProxy.ContainerManagementProtocolProxyData; import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.factories.RecordFactory; import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider; import org.apache.hadoop.yarn.ipc.HadoopYarnProtoRPC; @@ -435,5 +442,27 @@ public StopContainerResponse stopContainer(StopContainerRequest request) "Dummy function cause")); throw new IOException(e); } + + @Override + public StartContainersResponse startContainers( + StartContainersRequest requests) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public StopContainersResponse + stopContainers(StopContainersRequest requests) throws YarnException, + IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public GetContainerStatusesResponse getContainerStatuses( + GetContainerStatusesRequest request) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } } } \ No newline at end of file diff --git hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/launcher/TestContainerLauncherImpl.java hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/launcher/TestContainerLauncherImpl.java index dc6ca6a..d0fe4ae 100644 --- hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/launcher/TestContainerLauncherImpl.java +++ hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/launcher/TestContainerLauncherImpl.java @@ -47,10 +47,16 @@ import org.apache.hadoop.yarn.api.ContainerManagementProtocol; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusRequest; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusResponse; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesRequest; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ContainerId; @@ -445,6 +451,25 @@ public GetContainerStatusResponse getContainerStatus( return null; } + @Override + public StartContainersResponse startContainers( + StartContainersRequest requests) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } + @Override + public StopContainersResponse + stopContainers(StopContainersRequest requests) throws YarnException, + IOException { + // TODO Auto-generated method stub + return null; + } + @Override + public GetContainerStatusesResponse getContainerStatuses( + GetContainerStatusesRequest request) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } } @SuppressWarnings("serial") diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ContainerManagementProtocol.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ContainerManagementProtocol.java index de330c5..4b2c2f0 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ContainerManagementProtocol.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ContainerManagementProtocol.java @@ -24,10 +24,16 @@ import org.apache.hadoop.classification.InterfaceStability.Stable; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusRequest; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusResponse; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesRequest; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.records.Container; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerLaunchContext; @@ -92,12 +98,57 @@ StartContainerResponse startContainer(StartContainerRequest request) throws YarnException, IOException; /** + *

+ * The ApplicationMaster provides a list of + * {@link StartContainerRequest}s to a NodeManager to + * start {@link Container}s allocated to it using this interface. + *

+ * + *

+ * The ApplicationMaster has to provide details such as allocated + * resource capability, security tokens (if enabled), command to be executed + * to start the container, environment for the process, necessary + * binaries/jar/shared-objects etc. via the {@link ContainerLaunchContext} in + * the {@link StartContainerRequest}. + *

+ * + *

+ * The NodeManager sends a response via + * {@link StartContainersResponse} which includes a list of + * {@link ContaienrId}s of successfully launched {@link Container}s, a + * containerId-to-exception map for each failed {@link StartContainerRequest} in + * which the exception indicates errors from per container and a + * allServicesMetaData map between the names of auxiliary services and their + * corresponding meta-data. Note: None-container-specific exceptions will + * still be thrown by the API method itself. + *

+ *

+ * The ApplicationMaster can use + * {@link #getContainerStatuses(GetContainerStatusesRequest)} to get updated + * statuses of the to-be-launched or launched containers. + *

+ * + * @param request + * request to start a list of containers + * @return response including conatinerIds of all successfully launched + * containers, a containerId-to-exception map for failed requests and + * a allServicesMetaData map. + * @throws YarnException + * @throws IOException + * @throws NMNotYetReadyException + * This exception is thrown when NM starts from scratch but has not + * yet connected with RM. + */ + StartContainersResponse startContainers(StartContainersRequest request) + throws YarnException, IOException; + + /** *

The ApplicationMaster requests a NodeManager - * to stop a {@link Container} allocated to it using this interface. + * to stop {@link Container}s allocated to it using this interface. *

* *

The ApplicationMaster sends a - * {@link StopContainerRequest} which includes the {@link ContainerId} of the + * {@link StopContainerRequest} which includes the {@link ContainerId}s of the * container to be stopped.

* *

Currently the NodeManager sends an immediate, empty @@ -113,12 +164,47 @@ StartContainerResponse startContainer(StartContainerRequest request) * @throws YarnException * @throws IOException */ + @Public @Stable StopContainerResponse stopContainer(StopContainerRequest request) throws YarnException, IOException; /** + *

+ * The ApplicationMaster requests a NodeManager to + * stop a list of {@link Container}s allocated to it using this + * interface. + *

+ * + *

+ * The ApplicationMaster sends a {@link StopContainersRequest} + * which includes the {@link ContainerId}s of the containers to be stopped. + *

+ * + *

+ * The NodeManager sends a response via + * {@link StopContainersResponse} which includes a list of {@link ContainerId} + * s of successfully stopped containers, a containerId-to-exception map for + * each failed request in which the exception indicates errors from per + * container. Note: None-container-specific exceptions will still be thrown by + * the API method itself. ApplicationMaster can use + * {@link #getContainerStatuses(GetContainerStatusesRequest)} to get updated + * statuses of the containers. + *

+ * + * @param request + * request to stop a list of containers + * @return response which includes a list of containerIds of successfully + * stopped containers, a containerId-to-exception map for failed + * requests. + * @throws YarnException + * @throws IOException + */ + StopContainersResponse stopContainers(StopContainersRequest request) + throws YarnException, IOException; + + /** *

The api used by the ApplicationMaster to request for * current status of a Container from the * NodeManager.

@@ -143,4 +229,39 @@ StopContainerResponse stopContainer(StopContainerRequest request) GetContainerStatusResponse getContainerStatus( GetContainerStatusRequest request) throws YarnException, IOException; + + /** + *

+ * The API used by the ApplicationMaster to request for current + * statuses of Containers from the NodeManager. + *

+ * + *

+ * The ApplicationMaster sends a + * {@link GetContainerStatusesRequest} which includes the {@link ContainerId}s + * of all containers whose statuses are needed. + *

+ * + *

+ * The NodeManager responds with + * {@link GetContainerStatusesResponse} which includes a list of + * {@link ContainerStatus} of the successfully queried containers and a + * containerId-to-exception map for each failed request in which the exception + * indicates errors from per container. Note: None-container-specific + * exceptions will still be thrown by the API method itself. + *

+ * + * @param request + * request to get ContainerStatuses of containers with + * the specified ContainerIds + * @return response containing the list of ContainerStatus of the + * successfully queried containers and a containerId-to-exception map + * for failed requests. + * + * @throws YarnException + * @throws IOException + */ + GetContainerStatusesResponse getContainerStatuses( + GetContainerStatusesRequest request) throws YarnException, + IOException; } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetContainerStatusesRequest.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetContainerStatusesRequest.java new file mode 100644 index 0000000..f9f77a3 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetContainerStatusesRequest.java @@ -0,0 +1,75 @@ +/** + * 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.hadoop.yarn.api.protocolrecords; + +import java.util.List; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Stable; +import org.apache.hadoop.yarn.api.ContainerManagementProtocol; +import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.api.records.ContainerStatus; +import org.apache.hadoop.yarn.util.Records; + +/** + *

+ * The request sent by the ApplicationMaster to the + * NodeManager to get {@link ContainerStatus} of requested + * containers. + *

+ * + * @see ContainerManagementProtocol#getContainerStatuses(GetContainerStatusesRequest) + */ +@Public +@Stable +public abstract class GetContainerStatusesRequest { + + @Public + @Stable + public static GetContainerStatusesRequest newInstance( + List containerIds) { + GetContainerStatusesRequest request = + Records.newRecord(GetContainerStatusesRequest.class); + request.setContainerIds(containerIds); + return request; + } + + /** + * Get the list of ContainerIds of containers for which to obtain + * the ContainerStatus. + * + * @return the list of ContainerIds of containers for which to + * obtain the ContainerStatus. + */ + @Public + @Stable + public abstract List getContainerIds(); + + /** + * Set a list of ContainerIds of containers for which to obtain + * the ContainerStatus + * + * @param containerIds + * a list of ContainerIds of containers for which to + * obtain the ContainerStatus + */ + @Public + @Stable + public abstract void setContainerIds(List containerIds); +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetContainerStatusesResponse.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetContainerStatusesResponse.java new file mode 100644 index 0000000..54e1d02 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetContainerStatusesResponse.java @@ -0,0 +1,93 @@ +/** + * 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.hadoop.yarn.api.protocolrecords; + +import java.util.List; +import java.util.Map; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Stable; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.ContainerManagementProtocol; +import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.api.records.ContainerStatus; +import org.apache.hadoop.yarn.api.records.SerializedException; +import org.apache.hadoop.yarn.util.Records; + +/** + *

+ * The response sent by the NodeManager to the + * ApplicationMaster when asked to obtain the + * ContainerStatus of requested containers. + *

+ * + * @see ContainerManagementProtocol#getContainerStatuses(GetContainerStatusesRequest) + */ +@Public +@Stable +public abstract class GetContainerStatusesResponse { + + @Private + @Unstable + public static GetContainerStatusesResponse newInstance( + List statuses, + Map failedRequests) { + GetContainerStatusesResponse response = + Records.newRecord(GetContainerStatusesResponse.class); + response.setContainerStatuses(statuses); + response.setFailedRequests(failedRequests); + return response; + } + + /** + * Get the ContainerStatuses of the requested containers. + * + * @return ContainerStatuses of the requested containers. + */ + @Public + @Stable + public abstract List getContainerStatuses(); + + /** + * Set the ContainerStatuses of the requested containers. + * + * @return ContainerStatuses of the requested containers. + */ + @Private + @Unstable + public abstract void setContainerStatuses(List statuses); + + /** + * Get the containerId-to-exception map in which the exception indicates error + * from per container for failed requests + */ + @Public + @Stable + public abstract Map getFailedRequests(); + + /** + * Set the containerId-to-exception map in which the exception indicates error + * from per container for failed requests + */ + @Private + @Unstable + public abstract void setFailedRequests( + Map failedContainers); +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/StartContainersRequest.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/StartContainersRequest.java new file mode 100644 index 0000000..0ec951c --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/StartContainersRequest.java @@ -0,0 +1,76 @@ +/** + * 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.hadoop.yarn.api.protocolrecords; + +import java.util.List; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Stable; +import org.apache.hadoop.yarn.api.ContainerManagementProtocol; +import org.apache.hadoop.yarn.api.records.ContainerLaunchContext; +import org.apache.hadoop.yarn.util.Records; + +/** + *

+ * The request which contains a list of {@link StartContainerRequest} sent by + * the ApplicationMaster to the NodeManager to + * start containers. + *

+ * + *

+ * In each {@link StartContainerRequest}, the ApplicationMaster has + * to provide details such as allocated resource capability, security tokens (if + * enabled), command to be executed to start the container, environment for the + * process, necessary binaries/jar/shared-objects etc. via the + * {@link ContainerLaunchContext}. + *

+ * + * @see ContainerManagementProtocol#startContainer(StartContainersRequest) + */ +@Public +@Stable +public abstract class StartContainersRequest { + + @Public + @Stable + public static StartContainersRequest newInstance( + List requests) { + StartContainersRequest request = + Records.newRecord(StartContainersRequest.class); + request.setStartContainerRequests(requests); + return request; + } + + /** + * Get a list of {@link StartContainerRequest} to start containers. + * @return a list of {@link StartContainerRequest} to start containers. + */ + @Public + @Stable + public abstract List getStartContainerRequests(); + + /** + * Set a list of {@link StartContainerRequest} to start containers. + * @param request a list of {@link StartContainerRequest} to start containers + */ + @Public + @Stable + public abstract void setStartContainerRequests( + List request); +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/StartContainersResponse.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/StartContainersResponse.java new file mode 100644 index 0000000..b63bf7d --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/StartContainersResponse.java @@ -0,0 +1,131 @@ +/** + * 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.hadoop.yarn.api.protocolrecords; + +import java.nio.ByteBuffer; +import java.util.List; +import java.util.Map; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Stable; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.ContainerManagementProtocol; +import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.api.records.SerializedException; +import org.apache.hadoop.yarn.util.Records; + +/** + *

+ * The response sent by the NodeManager to the + * ApplicationMaster when asked to start an allocated + * container. + *

+ * + * @see ContainerManagementProtocol#startContainer(StartContainerRequest) + */ +@Public +@Stable +public abstract class StartContainersResponse { + + @Private + @Unstable + public static StartContainersResponse newInstance( + Map servicesMetaData, + List succeededContainers, + Map failedContainers) { + StartContainersResponse response = + Records.newRecord(StartContainersResponse.class); + response.setAllServicesMetaData(servicesMetaData); + response.setSuccessfullyStartedContainers(succeededContainers); + response.setFailedRequests(failedContainers); + return response; + } + + /** + * Get the list of ContainerId s of the containers that are + * started successfully. + * + * @return the list of ContainerId s of the containers that are + * started successfully. + * @see ContainerManagementProtocol#startContainer(StartContainerRequest) + */ + @Public + @Stable + public abstract List getSuccessfullyStartedContainers(); + + @Private + @Unstable + public abstract void setSuccessfullyStartedContainers( + List succeededContainers); + + /** + * Get the containerId-to-exception map in which the exception indicates error + * from per container for failed requests + */ + @Public + @Stable + public abstract Map getFailedRequests(); + + /** + * Set the containerId-to-exception map in which the exception indicates error + * from per container for failed requests + */ + @Private + @Unstable + public abstract void setFailedRequests( + Map failedContainers); + + /** + *

+ * Get the meta-data from all auxiliary services running on the + * NodeManager. + *

+ *

+ * The meta-data is returned as a Map between the auxiliary service names and + * their corresponding per service meta-data as an opaque blob + * ByteBuffer + *

+ * + *

+ * To be able to interpret the per-service meta-data, you should consult the + * documentation for the Auxiliary-service configured on the NodeManager + *

+ * + * @return a Map between the names of auxiliary services and their + * corresponding meta-data + */ + @Public + @Stable + public abstract Map getAllServicesMetaData(); + + /** + * Set to the list of auxiliary services which have been started on the + * NodeManager. This is done only once when the + * NodeManager starts up + * + * @param allServicesMetaData + * A map from auxiliary service names to the opaque blob + * ByteBuffer for that auxiliary service + */ + @Private + @Unstable + public abstract void setAllServicesMetaData( + Map allServicesMetaData); +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/StopContainersRequest.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/StopContainersRequest.java new file mode 100644 index 0000000..8ea186c --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/StopContainersRequest.java @@ -0,0 +1,63 @@ +/** +* 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.hadoop.yarn.api.protocolrecords; + +import java.util.List; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Stable; +import org.apache.hadoop.yarn.api.ContainerManagementProtocol; +import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.util.Records; + +/** + *

The request sent by the ApplicationMaster to the + * NodeManager to stop containers.

+ * + * @see ContainerManagementProtocol#stopContainers(StopContainersRequest) + */ +@Public +@Stable +public abstract class StopContainersRequest { + + @Public + @Stable + public static StopContainersRequest newInstance(List containerIds) { + StopContainersRequest request = + Records.newRecord(StopContainersRequest.class); + request.setContainerIds(containerIds); + return request; + } + + /** + * Get the ContainerIds of the containers to be stopped. + * @return ContainerIds of containers to be stopped + */ + @Public + @Stable + public abstract List getContainerIds(); + + /** + * Set the ContainerIds of the containers to be stopped. + * @param containerIds ContainerIds of the containers to be stopped + */ + @Public + @Stable + public abstract void setContainerIds(List containerIds); +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/StopContainersResponse.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/StopContainersResponse.java new file mode 100644 index 0000000..ee83ca1 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/StopContainersResponse.java @@ -0,0 +1,90 @@ +/** + * 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.hadoop.yarn.api.protocolrecords; + +import java.util.List; +import java.util.Map; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Stable; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.ContainerManagementProtocol; +import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.api.records.SerializedException; +import org.apache.hadoop.yarn.util.Records; + +/** + *

+ * The response sent by the NodeManager to the + * ApplicationMaster when asked to stop an allocated + * container. + *

+ * + * @see ContainerManagementProtocol#stopContainer(StopContainerRequest) + */ +@Public +@Stable +public abstract class StopContainersResponse { + @Private + @Unstable + public static StopContainersResponse newInstance( + List succeededRequests, + Map failedRequests) { + StopContainersResponse response = + Records.newRecord(StopContainersResponse.class); + response.setFailedRequests(failedRequests); + response.setSuccessfullyStoppedContainers(succeededRequests); + return response; + } + + /** + * Get the list of containerIds of successfully stopped containers. + * + * @return the list of containerIds of successfully stopped containers. + */ + @Public + @Stable + public abstract List getSuccessfullyStoppedContainers(); + + /** + * Set the list of containerIds of successfully stopped containers. + */ + @Private + @Unstable + public abstract void setSuccessfullyStoppedContainers( + List succeededRequests); + + /** + * Get the containerId-to-exception map in which the exception indicates error + * from per container for failed requests + */ + @Public + @Stable + public abstract Map getFailedRequests(); + + /** + * Set the containerId-to-exception map in which the exception indicates error + * from per container for failed requests + */ + @Private + @Unstable + public abstract void setFailedRequests( + Map failedRequests); +} \ No newline at end of file diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerLaunchContext.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerLaunchContext.java index 54c1d07..03f82ac 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerLaunchContext.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerLaunchContext.java @@ -132,7 +132,7 @@ public static ContainerLaunchContext newInstance( /** *

- * Get application-specific binary service data. This is a map keyed + * Set application-specific binary service data. This is a map keyed * by the name of each {@link AuxiliaryService} that is configured on a * NodeManager and value correspond to the application specific data targeted * for the keyed {@link AuxiliaryService}. All pre-existing Map entries are diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/SerializedException.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/SerializedException.java new file mode 100644 index 0000000..4ee7e89 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/SerializedException.java @@ -0,0 +1,48 @@ +/** + * 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.hadoop.yarn.api.records; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.exceptions.YarnException; +import org.apache.hadoop.yarn.util.Records; + +@Private +@Unstable +public abstract class SerializedException { + + public static SerializedException newInstance(YarnException e) { + SerializedException exception = + Records.newRecord(SerializedException.class); + exception.init(e); + return exception; + } + + public abstract void init(String message, Throwable cause); + + public abstract void init(String message); + + public abstract void init(Throwable cause); + + public abstract String getMessage(); + + public abstract String getRemoteTrace(); + + public abstract SerializedException getCause(); +} \ No newline at end of file diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/containermanagement_protocol.proto hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/containermanagement_protocol.proto index 5f02a28..222aaeb 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/containermanagement_protocol.proto +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/containermanagement_protocol.proto @@ -33,4 +33,8 @@ service ContainerManagementProtocolService { rpc startContainer(StartContainerRequestProto) returns (StartContainerResponseProto); rpc stopContainer(StopContainerRequestProto) returns (StopContainerResponseProto); rpc getContainerStatus(GetContainerStatusRequestProto) returns (GetContainerStatusResponseProto); + + rpc startContainers(StartContainersRequestProto) returns (StartContainersResponseProto); + rpc stopContainers(StopContainersRequestProto) returns (StopContainersResponseProto); + rpc getContainerStatuses(GetContainerStatusesRequestProto) returns (GetContainerStatusesResponseProto); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto index 4a6db02..bd009e0 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto @@ -182,3 +182,37 @@ message GetContainerStatusRequestProto { message GetContainerStatusResponseProto { optional ContainerStatusProto status = 1; } + +//// bulk API records +message StartContainersRequestProto { + repeated StartContainerRequestProto start_container_request = 1; +} + +message ContainerExceptionMapProto { + optional ContainerIdProto container_id = 1; + optional SerializedExceptionProto exception = 2; +} + +message StartContainersResponseProto { + repeated StringBytesMapProto services_meta_data = 1; + repeated ContainerIdProto succeeded_requests = 2; + repeated ContainerExceptionMapProto failed_requests = 3; +} + +message StopContainersRequestProto { + repeated ContainerIdProto container_id = 1; +} + +message StopContainersResponseProto { + repeated ContainerIdProto succeeded_requests = 1; + repeated ContainerExceptionMapProto failed_requests = 2; +} + +message GetContainerStatusesRequestProto { + repeated ContainerIdProto container_id = 1; +} + +message GetContainerStatusesResponseProto { + repeated ContainerStatusProto status = 1; + repeated ContainerExceptionMapProto failed_requests = 2; +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ContainerManagementProtocolPBClientImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ContainerManagementProtocolPBClientImpl.java index f6c0fa6..57dbd84 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ContainerManagementProtocolPBClientImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ContainerManagementProtocolPBClientImpl.java @@ -32,22 +32,37 @@ import org.apache.hadoop.yarn.api.ContainerManagementProtocolPB; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusRequest; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusResponse; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesRequest; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetContainerStatusRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetContainerStatusResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetContainerStatusesRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetContainerStatusesResponsePBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StartContainerRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StartContainerResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StartContainersRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StartContainersResponsePBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StopContainerRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StopContainerResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StopContainersRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StopContainersResponsePBImpl; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.ipc.RPCUtil; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainerStatusRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainerStatusesRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.StartContainerRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StartContainersRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.StopContainerRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StopContainersRequestProto; import com.google.protobuf.ServiceException; @@ -128,4 +143,47 @@ public StopContainerResponse stopContainer(StopContainerRequest request) return null; } } + + @Override + public StartContainersResponse + startContainers(StartContainersRequest requests) throws YarnException, + IOException { + StartContainersRequestProto requestProto = + ((StartContainersRequestPBImpl) requests).getProto(); + try { + return new StartContainersResponsePBImpl(proxy.startContainers(null, + requestProto)); + } catch (ServiceException e) { + RPCUtil.unwrapAndThrowException(e); + return null; + } + } + + @Override + public StopContainersResponse stopContainers(StopContainersRequest requests) + throws YarnException, IOException { + StopContainersRequestProto requestProto = + ((StopContainersRequestPBImpl) requests).getProto(); + try { + return new StopContainersResponsePBImpl(proxy.stopContainers(null, + requestProto)); + } catch (ServiceException e) { + RPCUtil.unwrapAndThrowException(e); + return null; + } + } + + @Override + public GetContainerStatusesResponse getContainerStatuses( + GetContainerStatusesRequest request) throws YarnException, IOException { + GetContainerStatusesRequestProto requestProto = + ((GetContainerStatusesRequestPBImpl) request).getProto(); + try { + return new GetContainerStatusesResponsePBImpl(proxy.getContainerStatuses( + null, requestProto)); + } catch (ServiceException e) { + RPCUtil.unwrapAndThrowException(e); + return null; + } + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ContainerManagementProtocolPBServiceImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ContainerManagementProtocolPBServiceImpl.java index 5c2a96a..0bf28e2 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ContainerManagementProtocolPBServiceImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ContainerManagementProtocolPBServiceImpl.java @@ -24,21 +24,36 @@ import org.apache.hadoop.yarn.api.ContainerManagementProtocol; import org.apache.hadoop.yarn.api.ContainerManagementProtocolPB; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusResponse; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetContainerStatusRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetContainerStatusResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetContainerStatusesRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetContainerStatusesResponsePBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StartContainerRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StartContainerResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StartContainersRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StartContainersResponsePBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StopContainerRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StopContainerResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StopContainersRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.StopContainersResponsePBImpl; import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainerStatusRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainerStatusResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainerStatusesRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainerStatusesResponseProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.StartContainerRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.StartContainerResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StartContainersRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StartContainersResponseProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.StopContainerRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.StopContainerResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StopContainersRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StopContainersResponseProto; import com.google.protobuf.RpcController; import com.google.protobuf.ServiceException; @@ -94,4 +109,46 @@ public StopContainerResponseProto stopContainer(RpcController arg0, } } + @Override + public StartContainersResponseProto startContainers(RpcController arg0, + StartContainersRequestProto proto) throws ServiceException { + StartContainersRequestPBImpl request = new StartContainersRequestPBImpl(proto); + try { + StartContainersResponse response = real.startContainers(request); + return ((StartContainersResponsePBImpl)response).getProto(); + } catch (YarnException e) { + throw new ServiceException(e); + } catch (IOException e) { + throw new ServiceException(e); + } + } + + @Override + public StopContainersResponseProto stopContainers(RpcController arg0, + StopContainersRequestProto proto) throws ServiceException { + StopContainersRequestPBImpl request = new StopContainersRequestPBImpl(proto); + try { + StopContainersResponse response = real.stopContainers(request); + return ((StopContainersResponsePBImpl)response).getProto(); + } catch (YarnException e) { + throw new ServiceException(e); + } catch (IOException e) { + throw new ServiceException(e); + } + } + + @Override + public GetContainerStatusesResponseProto getContainerStatuses( + RpcController arg0, GetContainerStatusesRequestProto proto) + throws ServiceException { + GetContainerStatusesRequestPBImpl request = new GetContainerStatusesRequestPBImpl(proto); + try { + GetContainerStatusesResponse response = real.getContainerStatuses(request); + return ((GetContainerStatusesResponsePBImpl)response).getProto(); + } catch (YarnException e) { + throw new ServiceException(e); + } catch (IOException e) { + throw new ServiceException(e); + } + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetContainerStatusesRequestPBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetContainerStatusesRequestPBImpl.java new file mode 100644 index 0000000..0c305ca --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetContainerStatusesRequestPBImpl.java @@ -0,0 +1,149 @@ +/** + * 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.hadoop.yarn.api.protocolrecords.impl.pb; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesRequest; +import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.api.records.impl.pb.ContainerIdPBImpl; +import org.apache.hadoop.yarn.proto.YarnProtos.ContainerIdProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainerStatusesRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainerStatusesRequestProtoOrBuilder; + +@Private +@Unstable +public class GetContainerStatusesRequestPBImpl extends + GetContainerStatusesRequest { + GetContainerStatusesRequestProto proto = GetContainerStatusesRequestProto + .getDefaultInstance(); + GetContainerStatusesRequestProto.Builder builder = null; + boolean viaProto = false; + + private List containerIds = null; + + public GetContainerStatusesRequestPBImpl() { + builder = GetContainerStatusesRequestProto.newBuilder(); + } + + public GetContainerStatusesRequestPBImpl( + GetContainerStatusesRequestProto proto) { + this.proto = proto; + viaProto = true; + } + + public GetContainerStatusesRequestProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + @Override + public int hashCode() { + return getProto().hashCode(); + } + + @Override + public boolean equals(Object other) { + if (other == null) + return false; + if (other.getClass().isAssignableFrom(this.getClass())) { + return this.getProto().equals(this.getClass().cast(other).getProto()); + } + return false; + } + + @Override + public String toString() { + return getProto().toString().replaceAll("\\n", ", ") + .replaceAll("\\s+", " "); + } + + private void mergeLocalToBuilder() { + if (this.containerIds != null) { + addLocalContainerIdsToProto(); + } + } + + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = GetContainerStatusesRequestProto.newBuilder(proto); + } + viaProto = false; + } + + private void addLocalContainerIdsToProto() { + maybeInitBuilder(); + builder.clearContainerId(); + if (this.containerIds == null) + return; + List protoList = new ArrayList(); + for (ContainerId id : containerIds) { + protoList.add(convertToProtoFormat(id)); + } + builder.addAllContainerId(protoList); + } + + private void initLocalContainerIds() { + if (this.containerIds != null) { + return; + } + GetContainerStatusesRequestProtoOrBuilder p = viaProto ? proto : builder; + List containerIds = p.getContainerIdList(); + this.containerIds = new ArrayList(); + for (ContainerIdProto id : containerIds) { + this.containerIds.add(convertFromProtoFormat(id)); + } + } + + @Override + public List getContainerIds() { + initLocalContainerIds(); + return this.containerIds; + } + + @Override + public void setContainerIds(List containerIds) { + maybeInitBuilder(); + if (containerIds == null) + builder.clearContainerId(); + this.containerIds = containerIds; + } + + private ContainerIdPBImpl convertFromProtoFormat(ContainerIdProto p) { + return new ContainerIdPBImpl(p); + } + + private ContainerIdProto convertToProtoFormat(ContainerId t) { + return ((ContainerIdPBImpl) t).getProto(); + } + +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetContainerStatusesResponsePBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetContainerStatusesResponsePBImpl.java new file mode 100644 index 0000000..b28dd5b --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetContainerStatusesResponsePBImpl.java @@ -0,0 +1,222 @@ +/** + * 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.hadoop.yarn.api.protocolrecords.impl.pb; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; +import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.api.records.ContainerStatus; +import org.apache.hadoop.yarn.api.records.SerializedException; +import org.apache.hadoop.yarn.api.records.impl.pb.ContainerIdPBImpl; +import org.apache.hadoop.yarn.api.records.impl.pb.ContainerStatusPBImpl; +import org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl; +import org.apache.hadoop.yarn.proto.YarnProtos.ContainerIdProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ContainerStatusProto; +import org.apache.hadoop.yarn.proto.YarnProtos.SerializedExceptionProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ContainerExceptionMapProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainerStatusesResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainerStatusesResponseProtoOrBuilder; + +@Private +@Unstable +public class GetContainerStatusesResponsePBImpl extends + GetContainerStatusesResponse { + GetContainerStatusesResponseProto proto = GetContainerStatusesResponseProto + .getDefaultInstance(); + GetContainerStatusesResponseProto.Builder builder = null; + boolean viaProto = false; + + private List containerStatuses = null; + private Map failedRequests = null; + + public GetContainerStatusesResponsePBImpl() { + builder = GetContainerStatusesResponseProto.newBuilder(); + } + + public GetContainerStatusesResponsePBImpl( + GetContainerStatusesResponseProto proto) { + this.proto = proto; + viaProto = true; + } + + public GetContainerStatusesResponseProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + @Override + public int hashCode() { + return getProto().hashCode(); + } + + @Override + public boolean equals(Object other) { + if (other == null) + return false; + if (other.getClass().isAssignableFrom(this.getClass())) { + return this.getProto().equals(this.getClass().cast(other).getProto()); + } + return false; + } + + @Override + public String toString() { + return getProto().toString().replaceAll("\\n", ", ") + .replaceAll("\\s+", " "); + } + + private void mergeLocalToBuilder() { + if (this.containerStatuses != null) { + addLocalContainerStatusesToProto(); + } + if (this.failedRequests != null) { + addFailedRequestsToProto(); + } + } + + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = GetContainerStatusesResponseProto.newBuilder(proto); + } + viaProto = false; + } + + private void addLocalContainerStatusesToProto() { + maybeInitBuilder(); + builder.clearStatus(); + if (this.containerStatuses == null) + return; + List protoList = + new ArrayList(); + for (ContainerStatus status : containerStatuses) { + protoList.add(convertToProtoFormat(status)); + } + builder.addAllStatus(protoList); + } + + private void addFailedRequestsToProto() { + maybeInitBuilder(); + builder.clearFailedRequests(); + if (this.failedRequests == null) + return; + List protoList = + new ArrayList(); + for (Map.Entry entry : this.failedRequests + .entrySet()) { + protoList.add(ContainerExceptionMapProto.newBuilder() + .setContainerId(convertToProtoFormat(entry.getKey())) + .setException(convertToProtoFormat(entry.getValue())).build()); + } + builder.addAllFailedRequests(protoList); + } + + private void initLocalContainerStatuses() { + if (this.containerStatuses != null) { + return; + } + GetContainerStatusesResponseProtoOrBuilder p = viaProto ? proto : builder; + List statuses = p.getStatusList(); + for (ContainerStatusProto status : statuses) { + this.containerStatuses.add(convertFromProtoFormat(status)); + } + } + + private void initFailedRequests() { + if (this.failedRequests != null) { + return; + } + GetContainerStatusesResponseProtoOrBuilder p = viaProto ? proto : builder; + List protoList = p.getFailedRequestsList(); + this.failedRequests = new HashMap(); + for (ContainerExceptionMapProto ce : protoList) { + this.failedRequests.put(convertFromProtoFormat(ce.getContainerId()), + convertFromProtoFormat(ce.getException())); + } + } + + @Override + public List getContainerStatuses() { + initLocalContainerStatuses(); + return this.containerStatuses; + } + + @Override + public void setContainerStatuses(List statuses) { + maybeInitBuilder(); + if (statuses == null) + builder.clearStatus(); + this.containerStatuses = statuses; + } + + @Override + public Map getFailedRequests() { + initFailedRequests(); + return this.failedRequests; + } + + @Override + public void setFailedRequests( + Map failedRequests) { + maybeInitBuilder(); + if (failedRequests == null) + builder.clearFailedRequests(); + this.failedRequests = failedRequests; + } + + private ContainerStatusPBImpl convertFromProtoFormat(ContainerStatusProto p) { + return new ContainerStatusPBImpl(p); + } + + private ContainerStatusProto convertToProtoFormat(ContainerStatus t) { + return ((ContainerStatusPBImpl) t).getProto(); + } + + private ContainerIdPBImpl convertFromProtoFormat(ContainerIdProto p) { + return new ContainerIdPBImpl(p); + } + + private ContainerIdProto convertToProtoFormat(ContainerId t) { + return ((ContainerIdPBImpl) t).getProto(); + } + + private SerializedExceptionPBImpl convertFromProtoFormat( + SerializedExceptionProto p) { + return new SerializedExceptionPBImpl(p); + } + + private SerializedExceptionProto convertToProtoFormat(SerializedException t) { + return ((SerializedExceptionPBImpl) t).getProto(); + } +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StartContainersRequestPBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StartContainersRequestPBImpl.java new file mode 100644 index 0000000..659aedd --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StartContainersRequestPBImpl.java @@ -0,0 +1,121 @@ +package org.apache.hadoop.yarn.api.protocolrecords.impl.pb; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StartContainerRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StartContainersRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StartContainersRequestProtoOrBuilder; + +public class StartContainersRequestPBImpl extends StartContainersRequest { + StartContainersRequestProto proto = StartContainersRequestProto + .getDefaultInstance(); + StartContainersRequestProto.Builder builder = null; + boolean viaProto = false; + + private List requests = null; + + public StartContainersRequestPBImpl() { + builder = StartContainersRequestProto.newBuilder(); + } + + public StartContainersRequestPBImpl(StartContainersRequestProto proto) { + this.proto = proto; + viaProto = true; + } + + public StartContainersRequestProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + @Override + public int hashCode() { + return getProto().hashCode(); + } + + @Override + public boolean equals(Object other) { + if (other == null) + return false; + if (other.getClass().isAssignableFrom(this.getClass())) { + return this.getProto().equals(this.getClass().cast(other).getProto()); + } + return false; + } + + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void mergeLocalToBuilder() { + if (requests != null) { + addLocalRequestsToProto(); + } + } + + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = StartContainersRequestProto.newBuilder(proto); + } + viaProto = false; + } + + private void addLocalRequestsToProto() { + maybeInitBuilder(); + builder.clearStartContainerRequest(); + List protoList = + new ArrayList(); + for (StartContainerRequest r : this.requests) { + protoList.add(convertToProtoFormat(r)); + } + builder.addAllStartContainerRequest(protoList); + } + + private void initLocalRequests() { + StartContainersRequestProtoOrBuilder p = viaProto ? proto : builder; + List requestList = + p.getStartContainerRequestList(); + this.requests = new ArrayList(); + for (StartContainerRequestProto r : requestList) { + this.requests.add(convertFromProtoFormat(r)); + } + } + + @Override + public void setStartContainerRequests(List requests) { + maybeInitBuilder(); + if (requests == null) { + builder.clearStartContainerRequest(); + } + this.requests = requests; + } + + @Override + public List getStartContainerRequests() { + if (this.requests != null) { + return this.requests; + } + initLocalRequests(); + return this.requests; + } + + private StartContainerRequestPBImpl convertFromProtoFormat( + StartContainerRequestProto p) { + return new StartContainerRequestPBImpl(p); + } + + private StartContainerRequestProto convertToProtoFormat( + StartContainerRequest t) { + return ((StartContainerRequestPBImpl) t).getProto(); + } +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StartContainersResponsePBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StartContainersResponsePBImpl.java new file mode 100644 index 0000000..d3fcd13 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StartContainersResponsePBImpl.java @@ -0,0 +1,319 @@ +/** + * 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.hadoop.yarn.api.protocolrecords.impl.pb; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; +import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.api.records.SerializedException; +import org.apache.hadoop.yarn.api.records.impl.pb.ContainerIdPBImpl; +import org.apache.hadoop.yarn.api.records.impl.pb.ProtoUtils; +import org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl; +import org.apache.hadoop.yarn.proto.YarnProtos.ContainerIdProto; +import org.apache.hadoop.yarn.proto.YarnProtos.SerializedExceptionProto; +import org.apache.hadoop.yarn.proto.YarnProtos.StringBytesMapProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ContainerExceptionMapProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StartContainersResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StartContainersResponseProtoOrBuilder; + +import com.google.protobuf.ByteString; + +@Private +@Unstable +public class StartContainersResponsePBImpl extends StartContainersResponse { + StartContainersResponseProto proto = StartContainersResponseProto + .getDefaultInstance(); + StartContainersResponseProto.Builder builder = null; + boolean viaProto = false; + + private Map servicesMetaData = null; + private List succeededContainers = null; + private Map failedContainers = null; + + public StartContainersResponsePBImpl() { + builder = StartContainersResponseProto.newBuilder(); + } + + public StartContainersResponsePBImpl(StartContainersResponseProto proto) { + this.proto = proto; + viaProto = true; + } + + public synchronized StartContainersResponseProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + @Override + public int hashCode() { + return getProto().hashCode(); + } + + @Override + public boolean equals(Object other) { + if (other == null) + return false; + if (other.getClass().isAssignableFrom(this.getClass())) { + return this.getProto().equals(this.getClass().cast(other).getProto()); + } + return false; + } + + @Override + public String toString() { + return getProto().toString().replaceAll("\\n", ", ") + .replaceAll("\\s+", " "); + } + + private synchronized void mergeLocalToBuilder() { + if (this.servicesMetaData != null) { + addServicesMetaDataToProto(); + } + if (this.succeededContainers != null) { + addSucceededContainersToProto(); + } + if (this.failedContainers != null) { + addFailedContainersToProto(); + } + } + + protected final ByteBuffer convertFromProtoFormat(ByteString byteString) { + return ProtoUtils.convertFromProtoFormat(byteString); + } + + protected final ByteString convertToProtoFormat(ByteBuffer byteBuffer) { + return ProtoUtils.convertToProtoFormat(byteBuffer); + } + + private ContainerIdPBImpl convertFromProtoFormat(ContainerIdProto p) { + return new ContainerIdPBImpl(p); + } + + private ContainerIdProto convertToProtoFormat(ContainerId t) { + return ((ContainerIdPBImpl) t).getProto(); + } + + private SerializedExceptionPBImpl convertFromProtoFormat( + SerializedExceptionProto p) { + return new SerializedExceptionPBImpl(p); + } + + private SerializedExceptionProto convertToProtoFormat(SerializedException t) { + return ((SerializedExceptionPBImpl) t).getProto(); + } + + private synchronized void mergeLocalToProto() { + if (viaProto) { + maybeInitBuilder(); + } + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private synchronized void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = StartContainersResponseProto.newBuilder(proto); + } + viaProto = false; + } + + @Override + public synchronized Map getAllServicesMetaData() { + initServicesMetaData(); + return this.servicesMetaData; + } + + @Override + public synchronized void setAllServicesMetaData( + Map servicesMetaData) { + if (servicesMetaData == null) { + return; + } + initServicesMetaData(); + this.servicesMetaData.clear(); + this.servicesMetaData.putAll(servicesMetaData); + } + + private synchronized void initServicesMetaData() { + if (this.servicesMetaData != null) { + return; + } + StartContainersResponseProtoOrBuilder p = viaProto ? proto : builder; + List list = p.getServicesMetaDataList(); + this.servicesMetaData = new HashMap(); + + for (StringBytesMapProto c : list) { + this.servicesMetaData.put(c.getKey(), + convertFromProtoFormat(c.getValue())); + } + } + + private synchronized void addServicesMetaDataToProto() { + maybeInitBuilder(); + builder.clearServicesMetaData(); + if (servicesMetaData == null) + return; + Iterable iterable = + new Iterable() { + + @Override + public synchronized Iterator iterator() { + return new Iterator() { + + Iterator keyIter = servicesMetaData.keySet().iterator(); + + @Override + public synchronized void remove() { + throw new UnsupportedOperationException(); + } + + @Override + public synchronized StringBytesMapProto next() { + String key = keyIter.next(); + return StringBytesMapProto.newBuilder().setKey(key) + .setValue(convertToProtoFormat(servicesMetaData.get(key))) + .build(); + } + + @Override + public synchronized boolean hasNext() { + return keyIter.hasNext(); + } + }; + } + }; + builder.addAllServicesMetaData(iterable); + } + + private void addFailedContainersToProto() { + maybeInitBuilder(); + builder.clearFailedRequests(); + if (this.failedContainers == null) + return; + List protoList = + new ArrayList(); + + for (Map.Entry entry : this.failedContainers + .entrySet()) { + protoList.add(ContainerExceptionMapProto.newBuilder() + .setContainerId(convertToProtoFormat(entry.getKey())) + .setException(convertToProtoFormat(entry.getValue())).build()); + } + builder.addAllFailedRequests(protoList); + } + + private void addSucceededContainersToProto() { + maybeInitBuilder(); + builder.clearSucceededRequests(); + if (this.succeededContainers == null) { + return; + } + Iterable iterable = new Iterable() { + @Override + public Iterator iterator() { + return new Iterator() { + + Iterator iter = succeededContainers.iterator(); + + @Override + public boolean hasNext() { + return iter.hasNext(); + } + + @Override + public ContainerIdProto next() { + return convertToProtoFormat(iter.next()); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + + } + }; + } + }; + builder.addAllSucceededRequests(iterable); + } + + private void initSucceededContainers() { + if (this.succeededContainers != null) + return; + StartContainersResponseProtoOrBuilder p = viaProto ? proto : builder; + List list = p.getSucceededRequestsList(); + this.succeededContainers = new ArrayList(); + for (ContainerIdProto c : list) { + this.succeededContainers.add(convertFromProtoFormat(c)); + } + } + + @Override + public List getSuccessfullyStartedContainers() { + initSucceededContainers(); + return this.succeededContainers; + } + + @Override + public void setSuccessfullyStartedContainers(List succeededContainers) { + maybeInitBuilder(); + if (succeededContainers == null) { + builder.clearSucceededRequests(); + } + this.succeededContainers = succeededContainers; + } + + private void initFailedContainers() { + if (this.failedContainers != null) { + return; + } + StartContainersResponseProtoOrBuilder p = viaProto ? proto : builder; + List protoList = p.getFailedRequestsList(); + this.failedContainers = new HashMap(); + for (ContainerExceptionMapProto ce : protoList) { + this.failedContainers.put(convertFromProtoFormat(ce.getContainerId()), + convertFromProtoFormat(ce.getException())); + } + } + + @Override + public Map getFailedRequests() { + initFailedContainers(); + return this.failedContainers; + } + + @Override + public void setFailedRequests( + Map failedContainers) { + maybeInitBuilder(); + if (failedContainers == null) + builder.clearFailedRequests(); + this.failedContainers = failedContainers; + } +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StopContainersRequestPBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StopContainersRequestPBImpl.java new file mode 100644 index 0000000..5c758e8 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StopContainersRequestPBImpl.java @@ -0,0 +1,146 @@ +/** + * 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.hadoop.yarn.api.protocolrecords.impl.pb; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; +import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.api.records.impl.pb.ContainerIdPBImpl; +import org.apache.hadoop.yarn.proto.YarnProtos.ContainerIdProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StopContainersRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StopContainersRequestProtoOrBuilder; + +@Private +@Unstable +public class StopContainersRequestPBImpl extends StopContainersRequest { + StopContainersRequestProto proto = StopContainersRequestProto + .getDefaultInstance(); + StopContainersRequestProto.Builder builder = null; + boolean viaProto = false; + + private List containerIds = null; + + public StopContainersRequestPBImpl() { + builder = StopContainersRequestProto.newBuilder(); + } + + public StopContainersRequestPBImpl(StopContainersRequestProto proto) { + this.proto = proto; + viaProto = true; + } + + public StopContainersRequestProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + @Override + public int hashCode() { + return getProto().hashCode(); + } + + @Override + public boolean equals(Object other) { + if (other == null) + return false; + if (other.getClass().isAssignableFrom(this.getClass())) { + return this.getProto().equals(this.getClass().cast(other).getProto()); + } + return false; + } + + @Override + public String toString() { + return getProto().toString().replaceAll("\\n", ", ") + .replaceAll("\\s+", " "); + } + + private void mergeLocalToBuilder() { + if (this.containerIds != null) { + addLocalContainerIdsToProto(); + } + } + + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = StopContainersRequestProto.newBuilder(proto); + } + viaProto = false; + } + + private void addLocalContainerIdsToProto() { + maybeInitBuilder(); + builder.clearContainerId(); + if (this.containerIds == null) + return; + List protoList = new ArrayList(); + for (ContainerId id : containerIds) { + protoList.add(convertToProtoFormat(id)); + } + builder.addAllContainerId(protoList); + } + + private void initLocalContainerIds() { + if (this.containerIds != null) { + return; + } + StopContainersRequestProtoOrBuilder p = viaProto ? proto : builder; + List containerIds = p.getContainerIdList(); + this.containerIds = new ArrayList(); + for (ContainerIdProto id : containerIds) { + this.containerIds.add(convertFromProtoFormat(id)); + } + } + + @Override + public List getContainerIds() { + initLocalContainerIds(); + return this.containerIds; + } + + @Override + public void setContainerIds(List containerIds) { + maybeInitBuilder(); + if (containerIds == null) + builder.clearContainerId(); + this.containerIds = containerIds; + } + + private ContainerIdPBImpl convertFromProtoFormat(ContainerIdProto p) { + return new ContainerIdPBImpl(p); + } + + private ContainerIdProto convertToProtoFormat(ContainerId t) { + return ((ContainerIdPBImpl) t).getProto(); + } +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StopContainersResponsePBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StopContainersResponsePBImpl.java new file mode 100644 index 0000000..4d07dd8 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StopContainersResponsePBImpl.java @@ -0,0 +1,234 @@ +/** + * 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.hadoop.yarn.api.protocolrecords.impl.pb; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; +import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.api.records.SerializedException; +import org.apache.hadoop.yarn.api.records.impl.pb.ContainerIdPBImpl; +import org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl; +import org.apache.hadoop.yarn.proto.YarnProtos.ContainerIdProto; +import org.apache.hadoop.yarn.proto.YarnProtos.SerializedExceptionProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ContainerExceptionMapProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StopContainersResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.StopContainersResponseProtoOrBuilder; + +@Private +@Unstable +public class StopContainersResponsePBImpl extends StopContainersResponse { + StopContainersResponseProto proto = StopContainersResponseProto + .getDefaultInstance(); + StopContainersResponseProto.Builder builder = null; + boolean viaProto = false; + private List succeededRequests = null; + private Map failedRequests = null; + + public StopContainersResponsePBImpl() { + builder = StopContainersResponseProto.newBuilder(); + } + + public StopContainersResponsePBImpl(StopContainersResponseProto proto) { + this.proto = proto; + viaProto = true; + } + + public StopContainersResponseProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + @Override + public int hashCode() { + return getProto().hashCode(); + } + + @Override + public boolean equals(Object other) { + if (other == null) + return false; + if (other.getClass().isAssignableFrom(this.getClass())) { + return this.getProto().equals(this.getClass().cast(other).getProto()); + } + return false; + } + + @Override + public String toString() { + return getProto().toString().replaceAll("\\n", ", ") + .replaceAll("\\s+", " "); + } + + private synchronized void mergeLocalToProto() { + if (viaProto) { + maybeInitBuilder(); + } + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private synchronized void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = StopContainersResponseProto.newBuilder(proto); + } + viaProto = false; + } + + private synchronized void mergeLocalToBuilder() { + + if (this.succeededRequests != null) { + addSucceededRequestsToProto(); + } + if (this.failedRequests != null) { + addFailedRequestsToProto(); + } + } + + private void addSucceededRequestsToProto() { + maybeInitBuilder(); + builder.clearSucceededRequests(); + if (this.succeededRequests == null) { + return; + } + Iterable iterable = new Iterable() { + @Override + public Iterator iterator() { + return new Iterator() { + + Iterator iter = succeededRequests.iterator(); + + @Override + public boolean hasNext() { + return iter.hasNext(); + } + + @Override + public ContainerIdProto next() { + return convertToProtoFormat(iter.next()); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + + } + }; + } + }; + builder.addAllSucceededRequests(iterable); + } + + private void addFailedRequestsToProto() { + maybeInitBuilder(); + builder.clearFailedRequests(); + if (this.failedRequests == null) + return; + List protoList = + new ArrayList(); + + for (Map.Entry entry : this.failedRequests + .entrySet()) { + protoList.add(ContainerExceptionMapProto.newBuilder() + .setContainerId(convertToProtoFormat(entry.getKey())) + .setException(convertToProtoFormat(entry.getValue())).build()); + } + builder.addAllFailedRequests(protoList); + } + + private void initSucceededRequests() { + if (this.succeededRequests != null) + return; + StopContainersResponseProtoOrBuilder p = viaProto ? proto : builder; + List list = p.getSucceededRequestsList(); + this.succeededRequests = new ArrayList(); + for (ContainerIdProto c : list) { + this.succeededRequests.add(convertFromProtoFormat(c)); + } + } + + private void initFailedRequests() { + if (this.failedRequests != null) { + return; + } + StopContainersResponseProtoOrBuilder p = viaProto ? proto : builder; + List protoList = p.getFailedRequestsList(); + this.failedRequests = new HashMap(); + for (ContainerExceptionMapProto ce : protoList) { + this.failedRequests.put(convertFromProtoFormat(ce.getContainerId()), + convertFromProtoFormat(ce.getException())); + } + } + + @Override + public List getSuccessfullyStoppedContainers() { + initSucceededRequests(); + return this.succeededRequests; + } + + @Override + public void setSuccessfullyStoppedContainers(List succeededRequests) { + maybeInitBuilder(); + if (succeededRequests == null) { + builder.clearSucceededRequests(); + } + this.succeededRequests = succeededRequests; + } + + @Override + public Map getFailedRequests() { + initFailedRequests(); + return this.failedRequests; + } + + @Override + public void setFailedRequests( + Map failedRequests) { + maybeInitBuilder(); + if (failedRequests == null) + builder.clearFailedRequests(); + this.failedRequests = failedRequests; + } + + private ContainerIdPBImpl convertFromProtoFormat(ContainerIdProto p) { + return new ContainerIdPBImpl(p); + } + + private ContainerIdProto convertToProtoFormat(ContainerId t) { + return ((ContainerIdPBImpl) t).getProto(); + } + + private SerializedExceptionPBImpl convertFromProtoFormat( + SerializedExceptionProto p) { + return new SerializedExceptionPBImpl(p); + } + + private SerializedExceptionProto convertToProtoFormat(SerializedException t) { + return ((SerializedExceptionPBImpl) t).getProto(); + } +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/SerializedExceptionPBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/SerializedExceptionPBImpl.java new file mode 100644 index 0000000..5f1eb3d --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/SerializedExceptionPBImpl.java @@ -0,0 +1,113 @@ +/** + * 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.hadoop.yarn.api.records.impl.pb; + +import java.io.PrintWriter; +import java.io.StringWriter; + +import org.apache.hadoop.yarn.api.records.SerializedException; +import org.apache.hadoop.yarn.proto.YarnProtos.SerializedExceptionProto; +import org.apache.hadoop.yarn.proto.YarnProtos.SerializedExceptionProtoOrBuilder; + +public class SerializedExceptionPBImpl extends SerializedException { + + SerializedExceptionProto proto = SerializedExceptionProto + .getDefaultInstance(); + SerializedExceptionProto.Builder builder = null; + boolean viaProto = false; + + public SerializedExceptionPBImpl() { + } + + public SerializedExceptionPBImpl(SerializedExceptionProto proto) { + this.proto = proto; + viaProto = true; + } + + private SerializedExceptionPBImpl(Throwable t) { + init(t); + } + + public void init(String message) { + maybeInitBuilder(); + builder.setMessage(message); + } + + public void init(Throwable t) { + maybeInitBuilder(); + if (t == null) { + return; + } + + if (t.getCause() == null) { + } else { + builder.setCause(new SerializedExceptionPBImpl(t.getCause()).getProto()); + builder.setClassName(t.getClass().getCanonicalName()); + } + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + t.printStackTrace(pw); + pw.close(); + if (sw.toString() != null) + builder.setTrace(sw.toString()); + if (t.getMessage() != null) + builder.setMessage(t.getMessage()); + } + + public void init(String message, Throwable t) { + init(t); + if (message != null) + builder.setMessage(message); + } + + @Override + public String getMessage() { + SerializedExceptionProtoOrBuilder p = viaProto ? proto : builder; + return p.getMessage(); + } + + @Override + public String getRemoteTrace() { + SerializedExceptionProtoOrBuilder p = viaProto ? proto : builder; + return p.getTrace(); + } + + @Override + public SerializedException getCause() { + SerializedExceptionProtoOrBuilder p = viaProto ? proto : builder; + if (p.hasCause()) { + return new SerializedExceptionPBImpl(p.getCause()); + } else { + return null; + } + } + + public SerializedExceptionProto getProto() { + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = SerializedExceptionProto.newBuilder(proto); + } + viaProto = false; + } +} \ No newline at end of file diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/TestContainerLaunchRPC.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/TestContainerLaunchRPC.java index 0c633f1..4a1a5d3 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/TestContainerLaunchRPC.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/TestContainerLaunchRPC.java @@ -33,10 +33,16 @@ import org.apache.hadoop.yarn.api.ContainerManagementProtocol; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusRequest; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusResponse; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesRequest; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ContainerId; @@ -157,5 +163,27 @@ public StopContainerResponse stopContainer(StopContainerRequest request) "Dummy function cause")); throw new YarnException(e); } + + @Override + public StartContainersResponse startContainers( + StartContainersRequest requests) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public StopContainersResponse + stopContainers(StopContainersRequest requests) throws YarnException, + IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public GetContainerStatusesResponse getContainerStatuses( + GetContainerStatusesRequest request) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/TestRPC.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/TestRPC.java index 68aeb56..8fca2fd 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/TestRPC.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/TestRPC.java @@ -35,11 +35,17 @@ import org.apache.hadoop.yarn.api.ContainerManagementProtocolPB; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusRequest; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusResponse; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesRequest; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; import org.apache.hadoop.yarn.api.protocolrecords.GetNewApplicationRequest; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ContainerId; @@ -203,6 +209,28 @@ public StopContainerResponse stopContainer(StopContainerRequest request) new Exception(EXCEPTION_CAUSE)); throw new YarnException(e); } + + @Override + public StartContainersResponse startContainers( + StartContainersRequest requests) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public StopContainersResponse + stopContainers(StopContainersRequest requests) throws YarnException, + IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public GetContainerStatusesResponse getContainerStatuses( + GetContainerStatusesRequest request) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } } public static ContainerTokenIdentifier newContainerTokenIdentifier( diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/records/SerializedException.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/records/SerializedException.java deleted file mode 100644 index 9750607..0000000 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/records/SerializedException.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * 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.hadoop.yarn.server.api.records; - -import org.apache.hadoop.classification.InterfaceAudience.Private; -import org.apache.hadoop.classification.InterfaceStability.Unstable; - -@Private -@Unstable -public abstract class SerializedException { - - public abstract void init(String message, Throwable cause); - - public abstract void init(String message); - - public abstract void init(Throwable cause); - - public abstract String getMessage(); - - public abstract String getRemoteTrace(); - - public abstract SerializedException getCause(); -} \ No newline at end of file diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/records/impl/pb/SerializedExceptionPBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/records/impl/pb/SerializedExceptionPBImpl.java deleted file mode 100644 index 428cfe4..0000000 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/records/impl/pb/SerializedExceptionPBImpl.java +++ /dev/null @@ -1,113 +0,0 @@ -/** - * 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.hadoop.yarn.server.api.records.impl.pb; - -import java.io.PrintWriter; -import java.io.StringWriter; - -import org.apache.hadoop.yarn.proto.YarnProtos.SerializedExceptionProto; -import org.apache.hadoop.yarn.proto.YarnProtos.SerializedExceptionProtoOrBuilder; -import org.apache.hadoop.yarn.server.api.records.SerializedException; - -public class SerializedExceptionPBImpl extends SerializedException { - - SerializedExceptionProto proto = SerializedExceptionProto - .getDefaultInstance(); - SerializedExceptionProto.Builder builder = null; - boolean viaProto = false; - - public SerializedExceptionPBImpl() { - } - - public SerializedExceptionPBImpl(SerializedExceptionProto proto) { - this.proto = proto; - viaProto = true; - } - - private SerializedExceptionPBImpl(Throwable t) { - init(t); - } - - public void init(String message) { - maybeInitBuilder(); - builder.setMessage(message); - } - - public void init(Throwable t) { - maybeInitBuilder(); - if (t == null) { - return; - } - - if (t.getCause() == null) { - } else { - builder.setCause(new SerializedExceptionPBImpl(t.getCause()).getProto()); - builder.setClassName(t.getClass().getCanonicalName()); - } - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - t.printStackTrace(pw); - pw.close(); - if (sw.toString() != null) - builder.setTrace(sw.toString()); - if (t.getMessage() != null) - builder.setMessage(t.getMessage()); - } - - public void init(String message, Throwable t) { - init(t); - if (message != null) - builder.setMessage(message); - } - - @Override - public String getMessage() { - SerializedExceptionProtoOrBuilder p = viaProto ? proto : builder; - return p.getMessage(); - } - - @Override - public String getRemoteTrace() { - SerializedExceptionProtoOrBuilder p = viaProto ? proto : builder; - return p.getTrace(); - } - - @Override - public SerializedException getCause() { - SerializedExceptionProtoOrBuilder p = viaProto ? proto : builder; - if (p.hasCause()) { - return new SerializedExceptionPBImpl(p.getCause()); - } else { - return null; - } - } - - public SerializedExceptionProto getProto() { - proto = viaProto ? proto : builder.build(); - viaProto = true; - return proto; - } - - private void maybeInitBuilder() { - if (viaProto || builder == null) { - builder = SerializedExceptionProto.newBuilder(proto); - } - viaProto = false; - } -} \ No newline at end of file diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/utils/YarnServerBuilderUtils.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/utils/YarnServerBuilderUtils.java index e472746..cf2e200 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/utils/YarnServerBuilderUtils.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/utils/YarnServerBuilderUtils.java @@ -22,12 +22,12 @@ import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ContainerId; +import org.apache.hadoop.yarn.api.records.SerializedException; import org.apache.hadoop.yarn.factories.RecordFactory; import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider; import org.apache.hadoop.yarn.server.api.protocolrecords.NodeHeartbeatResponse; import org.apache.hadoop.yarn.server.api.records.MasterKey; import org.apache.hadoop.yarn.server.api.records.NodeAction; -import org.apache.hadoop.yarn.server.api.records.SerializedException; import org.apache.hadoop.yarn.util.Records; /** diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/TestYarnServerApiClasses.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/TestYarnServerApiClasses.java index 41fc68e..f728eb3 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/TestYarnServerApiClasses.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/TestYarnServerApiClasses.java @@ -34,6 +34,7 @@ import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationAttemptIdPBImpl; import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationIdPBImpl; import org.apache.hadoop.yarn.api.records.impl.pb.ContainerIdPBImpl; +import org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl; import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider; import org.apache.hadoop.yarn.server.api.protocolrecords.impl.pb.NodeHeartbeatRequestPBImpl; import org.apache.hadoop.yarn.server.api.protocolrecords.impl.pb.NodeHeartbeatResponsePBImpl; @@ -45,7 +46,6 @@ import org.apache.hadoop.yarn.server.api.records.NodeStatus; import org.apache.hadoop.yarn.server.api.records.impl.pb.MasterKeyPBImpl; import org.apache.hadoop.yarn.server.api.records.impl.pb.NodeStatusPBImpl; -import org.apache.hadoop.yarn.server.api.records.impl.pb.SerializedExceptionPBImpl; import org.junit.Test; /** diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/api/protocolrecords/LocalResourceStatus.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/api/protocolrecords/LocalResourceStatus.java index 70a96cd..d3c5a8f 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/api/protocolrecords/LocalResourceStatus.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/api/protocolrecords/LocalResourceStatus.java @@ -18,8 +18,8 @@ package org.apache.hadoop.yarn.server.nodemanager.api.protocolrecords; import org.apache.hadoop.yarn.api.records.LocalResource; +import org.apache.hadoop.yarn.api.records.SerializedException; import org.apache.hadoop.yarn.api.records.URL; -import org.apache.hadoop.yarn.server.api.records.SerializedException; public interface LocalResourceStatus { public LocalResource getResource(); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/api/protocolrecords/impl/pb/LocalResourceStatusPBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/api/protocolrecords/impl/pb/LocalResourceStatusPBImpl.java index 6ecb934..bc5fcd4 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/api/protocolrecords/impl/pb/LocalResourceStatusPBImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/api/protocolrecords/impl/pb/LocalResourceStatusPBImpl.java @@ -18,9 +18,11 @@ package org.apache.hadoop.yarn.server.nodemanager.api.protocolrecords.impl.pb; import org.apache.hadoop.yarn.api.records.LocalResource; +import org.apache.hadoop.yarn.api.records.SerializedException; import org.apache.hadoop.yarn.api.records.URL; import org.apache.hadoop.yarn.api.records.impl.pb.LocalResourcePBImpl; import org.apache.hadoop.yarn.api.records.impl.pb.ProtoBase; +import org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl; import org.apache.hadoop.yarn.api.records.impl.pb.URLPBImpl; import org.apache.hadoop.yarn.proto.YarnProtos.LocalResourceProto; import org.apache.hadoop.yarn.proto.YarnProtos.SerializedExceptionProto; @@ -28,8 +30,6 @@ import org.apache.hadoop.yarn.proto.YarnServerNodemanagerServiceProtos.LocalResourceStatusProto; import org.apache.hadoop.yarn.proto.YarnServerNodemanagerServiceProtos.LocalResourceStatusProtoOrBuilder; import org.apache.hadoop.yarn.proto.YarnServerNodemanagerServiceProtos.ResourceStatusTypeProto; -import org.apache.hadoop.yarn.server.api.records.SerializedException; -import org.apache.hadoop.yarn.server.api.records.impl.pb.SerializedExceptionPBImpl; import org.apache.hadoop.yarn.server.nodemanager.api.protocolrecords.LocalResourceStatus; import org.apache.hadoop.yarn.server.nodemanager.api.protocolrecords.ResourceStatusType; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java index 712bc43..32fe5f5 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java @@ -23,12 +23,12 @@ import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.SortedSet; -import java.util.TreeMap; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.logging.Log; @@ -52,23 +52,28 @@ import org.apache.hadoop.yarn.api.ContainerManagementProtocol; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusRequest; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusResponse; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesRequest; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerLaunchContext; import org.apache.hadoop.yarn.api.records.ContainerStatus; import org.apache.hadoop.yarn.api.records.NodeId; +import org.apache.hadoop.yarn.api.records.SerializedException; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.event.AsyncDispatcher; import org.apache.hadoop.yarn.event.EventHandler; import org.apache.hadoop.yarn.exceptions.InvalidContainerException; import org.apache.hadoop.yarn.exceptions.NMNotYetReadyException; import org.apache.hadoop.yarn.exceptions.YarnException; -import org.apache.hadoop.yarn.factories.RecordFactory; -import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider; import org.apache.hadoop.yarn.ipc.RPCUtil; import org.apache.hadoop.yarn.ipc.YarnRPC; import org.apache.hadoop.yarn.security.ContainerTokenIdentifier; @@ -130,8 +135,6 @@ private final NodeStatusUpdater nodeStatusUpdater; - private final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null); - protected LocalDirsHandlerService dirsHandler; protected final AsyncDispatcher dispatcher; private final ApplicationACLsManager aclsManager; @@ -316,18 +319,25 @@ protected NMTokenIdentifier selectNMTokenIdentifier( return resultId; } + protected void authorizeUser(UserGroupInformation remoteUgi, + NMTokenIdentifier nmTokenIdentifier) throws YarnException { + if (!remoteUgi.getUserName().equals( + nmTokenIdentifier.getApplicationAttemptId().toString())) { + throw RPCUtil.getRemoteException("Expected applicationAttemptId: " + + remoteUgi.getUserName() + "Found: " + + nmTokenIdentifier.getApplicationAttemptId()); + } + } + /** * @param containerTokenIdentifier * of the container to be started - * @param ugi - * ugi corresponding to the remote end making the api-call * @throws YarnException */ @Private @VisibleForTesting protected void authorizeStartRequest(NMTokenIdentifier nmTokenIdentifier, - ContainerTokenIdentifier containerTokenIdentifier, - UserGroupInformation ugi) throws YarnException { + ContainerTokenIdentifier containerTokenIdentifier) throws YarnException { ContainerId containerId = containerTokenIdentifier.getContainerID(); String containerIDStr = containerId.toString(); @@ -342,12 +352,6 @@ protected void authorizeStartRequest(NMTokenIdentifier nmTokenIdentifier, .append(" was used for starting container with container token") .append(" issued for application attempt : ") .append(containerId.getApplicationAttemptId()); - } else if (!ugi.getUserName().equals( - nmTokenIdentifier.getApplicationAttemptId().toString())) { - unauthorized = true; - messageBuilder.append("\nExpected applicationAttemptId: ") - .append(ugi.getUserName()).append(" Found: ") - .append(nmTokenIdentifier.getApplicationAttemptId().toString()); } else if (!this.context.getContainerTokenSecretManager() .isValidStartContainerRequest(containerTokenIdentifier)) { // Is the container being relaunched? Or RPC layer let startCall with @@ -363,7 +367,6 @@ protected void authorizeStartRequest(NMTokenIdentifier nmTokenIdentifier, .append(System.currentTimeMillis()).append(" found ") .append(containerTokenIdentifier.getExpiryTimeStamp()); } - if (unauthorized) { String msg = messageBuilder.toString(); LOG.error(msg); @@ -372,18 +375,73 @@ protected void authorizeStartRequest(NMTokenIdentifier nmTokenIdentifier, } /** + * Start a list of containers on this NodeManager. + */ + @Override + public StartContainersResponse + startContainers(StartContainersRequest requests) throws YarnException, + IOException { + if (blockNewContainerRequests.get()) { + throw new NMNotYetReadyException( + "Rejecting new containers as NodeManager has not" + + " yet connected with ResourceManager"); + } + + UserGroupInformation remoteUgi = getRemoteUgi(); + NMTokenIdentifier nmTokenIdentifier = selectNMTokenIdentifier(remoteUgi); + authorizeUser(remoteUgi,nmTokenIdentifier); + List succeededContainers = new ArrayList(); + Map failedContainers = + new HashMap(); + for (StartContainerRequest request : requests.getStartContainerRequests()) { + ContainerId containerId = null; + try { + // Validate containerToken + ContainerTokenIdentifier containerTokenIdentifier = + verifyAndGetContainerTokenIdentifier(request.getContainerToken()); + containerId = containerTokenIdentifier.getContainerID(); + startContainerInternal(nmTokenIdentifier, containerTokenIdentifier, + request); + succeededContainers.add(containerId); + } catch (YarnException e) { + failedContainers.put(containerId, SerializedException.newInstance(e)); + } catch (IOException ioe) { + throw ioe; + } + } + + return StartContainersResponse.newInstance(auxiliaryServices.getMetaData(), + succeededContainers, failedContainers); + } + + /** * Start a container on this NodeManager. */ - @SuppressWarnings("unchecked") @Override public StartContainerResponse startContainer(StartContainerRequest request) throws YarnException, IOException { - if (blockNewContainerRequests.get()) { throw new NMNotYetReadyException( "Rejecting new containers as NodeManager has not" + " yet connected with ResourceManager"); } + + UserGroupInformation remoteUgi = getRemoteUgi(); + NMTokenIdentifier nmTokenIdentifier = selectNMTokenIdentifier(remoteUgi); + authorizeUser(remoteUgi, nmTokenIdentifier); + // Validate containerToken + ContainerTokenIdentifier containerTokenIdentifier = + verifyAndGetContainerTokenIdentifier(request.getContainerToken()); + + startContainerInternal(nmTokenIdentifier, containerTokenIdentifier, request); + return StartContainerResponse.newInstance(auxiliaryServices.getMetaData()); + } + + @SuppressWarnings("unchecked") + private void startContainerInternal(NMTokenIdentifier nmTokenIdentifier, + ContainerTokenIdentifier containerTokenIdentifier, + StartContainerRequest request) throws YarnException, IOException { + /* * 1) It should save the NMToken into NMTokenSecretManager. This is done * here instead of RPC layer because at the time of opening/authenticating @@ -395,18 +453,8 @@ public StartContainerResponse startContainer(StartContainerRequest request) * belongs to correct Node Manager (part of retrieve password). c) It has * correct RMIdentifier. d) It is not expired. */ - // update NMToken - - UserGroupInformation remoteUgi = getRemoteUgi(); - NMTokenIdentifier nmTokenIdentifier = selectNMTokenIdentifier(remoteUgi); - - // Validate containerToken - ContainerTokenIdentifier containerTokenIdentifier = - verifyAndGetContainerTokenIdentifier(request.getContainerToken()); - - authorizeStartRequest(nmTokenIdentifier, containerTokenIdentifier, - remoteUgi); - + authorizeStartRequest(nmTokenIdentifier, containerTokenIdentifier); + if (containerTokenIdentifier.getRMIdentifer() != nodeStatusUpdater .getRMIdentifier()) { // Is the container coming from unknown RM @@ -415,9 +463,9 @@ public StartContainerResponse startContainer(StartContainerRequest request) .append(" rejected as it is allocated by a previous RM"); throw new InvalidContainerException(sb.toString()); } - + // update NMToken updateNMTokenIdentifier(nmTokenIdentifier); - + ContainerId containerId = containerTokenIdentifier.getContainerID(); String containerIdStr = containerId.toString(); String user = containerTokenIdentifier.getApplicationSubmitter(); @@ -461,14 +509,10 @@ public StartContainerResponse startContainer(StartContainerRequest request) containerTokenIdentifier); NMAuditLogger.logSuccess(user, AuditConstants.START_CONTAINER, "ContainerManageImpl", applicationID, containerId); - StartContainerResponse response = - recordFactory.newRecordInstance(StartContainerResponse.class); - response.setAllServicesMetaData(auxiliaryServices.getMetaData()); // TODO launchedContainer misplaced -> doesn't necessarily mean a container // launch. A finished Application will not launch containers. metrics.launchedContainer(); - metrics.allocateContainer(containerTokenIdentifier.getResource()); - return response; + metrics.allocateContainer(containerTokenIdentifier.getResource()); } protected ContainerTokenIdentifier verifyAndGetContainerTokenIdentifier( @@ -528,22 +572,49 @@ private Credentials parseCredentials(ContainerLaunchContext launchContext) } /** + * Stop a list of containers running on this NodeManager. + */ + @Override + public StopContainersResponse stopContainers(StopContainersRequest requests) + throws YarnException, IOException { + + List succeededRequests = new ArrayList(); + Map failedRequests = + new HashMap(); + for (ContainerId id : requests.getContainerIds()) { + try { + stopContainerInternal(id); + succeededRequests.add(id); + } catch (YarnException e) { + failedRequests.put(id, SerializedException.newInstance(e)); + } catch (IOException ioe) { + throw ioe; + } + } + return StopContainersResponse + .newInstance(succeededRequests, failedRequests); + } + + /** * Stop the container running on this NodeManager. */ @Override - @SuppressWarnings("unchecked") public StopContainerResponse stopContainer(StopContainerRequest request) throws YarnException, IOException { ContainerId containerID = request.getContainerId(); + stopContainerInternal(containerID); + return StopContainerResponse.newInstance(); + } + + @SuppressWarnings("unchecked") + private void stopContainerInternal(ContainerId containerID) + throws YarnException, IOException { String containerIDStr = containerID.toString(); Container container = this.context.getContainers().get(containerID); LOG.info("Getting container-status for " + containerIDStr); authorizeGetAndStopContainerRequest(containerID, container, true); - StopContainerResponse response = - recordFactory.newRecordInstance(StopContainerResponse.class); - dispatcher.getEventHandler().handle( new ContainerKillEvent(containerID, "Container killed by the ApplicationMaster.")); @@ -555,15 +626,45 @@ public StopContainerResponse stopContainer(StopContainerRequest request) // TODO: Move this code to appropriate place once kill_container is // implemented. nodeStatusUpdater.sendOutofBandHeartBeat(); + } + + /** + * Get a list of container statuses running on this NodeManager + */ + @Override + public GetContainerStatusesResponse getContainerStatuses( + GetContainerStatusesRequest request) throws YarnException, IOException { - return response; + List succeededRequests = new ArrayList(); + Map failedRequests = + new HashMap(); + for (ContainerId id : request.getContainerIds()) { + try { + ContainerStatus status = getContainerStatusInternal(id); + succeededRequests.add(status); + } catch (YarnException e) { + failedRequests.put(id, SerializedException.newInstance(e)); + } catch (IOException ioe) { + throw ioe; + } + } + return GetContainerStatusesResponse.newInstance(succeededRequests, + failedRequests); } + /** + * Get the container status running on this NodeManager + */ @Override public GetContainerStatusResponse getContainerStatus( GetContainerStatusRequest request) throws YarnException, IOException { - ContainerId containerID = request.getContainerId(); + ContainerStatus status = getContainerStatusInternal(containerID); + return GetContainerStatusResponse.newInstance(status); + } + + private ContainerStatus getContainerStatusInternal(ContainerId containerID) + throws YarnException, IOException { String containerIDStr = containerID.toString(); Container container = this.context.getContainers().get(containerID); @@ -572,10 +673,7 @@ public GetContainerStatusResponse getContainerStatus( ContainerStatus containerStatus = container.cloneAndGetContainerStatus(); LOG.info("Returning " + containerStatus); - GetContainerStatusResponse response = - recordFactory.newRecordInstance(GetContainerStatusResponse.class); - response.setStatus(containerStatus); - return response; + return containerStatus; } @Private diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/DummyContainerManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/DummyContainerManager.java index 76ef074..e6914af 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/DummyContainerManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/DummyContainerManager.java @@ -195,8 +195,7 @@ public void setBlockNewContainerRequests(boolean blockNewContainerRequests) { @Override protected void authorizeStartRequest(NMTokenIdentifier nmTokenIdentifier, - ContainerTokenIdentifier containerTokenIdentifier, - UserGroupInformation ugi) throws YarnException { + ContainerTokenIdentifier containerTokenIdentifier) throws YarnException { // do nothing } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestContainerManagerWithLCE.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestContainerManagerWithLCE.java index 13dc099..9cd62df 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestContainerManagerWithLCE.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestContainerManagerWithLCE.java @@ -155,6 +155,29 @@ public void testContainerLaunchFromPreviousRM() throws InterruptedException, LOG.info("Running testContainerLaunchFromPreviousRM"); super.testContainerLaunchFromPreviousRM(); } + + @Override + public void testMultipleContainersLaunch() throws Exception { + // Don't run the test if the binary is not available. + if (!shouldRunTest()) { + LOG.info("LCE binary path is not passed. Not running the test"); + return; + } + LOG.info("Running testContainerLaunchFromPreviousRM"); + super.testMultipleContainersLaunch(); + } + + @Override + public void testMultipleContainersStopAndGetStatus() throws Exception { + // Don't run the test if the binary is not available. + if (!shouldRunTest()) { + LOG.info("LCE binary path is not passed. Not running the test"); + return; + } + LOG.info("Running testContainerLaunchFromPreviousRM"); + super.testMultipleContainersStopAndGetStatus(); + } + private boolean shouldRunTest() { return System .getProperty(YarnConfiguration.NM_LINUX_CONTAINER_EXECUTOR_PATH) != null; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestEventFlow.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestEventFlow.java index 294c93e..ec6c684 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestEventFlow.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestEventFlow.java @@ -62,7 +62,7 @@ private static File remoteLogDir = new File("target", TestEventFlow.class.getName() + "-remoteLogDir").getAbsoluteFile(); private static final long SIMULATED_RM_IDENTIFIER = 1234; - + @Test public void testSuccessfulContainerLaunch() throws InterruptedException, IOException, YarnException { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/BaseContainerManagerTest.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/BaseContainerManagerTest.java index cfcf7f6..60a2706 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/BaseContainerManagerTest.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/BaseContainerManagerTest.java @@ -192,12 +192,15 @@ protected void authorizeGetAndStopContainerRequest(ContainerId containerId, Container container, boolean stopRequest) throws YarnException { // do nothing } - + @Override + protected void authorizeUser(UserGroupInformation remoteUgi, + NMTokenIdentifier nmTokenIdentifier) { + // do nothing + } @Override protected void authorizeStartRequest( NMTokenIdentifier nmTokenIdentifier, - ContainerTokenIdentifier containerTokenIdentifier, - UserGroupInformation ugi) throws YarnException { + ContainerTokenIdentifier containerTokenIdentifier) throws YarnException { // do nothing } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestContainerManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestContainerManager.java index fdd0ed4..84db175 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestContainerManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestContainerManager.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.net.InetAddress; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -38,8 +39,14 @@ import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.util.Shell; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusRequest; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesRequest; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ContainerId; @@ -51,6 +58,7 @@ import org.apache.hadoop.yarn.api.records.LocalResourceVisibility; import org.apache.hadoop.yarn.api.records.NodeId; import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.api.records.SerializedException; import org.apache.hadoop.yarn.api.records.Token; import org.apache.hadoop.yarn.api.records.URL; import org.apache.hadoop.yarn.exceptions.InvalidContainerException; @@ -63,6 +71,7 @@ import org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor; import org.apache.hadoop.yarn.server.nodemanager.DeletionService; import org.apache.hadoop.yarn.server.nodemanager.containermanager.application.ApplicationState; +import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container; import org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ContainerLocalizer; import org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService; import org.apache.hadoop.yarn.server.nodemanager.security.NMContainerTokenSecretManager; @@ -88,11 +97,11 @@ public void setup() throws IOException { super.setup(); } - private ContainerId createContainerId() { + private ContainerId createContainerId(int id) { ApplicationId appId = ApplicationId.newInstance(0, 0); ApplicationAttemptId appAttemptId = ApplicationAttemptId.newInstance(appId, 1); - ContainerId containerId = ContainerId.newInstance(appAttemptId, 0); + ContainerId containerId = ContainerId.newInstance(appAttemptId, id); return containerId; } @@ -119,6 +128,14 @@ protected UserGroupInformation getRemoteUgi() throws YarnException { .getKeyId())); return ugi; } + + @Override + protected void authorizeGetAndStopContainerRequest(ContainerId containerId, + Container container, boolean stopRequest) throws YarnException { + if(container == null || container.getUser().equals("Fail")){ + throw new YarnException("Reject this container"); + } + } }; } @@ -140,7 +157,7 @@ public void testContainerManagerInitialization() throws IOException { try { GetContainerStatusRequest request = recordFactory.newRecordInstance(GetContainerStatusRequest.class); - ContainerId cId = createContainerId(); + ContainerId cId = createContainerId(0); request.setContainerId(cId); containerManager.getContainerStatus(request); } catch (YarnException e) { @@ -163,7 +180,7 @@ public void testContainerSetup() throws Exception { fileWriter.close(); // ////// Construct the Container-id - ContainerId cId = createContainerId(); + ContainerId cId = createContainerId(0); // ////// Construct the container-spec. ContainerLaunchContext containerLaunchContext = @@ -237,7 +254,7 @@ public void testContainerLaunchAndStop() throws IOException, new File(tmpDir, "start_file.txt").getAbsoluteFile(); // ////// Construct the Container-id - ContainerId cId = createContainerId(); + ContainerId cId = createContainerId(0); if (Shell.WINDOWS) { fileWriter.println("@echo Hello World!> " + processStartFile); @@ -335,7 +352,7 @@ private void testContainerLaunchAndExit(int exitCode) throws IOException, new File(tmpDir, "start_file.txt").getAbsoluteFile(); // ////// Construct the Container-id - ContainerId cId = createContainerId(); + ContainerId cId = createContainerId(0); if (Shell.WINDOWS) { fileWriter.println("@echo Hello World!> " + processStartFile); @@ -439,7 +456,7 @@ public void testLocalFilesCleanup() throws InterruptedException, fileWriter.close(); // ////// Construct the Container-id - ContainerId cId = createContainerId(); + ContainerId cId = createContainerId(0); ApplicationId appId = cId.getApplicationAttemptId().getApplicationId(); // ////// Construct the container-spec. @@ -534,8 +551,8 @@ public void testContainerLaunchFromPreviousRM() throws IOException, ContainerLaunchContext containerLaunchContext = recordFactory.newRecordInstance(ContainerLaunchContext.class); - ContainerId cId1 = createContainerId(); - ContainerId cId2 = createContainerId(); + ContainerId cId1 = createContainerId(0); + ContainerId cId2 = createContainerId(0); containerLaunchContext .setLocalResources(new HashMap()); @@ -577,7 +594,124 @@ public void testContainerLaunchFromPreviousRM() throws IOException, // Verify that startContainer get no YarnException Assert.assertTrue(noException); } - + + @Test + public void testMultipleContainersLaunch() throws Exception { + containerManager.start(); + + List list = new ArrayList(); + ContainerLaunchContext containerLaunchContext = + recordFactory.newRecordInstance(ContainerLaunchContext.class); + for (int i = 0; i < 10; i++) { + ContainerId cId = createContainerId(i); + long identifier = 0; + if ((i & 1) == 0) + // container with even id fail + identifier = ResourceManagerConstants.RM_INVALID_IDENTIFIER; + else + identifier = DUMMY_RM_IDENTIFIER; + Token containerToken = + createContainerToken(cId, identifier, context.getNodeId(), user, + context.getContainerTokenSecretManager()); + StartContainerRequest request = + StartContainerRequest.newInstance(containerLaunchContext, + containerToken); + list.add(request); + } + StartContainersRequest requestList = + StartContainersRequest.newInstance(list); + + StartContainersResponse response = + containerManager.startContainers(requestList); + + Assert.assertEquals(5, response.getSuccessfullyStartedContainers().size()); + for (ContainerId id : response.getSuccessfullyStartedContainers()) { + // Containers with odd id should succeed. + Assert.assertEquals(1, id.getId() & 1); + } + Assert.assertEquals(5, response.getFailedRequests().size()); + for (Map.Entry entry : response + .getFailedRequests().entrySet()) { + // Containers with even id should fail. + Assert.assertEquals(0, entry.getKey().getId() & 1); + Assert.assertTrue(entry.getValue().getMessage() + .contains( + "Container " + entry.getKey() + " rejected as it is allocated by a previous RM")); + } + } + + @Test + public void testMultipleContainersStopAndGetStatus() throws Exception { + containerManager.start(); + List startRequest = + new ArrayList(); + ContainerLaunchContext containerLaunchContext = + recordFactory.newRecordInstance(ContainerLaunchContext.class); + + List containerIds = new ArrayList(); + for (int i = 0; i < 10; i++) { + ContainerId cId = createContainerId(i); + String user = null; + if ((i & 1) == 0) { + // container with even id fail + user = "Fail"; + } else { + user = "Pass"; + } + Token containerToken = + createContainerToken(cId, DUMMY_RM_IDENTIFIER, context.getNodeId(), + user, context.getContainerTokenSecretManager()); + StartContainerRequest request = + StartContainerRequest.newInstance(containerLaunchContext, + containerToken); + startRequest.add(request); + containerIds.add(cId); + } + // start containers + StartContainersRequest requestList = + StartContainersRequest.newInstance(startRequest); + containerManager.startContainers(requestList); + + // Get container statuses + GetContainerStatusesRequest statusRequest = + GetContainerStatusesRequest.newInstance(containerIds); + GetContainerStatusesResponse statusResponse = + containerManager.getContainerStatuses(statusRequest); + Assert.assertEquals(5, statusResponse.getContainerStatuses().size()); + for (ContainerStatus status : statusResponse.getContainerStatuses()) { + // Containers with odd id should succeed + Assert.assertEquals(1, status.getContainerId().getId() & 1); + } + Assert.assertEquals(5, statusResponse.getFailedRequests().size()); + for (Map.Entry entry : statusResponse + .getFailedRequests().entrySet()) { + // Containers with even id should fail. + Assert.assertEquals(0, entry.getKey().getId() & 1); + Assert.assertTrue(entry.getValue().getMessage() + .contains("Reject this container")); + } + + // stop containers + StopContainersRequest stopRequest = + StopContainersRequest.newInstance(containerIds); + StopContainersResponse stopResponse = + containerManager.stopContainers(stopRequest); + Assert.assertEquals(5, stopResponse.getSuccessfullyStoppedContainers() + .size()); + for (ContainerId id : stopResponse.getSuccessfullyStoppedContainers()) { + // Containers with odd id should succeed. + Assert.assertEquals(1, id.getId() & 1); + } + Assert.assertEquals(5, stopResponse.getFailedRequests().size()); + for (Map.Entry entry : stopResponse + .getFailedRequests().entrySet()) { + // Containers with even id should fail. + Assert.assertEquals(0, entry.getKey().getId() & 1); + Assert.assertTrue(entry.getValue().getMessage() + .contains("Reject this container")); + } + } + public static Token createContainerToken(ContainerId cId, long rmIdentifier, NodeId nodeId, String user, NMContainerTokenSecretManager containerTokenSecretManager) diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/MockLocalResourceStatus.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/MockLocalResourceStatus.java index 882068a..1eeab7c 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/MockLocalResourceStatus.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/MockLocalResourceStatus.java @@ -18,8 +18,8 @@ package org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer; import org.apache.hadoop.yarn.api.records.LocalResource; +import org.apache.hadoop.yarn.api.records.SerializedException; import org.apache.hadoop.yarn.api.records.URL; -import org.apache.hadoop.yarn.server.api.records.SerializedException; import org.apache.hadoop.yarn.server.nodemanager.api.protocolrecords.LocalResourceStatus; import org.apache.hadoop.yarn.server.nodemanager.api.protocolrecords.ResourceStatusType; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/NodeManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/NodeManager.java index 7772b04..f70d7e0 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/NodeManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/NodeManager.java @@ -33,10 +33,16 @@ import org.apache.hadoop.yarn.api.ContainerManagementProtocol; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusRequest; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusResponse; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesRequest; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.Container; import org.apache.hadoop.yarn.api.records.ContainerId; @@ -310,4 +316,26 @@ synchronized public GetContainerStatusResponse getContainerStatus(GetContainerSt nodeStatus.setNodeHealthStatus(nodeHealthStatus); return nodeStatus; } + + @Override + public StartContainersResponse + startContainers(StartContainersRequest requests) throws YarnException, + IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public StopContainersResponse stopContainers(StopContainersRequest requests) + throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public GetContainerStatusesResponse getContainerStatuses( + GetContainerStatusesRequest request) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java index 7bae0c1..caff532 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java @@ -38,12 +38,18 @@ import org.apache.hadoop.yarn.api.ContainerManagementProtocol; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusRequest; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusResponse; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesRequest; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; import org.apache.hadoop.yarn.api.protocolrecords.RegisterApplicationMasterRequest; import org.apache.hadoop.yarn.api.protocolrecords.RegisterApplicationMasterResponse; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.records.ApplicationAccessType; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.conf.YarnConfiguration; @@ -125,6 +131,28 @@ public Credentials getContainerCredentials() throws IOException { credentials.readTokenStorageStream(buf); return credentials; } + + @Override + public StartContainersResponse startContainers( + StartContainersRequest requests) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public StopContainersResponse + stopContainers(StopContainersRequest requests) throws YarnException, + IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public GetContainerStatusesResponse getContainerStatuses( + GetContainerStatusesRequest request) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } } public static class MockRMWithAMS extends MockRMWithCustomAMLauncher { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterLauncher.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterLauncher.java index ad55b0c..484944a 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterLauncher.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterLauncher.java @@ -29,10 +29,16 @@ import org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusRequest; import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusResponse; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesRequest; +import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusesResponse; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StartContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest; import org.apache.hadoop.yarn.api.protocolrecords.StopContainerResponse; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; +import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerState; @@ -112,6 +118,28 @@ public GetContainerStatusResponse getContainerStatus( return null; } + @Override + public StartContainersResponse startContainers( + StartContainersRequest requests) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public StopContainersResponse + stopContainers(StopContainersRequest requests) throws YarnException, + IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public GetContainerStatusesResponse getContainerStatuses( + GetContainerStatusesRequest request) throws YarnException, IOException { + // TODO Auto-generated method stub + return null; + } + } @Test