diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TrafficControlBandwidthHandlerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TrafficControlBandwidthHandlerImpl.java index 5c4ad85..023d173 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TrafficControlBandwidthHandlerImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TrafficControlBandwidthHandlerImpl.java @@ -118,7 +118,7 @@ public class TrafficControlBandwidthHandlerImpl .append(containerBandwidthMbit); LOG.info(logLine); - trafficController.bootstrap(device, rootBandwidthMbit, yarnBandwidthMbit, containerBandwidthMbit); + trafficController.bootstrap(device, rootBandwidthMbit, yarnBandwidthMbit, containerBandwidthMbit, strictMode); return null; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TrafficController.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TrafficController.java index 81da932..3d9cfd9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TrafficController.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TrafficController.java @@ -122,7 +122,7 @@ import java.util.regex.Pattern; * Bootstrap tc configuration */ public void bootstrap(String device, int rootBandwidthMbit, int - yarnBandwidthMbit, int containerBandwidthMbit) + yarnBandwidthMbit, int containerBandwidthMbit, boolean strictMode) throws ResourceHandlerException { if (device == null) { throw new ResourceHandlerException("device cannot be null!"); @@ -163,6 +163,9 @@ import java.util.regex.Pattern; //We already have the list of existing container classes, if any //that were created after bootstrapping reacquireContainerClasses(state); + wipeState(); + initializeState(); + recoverAcquireContainerClasses(containerBandwidthMbit, strictMode); return; } else { LOG.info("TC configuration is incomplete. Wiping tc state before proceeding"); @@ -197,6 +200,30 @@ import java.util.regex.Pattern; } } + private void recoverAcquireContainerClasses(int containerBandwidthMbit, boolean strictMode) throws ResourceHandlerException { + LOG.info("Recovering acquired container's tc state."); + + BatchBuilder builder = new BatchBuilder(PrivilegedOperation. + OperationType.TC_MODIFY_STATE); + + for (int i = this.classIdSet.nextSetBit(0); i >= 0; i = this.classIdSet.nextSetBit(i+1)) { + int classId = i + MIN_CONTAINER_CLASS_ID; + builder.addContainerClass(classId, containerBandwidthMbit, strictMode); + LOG.info("Recovered container classid: " + classId); + } + + PrivilegedOperation op = builder.commitBatchToTempFile(); + + try { + privilegedOperationExecutor.executePrivilegedOperation(op, false); + } catch (PrivilegedOperationException e) { + LOG.warn("Failed to bootstrap outbound bandwidth configuration"); + + throw new ResourceHandlerException( + "Failed to bootstrap outbound bandwidth configuration", e); + } + } + /** * Function to check if the interface in use has already been fully * bootstrapped with the required tc configuration diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestTrafficControlBandwidthHandlerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestTrafficControlBandwidthHandlerImpl.java index 9d5c64d..7f37bbd 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestTrafficControlBandwidthHandlerImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestTrafficControlBandwidthHandlerImpl.java @@ -105,7 +105,7 @@ public class TestTrafficControlBandwidthHandlerImpl { verifyNoMoreInteractions(cGroupsHandlerMock); verify(trafficControllerMock).bootstrap(eq(device), eq(ROOT_BANDWIDTH_MBIT), - eq(YARN_BANDWIDTH_MBIT), eq(CONTAINER_BANDWIDTH_MBIT)); + eq(YARN_BANDWIDTH_MBIT), eq(CONTAINER_BANDWIDTH_MBIT), eq(false)); verifyNoMoreInteractions(trafficControllerMock); } catch (ResourceHandlerException e) { LOG.error("Unexpected exception: " + e); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestTrafficController.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestTrafficController.java index 277dff5..c3126e6 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestTrafficController.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestTrafficController.java @@ -140,7 +140,7 @@ public class TestTrafficController { try { trafficController - .bootstrap(DEVICE, ROOT_BANDWIDTH_MBIT, YARN_BANDWIDTH_MBIT, CONTAINER_BANDWIDTH_MBIT); + .bootstrap(DEVICE, ROOT_BANDWIDTH_MBIT, YARN_BANDWIDTH_MBIT, CONTAINER_BANDWIDTH_MBIT, false); ArgumentCaptor opCaptor = ArgumentCaptor.forClass (PrivilegedOperation.class); @@ -183,7 +183,7 @@ public class TestTrafficController { .thenReturn(DEFAULT_TC_STATE_EXAMPLE); trafficController - .bootstrap(DEVICE, ROOT_BANDWIDTH_MBIT, YARN_BANDWIDTH_MBIT, CONTAINER_BANDWIDTH_MBIT); + .bootstrap(DEVICE, ROOT_BANDWIDTH_MBIT, YARN_BANDWIDTH_MBIT, CONTAINER_BANDWIDTH_MBIT, false); ArgumentCaptor readOpCaptor = ArgumentCaptor.forClass (PrivilegedOperation.class); @@ -229,7 +229,7 @@ public class TestTrafficController { privilegedOperationExecutorMock); try { trafficController - .bootstrap(DEVICE, ROOT_BANDWIDTH_MBIT, YARN_BANDWIDTH_MBIT, CONTAINER_BANDWIDTH_MBIT); + .bootstrap(DEVICE, ROOT_BANDWIDTH_MBIT, YARN_BANDWIDTH_MBIT, CONTAINER_BANDWIDTH_MBIT, false); try { //Invalid op type for TC batch builder @@ -271,7 +271,7 @@ public class TestTrafficController { privilegedOperationExecutorMock); try { trafficController - .bootstrap(DEVICE, ROOT_BANDWIDTH_MBIT, YARN_BANDWIDTH_MBIT, CONTAINER_BANDWIDTH_MBIT); + .bootstrap(DEVICE, ROOT_BANDWIDTH_MBIT, YARN_BANDWIDTH_MBIT, CONTAINER_BANDWIDTH_MBIT, false); int classId = trafficController.getNextClassId();