This is an automated email from the ASF dual-hosted git repository.

adoroszlai 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 1ceec5c2bc HDDS-10540. Replace GSON with Jackson in nssummary. (#6400)
1ceec5c2bc is described below

commit 1ceec5c2bc1a88d75727312c106f83d763eea53c
Author: Arafat2198 <[email protected]>
AuthorDate: Sun Mar 24 13:17:23 2024 +0530

    HDDS-10540. Replace GSON with Jackson in nssummary. (#6400)
---
 .../org/apache/hadoop/hdds/server/JsonUtils.java   | 10 ++++++
 .../ozone/recon/TestReconWithOzoneManager.java     | 31 +++++++++++--------
 .../ozone/admin/nssummary/DiskUsageSubCommand.java | 36 ++++++++++------------
 .../admin/nssummary/FileSizeDistSubCommand.java    | 19 ++++++------
 .../ozone/admin/nssummary/NSSummaryCLIUtils.java   |  6 ----
 .../admin/nssummary/QuotaUsageSubCommand.java      | 16 +++++-----
 .../ozone/admin/nssummary/SummarySubCommand.java   | 17 +++++-----
 7 files changed, 72 insertions(+), 63 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/server/JsonUtils.java 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/server/JsonUtils.java
index 538dd522d0..489cf3c41c 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/server/JsonUtils.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/server/JsonUtils.java
@@ -20,9 +20,11 @@ package org.apache.hadoop.hdds.server;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.MappingIterator;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectReader;
@@ -81,6 +83,14 @@ public final class JsonUtils {
     return MAPPER.readTree(content);
   }
 
+  public static List<HashMap<String, Object>> readTreeAsListOfMaps(String json)
+      throws IOException {
+    return MAPPER.readValue(json,
+        new TypeReference<List<HashMap<String, Object>>>() {
+        });
+  }
+
+
   /**
    * Utility to sequentially write a large collection of items to a file.
    */
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManager.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManager.java
index c0e5acc20e..d52b0e99b2 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManager.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManager.java
@@ -38,6 +38,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
+import java.util.HashMap;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.hadoop.hdds.client.BlockID;
@@ -46,6 +47,7 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.HddsTestUtils;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
+import org.apache.hadoop.hdds.server.JsonUtils;
 import org.apache.hadoop.hdds.utils.db.RDBStore;
 import org.apache.hadoop.hdds.utils.db.Table;
 import org.apache.hadoop.hdds.utils.db.TableIterator;
@@ -65,8 +67,6 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.util.EntityUtils;
 
-import com.google.gson.Gson;
-import com.google.gson.internal.LinkedTreeMap;
 import org.apache.ozone.test.GenericTestUtils;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
@@ -381,16 +381,23 @@ public class TestReconWithOzoneManager {
 
   private long getReconTaskAttributeFromJson(String taskStatusResponse,
                                              String taskName,
-                                             String entityAttribute) {
-    ArrayList<LinkedTreeMap> taskStatusList = new Gson()
-        .fromJson(taskStatusResponse, ArrayList.class);
-    Optional<LinkedTreeMap> taskEntity =
-        taskStatusList
-            .stream()
-            .filter(task -> task.get("taskName").equals(taskName))
-            .findFirst();
-    assertTrue(taskEntity.isPresent());
-    return (long) (double) taskEntity.get().get(entityAttribute);
+                                             String entityAttribute)
+      throws IOException {
+    List<HashMap<String, Object>> taskStatusList =
+        JsonUtils.readTreeAsListOfMaps(taskStatusResponse);
+
+    // Stream through the list to find the task entity matching the taskName
+    Optional<HashMap<String, Object>> taskEntity = taskStatusList.stream()
+        .filter(task -> taskName.equals(task.get("taskName")))
+        .findFirst();
+
+    if (taskEntity.isPresent()) {
+      Number number = (Number) taskEntity.get().get(entityAttribute);
+      return number.longValue();
+    } else {
+      throw new IOException(
+          "Task entity for task name " + taskName + " not found");
+    }
   }
 
   /**
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java
index 0585fea000..2f46729d52 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/DiskUsageSubCommand.java
@@ -17,18 +17,16 @@
  */
 package org.apache.hadoop.ozone.admin.nssummary;
 
-import com.google.gson.internal.LinkedTreeMap;
 import org.apache.commons.io.FileUtils;
 import org.apache.hadoop.hdds.cli.HddsVersionProvider;
+import org.apache.hadoop.hdds.server.JsonUtils;
 import org.apache.hadoop.ozone.shell.ListOptions;
 import picocli.CommandLine;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.concurrent.Callable;
-
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX;
-import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.getResponseMap;
 import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.makeHttpCall;
 import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.parseInputPath;
 import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.printEmptyPathRequest;
@@ -101,21 +99,20 @@ public class DiskUsageSubCommand implements Callable {
       return null;
     }
 
-    HashMap<String, Object> duResponse = getResponseMap(response);
+    JsonNode duResponse = JsonUtils.readTree(response);
 
-    if (duResponse.get("status").equals("PATH_NOT_FOUND")) {
+    if (duResponse.get("status").asText().equals("PATH_NOT_FOUND")) {
       printPathNotFound();
     } else {
       if (parent.isNotValidBucketOrOBSBucket(path)) {
         printBucketReminder();
       }
 
-      long totalSize = (long)(double)duResponse.get("size");
-
+      long totalSize = duResponse.get("size").asLong();
       if (!noHeader) {
         printWithUnderline("Path", false);
         printKVSeparator();
-        System.out.println(duResponse.get("path"));
+        System.out.println(duResponse.get("path").asText());
 
         printWithUnderline("Total Size", false);
         printKVSeparator();
@@ -124,11 +121,11 @@ public class DiskUsageSubCommand implements Callable {
         if (withReplica) {
           printWithUnderline("Total Disk Usage", false);
           printKVSeparator();
-          long du = (long)(double)duResponse.get("sizeWithReplica");
+          long du = duResponse.get("sizeWithReplica").asLong();
           System.out.println(FileUtils.byteCountToDisplaySize(du));
         }
 
-        long sizeDirectKey = (long)(double)duResponse.get("sizeDirectKey");
+        long sizeDirectKey = duResponse.get("sizeDirectKey").asLong();
         if (!listFiles && sizeDirectKey != -1) {
           printWithUnderline("Size of Direct Keys", false);
           printKVSeparator();
@@ -137,7 +134,7 @@ public class DiskUsageSubCommand implements Callable {
         printNewLines(1);
       }
 
-      if ((double)duResponse.get("subPathCount") == 0) {
+      if (duResponse.get("subPathCount").asInt() == 0) {
         if (totalSize == 0) {
           // the object is empty
           System.out.println("The object is empty.\n" +
@@ -160,20 +157,19 @@ public class DiskUsageSubCommand implements Callable {
           seekStr = "";
         }
 
-        ArrayList duData = (ArrayList)duResponse.get("subPaths");
+        ArrayNode subPaths = (ArrayNode) duResponse.get("subPaths");
         int cnt = 0;
-        for (int i = 0; i < duData.size(); ++i) {
+        for (JsonNode subPathDU : subPaths) {
           if (cnt >= limit) {
             break;
           }
-          LinkedTreeMap subPathDU = (LinkedTreeMap) duData.get(i);
-          String subPath = subPathDU.get("path").toString();
+          String subPath = subPathDU.get("path").asText();
           // differentiate key from other types
-          if (!(boolean)subPathDU.get("isKey")) {
+          if (!subPathDU.get("isKey").asBoolean()) {
             subPath += OM_KEY_PREFIX;
           }
-          long size = (long)(double)subPathDU.get("size");
-          long sizeWithReplica = 
(long)(double)subPathDU.get("sizeWithReplica");
+          long size = subPathDU.get("size").asLong();
+          long sizeWithReplica = subPathDU.get("sizeWithReplica").asLong();
           if (subPath.startsWith(seekStr)) {
             printDURow(subPath, size, sizeWithReplica);
             ++cnt;
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/FileSizeDistSubCommand.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/FileSizeDistSubCommand.java
index f74ee10950..0af263dbe3 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/FileSizeDistSubCommand.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/FileSizeDistSubCommand.java
@@ -17,15 +17,14 @@
  */
 package org.apache.hadoop.ozone.admin.nssummary;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.commons.io.FileUtils;
 import org.apache.hadoop.hdds.cli.HddsVersionProvider;
+import org.apache.hadoop.hdds.server.JsonUtils;
 import picocli.CommandLine;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.concurrent.Callable;
 
-import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.getResponseMap;
 import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.makeHttpCall;
 import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.printEmptyPathRequest;
 import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.printBucketReminder;
@@ -73,11 +72,11 @@ public class FileSizeDistSubCommand implements Callable {
       printNewLines(1);
       return null;
     }
-    HashMap<String, Object> distResponse = getResponseMap(response);
+    JsonNode distResponse = JsonUtils.readTree(response);
 
-    if (distResponse.get("status").equals("PATH_NOT_FOUND")) {
+    if ("PATH_NOT_FOUND".equals(distResponse.path("status").asText())) {
       printPathNotFound();
-    } else if (distResponse.get("status").equals("TYPE_NOT_APPLICABLE")) {
+    } else if 
("TYPE_NOT_APPLICABLE".equals(distResponse.path("status").asText())) {
       printTypeNA("File Size Distribution");
     } else {
       if (parent.isNotValidBucketOrOBSBucket(path)) {
@@ -85,11 +84,11 @@ public class FileSizeDistSubCommand implements Callable {
       }
 
       printWithUnderline("File Size Distribution", true);
-      ArrayList fileSizeDist = (ArrayList) distResponse.get("dist");
+      JsonNode fileSizeDist = distResponse.path("dist");
       double sum = 0;
 
       for (int i = 0; i < fileSizeDist.size(); ++i) {
-        sum += (double) fileSizeDist.get(i);
+        sum += fileSizeDist.get(i).asDouble();
       }
       if (sum == 0) {
         printSpaces(2);
@@ -100,11 +99,11 @@ public class FileSizeDistSubCommand implements Callable {
       }
 
       for (int i = 0; i < fileSizeDist.size(); ++i) {
-        if ((double)fileSizeDist.get(i) == 0) {
+        if (fileSizeDist.get(i).asDouble() == 0) {
           continue;
         }
         String label = convertBinIndexToReadableRange(i);
-        printDistRow(label, (double) fileSizeDist.get(i), sum);
+        printDistRow(label, fileSizeDist.get(i).asDouble(), sum);
       }
     }
     printNewLines(1);
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/NSSummaryCLIUtils.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/NSSummaryCLIUtils.java
index 729aa20c5c..9aff2e9999 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/NSSummaryCLIUtils.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/NSSummaryCLIUtils.java
@@ -18,7 +18,6 @@
 
 package org.apache.hadoop.ozone.admin.nssummary;
 
-import com.google.gson.Gson;
 import org.apache.commons.io.IOUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hdds.conf.ConfigurationSource;
@@ -31,7 +30,6 @@ import java.net.ConnectException;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
 
 import static java.net.HttpURLConnection.HTTP_CREATED;
 import static java.net.HttpURLConnection.HTTP_OK;
@@ -107,10 +105,6 @@ public final class NSSummaryCLIUtils {
     }
   }
 
-  public static HashMap<String, Object> getResponseMap(String response) {
-    return new Gson().fromJson(response, HashMap.class);
-  }
-
   public static void printNewLines(int cnt) {
     for (int i = 0; i < cnt; ++i) {
       System.out.println();
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/QuotaUsageSubCommand.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/QuotaUsageSubCommand.java
index 113193c929..1e4e719baf 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/QuotaUsageSubCommand.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/QuotaUsageSubCommand.java
@@ -17,14 +17,14 @@
  */
 package org.apache.hadoop.ozone.admin.nssummary;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.commons.io.FileUtils;
 import org.apache.hadoop.hdds.cli.HddsVersionProvider;
+import org.apache.hadoop.hdds.server.JsonUtils;
 import picocli.CommandLine;
 
-import java.util.HashMap;
 import java.util.concurrent.Callable;
 
-import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.getResponseMap;
 import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.makeHttpCall;
 import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.printEmptyPathRequest;
 import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.printBucketReminder;
@@ -73,11 +73,11 @@ public class QuotaUsageSubCommand implements Callable {
       return null;
     }
 
-    HashMap<String, Object> quotaResponse = getResponseMap(response);
+    JsonNode quotaResponse = JsonUtils.readTree(response);
 
-    if (quotaResponse.get("status").equals("PATH_NOT_FOUND")) {
+    if ("PATH_NOT_FOUND".equals(quotaResponse.path("status").asText())) {
       printPathNotFound();
-    } else if (quotaResponse.get("status").equals("TYPE_NOT_APPLICABLE")) {
+    } else if 
("TYPE_NOT_APPLICABLE".equals(quotaResponse.path("status").asText())) {
       printTypeNA("Quota");
     } else {
       if (parent.isNotValidBucketOrOBSBucket(path)) {
@@ -85,8 +85,10 @@ public class QuotaUsageSubCommand implements Callable {
       }
 
       printWithUnderline("Quota", true);
-      long quotaAllowed = (long)(double)quotaResponse.get("allowed");
-      long quotaUsed = (long)(double)quotaResponse.get("used");
+
+      long quotaAllowed = quotaResponse.get("allowed").asLong();
+      long quotaUsed = quotaResponse.get("used").asLong();
+
       printSpaces(2);
       System.out.print("Allowed");
       printKVSeparator();
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/SummarySubCommand.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/SummarySubCommand.java
index 9180274b9c..11cc1e926c 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/SummarySubCommand.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/nssummary/SummarySubCommand.java
@@ -17,13 +17,13 @@
  */
 package org.apache.hadoop.ozone.admin.nssummary;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.hadoop.hdds.cli.HddsVersionProvider;
+import org.apache.hadoop.hdds.server.JsonUtils;
 import picocli.CommandLine;
 
-import java.util.HashMap;
 import java.util.concurrent.Callable;
 
-import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.getResponseMap;
 import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.makeHttpCall;
 import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.parseInputPath;
 import static 
org.apache.hadoop.ozone.admin.nssummary.NSSummaryCLIUtils.printEmptyPathRequest;
@@ -71,9 +71,9 @@ public class SummarySubCommand implements Callable<Void> {
       printNewLines(1);
       return null;
     }
-    HashMap<String, Object> summaryResponse = getResponseMap(response);
+    JsonNode summaryResponse = JsonUtils.readTree(response);
 
-    if (summaryResponse.get("status").equals("PATH_NOT_FOUND")) {
+    if ("PATH_NOT_FOUND".equals(summaryResponse.path("status").asText())) {
       printPathNotFound();
     } else {
       if (parent.isNotValidBucketOrOBSBucket(path)) {
@@ -83,10 +83,11 @@ public class SummarySubCommand implements Callable<Void> {
       printWithUnderline("Entity Type", false);
       printKVSeparator();
       System.out.println(summaryResponse.get("type"));
-      int numVol = ((Double) summaryResponse.get("numVolume")).intValue();
-      int numBucket = ((Double) summaryResponse.get("numBucket")).intValue();
-      int numDir = ((Double) summaryResponse.get("numDir")).intValue();
-      int numKey = ((Double) summaryResponse.get("numKey")).intValue();
+
+      int numVol = summaryResponse.get("numVolume").asInt();
+      int numBucket = summaryResponse.get("numBucket").asInt();
+      int numDir = summaryResponse.get("numDir").asInt();
+      int numKey = summaryResponse.get("numKey").asInt();
 
       if (numVol != -1) {
         printWithUnderline("Volumes", false);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to