diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerId.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerId.java index c9b9618..864e2e2 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerId.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerId.java @@ -228,6 +228,11 @@ public static ContainerId fromString(String containerIdStr) { } long id = Long.parseLong(it.next()); long cid = (epoch << 40) | id; + // Account for non-RM (remotely allocated containers) + // Assume half the id space can be used by remotely allocated + // containers + cid = cid > (CONTAINER_ID_BITMASK >> 1) ? + -1 * (CONTAINER_ID_BITMASK - cid + 1): cid; ContainerId containerId = ContainerId.newContainerId(appAttemptID, cid); return containerId; } catch (NumberFormatException n) { @@ -254,4 +259,5 @@ private static ApplicationAttemptId toApplicationAttemptId( } protected abstract void build(); + } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestContainerId.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestContainerId.java index 1643301..b344e06 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestContainerId.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestContainerId.java @@ -74,6 +74,21 @@ public void testContainerId() { c8.toString()); } + @Test + public void testFromString() { + ContainerId containerId = newContainerId(1, 1, 1, 1); + Assert.assertEquals(containerId.toString(), + ContainerId.fromString(containerId.toString()).toString()); + + containerId = newContainerId(1, 1, 1, -1); + Assert.assertEquals(containerId.toString(), + ContainerId.fromString(containerId.toString()).toString()); + + Assert.assertEquals("container_1466200036983_0001_01_1099511627774", + ContainerId.fromString("container_1466200036983_0001_01_1099511627774") + .toString()); + } + public static ContainerId newContainerId(int appId, int appAttemptId, long timestamp, long containerId) { ApplicationId applicationId = ApplicationId.newInstance(timestamp, appId);