This is an automated email from the ASF dual-hosted git repository.
zitadombi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new a10d31c994 HDDS-8502. Recon - getContainers API is not giving expected
response with prevKey. (#4724)
a10d31c994 is described below
commit a10d31c9945d01c8960a73260629cfad7777edb7
Author: Arafat2198 <[email protected]>
AuthorDate: Tue May 23 15:33:16 2023 +0530
HDDS-8502. Recon - getContainers API is not giving expected response with
prevKey. (#4724)
---
.../hadoop/ozone/recon/api/ContainerEndpoint.java | 17 +++++--
.../ozone/recon/api/types/ContainersResponse.java | 21 +++++++--
.../ozone/recon/api/TestContainerEndpoint.java | 55 +++++++++++++++++++---
3 files changed, 79 insertions(+), 14 deletions(-)
diff --git
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java
index 5990435b6c..1d52fe8890 100644
---
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java
+++
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java
@@ -68,7 +68,6 @@ import javax.ws.rs.core.Response;
import java.io.IOException;
import java.time.Instant;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -141,9 +140,12 @@ public class ContainerEndpoint {
// Send back an empty response
return Response.status(Response.Status.NOT_ACCEPTABLE).build();
}
+
long containersCount;
- Collection<ContainerMetadata> containerMetaDataList =
- containerManager.getContainers(ContainerID.valueOf(prevKey), limit)
+ List<ContainerMetadata> containerMetaDataList =
+ // Get the containers starting from the prevKey+1 which will skip the
+ // container having prevKey ID
+ containerManager.getContainers(ContainerID.valueOf(prevKey + 1), limit)
.stream()
.map(container -> {
ContainerMetadata containerMetadata =
@@ -154,8 +156,15 @@ public class ContainerEndpoint {
.collect(Collectors.toList());
containersCount = containerMetaDataList.size();
+
+ // Get the last container ID from the List
+ long lastContainerID = containerMetaDataList.isEmpty() ? prevKey :
+ containerMetaDataList.get(containerMetaDataList.size() - 1)
+ .getContainerID();
+
ContainersResponse containersResponse =
- new ContainersResponse(containersCount, containerMetaDataList);
+ new ContainersResponse(containersCount, containerMetaDataList,
+ lastContainerID);
return Response.ok(containersResponse).build();
}
diff --git
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainersResponse.java
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainersResponse.java
index 48e9077a9d..1f188edc87 100644
---
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainersResponse.java
+++
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainersResponse.java
@@ -32,13 +32,14 @@ public class ContainersResponse {
private ContainersResponseData containersResponseData;
public ContainersResponse() {
- this(0, new ArrayList<>());
+ this(0, new ArrayList<>(), 0);
}
public ContainersResponse(long totalCount,
- Collection<ContainerMetadata> containers) {
+ Collection<ContainerMetadata> containers,
+ long prevKey) {
this.containersResponseData =
- new ContainersResponseData(totalCount, containers);
+ new ContainersResponseData(totalCount, containers, prevKey);
}
public ContainersResponseData getContainersResponseData() {
@@ -60,6 +61,12 @@ public class ContainersResponse {
@JsonProperty("totalCount")
private long totalCount;
+ /**
+ * prevKey will be the last key of the previous page.
+ */
+ @JsonProperty("prevKey")
+ private long prevKey;
+
/**
* An array of containers.
*/
@@ -67,9 +74,11 @@ public class ContainersResponse {
private Collection<ContainerMetadata> containers;
ContainersResponseData(long totalCount,
- Collection<ContainerMetadata> containers) {
+ Collection<ContainerMetadata> containers,
+ long prevKey) {
this.totalCount = totalCount;
this.containers = containers;
+ this.prevKey = prevKey;
}
public long getTotalCount() {
@@ -79,5 +88,9 @@ public class ContainersResponse {
public Collection<ContainerMetadata> getContainers() {
return containers;
}
+
+ public long getPrevKey() {
+ return prevKey;
+ }
}
}
diff --git
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java
index 55badb4d85..9bb6cb1a8a 100644
---
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java
+++
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java
@@ -611,6 +611,41 @@ public class TestContainerEndpoint {
// The results will be limited to 2 containers only
assertEquals(2, containers.size());
assertEquals(2, data.getTotalCount());
+
+ // test if prevKey parameter in containerResponse works as expected for
+ // sequential container Ids
+ response = containerEndpoint.getContainers(5, 0L);
+ responseObject = (ContainersResponse) response.getEntity();
+ data = responseObject.getContainersResponseData();
+ containers = new ArrayList<>(data.getContainers());
+ // The results will be limited to 5 containers only
+ // Get the last container ID from the List
+ long expectedLastContainerID =
+ containers.get(containers.size() - 1).getContainerID();
+ // Get the last container ID from the response
+ long actualLastContainerID = data.getPrevKey();
+ // test if prev-key param works as expected
+ assertEquals(expectedLastContainerID, actualLastContainerID);
+
+ // test if prevKey/lastContainerID object in containerResponse works
+ // as expected for non-sequential container Ids
+ for (int i = 10; i <= 50; i += 10) {
+ final ContainerInfo info = newContainerInfo(i);
+ reconContainerManager.addNewContainer(
+ new ContainerWithPipeline(info, pipeline));
+ }
+
+ response = containerEndpoint.getContainers(10, 0L);
+ responseObject = (ContainersResponse) response.getEntity();
+ data = responseObject.getContainersResponseData();
+ containers = new ArrayList<>(data.getContainers());
+ // The results will be limited to 10 containers only
+ // Get the last container ID from the List
+ expectedLastContainerID =
+ containers.get(containers.size() - 1).getContainerID();
+ // Get the last container ID from the Response
+ actualLastContainerID = data.getPrevKey();
+ assertEquals(expectedLastContainerID, actualLastContainerID);
}
@Test
@@ -629,8 +664,9 @@ public class TestContainerEndpoint {
ContainersResponse.ContainersResponseData data =
responseObject.getContainersResponseData();
- // Ensure that the total count of containers is 4
- assertEquals(4, data.getTotalCount());
+ // Ensure that the total count of containers is 3 as containers having
+ // ID's 1,2, will be skipped and the next 3 containers will be returned
+ assertEquals(3, data.getTotalCount());
List<ContainerMetadata> containers = new ArrayList<>(data.getContainers());
@@ -638,10 +674,17 @@ public class TestContainerEndpoint {
ContainerMetadata containerMetadata = iterator.next();
- // Ensure that the containers list size is 4
- assertEquals(4, containers.size());
- // Ensure that the first container ID is 2
- assertEquals(2L, containerMetadata.getContainerID());
+ // Ensure that the containers list size is 3
+ assertEquals(3, containers.size());
+ // Ensure that the first container ID is 3
+ assertEquals(3L, containerMetadata.getContainerID());
+
+ // test if prevKey/lastContainerID object in containerResponse works as
+ // expected when both limit and prevKey parameters are provided to method
+ long expectedLastContainerID =
+ containers.get(containers.size() - 1).getContainerID();
+ long actualLastContainerID = data.getPrevKey();
+ assertEquals(expectedLastContainerID, actualLastContainerID);
// test for negative cases
response = containerEndpoint.getContainers(-1, 0L);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]