From f4522fd987e00a84f2cf0b88de82666bf5b8e019 Mon Sep 17 00:00:00 2001 From: subru Date: Fri, 12 Sep 2014 17:16:07 -0700 Subject: [PATCH] YARN-1708. Public YARN APIs for creating/updating/deleting reservations. (cherry picked from commit 3f2e3b275bcf29264a112c5d2f4eae289fe7f52c) (cherry picked from commit c9266df40434fdde05bd3a4c75f7a6bc29db760f) (cherry picked from commit 3a167056d10707bb3144e0d0a2a2affc169e8461) --- YARN-1051-CHANGES.txt | 2 + .../yarn/api/ApplicationClientProtocol.java | 113 +++++++++ .../ReservationDeleteRequest.java | 72 ++++++ .../ReservationDeleteResponse.java | 48 ++++ .../ReservationSubmissionRequest.java | 97 ++++++++ .../ReservationSubmissionResponse.java | 78 ++++++ .../ReservationUpdateRequest.java | 96 ++++++++ .../ReservationUpdateResponse.java | 48 ++++ .../records/ApplicationSubmissionContext.java | 22 ++ .../api/records/ReservationDefinition.java | 137 +++++++++++ .../yarn/api/records/ReservationId.java | 147 ++++++++++++ .../yarn/api/records/ReservationRequest.java | 222 ++++++++++++++++++ .../ReservationRequestInterpreter.java | 101 ++++++++ .../yarn/api/records/ReservationRequests.java | 94 ++++++++ .../proto/applicationclient_protocol.proto | 3 + .../src/main/proto/yarn_protos.proto | 37 ++- .../src/main/proto/yarn_service_protos.proto | 28 +++ ...ApplicationClientProtocolPBClientImpl.java | 58 ++++- ...pplicationClientProtocolPBServiceImpl.java | 61 +++++ .../pb/ReservationDeleteRequestPBImpl.java | 127 ++++++++++ .../pb/ReservationDeleteResponsePBImpl.java | 68 ++++++ .../ReservationSubmissionRequestPBImpl.java | 152 ++++++++++++ .../ReservationSubmissionResponsePBImpl.java | 129 ++++++++++ .../pb/ReservationUpdateRequestPBImpl.java | 169 +++++++++++++ .../pb/ReservationUpdateResponsePBImpl.java | 68 ++++++ .../ApplicationSubmissionContextPBImpl.java | 36 ++- .../yarn/api/records/impl/pb/ProtoUtils.java | 17 ++ .../impl/pb/ReservationDefinitionPBImpl.java | 169 +++++++++++++ .../records/impl/pb/ReservationIdPBImpl.java | 75 ++++++ .../impl/pb/ReservationRequestPBImpl.java | 152 ++++++++++++ .../impl/pb/ReservationRequestsPBImpl.java | 189 +++++++++++++++ .../org/apache/hadoop/yarn/util/UTCClock.java | 39 +++ 32 files changed, 2848 insertions(+), 6 deletions(-) create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteRequest.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteResponse.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionRequest.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionResponse.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateRequest.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateResponse.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationDefinition.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationId.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequest.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequestInterpreter.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequests.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteRequestPBImpl.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteResponsePBImpl.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationSubmissionRequestPBImpl.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationSubmissionResponsePBImpl.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationUpdateRequestPBImpl.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationUpdateResponsePBImpl.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationDefinitionPBImpl.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationIdPBImpl.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationRequestPBImpl.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationRequestsPBImpl.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/UTCClock.java diff --git a/YARN-1051-CHANGES.txt b/YARN-1051-CHANGES.txt index 9fd4b3b8117..a7c08a02cca 100644 --- a/YARN-1051-CHANGES.txt +++ b/YARN-1051-CHANGES.txt @@ -3,3 +3,5 @@ CapacityScheduler. (Carlo Curino and Subru Krishnan via curino) YARN-2475. Logic for responding to capacity drops for the ReservationSystem. (Carlo Curino and Subru Krishnan via curino) + +YARN-1708. Public YARN APIs for creating/updating/deleting reservations. (subru) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java index e449c1ee3f2..863a068186d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java @@ -57,6 +57,12 @@ import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesReq import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesResponse; import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenRequest; import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateResponse; import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest; import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationResponse; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; @@ -67,6 +73,7 @@ import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerLaunchContext; import org.apache.hadoop.yarn.api.records.ContainerReport; import org.apache.hadoop.yarn.api.records.NodeReport; +import org.apache.hadoop.yarn.api.records.ReservationId; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceRequest; import org.apache.hadoop.yarn.api.records.Token; @@ -543,4 +550,110 @@ public interface ApplicationClientProtocol { public GetContainersResponse getContainers(GetContainersRequest request) throws YarnException, IOException; + /** + *

+ * The interface used by clients to submit a new reservation to the + * {@link ResourceManager}. + *

+ * + *

+ * The client packages all details of its request in a + * {@link ReservationSubmissionRequest} object. This contains information + * about the amount of capacity, temporal constraints, and concurrency needs. + * Furthermore, the reservation might be composed of multiple stages, with + * ordering dependencies among them. + *

+ * + *

+ * In order to respond, a new admission control component in the + * {@link ResourceManager} performs an analysis of the resources that have + * been committed over the period of time the user is requesting, verify that + * the user requests can be fulfilled, and that it respect a sharing policy + * (e.g., {@link CapacityOverTimePolicy}). Once it has positively determined + * that the ReservationSubmissionRequest is satisfiable the + * {@link ResourceManager} answers with a + * {@link ReservationSubmissionResponse} that include a non-null + * {@link ReservationId}. Upon failure to find a valid allocation the response + * is an exception with the reason. + * + * On application submission the client can use this {@link ReservationId} to + * obtain access to the reserved resources. + *

+ * + *

+ * The system guarantees that during the time-range specified by the user, the + * reservationID will be corresponding to a valid reservation. The amount of + * capacity dedicated to such queue can vary overtime, depending of the + * allocation that has been determined. But it is guaranteed to satisfy all + * the constraint expressed by the user in the + * {@link ReservationSubmissionRequest}. + *

+ * + * @param request the request to submit a new Reservation + * @return response the {@link ReservationId} on accepting the submission + * @throws YarnException if the request is invalid or reservation cannot be + * created successfully + * @throws IOException + * + */ + @Public + @Unstable + public ReservationSubmissionResponse submitReservation( + ReservationSubmissionRequest request) throws YarnException, IOException; + + /** + *

+ * The interface used by clients to update an existing Reservation. This is + * referred to as a re-negotiation process, in which a user that has + * previously submitted a Reservation. + *

+ * + *

+ * The allocation is attempted by virtually substituting all previous + * allocations related to this Reservation with new ones, that satisfy the new + * {@link ReservationUpdateRequest}. Upon success the previous allocation is + * substituted by the new one, and on failure (i.e., if the system cannot find + * a valid allocation for the updated request), the previous allocation + * remains valid. + * + * The {@link ReservationId} is not changed, and applications currently + * running within this reservation will automatically receive the resources + * based on the new allocation. + *

+ * + * @param request to update an existing Reservation (the ReservationRequest + * should refer to an existing valid {@link ReservationId}) + * @return response empty on successfully updating the existing reservation + * @throws YarnException if the request is invalid or reservation cannot be + * updated successfully + * @throws IOException + * + */ + @Public + @Unstable + public ReservationUpdateResponse updateReservation( + ReservationUpdateRequest request) throws YarnException, IOException; + + /** + *

+ * The interface used by clients to remove an existing Reservation. + * + * Upon deletion of a reservation applications running with this reservation, + * are automatically downgraded to normal jobs running without any dedicated + * reservation. + *

+ * + * @param request to remove an existing Reservation (the ReservationRequest + * should refer to an existing valid {@link ReservationId}) + * @return response empty on successfully deleting the existing reservation + * @throws YarnException if the request is invalid or reservation cannot be + * deleted successfully + * @throws IOException + * + */ + @Public + @Unstable + public ReservationDeleteResponse deleteReservation( + ReservationDeleteRequest request) throws YarnException, IOException; + } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteRequest.java new file mode 100644 index 00000000000..1dd876b7135 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteRequest.java @@ -0,0 +1,72 @@ +/** + * 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 org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.api.records.ReservationId; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationDeleteRequest} captures the set of requirements the user + * has to delete an existing reservation. + * + * @see ReservationDefinition + * + */ +@Public +@Unstable +public abstract class ReservationDeleteRequest { + + @Public + @Unstable + public static ReservationDeleteRequest newInstance(ReservationId reservationId) { + ReservationDeleteRequest request = + Records.newRecord(ReservationDeleteRequest.class); + request.setReservationId(reservationId); + return request; + } + + /** + * Get the {@link ReservationId}, that corresponds to a valid resource + * allocation in the scheduler (between start and end time of this + * reservation) + * + * @return the {@link ReservationId} representing the unique id of the + * corresponding reserved resource allocation in the scheduler + */ + @Public + @Unstable + public abstract ReservationId getReservationId(); + + /** + * Set the {@link ReservationId}, that correspond to a valid resource + * allocation in the scheduler (between start and end time of this + * reservation) + * + * @param reservationId the {@link ReservationId} representing the the unique + * id of the corresponding reserved resource allocation in the + * scheduler + */ + @Public + @Unstable + public abstract void setReservationId(ReservationId reservationId); + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteResponse.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteResponse.java new file mode 100644 index 00000000000..eedd3a4a197 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteResponse.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.protocolrecords; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationDeleteResponse} contains the answer of the admission + * control system in the {@link ResourceManager} to a reservation delete + * operation. Currently response is empty if the operation was successful, if + * not an exception reporting reason for a failure. + * + * @see ReservationDefinition + * + */ +@Public +@Unstable +public abstract class ReservationDeleteResponse { + + @Private + @Unstable + public static ReservationDeleteResponse newInstance() { + ReservationDeleteResponse response = + Records.newRecord(ReservationDeleteResponse.class); + return response; + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionRequest.java new file mode 100644 index 00000000000..e550fe20d79 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionRequest.java @@ -0,0 +1,97 @@ +/** + * 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 org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.QueueInfo; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationSubmissionRequest} captures the set of requirements the + * user has to create a reservation. + * + * @see ReservationDefinition + * + */ +@Public +@Unstable +public abstract class ReservationSubmissionRequest { + + @Public + @Unstable + public static ReservationSubmissionRequest newInstance( + ReservationDefinition reservationDefinition, String queueName) { + ReservationSubmissionRequest request = + Records.newRecord(ReservationSubmissionRequest.class); + request.setReservationDefinition(reservationDefinition); + request.setQueue(queueName); + return request; + } + + /** + * Get the {@link ReservationDefinition} representing the user constraints for + * this reservation + * + * @return the reservation definition representing user constraints + */ + @Public + @Unstable + public abstract ReservationDefinition getReservationDefinition(); + + /** + * Set the {@link ReservationDefinition} representing the user constraints for + * this reservation + * + * @param reservationDefinition the reservation request representing the + * reservation + */ + @Public + @Unstable + public abstract void setReservationDefinition( + ReservationDefinition reservationDefinition); + + /** + * Get the name of the {@link Plan} that corresponds to the name of the + * {@link QueueInfo} in the scheduler to which the reservation will be + * submitted to. + * + * @return the name of the {@link Plan} that corresponds to the name of the + * {@link QueueInfo} in the scheduler to which the reservation will be + * submitted to + */ + @Public + @Unstable + public abstract String getQueue(); + + /** + * Set the name of the {@link Plan} that corresponds to the name of the + * {@link QueueInfo} in the scheduler to which the reservation will be + * submitted to + * + * @param the name of the parent {@link Plan} that corresponds to the name of + * the {@link QueueInfo} in the scheduler to which the reservation + * will be submitted to + */ + @Public + @Unstable + public abstract void setQueue(String queueName); + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionResponse.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionResponse.java new file mode 100644 index 00000000000..b57ef52a850 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionResponse.java @@ -0,0 +1,78 @@ +/** + * 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 org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.api.records.ReservationId; +import org.apache.hadoop.yarn.util.Records; + +import com.sun.naming.internal.ResourceManager; + +/** + * {@link ReservationSubmissionResponse} contains the answer of the admission + * control system in the {@link ResourceManager} to a reservation create + * operation. Response contains a {@link ReservationId} if the operation was + * successful, if not an exception reporting reason for a failure. + * + * @see ReservationDefinition + * + */ +@Public +@Unstable +public abstract class ReservationSubmissionResponse { + + @Private + @Unstable + public static ReservationSubmissionResponse newInstance( + ReservationId reservationId) { + ReservationSubmissionResponse response = + Records.newRecord(ReservationSubmissionResponse.class); + response.setReservationId(reservationId); + return response; + } + + /** + * Get the {@link ReservationId}, that corresponds to a valid resource + * allocation in the scheduler (between start and end time of this + * reservation) + * + * @return the {@link ReservationId} representing the unique id of the + * corresponding reserved resource allocation in the scheduler + */ + @Public + @Unstable + public abstract ReservationId getReservationId(); + + /** + * Set the {@link ReservationId}, that correspond to a valid resource + * allocation in the scheduler (between start and end time of this + * reservation) + * + * @param reservationId the {@link ReservationId} representing the the unique + * id of the corresponding reserved resource allocation in the + * scheduler + */ + @Private + @Unstable + public abstract void setReservationId(ReservationId reservationId); + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateRequest.java new file mode 100644 index 00000000000..b5a4b7b1a9b --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateRequest.java @@ -0,0 +1,96 @@ +/** + * 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 org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.api.records.ReservationId; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationUpdateRequest} captures the set of requirements the user + * has to update an existing reservation. + * + * @see ReservationDefinition + * + */ +@Public +@Unstable +public abstract class ReservationUpdateRequest { + + @Public + @Unstable + public static ReservationUpdateRequest newInstance( + ReservationDefinition reservationDefinition, ReservationId reservationId) { + ReservationUpdateRequest request = + Records.newRecord(ReservationUpdateRequest.class); + request.setReservationDefinition(reservationDefinition); + request.setReservationId(reservationId); + return request; + } + + /** + * Get the {@link ReservationDefinition} representing the updated user + * constraints for this reservation + * + * @return the reservation definition representing user constraints + */ + @Public + @Unstable + public abstract ReservationDefinition getReservationDefinition(); + + /** + * Set the {@link ReservationDefinition} representing the updated user + * constraints for this reservation + * + * @param reservationDefinition the reservation request representing the + * reservation + */ + @Public + @Unstable + public abstract void setReservationDefinition( + ReservationDefinition reservationDefinition); + + /** + * Get the {@link ReservationId}, that corresponds to a valid resource + * allocation in the scheduler (between start and end time of this + * reservation) + * + * @return the {@link ReservationId} representing the unique id of the + * corresponding reserved resource allocation in the scheduler + */ + @Public + @Unstable + public abstract ReservationId getReservationId(); + + /** + * Set the {@link ReservationId}, that correspond to a valid resource + * allocation in the scheduler (between start and end time of this + * reservation) + * + * @param reservationId the {@link ReservationId} representing the the unique + * id of the corresponding reserved resource allocation in the + * scheduler + */ + @Public + @Unstable + public abstract void setReservationId(ReservationId reservationId); + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateResponse.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateResponse.java new file mode 100644 index 00000000000..bfd2d514436 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateResponse.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.protocolrecords; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationUpdateResponse} contains the answer of the admission + * control system in the {@link ResourceManager} to a reservation update + * operation. Currently response is empty if the operation was successful, if + * not an exception reporting reason for a failure. + * + * @see ReservationDefinition + * + */ +@Public +@Unstable +public abstract class ReservationUpdateResponse { + + @Private + @Unstable + public static ReservationUpdateResponse newInstance() { + ReservationUpdateResponse response = + Records.newRecord(ReservationUpdateResponse.class); + return response; + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java index 22023807adc..cbf1e3783ff 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java @@ -417,4 +417,26 @@ public abstract class ApplicationSubmissionContext { @Stable public abstract void setLogAggregationContext( LogAggregationContext logAggregationContext); + + /** + * Get the reservation id, that corresponds to a valid resource allocation in + * the scheduler (between start and end time of the corresponding reservation) + * + * @return the reservation id representing the unique id of the corresponding + * reserved resource allocation in the scheduler + */ + @Public + @Unstable + public abstract ReservationId getReservationID(); + + /** + * Set the reservation id, that correspond to a valid resource allocation in + * the scheduler (between start and end time of the corresponding reservation) + * + * @param reservationId representing the unique id of the + * corresponding reserved resource allocation in the scheduler + */ + @Public + @Unstable + public abstract void setReservationID(ReservationId reservationID); } \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationDefinition.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationDefinition.java new file mode 100644 index 00000000000..c94463defb4 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationDefinition.java @@ -0,0 +1,137 @@ +/** + * 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.Public; +import org.apache.hadoop.classification.InterfaceStability.Evolving; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationDefinition} captures the set of resource and time + * constraints the user cares about regarding a reservation. + * + * @see ResourceRequest + * + */ +@Public +@Unstable +public abstract class ReservationDefinition { + + @Public + @Unstable + public static ReservationDefinition newInstance(long arrival, long deadline, + ReservationRequests reservationRequests, String name) { + ReservationDefinition rDefinition = + Records.newRecord(ReservationDefinition.class); + rDefinition.setArrival(arrival); + rDefinition.setDeadline(deadline); + rDefinition.setReservationRequests(reservationRequests); + rDefinition.setReservationName(name); + return rDefinition; + } + + /** + * Get the arrival time or the earliest time from which the resource(s) can be + * allocated. Time expressed as UTC. + * + * @return the earliest valid time for this reservation + */ + @Public + @Unstable + public abstract long getArrival(); + + /** + * Set the arrival time or the earliest time from which the resource(s) can be + * allocated. Time expressed as UTC. + * + * @param earliestStartTime the earliest valid time for this reservation + */ + @Public + @Unstable + public abstract void setArrival(long earliestStartTime); + + /** + * Get the deadline or the latest time by when the resource(s) must be + * allocated. Time expressed as UTC. + * + * @return the deadline or the latest time by when the resource(s) must be + * allocated + */ + @Public + @Unstable + public abstract long getDeadline(); + + /** + * Set the deadline or the latest time by when the resource(s) must be + * allocated. Time expressed as UTC. + * + * @param latestEndTime the deadline or the latest time by when the + * resource(s) should be allocated + */ + @Public + @Unstable + public abstract void setDeadline(long latestEndTime); + + /** + * Get the list of {@link ReservationRequests} representing the resources + * required by the application + * + * @return the list of {@link ReservationRequests} + */ + @Public + @Unstable + public abstract ReservationRequests getReservationRequests(); + + /** + * Set the list of {@link ReservationRequests} representing the resources + * required by the application + * + * @param resources the list of {@link ReservationRequests} + */ + @Public + @Unstable + public abstract void setReservationRequests( + ReservationRequests reservationRequests); + + /** + * Get the name for this reservation. The name need-not be unique, and it is + * just a mnemonic for the user (akin to job names). Accepted reservations are + * uniquely identified by a system-generated ReservationId. + * + * @return string representing the name of the corresponding reserved resource + * allocation in the scheduler + */ + @Public + @Evolving + public abstract String getReservationName(); + + /** + * Set the name for this reservation. The name need-not be unique, and it is + * just a mnemonic for the user (akin to job names). Accepted reservations are + * uniquely identified by a system-generated ReservationId. + * + * @param name representing the name of the corresponding reserved resource + * allocation in the scheduler + */ + @Public + @Evolving + public abstract void setReservationName(String name); + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationId.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationId.java new file mode 100644 index 00000000000..47a8c40b1e3 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationId.java @@ -0,0 +1,147 @@ +/** + * 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 java.text.NumberFormat; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.util.Records; + +/** + *

+ * {@link ReservationId} represents the globally unique identifier for + * a reservation. + *

+ * + *

+ * The globally unique nature of the identifier is achieved by using the + * cluster timestamp i.e. start-time of the {@link ResourceManager} + * along with a monotonically increasing counter for the reservation. + *

+ */ +@Public +@Unstable +public abstract class ReservationId implements Comparable { + + @Private + @Unstable + public static final String reserveIdStrPrefix = "reservation_"; + protected long clusterTimestamp; + protected long id; + + @Private + @Unstable + public static ReservationId newInstance(long clusterTimestamp, long id) { + ReservationId reservationId = Records.newRecord(ReservationId.class); + reservationId.setClusterTimestamp(clusterTimestamp); + reservationId.setId(id); + reservationId.build(); + return reservationId; + } + + /** + * Get the long identifier of the {@link ReservationId} which is unique for + * all Reservations started by a particular instance of the + * {@link ResourceManager}. + * + * @return long identifier of the {@link ReservationId} + */ + @Public + @Unstable + public abstract long getId(); + + @Private + @Unstable + protected abstract void setId(long id); + + /** + * Get the start time of the {@link ResourceManager} which is used to + * generate globally unique {@link ReservationId}. + * + * @return start time of the {@link ResourceManager} + */ + @Public + @Unstable + public abstract long getClusterTimestamp(); + + @Private + @Unstable + protected abstract void setClusterTimestamp(long clusterTimestamp); + + protected abstract void build(); + + static final ThreadLocal reservIdFormat = + new ThreadLocal() { + @Override + public NumberFormat initialValue() { + NumberFormat fmt = NumberFormat.getInstance(); + fmt.setGroupingUsed(false); + fmt.setMinimumIntegerDigits(4); + return fmt; + } + }; + + @Override + public int compareTo(ReservationId other) { + if (this.getClusterTimestamp() - other.getClusterTimestamp() == 0) { + return getId() > getId() ? 1 : getId() < getId() ? -1 : 0; + } else { + return this.getClusterTimestamp() > other.getClusterTimestamp() ? 1 + : this.getClusterTimestamp() < other.getClusterTimestamp() ? -1 : 0; + } + } + + @Override + public String toString() { + return reserveIdStrPrefix + this.getClusterTimestamp() + "_" + + reservIdFormat.get().format(getId()); + } + + @Override + public int hashCode() { + // generated by eclipse + final int prime = 31; + int result = 1; + result = + prime * result + + (int) (getClusterTimestamp() ^ (getClusterTimestamp() >>> 32)); + result = prime * result + (int) (getId() ^ (getId() >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + // generated by eclipse + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ReservationId other = (ReservationId) obj; + if (getClusterTimestamp() != other.getClusterTimestamp()) + return false; + if (getId() != other.getId()) + return false; + return true; + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequest.java new file mode 100644 index 00000000000..ded6d0618f2 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequest.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.records; + +import java.io.Serializable; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.util.Records; + +/** + *

+ * {@link ReservationRequest} represents the request made by an application to + * the {@link ResourceManager} to reserve {@link Resource}s. + *

+ * + *

+ * It includes: + *

    + *
  • {@link Resource} required for each request.
  • + *
  • + * Number of containers, of above specifications, which are required by the + * application.
  • + *
  • + * Concurrency that indicates the gang size of the request.
  • + *
+ *

+ * + */ +@Public +@Unstable +public abstract class ReservationRequest implements + Comparable { + + @Public + @Unstable + public static ReservationRequest newInstance(Resource capability, + int numContainers) { + return newInstance(capability, numContainers, 1, -1); + } + + @Public + @Unstable + public static ReservationRequest newInstance(Resource capability, + int numContainers, int concurrency, long duration) { + ReservationRequest request = Records.newRecord(ReservationRequest.class); + request.setCapability(capability); + request.setNumContainers(numContainers); + request.setConcurrency(concurrency); + request.setDuration(duration); + return request; + } + + @Public + @Unstable + public static class ReservationRequestComparator implements + java.util.Comparator, Serializable { + + private static final long serialVersionUID = 1L; + + @Override + public int compare(ReservationRequest r1, ReservationRequest r2) { + // Compare numContainers, concurrency and capability + int ret = r1.getNumContainers() - r2.getNumContainers(); + if (ret == 0) { + ret = r1.getConcurrency() - r2.getConcurrency(); + } + if (ret == 0) { + ret = r1.getCapability().compareTo(r2.getCapability()); + } + return ret; + } + } + + /** + * Get the {@link Resource} capability of the request. + * + * @return {@link Resource} capability of the request + */ + @Public + @Unstable + public abstract Resource getCapability(); + + /** + * Set the {@link Resource} capability of the request + * + * @param capability {@link Resource} capability of the request + */ + @Public + @Unstable + public abstract void setCapability(Resource capability); + + /** + * Get the number of containers required with the given specifications. + * + * @return number of containers required with the given specifications + */ + @Public + @Unstable + public abstract int getNumContainers(); + + /** + * Set the number of containers required with the given specifications + * + * @param numContainers number of containers required with the given + * specifications + */ + @Public + @Unstable + public abstract void setNumContainers(int numContainers); + + /** + * Get the number of containers that need to be scheduled concurrently. The + * default value of 1 would fall back to the current non concurrency + * constraints on the scheduling behavior. + * + * @return the number of containers to be concurrently scheduled + */ + @Public + @Unstable + public abstract int getConcurrency(); + + /** + * Set the number of containers that need to be scheduled concurrently. The + * default value of 1 would fall back to the current non concurrency + * constraints on the scheduling behavior. + * + * @param numContainers the number of containers to be concurrently scheduled + */ + @Public + @Unstable + public abstract void setConcurrency(int numContainers); + + /** + * Get the duration in milliseconds for which the resource is required. A + * default value of -1, indicates an unspecified lease duration, and fallback + * to current behavior. + * + * @return the duration in milliseconds for which the resource is required + */ + @Public + @Unstable + public abstract long getDuration(); + + /** + * Set the duration in milliseconds for which the resource is required. + * + * @param duration the duration in milliseconds for which the resource is + * required + */ + @Public + @Unstable + public abstract void setDuration(long duration); + + @Override + public int hashCode() { + final int prime = 2153; + int result = 2459; + Resource capability = getCapability(); + result = + prime * result + ((capability == null) ? 0 : capability.hashCode()); + result = prime * result + getNumContainers(); + result = prime * result + getConcurrency(); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ReservationRequest other = (ReservationRequest) obj; + Resource capability = getCapability(); + if (capability == null) { + if (other.getCapability() != null) + return false; + } else if (!capability.equals(other.getCapability())) + return false; + if (getNumContainers() != other.getNumContainers()) + return false; + if (getConcurrency() != other.getConcurrency()) + return false; + return true; + } + + @Override + public int compareTo(ReservationRequest other) { + int numContainersComparison = + this.getNumContainers() - other.getNumContainers(); + if (numContainersComparison == 0) { + int concurrencyComparison = + this.getConcurrency() - other.getConcurrency(); + if (concurrencyComparison == 0) { + return this.getCapability().compareTo(other.getCapability()); + } else { + return concurrencyComparison; + } + } else { + return numContainersComparison; + } + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequestInterpreter.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequestInterpreter.java new file mode 100644 index 00000000000..4621e0d95af --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequestInterpreter.java @@ -0,0 +1,101 @@ +package org.apache.hadoop.yarn.api.records; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Evolving; + +/** + * Enumeration of various types of dependencies among multiple + * {@link ReservationRequests} within one {@link ReservationDefinition} (from + * least constraining to most constraining). + */ +@Public +@Evolving +public enum ReservationRequestInterpreter { + /** + * Requires that exactly ONE among the {@link ReservationRequest} submitted as + * of a {@link ReservationDefinition} is satisfied to satisfy the overall + * {@link ReservationDefinition}. + * + * WHEN TO USE THIS: This is useful when the user have multiple equivalent + * ways to run an application, and wants to expose to the ReservationAgent + * such flexibility. For example an application could use one <32GB,16core> + * container for 10min, or 16 <2GB,1core> containers for 15min, the + * ReservationAgent will decide which one of the two it is best for the system + * to place. + * + */ + R_ANY, + + /** + * Requires that ALL of the {@link ReservationRequest} submitted as part of a + * {@link ReservationDefinition} are satisfied for the overall + * {@link ReservationDefinition} to be satisfied. No constraints are imposed + * on the temporal ordering of the allocation used to satisfy the + * ResourceRequeusts. + * + * WHEN TO USE THIS: This is useful to capture a scenario in which the user + * cares for multiple ReservationDefinition to be all accepted, or none. For + * example, a user might want a reservation R1: with 10 x <8GB,4core> for + * 10min, and a reservation R2: with 2 <1GB,1core> for 1h, and only if both + * are satisfied the workflow run in this reservation succeeds. The key + * differentiator from ALL and ORDER, ORDER_NO_GAP, is that ALL imposes no + * restrictions on the relative allocations used to place R1 and R2 above. + * + */ + R_ALL, + + /** + * Requires that ALL of the {@link ReservationRequest} submitted as part of a + * {@link ReservationDefinition} are satisfied for the overall + * {@link ReservationDefinition} to be satisfied. Moreover, it imposes a + * strict temporal ordering on the allocation used to satisfy the + * {@link ReservationRequest}s. The allocations satisfying the + * {@link ReservationRequest} in position k must strictly precede the + * allocations for the {@link ReservationRequest} at position k+1. No + * constraints are imposed on temporal gaps between subsequent allocations + * (the last instant of the previous allocation can be an arbitrary long + * period of time before the first instant of the subsequent allocation). + * + * WHEN TO USE THIS: Like ALL this requires all ReservationDefinitions to be + * placed, but it also imposes a time ordering on the allocations used. This + * is important if the ReservationDefinition(s) are used to describe a + * workflow with inherent inter-stage dependencies. For example, a first job + * runs in a ReservaitonDefinition R1 (10 x <1GB,1core> for 20min), and its + * output is consumed by a second job described by a ReservationDefinition R2 + * (5 x <1GB,1core>) for 50min). R2 allocation cannot overlap R1, as R2 models + * a job depending on the output of the job modeled by R1. + */ + R_ORDER, + + /** + * Requires that ALL of the {@link ReservationRequest} submitted as part of a + * {@link ReservationDefinition} are satisfied for the overall + * {@link ReservationDefinition} to be satisfied. Moreover, it imposes a + * strict temporal ordering on the allocation used to satisfy the + * {@link ResourceRequeust}s. It imposes a strict temporal ordering on the + * allocation used to satisfy the {@link ReservationRequest}s. The allocations + * satisfying the {@link ReservationRequest} in position k must strictly + * precede the allocations for the {@link ReservationRequest} at position k+1. + * Moreover it imposes a "zero-size gap" between subsequent allocations, i.e., + * the last instant in time of the allocations associated with the + * {@link ReservationRequest} at position k must be exactly preceding the + * first instant in time of the {@link ReservationRequest} at position k+1. + * Time ranges are interpreted as [a,b) inclusive left, exclusive right. + * + * WHEN TO USE THIS: This is a stricter version of R_ORDER, which allows no + * gaps between the allocations that satisfy R1 and R2. The use of this is + * twofold: 1) prevent long gaps between subsequent stages that produce very + * large intermediate output (e.g., the output of R1 is too large to be kept + * around for long before the job running in R2 consumes it, and disposes of + * it), 2) if the job being modeled has a time-varying resource need, one can + * combine multiple ResourceDefinition each approximating a portion of the job + * execution (think of using multiple rectangular bounding boxes to described + * an arbitrarily shaped area). By asking for no-gaps we guarantee + * "continuity" of resources given to this job. This still allow for some + * flexibility, as the entire "train" of allocations can be moved rigidly back + * or forth within the start-deadline time range (if there is slack). + * + */ + R_ORDER_NO_GAP + +} \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequests.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequests.java new file mode 100644 index 00000000000..8cc3fbccec9 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequests.java @@ -0,0 +1,94 @@ +/** + * 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 java.util.List; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationRequests} captures the set of resource and constraints the + * user cares about regarding a reservation. + * + * @see ReservationRequest + * + */ +@Public +@Unstable +public abstract class ReservationRequests { + + @Public + @Unstable + public static ReservationRequests newInstance( + List reservationResources, + ReservationRequestInterpreter type) { + ReservationRequests reservationRequests = + Records.newRecord(ReservationRequests.class); + reservationRequests.setReservationResources(reservationResources); + reservationRequests.setInterpreter(type); + return reservationRequests; + } + + /** + * Get the list of {@link ReservationRequest} representing the resources + * required by the application + * + * @return the list of {@link ReservationRequest} + */ + @Public + @Unstable + public abstract List getReservationResources(); + + /** + * Set the list of {@link ReservationRequest} representing the resources + * required by the application + * + * @param resources the list of {@link ReservationRequest} + */ + @Public + @Unstable + public abstract void setReservationResources( + List reservationResources); + + /** + * Get the {@link ReservationRequestInterpreter}, representing how the list of + * resources should be allocated, this captures temporal ordering and other + * constraints. + * + * @return the list of {@link ReservationRequestInterpreter} + */ + @Public + @Unstable + public abstract ReservationRequestInterpreter getInterpreter(); + + /** + * Set the {@link ReservationRequestInterpreter}, representing how the list of + * resources should be allocated, this captures temporal ordering and other + * constraints. + * + * @param interpreter the {@link ReservationRequestInterpreter} for this + * reservation + */ + @Public + @Unstable + public abstract void setInterpreter(ReservationRequestInterpreter interpreter); + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto index 2d8cae663e4..3346aef5a28 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto @@ -49,5 +49,8 @@ service ApplicationClientProtocolService { rpc getApplicationAttempts (GetApplicationAttemptsRequestProto) returns (GetApplicationAttemptsResponseProto); rpc getContainerReport (GetContainerReportRequestProto) returns (GetContainerReportResponseProto); rpc getContainers (GetContainersRequestProto) returns (GetContainersResponseProto); + rpc submitReservation (ReservationSubmissionRequestProto) returns (ReservationSubmissionResponseProto); + rpc updateReservation (ReservationUpdateRequestProto) returns (ReservationUpdateResponseProto); + rpc deleteReservation (ReservationDeleteRequestProto) returns (ReservationDeleteResponseProto); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto index b3687466cc4..c645719729e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto @@ -202,7 +202,6 @@ message ApplicationAttemptReportProto { optional string diagnostics = 5 [default = "N/A"]; optional YarnApplicationAttemptStateProto yarn_application_attempt_state = 6; optional ContainerIdProto am_container_id = 7; - optional string original_tracking_url = 8; } enum NodeStateProto { @@ -293,6 +292,7 @@ message ApplicationSubmissionContextProto { repeated string applicationTags = 12; optional int64 attempt_failures_validity_interval = 13 [default = -1]; optional LogAggregationContextProto log_aggregation_context = 14; + optional ReservationIdProto reservation_id = 15; } message LogAggregationContextProto { @@ -340,6 +340,41 @@ message QueueUserACLInfoProto { repeated QueueACLProto userAcls = 2; } +//////////////////////////////////////////////////////////////////////// +////// From reservation_protocol ///////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +message ReservationIdProto { + optional int64 id = 1; + optional int64 cluster_timestamp = 2; +} + +message ReservationRequestProto { + optional ResourceProto capability = 1; + optional int32 num_containers = 2 [default = 1]; + optional int32 concurrency = 3 [default = 1]; + optional int64 duration = 4 [default = -1]; +} + +message ReservationRequestsProto { + repeated ReservationRequestProto reservation_resources = 1; + optional ReservationRequestInterpreterProto interpreter = 2 [default = R_ALL]; +} + +message ReservationDefinitionProto { + optional ReservationRequestsProto reservation_requests = 1; + optional int64 arrival = 2; + optional int64 deadline = 3; + optional string reservation_name = 4; +} + +enum ReservationRequestInterpreterProto { + R_ANY = 0; + R_ALL = 1; + R_ORDER = 2; + R_ORDER_NO_GAP = 3; + } + //////////////////////////////////////////////////////////////////////// ////// From container_manager ////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto index 4203744a5d4..2585f78bb98 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto @@ -292,3 +292,31 @@ message GetContainersRequestProto { message GetContainersResponseProto { repeated ContainerReportProto containers = 1; } + +////////////////////////////////////////////////////// +// reservation_protocol +////////////////////////////////////////////////////// + +message ReservationSubmissionRequestProto { + optional string queue = 1; + optional ReservationDefinitionProto reservation_definition = 2; +} + +message ReservationSubmissionResponseProto { + optional ReservationIdProto reservation_id = 1; +} + +message ReservationUpdateRequestProto { + optional ReservationDefinitionProto reservation_definition = 1; + optional ReservationIdProto reservation_id = 2; +} + +message ReservationUpdateResponseProto { +} + +message ReservationDeleteRequestProto { + optional ReservationIdProto reservation_id = 1; +} + +message ReservationDeleteResponseProto { +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java index 5794da0ed80..b4b9f43c0cf 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java @@ -63,6 +63,12 @@ import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesReq import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesResponse; import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenRequest; import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateResponse; import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest; import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationResponse; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.CancelDelegationTokenRequestPBImpl; @@ -97,6 +103,12 @@ import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.MoveApplicationAcrossQ import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.MoveApplicationAcrossQueuesResponsePBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.RenewDelegationTokenRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.RenewDelegationTokenResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationDeleteRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationDeleteResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationSubmissionRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationSubmissionResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationUpdateRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationUpdateResponsePBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SubmitApplicationRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SubmitApplicationResponsePBImpl; import org.apache.hadoop.yarn.exceptions.YarnException; @@ -110,13 +122,15 @@ import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetQueueInfoRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetQueueUserAclsInfoRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.KillApplicationRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.MoveApplicationAcrossQueuesRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationSubmissionRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationUpdateRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationDeleteRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.SubmitApplicationRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationAttemptsRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationAttemptReportRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainerReportRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainersRequestProto; - import com.google.protobuf.ServiceException; @Private @@ -391,4 +405,46 @@ public class ApplicationClientProtocolPBClientImpl implements ApplicationClientP } } + @Override + public ReservationSubmissionResponse submitReservation(ReservationSubmissionRequest request) + throws YarnException, IOException { + ReservationSubmissionRequestProto requestProto = + ((ReservationSubmissionRequestPBImpl) request).getProto(); + try { + return new ReservationSubmissionResponsePBImpl(proxy.submitReservation(null, + requestProto)); + } catch (ServiceException e) { + RPCUtil.unwrapAndThrowException(e); + return null; + } + } + + @Override + public ReservationUpdateResponse updateReservation(ReservationUpdateRequest request) + throws YarnException, IOException { + ReservationUpdateRequestProto requestProto = + ((ReservationUpdateRequestPBImpl) request).getProto(); + try { + return new ReservationUpdateResponsePBImpl(proxy.updateReservation(null, + requestProto)); + } catch (ServiceException e) { + RPCUtil.unwrapAndThrowException(e); + return null; + } + } + + @Override + public ReservationDeleteResponse deleteReservation(ReservationDeleteRequest request) + throws YarnException, IOException { + ReservationDeleteRequestProto requestProto = + ((ReservationDeleteRequestPBImpl) request).getProto(); + try { + return new ReservationDeleteResponsePBImpl(proxy.deleteReservation(null, + requestProto)); + } catch (ServiceException e) { + RPCUtil.unwrapAndThrowException(e); + return null; + } + } + } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java index 1d9bedd4aff..f73202de49a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java @@ -45,6 +45,9 @@ import org.apache.hadoop.yarn.api.protocolrecords.GetQueueUserAclsInfoResponse; import org.apache.hadoop.yarn.api.protocolrecords.KillApplicationResponse; import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesResponse; import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateResponse; import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationResponse; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.CancelDelegationTokenRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.CancelDelegationTokenResponsePBImpl; @@ -78,6 +81,12 @@ import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.MoveApplicationAcrossQ import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.MoveApplicationAcrossQueuesResponsePBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.RenewDelegationTokenRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.RenewDelegationTokenResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationDeleteRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationDeleteResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationSubmissionRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationSubmissionResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationUpdateRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationUpdateResponsePBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SubmitApplicationRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SubmitApplicationResponsePBImpl; import org.apache.hadoop.yarn.exceptions.YarnException; @@ -99,6 +108,12 @@ import org.apache.hadoop.yarn.proto.YarnServiceProtos.KillApplicationRequestProt import org.apache.hadoop.yarn.proto.YarnServiceProtos.KillApplicationResponseProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.MoveApplicationAcrossQueuesRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.MoveApplicationAcrossQueuesResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationSubmissionRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationSubmissionResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationUpdateRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationUpdateResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationDeleteRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationDeleteResponseProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.SubmitApplicationRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.SubmitApplicationResponseProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationAttemptReportRequestProto; @@ -383,4 +398,50 @@ public class ApplicationClientProtocolPBServiceImpl implements ApplicationClient throw new ServiceException(e); } } + + @Override + public ReservationSubmissionResponseProto submitReservation(RpcController controller, + ReservationSubmissionRequestProto requestProto) throws ServiceException { + ReservationSubmissionRequestPBImpl request = + new ReservationSubmissionRequestPBImpl(requestProto); + try { + ReservationSubmissionResponse response = real.submitReservation(request); + return ((ReservationSubmissionResponsePBImpl) response).getProto(); + } catch (YarnException e) { + throw new ServiceException(e); + } catch (IOException e) { + throw new ServiceException(e); + } + } + + @Override + public ReservationUpdateResponseProto updateReservation(RpcController controller, + ReservationUpdateRequestProto requestProto) throws ServiceException { + ReservationUpdateRequestPBImpl request = + new ReservationUpdateRequestPBImpl(requestProto); + try { + ReservationUpdateResponse response = real.updateReservation(request); + return ((ReservationUpdateResponsePBImpl) response).getProto(); + } catch (YarnException e) { + throw new ServiceException(e); + } catch (IOException e) { + throw new ServiceException(e); + } + } + + @Override + public ReservationDeleteResponseProto deleteReservation(RpcController controller, + ReservationDeleteRequestProto requestProto) throws ServiceException { + ReservationDeleteRequestPBImpl request = + new ReservationDeleteRequestPBImpl(requestProto); + try { + ReservationDeleteResponse response = real.deleteReservation(request); + return ((ReservationDeleteResponsePBImpl) response).getProto(); + } catch (YarnException e) { + throw new ServiceException(e); + } catch (IOException e) { + throw new ServiceException(e); + } + } + } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteRequestPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteRequestPBImpl.java new file mode 100644 index 00000000000..c235dce27e7 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteRequestPBImpl.java @@ -0,0 +1,127 @@ +/** + * 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 org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest; +import org.apache.hadoop.yarn.api.records.ReservationId; +import org.apache.hadoop.yarn.api.records.impl.pb.ReservationIdPBImpl; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationIdProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationDeleteRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationDeleteRequestProtoOrBuilder; + +import com.google.protobuf.TextFormat; + +public class ReservationDeleteRequestPBImpl extends ReservationDeleteRequest { + + ReservationDeleteRequestProto proto = ReservationDeleteRequestProto + .getDefaultInstance(); + ReservationDeleteRequestProto.Builder builder = null; + boolean viaProto = false; + + private ReservationId reservationId; + + public ReservationDeleteRequestPBImpl() { + builder = ReservationDeleteRequestProto.newBuilder(); + } + + public ReservationDeleteRequestPBImpl(ReservationDeleteRequestProto proto) { + this.proto = proto; + viaProto = true; + } + + public ReservationDeleteRequestProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + private void mergeLocalToBuilder() { + if (this.reservationId != null) { + builder.setReservationId(convertToProtoFormat(this.reservationId)); + } + } + + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = ReservationDeleteRequestProto.newBuilder(proto); + } + viaProto = false; + } + + @Override + public ReservationId getReservationId() { + ReservationDeleteRequestProtoOrBuilder p = viaProto ? proto : builder; + if (reservationId != null) { + return reservationId; + } + if (!p.hasReservationId()) { + return null; + } + reservationId = convertFromProtoFormat(p.getReservationId()); + return reservationId; + } + + @Override + public void setReservationId(ReservationId reservationId) { + maybeInitBuilder(); + if (reservationId == null) { + builder.clearReservationId(); + return; + } + this.reservationId = reservationId; + } + + private ReservationIdPBImpl convertFromProtoFormat(ReservationIdProto p) { + return new ReservationIdPBImpl(p); + } + + private ReservationIdProto convertToProtoFormat(ReservationId t) { + return ((ReservationIdPBImpl) t).getProto(); + } + + @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 TextFormat.shortDebugString(getProto()); + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteResponsePBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteResponsePBImpl.java new file mode 100644 index 00000000000..a249ab8ea02 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteResponsePBImpl.java @@ -0,0 +1,68 @@ +/** + * 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 org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationDeleteResponseProto; + +import com.google.protobuf.TextFormat; + +public class ReservationDeleteResponsePBImpl extends ReservationDeleteResponse { + + ReservationDeleteResponseProto proto = ReservationDeleteResponseProto + .getDefaultInstance(); + ReservationDeleteResponseProto.Builder builder = null; + boolean viaProto = false; + + public ReservationDeleteResponsePBImpl() { + builder = ReservationDeleteResponseProto.newBuilder(); + } + + public ReservationDeleteResponsePBImpl(ReservationDeleteResponseProto proto) { + this.proto = proto; + viaProto = true; + } + + public ReservationDeleteResponseProto getProto() { + 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 TextFormat.shortDebugString(getProto()); + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationSubmissionRequestPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationSubmissionRequestPBImpl.java new file mode 100644 index 00000000000..9f10f4c75a7 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationSubmissionRequestPBImpl.java @@ -0,0 +1,152 @@ +/** + * 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 org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.api.records.impl.pb.ReservationDefinitionPBImpl; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationDefinitionProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationSubmissionRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationSubmissionRequestProtoOrBuilder; + +import com.google.protobuf.TextFormat; + +public class ReservationSubmissionRequestPBImpl extends + ReservationSubmissionRequest { + + ReservationSubmissionRequestProto proto = ReservationSubmissionRequestProto + .getDefaultInstance(); + ReservationSubmissionRequestProto.Builder builder = null; + boolean viaProto = false; + + private ReservationDefinition reservationDefinition; + + public ReservationSubmissionRequestPBImpl() { + builder = ReservationSubmissionRequestProto.newBuilder(); + } + + public ReservationSubmissionRequestPBImpl( + ReservationSubmissionRequestProto proto) { + this.proto = proto; + viaProto = true; + } + + public ReservationSubmissionRequestProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + private void mergeLocalToBuilder() { + if (this.reservationDefinition != null) { + builder + .setReservationDefinition(convertToProtoFormat(reservationDefinition)); + } + } + + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = ReservationSubmissionRequestProto.newBuilder(proto); + } + viaProto = false; + } + + @Override + public ReservationDefinition getReservationDefinition() { + ReservationSubmissionRequestProtoOrBuilder p = viaProto ? proto : builder; + if (reservationDefinition != null) { + return reservationDefinition; + } + if (!p.hasReservationDefinition()) { + return null; + } + reservationDefinition = + convertFromProtoFormat(p.getReservationDefinition()); + return reservationDefinition; + } + + @Override + public void setReservationDefinition( + ReservationDefinition reservationDefinition) { + maybeInitBuilder(); + if (reservationDefinition == null) { + builder.clearReservationDefinition(); + } + this.reservationDefinition = reservationDefinition; + } + + @Override + public String getQueue() { + ReservationSubmissionRequestProtoOrBuilder p = viaProto ? proto : builder; + if (!p.hasQueue()) { + return null; + } + return (p.getQueue()); + } + + @Override + public void setQueue(String planName) { + maybeInitBuilder(); + if (planName == null) { + builder.clearQueue(); + return; + } + builder.setQueue(planName); + } + + private ReservationDefinitionProto convertToProtoFormat( + ReservationDefinition r) { + return ((ReservationDefinitionPBImpl) r).getProto(); + } + + private ReservationDefinitionPBImpl convertFromProtoFormat( + ReservationDefinitionProto r) { + return new ReservationDefinitionPBImpl(r); + } + + @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 TextFormat.shortDebugString(getProto()); + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationSubmissionResponsePBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationSubmissionResponsePBImpl.java new file mode 100644 index 00000000000..82151f40469 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationSubmissionResponsePBImpl.java @@ -0,0 +1,129 @@ +/** + * 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 org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse; +import org.apache.hadoop.yarn.api.records.ReservationId; +import org.apache.hadoop.yarn.api.records.impl.pb.ReservationIdPBImpl; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationIdProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationSubmissionResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationSubmissionResponseProtoOrBuilder; + +import com.google.protobuf.TextFormat; + +public class ReservationSubmissionResponsePBImpl extends + ReservationSubmissionResponse { + + ReservationSubmissionResponseProto proto = ReservationSubmissionResponseProto + .getDefaultInstance(); + ReservationSubmissionResponseProto.Builder builder = null; + boolean viaProto = false; + + private ReservationId reservationId; + + public ReservationSubmissionResponsePBImpl() { + builder = ReservationSubmissionResponseProto.newBuilder(); + } + + public ReservationSubmissionResponsePBImpl( + ReservationSubmissionResponseProto proto) { + this.proto = proto; + viaProto = true; + } + + public ReservationSubmissionResponseProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + private void mergeLocalToBuilder() { + if (this.reservationId != null) { + builder.setReservationId(convertToProtoFormat(this.reservationId)); + } + } + + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = ReservationSubmissionResponseProto.newBuilder(proto); + } + viaProto = false; + } + + @Override + public ReservationId getReservationId() { + ReservationSubmissionResponseProtoOrBuilder p = viaProto ? proto : builder; + if (reservationId != null) { + return reservationId; + } + if (!p.hasReservationId()) { + return null; + } + reservationId = convertFromProtoFormat(p.getReservationId()); + return reservationId; + } + + @Override + public void setReservationId(ReservationId reservationId) { + maybeInitBuilder(); + if (reservationId == null) { + builder.clearReservationId(); + return; + } + this.reservationId = reservationId; + } + + private ReservationIdPBImpl convertFromProtoFormat(ReservationIdProto p) { + return new ReservationIdPBImpl(p); + } + + private ReservationIdProto convertToProtoFormat(ReservationId t) { + return ((ReservationIdPBImpl) t).getProto(); + } + + @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 TextFormat.shortDebugString(getProto()); + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationUpdateRequestPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationUpdateRequestPBImpl.java new file mode 100644 index 00000000000..89999f24c5c --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationUpdateRequestPBImpl.java @@ -0,0 +1,169 @@ +/** + * 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 org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.api.records.ReservationId; +import org.apache.hadoop.yarn.api.records.impl.pb.ReservationDefinitionPBImpl; +import org.apache.hadoop.yarn.api.records.impl.pb.ReservationIdPBImpl; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationDefinitionProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationIdProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationUpdateRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationUpdateRequestProtoOrBuilder; + +import com.google.protobuf.TextFormat; + +public class ReservationUpdateRequestPBImpl extends ReservationUpdateRequest { + + ReservationUpdateRequestProto proto = ReservationUpdateRequestProto + .getDefaultInstance(); + ReservationUpdateRequestProto.Builder builder = null; + boolean viaProto = false; + + private ReservationDefinition reservationDefinition; + private ReservationId reservationId; + + public ReservationUpdateRequestPBImpl() { + builder = ReservationUpdateRequestProto.newBuilder(); + } + + public ReservationUpdateRequestPBImpl(ReservationUpdateRequestProto proto) { + this.proto = proto; + viaProto = true; + } + + public ReservationUpdateRequestProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + private void mergeLocalToBuilder() { + if (this.reservationId != null) { + builder.setReservationId(convertToProtoFormat(this.reservationId)); + } + if (this.reservationDefinition != null) { + builder + .setReservationDefinition(convertToProtoFormat(reservationDefinition)); + } + } + + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = ReservationUpdateRequestProto.newBuilder(proto); + } + viaProto = false; + } + + @Override + public ReservationDefinition getReservationDefinition() { + ReservationUpdateRequestProtoOrBuilder p = viaProto ? proto : builder; + if (reservationDefinition != null) { + return reservationDefinition; + } + if (!p.hasReservationDefinition()) { + return null; + } + reservationDefinition = + convertFromProtoFormat(p.getReservationDefinition()); + return reservationDefinition; + } + + @Override + public void setReservationDefinition( + ReservationDefinition reservationDefinition) { + maybeInitBuilder(); + if (reservationDefinition == null) { + builder.clearReservationDefinition(); + } + this.reservationDefinition = reservationDefinition; + } + + @Override + public ReservationId getReservationId() { + ReservationUpdateRequestProtoOrBuilder p = viaProto ? proto : builder; + if (reservationId != null) { + return reservationId; + } + if (!p.hasReservationId()) { + return null; + } + reservationId = convertFromProtoFormat(p.getReservationId()); + return reservationId; + } + + @Override + public void setReservationId(ReservationId reservationId) { + maybeInitBuilder(); + if (reservationId == null) { + builder.clearReservationId(); + return; + } + this.reservationId = reservationId; + } + + private ReservationIdPBImpl convertFromProtoFormat(ReservationIdProto p) { + return new ReservationIdPBImpl(p); + } + + private ReservationIdProto convertToProtoFormat(ReservationId t) { + return ((ReservationIdPBImpl) t).getProto(); + } + + private ReservationDefinitionProto convertToProtoFormat( + ReservationDefinition r) { + return ((ReservationDefinitionPBImpl) r).getProto(); + } + + private ReservationDefinitionPBImpl convertFromProtoFormat( + ReservationDefinitionProto r) { + return new ReservationDefinitionPBImpl(r); + } + + @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 TextFormat.shortDebugString(getProto()); + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationUpdateResponsePBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationUpdateResponsePBImpl.java new file mode 100644 index 00000000000..57c7b1b2897 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationUpdateResponsePBImpl.java @@ -0,0 +1,68 @@ +/** + * 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 org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateResponse; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationUpdateResponseProto; + +import com.google.protobuf.TextFormat; + +public class ReservationUpdateResponsePBImpl extends ReservationUpdateResponse { + + ReservationUpdateResponseProto proto = ReservationUpdateResponseProto + .getDefaultInstance(); + ReservationUpdateResponseProto.Builder builder = null; + boolean viaProto = false; + + public ReservationUpdateResponsePBImpl() { + builder = ReservationUpdateResponseProto.newBuilder(); + } + + public ReservationUpdateResponsePBImpl(ReservationUpdateResponseProto proto) { + this.proto = proto; + viaProto = true; + } + + public ReservationUpdateResponseProto getProto() { + 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 TextFormat.shortDebugString(getProto()); + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationSubmissionContextPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationSubmissionContextPBImpl.java index e4f183b9027..489cf8cfcef 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationSubmissionContextPBImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationSubmissionContextPBImpl.java @@ -57,6 +57,7 @@ extends ApplicationSubmissionContext { private Resource resource = null; private Set applicationTags = null; private LogAggregationContext logAggregationContext = null; + private ReservationId reservationId = null; public ApplicationSubmissionContextPBImpl() { builder = ApplicationSubmissionContextProto.newBuilder(); @@ -114,10 +115,6 @@ extends ApplicationSubmissionContext { builder.clearApplicationTags(); builder.addAllApplicationTags(this.applicationTags); } - if (this.logAggregationContext != null) { - builder.setLogAggregationContext( - convertToProtoFormat(this.logAggregationContext)); - } } private void mergeLocalToProto() { @@ -365,6 +362,29 @@ extends ApplicationSubmissionContext { this.resource = resource; } + @Override + public ReservationId getReservationID() { + ApplicationSubmissionContextProtoOrBuilder p = viaProto ? proto : builder; + if (reservationId != null) { + return reservationId; + } + if (!p.hasReservationId()) { + return null; + } + reservationId = convertFromProtoFormat(p.getReservationId()); + return reservationId; + } + + @Override + public void setReservationID(ReservationId reservationID) { + maybeInitBuilder(); + if (reservationID == null) { + builder.clearReservationId(); + return; + } + this.reservationId = reservationID; + } + @Override public void setKeepContainersAcrossApplicationAttempts(boolean keepContainers) { @@ -455,4 +475,12 @@ extends ApplicationSubmissionContext { builder.clearLogAggregationContext(); this.logAggregationContext = logAggregationContext; } + + private ReservationIdPBImpl convertFromProtoFormat(ReservationIdProto p) { + return new ReservationIdPBImpl(p); + } + + private ReservationIdProto convertToProtoFormat(ReservationId t) { + return ((ReservationIdPBImpl) t).getProto(); + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ProtoUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ProtoUtils.java index 4a3c13792ea..f18a77c31ea 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ProtoUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ProtoUtils.java @@ -34,6 +34,7 @@ import org.apache.hadoop.yarn.api.records.NodeId; import org.apache.hadoop.yarn.api.records.NodeState; import org.apache.hadoop.yarn.api.records.QueueACL; import org.apache.hadoop.yarn.api.records.QueueState; +import org.apache.hadoop.yarn.api.records.ReservationRequestInterpreter; import org.apache.hadoop.yarn.api.records.YarnApplicationAttemptState; import org.apache.hadoop.yarn.api.records.YarnApplicationState; import org.apache.hadoop.yarn.proto.YarnProtos.AMCommandProto; @@ -47,10 +48,12 @@ import org.apache.hadoop.yarn.proto.YarnProtos.NodeIdProto; import org.apache.hadoop.yarn.proto.YarnProtos.NodeStateProto; import org.apache.hadoop.yarn.proto.YarnProtos.QueueACLProto; import org.apache.hadoop.yarn.proto.YarnProtos.QueueStateProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationRequestInterpreterProto; import org.apache.hadoop.yarn.proto.YarnProtos.YarnApplicationAttemptStateProto; import org.apache.hadoop.yarn.proto.YarnProtos.YarnApplicationStateProto; import com.google.protobuf.ByteString; + import org.apache.hadoop.yarn.proto.YarnServiceProtos; @Private @@ -237,4 +240,18 @@ public class ProtoUtils { return ApplicationAccessType.valueOf(e.name().replace( APP_ACCESS_TYPE_PREFIX, "")); } + + /* + * Reservation Request interpreter type + */ + public static ReservationRequestInterpreterProto convertToProtoFormat( + ReservationRequestInterpreter e) { + return ReservationRequestInterpreterProto.valueOf(e.name()); + } + + public static ReservationRequestInterpreter convertFromProtoFormat( + ReservationRequestInterpreterProto e) { + return ReservationRequestInterpreter.valueOf(e.name()); + } + } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationDefinitionPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationDefinitionPBImpl.java new file mode 100644 index 00000000000..9f87108464e --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationDefinitionPBImpl.java @@ -0,0 +1,169 @@ +/** + * 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 org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.api.records.ReservationRequests; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationDefinitionProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationDefinitionProtoOrBuilder; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationRequestsProto; + +public class ReservationDefinitionPBImpl extends ReservationDefinition { + + ReservationDefinitionProto proto = ReservationDefinitionProto + .getDefaultInstance(); + ReservationDefinitionProto.Builder builder = null; + boolean viaProto = false; + + private ReservationRequests reservationReqs; + + public ReservationDefinitionPBImpl() { + builder = ReservationDefinitionProto.newBuilder(); + } + + public ReservationDefinitionPBImpl(ReservationDefinitionProto proto) { + this.proto = proto; + viaProto = true; + } + + public ReservationDefinitionProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + private void mergeLocalToBuilder() { + if (this.reservationReqs != null) { + builder + .setReservationRequests(convertToProtoFormat(this.reservationReqs)); + } + } + + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = ReservationDefinitionProto.newBuilder(proto); + } + viaProto = false; + } + + @Override + public long getArrival() { + ReservationDefinitionProtoOrBuilder p = viaProto ? proto : builder; + if (!p.hasArrival()) { + return 0; + } + return (p.getArrival()); + } + + @Override + public void setArrival(long earliestStartTime) { + maybeInitBuilder(); + if (earliestStartTime <= 0) { + builder.clearArrival(); + return; + } + builder.setArrival(earliestStartTime); + } + + @Override + public long getDeadline() { + ReservationDefinitionProtoOrBuilder p = viaProto ? proto : builder; + if (!p.hasDeadline()) { + return 0; + } + return (p.getDeadline()); + } + + @Override + public void setDeadline(long latestEndTime) { + maybeInitBuilder(); + if (latestEndTime <= 0) { + builder.clearDeadline(); + return; + } + builder.setDeadline(latestEndTime); + } + + @Override + public ReservationRequests getReservationRequests() { + ReservationDefinitionProtoOrBuilder p = viaProto ? proto : builder; + if (reservationReqs != null) { + return reservationReqs; + } + if (!p.hasReservationRequests()) { + return null; + } + reservationReqs = convertFromProtoFormat(p.getReservationRequests()); + return reservationReqs; + } + + @Override + public void setReservationRequests(ReservationRequests reservationRequests) { + if (reservationRequests == null) { + builder.clearReservationRequests(); + return; + } + this.reservationReqs = reservationRequests; + } + + @Override + public String getReservationName() { + ReservationDefinitionProtoOrBuilder p = viaProto ? proto : builder; + if (!p.hasReservationName()) { + return null; + } + return (p.getReservationName()); + } + + @Override + public void setReservationName(String name) { + maybeInitBuilder(); + if (name == null) { + builder.clearReservationName(); + return; + } + builder.setReservationName(name); + } + + private ReservationRequestsPBImpl convertFromProtoFormat( + ReservationRequestsProto p) { + return new ReservationRequestsPBImpl(p); + } + + private ReservationRequestsProto convertToProtoFormat(ReservationRequests t) { + return ((ReservationRequestsPBImpl) t).getProto(); + } + + @Override + public String toString() { + return "{Arrival: " + getArrival() + ", Deadline: " + getDeadline() + + ", Reservation Name: " + getReservationName() + ", Resources: " + + getReservationRequests() + "}"; + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationIdPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationIdPBImpl.java new file mode 100644 index 00000000000..609d4ab1ba7 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationIdPBImpl.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.records.impl.pb; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ReservationId; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationIdProto; + +import com.google.common.base.Preconditions; + +@Private +@Unstable +public class ReservationIdPBImpl extends ReservationId { + ReservationIdProto proto = null; + ReservationIdProto.Builder builder = null; + + public ReservationIdPBImpl() { + builder = ReservationIdProto.newBuilder(); + } + + public ReservationIdPBImpl(ReservationIdProto proto) { + this.proto = proto; + } + + public ReservationIdProto getProto() { + return proto; + } + + @Override + public long getId() { + Preconditions.checkNotNull(proto); + return proto.getId(); + } + + @Override + protected void setId(long id) { + Preconditions.checkNotNull(builder); + builder.setId(id); + } + + @Override + public long getClusterTimestamp() { + Preconditions.checkNotNull(proto); + return proto.getClusterTimestamp(); + } + + @Override + protected void setClusterTimestamp(long clusterTimestamp) { + Preconditions.checkNotNull(builder); + builder.setClusterTimestamp((clusterTimestamp)); + } + + @Override + protected void build() { + proto = builder.build(); + builder = null; + } +} \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationRequestPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationRequestPBImpl.java new file mode 100644 index 00000000000..e36b9fb3c30 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationRequestPBImpl.java @@ -0,0 +1,152 @@ +/** + * 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 org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ReservationRequest; +import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationRequestProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationRequestProtoOrBuilder; +import org.apache.hadoop.yarn.proto.YarnProtos.ResourceProto; + +@Private +@Unstable +public class ReservationRequestPBImpl extends ReservationRequest { + ReservationRequestProto proto = ReservationRequestProto.getDefaultInstance(); + ReservationRequestProto.Builder builder = null; + boolean viaProto = false; + + private Resource capability = null; + + public ReservationRequestPBImpl() { + builder = ReservationRequestProto.newBuilder(); + } + + public ReservationRequestPBImpl(ReservationRequestProto proto) { + this.proto = proto; + viaProto = true; + } + + public ReservationRequestProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + private void mergeLocalToBuilder() { + if (this.capability != null) { + builder.setCapability(convertToProtoFormat(this.capability)); + } + } + + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = ReservationRequestProto.newBuilder(proto); + } + viaProto = false; + } + + @Override + public Resource getCapability() { + ReservationRequestProtoOrBuilder p = viaProto ? proto : builder; + if (this.capability != null) { + return this.capability; + } + if (!p.hasCapability()) { + return null; + } + this.capability = convertFromProtoFormat(p.getCapability()); + return this.capability; + } + + @Override + public void setCapability(Resource capability) { + maybeInitBuilder(); + if (capability == null) + builder.clearCapability(); + this.capability = capability; + } + + @Override + public int getNumContainers() { + ReservationRequestProtoOrBuilder p = viaProto ? proto : builder; + return (p.getNumContainers()); + } + + @Override + public void setNumContainers(int numContainers) { + maybeInitBuilder(); + builder.setNumContainers((numContainers)); + } + + @Override + public int getConcurrency() { + ReservationRequestProtoOrBuilder p = viaProto ? proto : builder; + if (!p.hasConcurrency()) { + return 1; + } + return (p.getConcurrency()); + } + + @Override + public void setConcurrency(int numContainers) { + maybeInitBuilder(); + builder.setConcurrency(numContainers); + } + + @Override + public long getDuration() { + ReservationRequestProtoOrBuilder p = viaProto ? proto : builder; + if (!p.hasDuration()) { + return 0; + } + return (p.getDuration()); + } + + @Override + public void setDuration(long duration) { + maybeInitBuilder(); + builder.setDuration(duration); + } + + private ResourcePBImpl convertFromProtoFormat(ResourceProto p) { + return new ResourcePBImpl(p); + } + + private ResourceProto convertToProtoFormat(Resource t) { + return ((ResourcePBImpl) t).getProto(); + } + + @Override + public String toString() { + return "{Capability: " + getCapability() + ", # Containers: " + + getNumContainers() + ", Concurrency: " + getConcurrency() + + ", Lease Duration: " + getDuration() + "}"; + } +} \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationRequestsPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationRequestsPBImpl.java new file mode 100644 index 00000000000..4b39836e27a --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationRequestsPBImpl.java @@ -0,0 +1,189 @@ +/** + * 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.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.hadoop.yarn.api.records.ReservationRequest; +import org.apache.hadoop.yarn.api.records.ReservationRequestInterpreter; +import org.apache.hadoop.yarn.api.records.ReservationRequests; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationRequestInterpreterProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationRequestProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationRequestsProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationRequestsProtoOrBuilder; + +public class ReservationRequestsPBImpl extends ReservationRequests { + + ReservationRequestsProto proto = ReservationRequestsProto + .getDefaultInstance(); + ReservationRequestsProto.Builder builder = null; + boolean viaProto = false; + + public List reservationRequests; + + public ReservationRequestsPBImpl() { + builder = ReservationRequestsProto.newBuilder(); + } + + public ReservationRequestsPBImpl(ReservationRequestsProto proto) { + this.proto = proto; + viaProto = true; + } + + public ReservationRequestsProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + private void mergeLocalToBuilder() { + if (this.reservationRequests != null) { + addReservationResourcesToProto(); + } + } + + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = ReservationRequestsProto.newBuilder(proto); + } + viaProto = false; + } + + @Override + public List getReservationResources() { + initReservationRequestsList(); + return reservationRequests; + } + + @Override + public void setReservationResources(List resources) { + if (resources == null) { + builder.clearReservationResources(); + return; + } + this.reservationRequests = resources; + } + + @Override + public ReservationRequestInterpreter getInterpreter() { + ReservationRequestsProtoOrBuilder p = viaProto ? proto : builder; + if (!p.hasInterpreter()) { + return null; + } + return (convertFromProtoFormat(p.getInterpreter())); + } + + @Override + public void setInterpreter(ReservationRequestInterpreter interpreter) { + maybeInitBuilder(); + if (interpreter == null) { + builder.clearInterpreter(); + return; + } + builder.setInterpreter(convertToProtoFormat(interpreter)); + } + + private void initReservationRequestsList() { + if (this.reservationRequests != null) { + return; + } + ReservationRequestsProtoOrBuilder p = viaProto ? proto : builder; + List resourceProtos = + p.getReservationResourcesList(); + reservationRequests = new ArrayList(); + + for (ReservationRequestProto r : resourceProtos) { + reservationRequests.add(convertFromProtoFormat(r)); + } + } + + private void addReservationResourcesToProto() { + maybeInitBuilder(); + builder.clearReservationResources(); + if (reservationRequests == null) + return; + Iterable iterable = + new Iterable() { + @Override + public Iterator iterator() { + return new Iterator() { + + Iterator iter = reservationRequests + .iterator(); + + @Override + public boolean hasNext() { + return iter.hasNext(); + } + + @Override + public ReservationRequestProto next() { + return convertToProtoFormat(iter.next()); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + }; + + } + + }; + builder.addAllReservationResources(iterable); + } + + private ReservationRequestProto convertToProtoFormat(ReservationRequest r) { + return ((ReservationRequestPBImpl) r).getProto(); + } + + private ReservationRequestPBImpl convertFromProtoFormat( + ReservationRequestProto r) { + return new ReservationRequestPBImpl(r); + } + + private ReservationRequestInterpreterProto convertToProtoFormat( + ReservationRequestInterpreter r) { + return ProtoUtils.convertToProtoFormat(r); + } + + private ReservationRequestInterpreter convertFromProtoFormat( + ReservationRequestInterpreterProto r) { + return ProtoUtils.convertFromProtoFormat(r); + } + + @Override + public String toString() { + return "{Reservation Resources: " + getReservationResources() + + ", Reservation Type: " + getInterpreter() + "}"; + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/UTCClock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/UTCClock.java new file mode 100644 index 00000000000..ecef3dd9669 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/UTCClock.java @@ -0,0 +1,39 @@ +/** + * 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.util; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Evolving; + +/** + * Implementation of {@link Clock} that gives the current UTC time in + * milliseconds. + */ +@Public +@Evolving +public class UTCClock implements Clock { + + private final TimeZone utcZone = TimeZone.getTimeZone("UTC"); + + public long getTime() { + return Calendar.getInstance(utcZone).getTimeInMillis(); + } +} \ No newline at end of file