From 8d7f60048c76fa19f21d38e422c3866e87e74211 Mon Sep 17 00:00:00 2001 From: slfan1989 Date: Sat, 7 Jan 2023 16:11:33 +0800 Subject: [PATCH 1/5] YARN-11218. [Federation] Add getActivities, getBulkActivities REST APIs for Router. --- .../webapp/dao/BulkActivitiesInfo.java | 10 ++ .../yarn/server/router/RouterMetrics.java | 61 +++++++++++ .../webapp/FederationInterceptorREST.java | 101 +++++++++++++++++- .../dao/FederationBulkActivitiesInfo.java | 49 +++++++++ 4 files changed, 219 insertions(+), 2 deletions(-) create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/dao/FederationBulkActivitiesInfo.java diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/BulkActivitiesInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/BulkActivitiesInfo.java index ad360cc6fc289..462003f94648f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/BulkActivitiesInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/BulkActivitiesInfo.java @@ -34,6 +34,8 @@ public class BulkActivitiesInfo { private ArrayList activities = new ArrayList<>(); + private String subClusterId; + public BulkActivitiesInfo() { // JAXB needs this } @@ -49,4 +51,12 @@ public ArrayList getActivities() { public void addAll(List activitiesInfoList) { activities.addAll(activitiesInfoList); } + + public String getSubClusterId() { + return subClusterId; + } + + public void setSubClusterId(String subClusterId) { + this.subClusterId = subClusterId; + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/RouterMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/RouterMetrics.java index 3268889c95cab..91b10cc216eda 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/RouterMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/RouterMetrics.java @@ -135,6 +135,10 @@ public final class RouterMetrics { private MutableGaugeInt numRenewDelegationTokenFailedRetrieved; @Metric("# of renewDelegationToken failed to be retrieved") private MutableGaugeInt numCancelDelegationTokenFailedRetrieved; + @Metric("# of getActivities failed to be retrieved") + private MutableGaugeInt numGetActivitiesFailedRetrieved; + @Metric("# of getBulkActivities failed to be retrieved") + private MutableGaugeInt numGetBulkActivitiesFailedRetrieved; // Aggregate metrics are shared, and don't have to be looked up per call @Metric("Total number of successful Submitted apps and latency(ms)") @@ -231,6 +235,10 @@ public final class RouterMetrics { private MutableRate totalSucceededRenewDelegationTokenRetrieved; @Metric("Total number of successful Retrieved CancelDelegationToken and latency(ms)") private MutableRate totalSucceededCancelDelegationTokenRetrieved; + @Metric("Total number of successful Retrieved GetActivities and latency(ms)") + private MutableRate totalSucceededGetActivitiesRetrieved; + @Metric("Total number of successful Retrieved GetBulkActivities and latency(ms)") + private MutableRate totalSucceededGetBulkActivitiesRetrieved; /** * Provide quantile counters for all latencies. @@ -282,6 +290,8 @@ public final class RouterMetrics { private MutableQuantiles getDelegationTokenLatency; private MutableQuantiles renewDelegationTokenLatency; private MutableQuantiles cancelDelegationTokenLatency; + private MutableQuantiles getActivitiesLatency; + private MutableQuantiles getBulkActivitiesLatency; private static volatile RouterMetrics instance = null; private static MetricsRegistry registry; @@ -456,6 +466,11 @@ private RouterMetrics() { cancelDelegationTokenLatency = registry.newQuantiles("cancelDelegationTokenLatency", "latency of cancel delegation token timeouts", "ops", "latency", 10); + getActivitiesLatency = registry.newQuantiles("getActivitiesLatency", + "latency of get activities timeouts", "ops", "latency", 10); + + getBulkActivitiesLatency = registry.newQuantiles("getBulkActivitiesLatency", + "latency of get bulk activities timeouts", "ops", "latency", 10); } public static RouterMetrics getMetrics() { @@ -712,6 +727,16 @@ public long getNumSucceededCancelDelegationTokenRetrieved() { return totalSucceededCancelDelegationTokenRetrieved.lastStat().numSamples(); } + @VisibleForTesting + public long getNumSucceededGetActivitiesRetrieved() { + return totalSucceededGetActivitiesRetrieved.lastStat().numSamples(); + } + + @VisibleForTesting + public long getNumSucceededGetBulkActivitiesRetrieved() { + return totalSucceededGetBulkActivitiesRetrieved.lastStat().numSamples(); + } + @VisibleForTesting public double getLatencySucceededAppsCreated() { return totalSucceededAppsCreated.lastStat().mean(); @@ -947,6 +972,16 @@ public double getLatencySucceededCancelDelegationTokenRetrieved() { return totalSucceededCancelDelegationTokenRetrieved.lastStat().mean(); } + @VisibleForTesting + public double getLatencySucceededGetActivitiesRetrieved() { + return totalSucceededGetActivitiesRetrieved.lastStat().mean(); + } + + @VisibleForTesting + public double getLatencySucceededGetBulkActivitiesRetrieved() { + return totalSucceededGetBulkActivitiesRetrieved.lastStat().mean(); + } + @VisibleForTesting public int getAppsFailedCreated() { return numAppsFailedCreated.value(); @@ -1157,6 +1192,14 @@ public int getCancelDelegationTokenFailedRetrieved() { return numCancelDelegationTokenFailedRetrieved.value(); } + public int getActivitiesFailedRetrieved() { + return numGetActivitiesFailedRetrieved.value(); + } + + public int getBulkActivitiesFailedRetrieved(){ + return numGetBulkActivitiesFailedRetrieved.value(); + } + public void succeededAppsCreated(long duration) { totalSucceededAppsCreated.add(duration); getNewApplicationLatency.add(duration); @@ -1392,6 +1435,16 @@ public void succeededCancelDelegationTokenRetrieved(long duration) { cancelDelegationTokenLatency.add(duration); } + public void succeededGetActivitiesLatencyRetrieved(long duration) { + totalSucceededGetActivitiesRetrieved.add(duration); + getActivitiesLatency.add(duration); + } + + public void succeededGetBulkActivitiesRetrieved(long duration) { + totalSucceededGetBulkActivitiesRetrieved.add(duration); + getBulkActivitiesLatency.add(duration); + } + public void incrAppsFailedCreated() { numAppsFailedCreated.incr(); } @@ -1579,4 +1632,12 @@ public void incrRenewDelegationTokenFailedRetrieved() { public void incrCancelDelegationTokenFailedRetrieved() { numCancelDelegationTokenFailedRetrieved.incr(); } + + public void incrGetActivitiesFailedRetrieved() { + numGetActivitiesFailedRetrieved.incr(); + } + + public void incrGetBulkActivitiesFailedRetrieved() { + numGetBulkActivitiesFailedRetrieved.incr(); + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java index f48ead04a53a1..79e6adeea0434 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java @@ -47,6 +47,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.impl.prefetch.Validate; import org.apache.hadoop.io.Text; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.authorize.AuthorizationException; @@ -82,6 +83,7 @@ import org.apache.hadoop.yarn.server.federation.store.records.SubClusterInfo; import org.apache.hadoop.yarn.server.federation.utils.FederationStateStoreFacade; import org.apache.hadoop.yarn.server.resourcemanager.webapp.NodeIDsInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWSConsts; import org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWebAppUtil; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ActivitiesInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppActivitiesInfo; @@ -121,6 +123,7 @@ import org.apache.hadoop.yarn.server.router.clientrm.RouterClientRMService; import org.apache.hadoop.yarn.server.router.security.RouterDelegationTokenSecretManager; import org.apache.hadoop.yarn.server.router.webapp.cache.RouterAppInfoCacheKey; +import org.apache.hadoop.yarn.server.router.webapp.dao.FederationBulkActivitiesInfo; import org.apache.hadoop.yarn.server.router.webapp.dao.FederationRMQueueAclInfo; import org.apache.hadoop.yarn.server.utils.BuilderUtils; import org.apache.hadoop.yarn.server.webapp.dao.AppAttemptInfo; @@ -1151,16 +1154,110 @@ public String dumpSchedulerLogs(String time, HttpServletRequest hsr) throw new NotImplementedException("Code is not implemented"); } + /** + * This method retrieve all the activities in a specific node, and it is + * reachable by using {@link RMWSConsts#SCHEDULER_ACTIVITIES}. + * + * @param hsr the servlet request + * @param nodeId the node we want to retrieve the activities. It is a + * QueryParam. + * @param groupBy the groupBy type by which the activities should be + * aggregated. It is a QueryParam. + * @return all the activities in the specific node + */ @Override public ActivitiesInfo getActivities(HttpServletRequest hsr, String nodeId, String groupBy) { - throw new NotImplementedException("Code is not implemented"); + try { + // Check the parameters to ensure that the parameters are not empty + Validate.checkNotNullAndNotEmpty(nodeId, "nodeId"); + Validate.checkNotNullAndNotEmpty(groupBy, "groupBy"); + + // Query SubClusterInfo according to id, + // if the nodeId cannot get SubClusterInfo, an exception will be thrown directly. + SubClusterInfo subClusterInfo = getNodeSubcluster(nodeId); + + // Call the corresponding subCluster to get ActivitiesInfo. + long startTime = clock.getTime(); + DefaultRequestInterceptorREST interceptor = getOrCreateInterceptorForSubCluster( + subClusterInfo.getSubClusterId(), subClusterInfo.getRMWebServiceAddress()); + final HttpServletRequest hsrCopy = clone(hsr); + ActivitiesInfo activitiesInfo = interceptor.getActivities(hsrCopy, nodeId, groupBy); + if (activitiesInfo != null) { + long stopTime = clock.getTime(); + routerMetrics.succeededGetActivitiesLatencyRetrieved(stopTime - startTime); + return activitiesInfo; + } + } catch (IllegalArgumentException e) { + routerMetrics.incrGetActivitiesFailedRetrieved(); + throw e; + } catch (NotFoundException e) { + routerMetrics.incrGetActivitiesFailedRetrieved(); + throw e; + } + + routerMetrics.incrGetActivitiesFailedRetrieved(); + throw new RuntimeException("getActivities Failed."); } + /** + * This method retrieve the last n activities inside scheduler, and it is + * reachable by using {@link RMWSConsts#SCHEDULER_BULK_ACTIVITIES}. + * + * @param hsr the servlet request + * @param groupBy the groupBy type by which the activities should be + * aggregated. It is a QueryParam. + * @param activitiesCount number of activities + * @return last n activities + */ @Override public BulkActivitiesInfo getBulkActivities(HttpServletRequest hsr, String groupBy, int activitiesCount) throws InterruptedException { - throw new NotImplementedException("Code is not implemented"); + try { + // Step1. Check the parameters to ensure that the parameters are not empty + Validate.checkNotNullAndNotEmpty(groupBy, "groupBy"); + Validate.checkNotNegative(activitiesCount, "activitiesCount"); + + // Step2. Call the interface of subCluster concurrently and get the returned result. + Map subClustersActive = getActiveSubclusters(); + final HttpServletRequest hsrCopy = clone(hsr); + Class[] argsClasses = new Class[]{HttpServletRequest.class, String.class, Integer.class}; + Object[] args = new Object[]{hsrCopy, groupBy, activitiesCount}; + ClientMethod remoteMethod = new ClientMethod("getBulkActivities", argsClasses, args); + Map appStatisticsMap = invokeConcurrent( + subClustersActive.values(), remoteMethod, BulkActivitiesInfo.class); + + // Step3. Generate Federation objects and set subCluster information. + long startTime = clock.getTime(); + FederationBulkActivitiesInfo fedBulkActivitiesInfo = new FederationBulkActivitiesInfo(); + appStatisticsMap.forEach((subClusterInfo, bulkActivitiesInfo) -> { + SubClusterId subClusterId = subClusterInfo.getSubClusterId(); + bulkActivitiesInfo.setSubClusterId(subClusterId.getId()); + fedBulkActivitiesInfo.getList().add(bulkActivitiesInfo); + }); + long stopTime = clock.getTime(); + routerMetrics.succeededGetBulkActivitiesRetrieved(stopTime - startTime); + return fedBulkActivitiesInfo; + } catch (IllegalArgumentException e) { + routerMetrics.incrGetBulkActivitiesFailedRetrieved(); + throw e; + } catch (NotFoundException e) { + routerMetrics.incrGetBulkActivitiesFailedRetrieved(); + RouterServerUtil.logAndThrowRunTimeException("get all active sub cluster(s) error.", e); + } catch (IOException e) { + routerMetrics.incrGetBulkActivitiesFailedRetrieved(); + RouterServerUtil.logAndThrowRunTimeException(e, + "getBulkActivities by groupBy = %s, activitiesCount = %s with io error.", + groupBy, String.valueOf(activitiesCount)); + } catch (YarnException e) { + routerMetrics.incrGetBulkActivitiesFailedRetrieved(); + RouterServerUtil.logAndThrowRunTimeException(e, + "getBulkActivities by groupBy = %s, activitiesCount = %s with yarn error.", + groupBy, String.valueOf(activitiesCount)); + } + + routerMetrics.incrGetBulkActivitiesFailedRetrieved(); + throw new RuntimeException("getBulkActivities Failed."); } @Override diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/dao/FederationBulkActivitiesInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/dao/FederationBulkActivitiesInfo.java new file mode 100644 index 0000000000000..87d11ad0feb0f --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/dao/FederationBulkActivitiesInfo.java @@ -0,0 +1,49 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.yarn.server.router.webapp.dao; + +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.BulkActivitiesInfo; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.ArrayList; + +@XmlRootElement +@XmlAccessorType(XmlAccessType.FIELD) +public class FederationBulkActivitiesInfo extends BulkActivitiesInfo { + + @XmlElement(name = "subCluster") + private ArrayList list = new ArrayList<>(); + + public FederationBulkActivitiesInfo() { + } // JAXB needs this + + public FederationBulkActivitiesInfo(ArrayList list) { + this.list = list; + } + + public ArrayList getList() { + return list; + } + + public void setList(ArrayList list) { + this.list = list; + } +} From 8249dc628f16f9a230a96efc468976c8216006d1 Mon Sep 17 00:00:00 2001 From: slfan1989 Date: Sat, 7 Jan 2023 17:42:05 +0800 Subject: [PATCH 2/5] YARN-11218. Add Junit Test. --- .../MockDefaultRequestInterceptorREST.java | 27 ++++++++++++ .../webapp/TestFederationInterceptorREST.java | 42 +++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java index e2ac5fbf260cd..8389077601bff 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java @@ -135,6 +135,9 @@ import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationRequestsInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationUpdateResponseInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationDeleteResponseInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ActivitiesInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWSConsts; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeAllocationInfo; import org.apache.hadoop.yarn.server.router.RouterServerUtil; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.PartitionInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.RMQueueAclInfo; @@ -1206,4 +1209,28 @@ public RMQueueAclInfo checkUserAccessToQueue( return new RMQueueAclInfo(true, user.getUserName(), ""); } } + + @Override + public ActivitiesInfo getActivities(HttpServletRequest hsr, String nodeId, String groupBy) { + if (!EnumUtils.isValidEnum(RMWSConsts.ActivitiesGroupBy.class, groupBy.toUpperCase())) { + String errMesasge = "Got invalid groupBy: " + groupBy + ", valid groupBy types: " + + Arrays.asList(RMWSConsts.ActivitiesGroupBy.values()); + throw new IllegalArgumentException(errMesasge); + } + + SubClusterId subClusterId = getSubClusterId(); + ActivitiesInfo activitiesInfo = mock(ActivitiesInfo.class); + Mockito.when(activitiesInfo.getNodeId()).thenReturn(nodeId); + Mockito.when(activitiesInfo.getTimestamp()).thenReturn(1673081972L); + Mockito.when(activitiesInfo.getDiagnostic()).thenReturn("Diagnostic:" + subClusterId.getId()); + + List allocationInfos = new ArrayList<>(); + NodeAllocationInfo nodeAllocationInfo = mock(NodeAllocationInfo.class); + Mockito.when(nodeAllocationInfo.getPartition()).thenReturn("p" + subClusterId.getId()); + Mockito.when(nodeAllocationInfo.getFinalAllocationState()).thenReturn("ALLOCATED"); + + allocationInfos.add(nodeAllocationInfo); + Mockito.when(activitiesInfo.getAllocations()).thenReturn(allocationInfos); + return activitiesInfo; + } } \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java index 910dbeb62ddec..96692047e73d3 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java @@ -33,6 +33,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.security.authorize.AuthorizationException; import org.apache.hadoop.test.LambdaTestUtils; import org.apache.hadoop.conf.Configuration; @@ -108,6 +109,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NewReservation; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationUpdateRequestInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationDeleteRequestInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ActivitiesInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeAllocationInfo; import org.apache.hadoop.yarn.server.webapp.dao.ContainerInfo; import org.apache.hadoop.yarn.server.webapp.dao.ContainersInfo; import org.apache.hadoop.yarn.server.router.webapp.dao.FederationRMQueueAclInfo; @@ -1685,4 +1688,43 @@ public void testCancelDelegationToken() throws Exception { Assert.assertNotNull(cancelResponse); Assert.assertEquals(response.getStatus(), Status.OK.getStatusCode()); } + + @Test + public void testGetActivitiesNormal() { + ActivitiesInfo activitiesInfo = interceptor.getActivities(null, "1", "DIAGNOSTIC"); + Assert.assertNotNull(activitiesInfo); + + String nodeId = activitiesInfo.getNodeId(); + Assert.assertNotNull(nodeId); + Assert.assertEquals("1", nodeId); + + String diagnostic = activitiesInfo.getDiagnostic(); + Assert.assertNotNull(diagnostic); + Assert.assertTrue(StringUtils.contains(diagnostic, "Diagnostic")); + + long timestamp = activitiesInfo.getTimestamp(); + Assert.assertEquals(1673081972L, timestamp); + + List allocationInfos = activitiesInfo.getAllocations(); + Assert.assertNotNull(allocationInfos); + Assert.assertEquals(1, allocationInfos.size()); + } + + @Test + public void testGetActivitiesError() throws Exception { + // nodeId is empty + LambdaTestUtils.intercept(IllegalArgumentException.class, + "'nodeId' must not be empty.", + () -> interceptor.getActivities(null, "", "DIAGNOSTIC")); + + // groupBy is empty + LambdaTestUtils.intercept(IllegalArgumentException.class, + "'groupBy' must not be empty.", + () -> interceptor.getActivities(null, "1", "")); + + // groupBy value is wrong + LambdaTestUtils.intercept(IllegalArgumentException.class, + "Got invalid groupBy: TEST1, valid groupBy types: [DIAGNOSTIC]", + () -> interceptor.getActivities(null, "1", "TEST1")); + } } \ No newline at end of file From 6ae1a9c2dcbae4d3aae191c0925aa273eb49f508 Mon Sep 17 00:00:00 2001 From: slfan1989 Date: Mon, 9 Jan 2023 18:28:09 +0800 Subject: [PATCH 3/5] YARN-11218. Fix CheckStyle. --- .../webapp/FederationInterceptorREST.java | 2 +- .../yarn/server/router/TestRouterMetrics.java | 66 +++++++++++++++++++ .../MockDefaultRequestInterceptorREST.java | 41 +++++++++++- .../webapp/TestFederationInterceptorREST.java | 44 +++++++++++++ 4 files changed, 150 insertions(+), 3 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java index 79e6adeea0434..f0094de9719f8 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java @@ -1221,7 +1221,7 @@ public BulkActivitiesInfo getBulkActivities(HttpServletRequest hsr, // Step2. Call the interface of subCluster concurrently and get the returned result. Map subClustersActive = getActiveSubclusters(); final HttpServletRequest hsrCopy = clone(hsr); - Class[] argsClasses = new Class[]{HttpServletRequest.class, String.class, Integer.class}; + Class[] argsClasses = new Class[]{HttpServletRequest.class, String.class, int.class}; Object[] args = new Object[]{hsrCopy, groupBy, activitiesCount}; ClientMethod remoteMethod = new ClientMethod("getBulkActivities", argsClasses, args); Map appStatisticsMap = invokeConcurrent( diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/TestRouterMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/TestRouterMetrics.java index 9d5aeab5c6d80..c26df63c954d8 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/TestRouterMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/TestRouterMetrics.java @@ -533,6 +533,16 @@ public void getRenewDelegationTokenFailed() { LOG.info("Mocked: failed renewDelegationToken call"); metrics.incrRenewDelegationTokenFailedRetrieved(); } + + public void getActivitiesFailed() { + LOG.info("Mocked: failed getBulkActivitie call"); + metrics.incrGetActivitiesFailedRetrieved(); + } + + public void getBulkActivitiesFailed() { + LOG.info("Mocked: failed getBulkActivitie call"); + metrics.incrGetBulkActivitiesFailedRetrieved(); + } } // Records successes for all calls @@ -763,6 +773,16 @@ public void getRenewDelegationTokenRetrieved(long duration) { LOG.info("Mocked: successful RenewDelegationToken call with duration {}", duration); metrics.succeededRenewDelegationTokenRetrieved(duration); } + + public void getActivitiesRetrieved(long duration) { + LOG.info("Mocked: successful GetActivities call with duration {}", duration); + metrics.succeededGetActivitiesLatencyRetrieved(duration); + } + + public void getBulkActivitiesRetrieved(long duration) { + LOG.info("Mocked: successful GetBulkActivities call with duration {}", duration); + metrics.succeededGetBulkActivitiesRetrieved(duration); + } } @Test @@ -1597,4 +1617,50 @@ public void testRenewDelegationTokenRetrievedFailed() { Assert.assertEquals(totalBadBefore + 1, metrics.getRenewDelegationTokenFailedRetrieved()); } + + @Test + public void testGetActivitiesRetrieved() { + long totalGoodBefore = metrics.getNumSucceededGetActivitiesRetrieved(); + goodSubCluster.getActivitiesRetrieved(150); + Assert.assertEquals(totalGoodBefore + 1, + metrics.getNumSucceededGetActivitiesRetrieved()); + Assert.assertEquals(150, + metrics.getLatencySucceededGetActivitiesRetrieved(), ASSERT_DOUBLE_DELTA); + goodSubCluster.getActivitiesRetrieved(300); + Assert.assertEquals(totalGoodBefore + 2, + metrics.getNumSucceededGetActivitiesRetrieved()); + Assert.assertEquals(225, + metrics.getLatencySucceededGetActivitiesRetrieved(), ASSERT_DOUBLE_DELTA); + } + + @Test + public void testGetActivitiesRetrievedFailed() { + long totalBadBefore = metrics.getActivitiesFailedRetrieved(); + badSubCluster.getActivitiesFailed(); + Assert.assertEquals(totalBadBefore + 1, + metrics.getActivitiesFailedRetrieved()); + } + + @Test + public void testGetBulkActivitiesRetrieved() { + long totalGoodBefore = metrics.getNumSucceededGetBulkActivitiesRetrieved(); + goodSubCluster.getBulkActivitiesRetrieved(150); + Assert.assertEquals(totalGoodBefore + 1, + metrics.getNumSucceededGetBulkActivitiesRetrieved()); + Assert.assertEquals(150, + metrics.getLatencySucceededGetBulkActivitiesRetrieved(), ASSERT_DOUBLE_DELTA); + goodSubCluster.getBulkActivitiesRetrieved(300); + Assert.assertEquals(totalGoodBefore + 2, + metrics.getNumSucceededGetBulkActivitiesRetrieved()); + Assert.assertEquals(225, + metrics.getLatencySucceededGetBulkActivitiesRetrieved(), ASSERT_DOUBLE_DELTA); + } + + @Test + public void testGetBulkActivitiesRetrievedFailed() { + long totalBadBefore = metrics.getBulkActivitiesFailedRetrieved(); + badSubCluster.getBulkActivitiesFailed(); + Assert.assertEquals(totalBadBefore + 1, + metrics.getBulkActivitiesFailedRetrieved()); + } } \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java index 8389077601bff..ab85b92cd3fbf 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java @@ -136,6 +136,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationUpdateResponseInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationDeleteResponseInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ActivitiesInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.BulkActivitiesInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWSConsts; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeAllocationInfo; import org.apache.hadoop.yarn.server.router.RouterServerUtil; @@ -1213,9 +1214,9 @@ public RMQueueAclInfo checkUserAccessToQueue( @Override public ActivitiesInfo getActivities(HttpServletRequest hsr, String nodeId, String groupBy) { if (!EnumUtils.isValidEnum(RMWSConsts.ActivitiesGroupBy.class, groupBy.toUpperCase())) { - String errMesasge = "Got invalid groupBy: " + groupBy + ", valid groupBy types: " + String errMessage = "Got invalid groupBy: " + groupBy + ", valid groupBy types: " + Arrays.asList(RMWSConsts.ActivitiesGroupBy.values()); - throw new IllegalArgumentException(errMesasge); + throw new IllegalArgumentException(errMessage); } SubClusterId subClusterId = getSubClusterId(); @@ -1233,4 +1234,40 @@ public ActivitiesInfo getActivities(HttpServletRequest hsr, String nodeId, Strin Mockito.when(activitiesInfo.getAllocations()).thenReturn(allocationInfos); return activitiesInfo; } + + @Override + public BulkActivitiesInfo getBulkActivities(HttpServletRequest hsr, + String groupBy, int activitiesCount) { + + if (activitiesCount <= 0) { + throw new IllegalArgumentException("activitiesCount needs to be greater than 0."); + } + + if (!EnumUtils.isValidEnum(RMWSConsts.ActivitiesGroupBy.class, groupBy.toUpperCase())) { + String errMessage = "Got invalid groupBy: " + groupBy + ", valid groupBy types: " + + Arrays.asList(RMWSConsts.ActivitiesGroupBy.values()); + throw new IllegalArgumentException(errMessage); + } + + BulkActivitiesInfo bulkActivitiesInfo = new BulkActivitiesInfo(); + + for (int i = 0; i < activitiesCount; i++) { + SubClusterId subClusterId = getSubClusterId(); + ActivitiesInfo activitiesInfo = mock(ActivitiesInfo.class); + Mockito.when(activitiesInfo.getNodeId()).thenReturn(subClusterId + "-nodeId-" + i); + Mockito.when(activitiesInfo.getTimestamp()).thenReturn(1673081972L); + Mockito.when(activitiesInfo.getDiagnostic()).thenReturn("Diagnostic:" + subClusterId.getId()); + + List allocationInfos = new ArrayList<>(); + NodeAllocationInfo nodeAllocationInfo = mock(NodeAllocationInfo.class); + Mockito.when(nodeAllocationInfo.getPartition()).thenReturn("p" + subClusterId.getId()); + Mockito.when(nodeAllocationInfo.getFinalAllocationState()).thenReturn("ALLOCATED"); + + allocationInfos.add(nodeAllocationInfo); + Mockito.when(activitiesInfo.getAllocations()).thenReturn(allocationInfos); + bulkActivitiesInfo.getActivities().add(activitiesInfo); + } + + return bulkActivitiesInfo; + } } \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java index 96692047e73d3..c824a6816b1fe 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java @@ -111,9 +111,11 @@ import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationDeleteRequestInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ActivitiesInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeAllocationInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.BulkActivitiesInfo; import org.apache.hadoop.yarn.server.webapp.dao.ContainerInfo; import org.apache.hadoop.yarn.server.webapp.dao.ContainersInfo; import org.apache.hadoop.yarn.server.router.webapp.dao.FederationRMQueueAclInfo; +import org.apache.hadoop.yarn.server.router.webapp.dao.FederationBulkActivitiesInfo; import org.apache.hadoop.yarn.util.LRUCacheHashMap; import org.apache.hadoop.yarn.util.MonotonicClock; import org.apache.hadoop.yarn.util.Times; @@ -1727,4 +1729,46 @@ public void testGetActivitiesError() throws Exception { "Got invalid groupBy: TEST1, valid groupBy types: [DIAGNOSTIC]", () -> interceptor.getActivities(null, "1", "TEST1")); } + + @Test + public void testGetBulkActivitiesNormal() throws InterruptedException { + BulkActivitiesInfo bulkActivitiesInfo = + interceptor.getBulkActivities(null, "DIAGNOSTIC", 5); + Assert.assertNotNull(bulkActivitiesInfo); + + Assert.assertTrue(bulkActivitiesInfo instanceof FederationBulkActivitiesInfo); + + FederationBulkActivitiesInfo federationBulkActivitiesInfo = + FederationBulkActivitiesInfo.class.cast(bulkActivitiesInfo); + Assert.assertNotNull(federationBulkActivitiesInfo); + + List activitiesInfos = federationBulkActivitiesInfo.getList(); + Assert.assertNotNull(activitiesInfos); + Assert.assertTrue(activitiesInfos.size() == 4); + + for (BulkActivitiesInfo activitiesInfo : activitiesInfos) { + Assert.assertNotNull(activitiesInfo); + List activitiesInfoList = activitiesInfo.getActivities(); + Assert.assertNotNull(activitiesInfoList); + Assert.assertTrue(activitiesInfoList.size() == 5); + } + } + + @Test + public void testGetBulkActivitiesError() throws Exception { + // activitiesCount < 0 + LambdaTestUtils.intercept(IllegalArgumentException.class, + "'activitiesCount' must not be negative.", + () -> interceptor.getBulkActivities(null, "DIAGNOSTIC", -1)); + + // groupBy value is wrong + LambdaTestUtils.intercept(YarnRuntimeException.class, + "Got invalid groupBy: TEST1, valid groupBy types: [DIAGNOSTIC]", + () -> interceptor.getBulkActivities(null, "TEST1", 1)); + + // groupBy is empty + LambdaTestUtils.intercept(IllegalArgumentException.class, + "'groupBy' must not be empty.", + () -> interceptor.getBulkActivities(null, "", 1)); + } } \ No newline at end of file From aa230d2fc3ebd0118f41704551fc6b0e7fecfecf Mon Sep 17 00:00:00 2001 From: slfan1989 Date: Sat, 14 Jan 2023 12:59:25 +0800 Subject: [PATCH 4/5] YARN-11218. Fix CheckStyle. --- .../hadoop/yarn/server/router/RouterMetrics.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/RouterMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/RouterMetrics.java index 8777e3549635b..ef3169bc15916 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/RouterMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/RouterMetrics.java @@ -481,7 +481,7 @@ private RouterMetrics() { getBulkActivitiesLatency = registry.newQuantiles("getBulkActivitiesLatency", "latency of get bulk activities timeouts", "ops", "latency", 10); - + refreshSuperUserGroupsConfLatency = registry.newQuantiles("refreshSuperUserGroupsConfLatency", "latency of refresh superuser groups configuration timeouts", "ops", "latency", 10); @@ -750,9 +750,9 @@ public long getNumSucceededGetActivitiesRetrieved() { @VisibleForTesting public long getNumSucceededGetBulkActivitiesRetrieved() { - return totalSucceededGetBulkActivitiesRetrieved.lastStat().numSamples(); - } - + return totalSucceededGetBulkActivitiesRetrieved.lastStat().numSamples(); + } + public long getNumSucceededRefreshSuperUserGroupsConfigurationRetrieved() { return totalSucceededRefreshSuperUserGroupsConfigurationRetrieved.lastStat().numSamples(); } @@ -1001,7 +1001,7 @@ public double getLatencySucceededGetActivitiesRetrieved() { public double getLatencySucceededGetBulkActivitiesRetrieved() { return totalSucceededGetBulkActivitiesRetrieved.lastStat().mean(); } - + public double getLatencySucceededRefreshSuperUserGroupsConfigurationRetrieved() { return totalSucceededRefreshSuperUserGroupsConfigurationRetrieved.lastStat().mean(); } @@ -1476,7 +1476,7 @@ public void succeededGetBulkActivitiesRetrieved(long duration) { totalSucceededGetBulkActivitiesRetrieved.add(duration); getBulkActivitiesLatency.add(duration); } - + public void succeededRefreshSuperUserGroupsConfRetrieved(long duration) { totalSucceededRefreshSuperUserGroupsConfigurationRetrieved.add(duration); refreshSuperUserGroupsConfLatency.add(duration); From fca0c20976db827c4ec5ff617d5eca4abd3c694d Mon Sep 17 00:00:00 2001 From: slfan1989 Date: Wed, 18 Jan 2023 17:55:47 +0800 Subject: [PATCH 5/5] YARN-11218. Fix CheckStyle. --- .../hadoop/yarn/server/router/RouterMetrics.java | 10 +++++----- .../webapp/MockDefaultRequestInterceptorREST.java | 2 +- .../router/webapp/TestFederationInterceptorREST.java | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/RouterMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/RouterMetrics.java index cf5bc2172757f..033aa076658c5 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/RouterMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/RouterMetrics.java @@ -1252,7 +1252,7 @@ public int getActivitiesFailedRetrieved() { public int getBulkActivitiesFailedRetrieved(){ return numGetBulkActivitiesFailedRetrieved.value(); } - + public int getSchedulerInfoFailedRetrieved() { return numGetSchedulerInfoFailedRetrieved.value(); } @@ -1491,7 +1491,7 @@ public void succeededCancelDelegationTokenRetrieved(long duration) { totalSucceededCancelDelegationTokenRetrieved.add(duration); cancelDelegationTokenLatency.add(duration); } - + public void succeededGetActivitiesLatencyRetrieved(long duration) { totalSucceededGetActivitiesRetrieved.add(duration); getActivitiesLatency.add(duration); @@ -1501,7 +1501,7 @@ public void succeededGetBulkActivitiesRetrieved(long duration) { totalSucceededGetBulkActivitiesRetrieved.add(duration); getBulkActivitiesLatency.add(duration); } - + public void succeededGetSchedulerInfoRetrieved(long duration) { totalSucceededGetSchedulerInfoRetrieved.add(duration); getSchedulerInfoRetrievedLatency.add(duration); @@ -1712,7 +1712,7 @@ public void incrRenewDelegationTokenFailedRetrieved() { public void incrCancelDelegationTokenFailedRetrieved() { numCancelDelegationTokenFailedRetrieved.incr(); } - + public void incrGetActivitiesFailedRetrieved() { numGetActivitiesFailedRetrieved.incr(); } @@ -1720,7 +1720,7 @@ public void incrGetActivitiesFailedRetrieved() { public void incrGetBulkActivitiesFailedRetrieved() { numGetBulkActivitiesFailedRetrieved.incr(); } - + public void incrGetSchedulerInfoFailedRetrieved() { numGetSchedulerInfoFailedRetrieved.incr(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java index 3cc39828ab8ae..2e118d172c125 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java @@ -1275,7 +1275,7 @@ public BulkActivitiesInfo getBulkActivities(HttpServletRequest hsr, return bulkActivitiesInfo; } - + public SchedulerTypeInfo getSchedulerInfo() { try { ResourceManager resourceManager = CapacitySchedulerTestUtilities.createResourceManager(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java index f8996b324d701..fcc6a0ed78e6a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java @@ -1810,13 +1810,13 @@ public void testGetBulkActivitiesNormal() throws InterruptedException { List activitiesInfos = federationBulkActivitiesInfo.getList(); Assert.assertNotNull(activitiesInfos); - Assert.assertTrue(activitiesInfos.size() == 4); + Assert.assertEquals(4, activitiesInfos.size()); for (BulkActivitiesInfo activitiesInfo : activitiesInfos) { Assert.assertNotNull(activitiesInfo); List activitiesInfoList = activitiesInfo.getActivities(); Assert.assertNotNull(activitiesInfoList); - Assert.assertTrue(activitiesInfoList.size() == 5); + Assert.assertEquals(5, activitiesInfoList.size()); } }