diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationId.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationId.java
index 097a533..ef1f509 100644
--- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationId.java
+++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationId.java
@@ -24,6 +24,7 @@
import org.apache.hadoop.classification.InterfaceAudience.Public;
import org.apache.hadoop.classification.InterfaceStability.Stable;
import org.apache.hadoop.classification.InterfaceStability.Unstable;
+import org.apache.hadoop.yarn.util.Records;
/**
*
ApplicationId represents the globally unique
@@ -52,7 +53,7 @@
@Private
@Unstable
- public abstract void setId(int id);
+ protected abstract void setId(int id);
/**
* Get the start time of the ResourceManager which is
@@ -63,9 +64,21 @@
@Private
@Unstable
- public abstract void setClusterTimestamp(long clusterTimestamp);
+ protected abstract void setClusterTimestamp(long clusterTimestamp);
+ /**
+ * Meant to build the serialized form once all setters have been called.
+ */
+ protected abstract void build();
+
+ public ApplicationId createApplicationId(long clusterTimestamp, int id) {
+ ApplicationId appId = Records.newRecord(ApplicationId.class);
+ appId.setClusterTimestamp(clusterTimestamp);
+ appId.setId(id);
+ appId.build();
+ return appId;
+ }
static final ThreadLocal appIdFormat =
new ThreadLocal() {
diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationIdPBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationIdPBImpl.java
index ad5c778..a0cb4a1 100644
--- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationIdPBImpl.java
+++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationIdPBImpl.java
@@ -19,9 +19,9 @@
package org.apache.hadoop.yarn.api.records.impl.pb;
+import org.apache.hadoop.yarn.YarnException;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationIdProto;
-import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationIdProtoOrBuilder;
@@ -32,6 +32,7 @@
public ApplicationIdPBImpl() {
builder = ApplicationIdProto.newBuilder();
+ viaProto = false;
}
public ApplicationIdPBImpl(ApplicationIdProto proto) {
@@ -39,40 +40,39 @@ public ApplicationIdPBImpl(ApplicationIdProto proto) {
viaProto = true;
}
- public synchronized ApplicationIdProto getProto() {
+ public ApplicationIdProto getProto() {
proto = viaProto ? proto : builder.build();
viaProto = true;
return proto;
}
- private synchronized void maybeInitBuilder() {
- if (viaProto || builder == null) {
- builder = ApplicationIdProto.newBuilder(proto);
- }
- viaProto = false;
- }
-
-
@Override
- public synchronized int getId() {
- ApplicationIdProtoOrBuilder p = viaProto ? proto : builder;
- return (p.getId());
+ public int getId() {
+ return proto.getId();
}
@Override
- public synchronized void setId(int id) {
- maybeInitBuilder();
+ protected void setId(int id) {
+ if (viaProto) {
+ throw new YarnException("FIXME to throw a better exception - cannot be set if the proto is already being used");
+ }
builder.setId((id));
}
@Override
- public synchronized long getClusterTimestamp() {
- ApplicationIdProtoOrBuilder p = viaProto ? proto : builder;
- return (p.getClusterTimestamp());
+ public long getClusterTimestamp() {
+ return proto.getClusterTimestamp();
}
@Override
- public synchronized void setClusterTimestamp(long clusterTimestamp) {
- maybeInitBuilder();
+ protected void setClusterTimestamp(long clusterTimestamp) {
+ if (viaProto) {
+ throw new YarnException("FIXME to throw a better exception - cannot be set if the proto is already being used");
+ }
builder.setClusterTimestamp((clusterTimestamp));
}
+
+ @Override
+ protected void build() {
+ getProto(); // TODO
+ }
}
\ No newline at end of file