>From Michael Blow <[email protected]>:

Michael Blow has submitted this change. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20251 )

Change subject: [NO ISSUE][HYR] Update Jackson to 2.19.2 to address CVEs
......................................................................

[NO ISSUE][HYR] Update Jackson to 2.19.2 to address CVEs

- user model changes: yes
- storage format changes: no
- interface changes: no

Adds new common properties to allow users to customize limits intro'd
in Jackson 2.15:

• JSON_MAX_DEPTH - The maximum nesting depth for JSON objects. The depth
  is a count of objects and arrays that have not been closed, { and [
  respectively (default: 1000)

• JSON_MAX_DOC_LENGTH - The maximum length of a JSON document in bytes
  (<=0 is no limit) (default: -1)

• JSON_MAX_TOKEN_COUNT - The maximum number of JSON tokens in a JSON
  object (<=0 is no limit). A token is a single unit of input, such as a
  number, a string, an object start or end, or an array start or end
  (default: -1)

• JSON_MAX_NUMBER_LENGTH - The maximum length of a JSON number in bytes
  (default: 1000)

• JSON_MAX_STRING_LENGTH - The maximum length of a JSON string in bytes
  (default: Integer.MAX_VALUE (2147483647))

• JSON_MAX_NAME_LENGTH - The maximum length of a JSON name in bytes
  (default: 50000)

- update Azure libraries, since they also include Jackson
- update Netty libraries, for CVEs

Ext-ref: MB-68123
Change-Id: Ic0b744711dd5097fbc3bff581f49e6fce857a409
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20251
Reviewed-by: Ali Alsuliman <[email protected]>
Reviewed-by: Michael Blow <[email protected]>
Tested-by: Michael Blow <[email protected]>
---
M 
hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java
M asterixdb/pom.xml
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IPropertiesFactory.java
M 
asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.java
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesFactory.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/CCDriver.java
M hyracks-fullstack/pom.xml
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
A 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/JacksonProperties.java
M 
hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/StorageUnitTest.java
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java
12 files changed, 378 insertions(+), 36 deletions(-)

Approvals:
  Michael Blow: Looks good to me, but someone else must approve; Verified
  Ali Alsuliman: Looks good to me, approved




diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.java
index b1b0d1d..843bce8 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/config/ConfigUsageTest.java
@@ -197,7 +197,7 @@
         return maxWidth;
     }

-    private String extractValue(Column column, IOption option) {
+    protected String extractValue(Column column, IOption option) {
         switch (column) {
             case SECTION:
                 return getSectionDisplayFunction().apply(option.section());
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IPropertiesFactory.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IPropertiesFactory.java
index 7857f18..0520fe6 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IPropertiesFactory.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IPropertiesFactory.java
@@ -22,6 +22,7 @@
 import org.apache.asterix.common.config.BuildProperties;
 import org.apache.asterix.common.config.CompilerProperties;
 import org.apache.asterix.common.config.ExternalProperties;
+import org.apache.asterix.common.config.JacksonProperties;
 import org.apache.asterix.common.config.MessagingProperties;
 import org.apache.asterix.common.config.MetadataProperties;
 import org.apache.asterix.common.config.NodeProperties;
@@ -100,4 +101,6 @@
      * @return new node properties
      */
     NodeProperties newNodeProperties();
+
+    JacksonProperties newJacksonProperties();
 }
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
index d192b49..fab1d1a 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
@@ -37,7 +37,7 @@
         configManager.register(NodeProperties.Option.class, 
CompilerProperties.Option.class,
                 MetadataProperties.Option.class, 
ExternalProperties.Option.class, ActiveProperties.Option.class,
                 MessagingProperties.Option.class, 
ReplicationProperties.Option.class, StorageProperties.Option.class,
-                TransactionProperties.Option.class);
+                TransactionProperties.Option.class, 
JacksonProperties.Option.class);

         // we need to process the old-style asterix config before we apply 
defaults!
         
configManager.addConfigurator(IConfigManager.ConfiguratorMetric.APPLY_DEFAULTS.metric()
 - 1, () -> {
@@ -47,5 +47,13 @@
                 throw HyracksDataException.create(e);
             }
         });
+        
configManager.addConfigurator(IConfigManager.ConfiguratorMetric.APPLY_DEFAULTS.metric()
 + 1, () -> {
+            try {
+                PropertiesAccessor accessor = 
PropertiesAccessor.getInstance(configManager.getAppConfig());
+                JacksonProperties.configureJackson(accessor);
+            } catch (AsterixException e) {
+                throw HyracksDataException.create(e);
+            }
+        });
     }
 }
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/JacksonProperties.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/JacksonProperties.java
new file mode 100644
index 0000000..ced27f7
--- /dev/null
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/JacksonProperties.java
@@ -0,0 +1,138 @@
+/*
+ * 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.asterix.common.config;
+
+import static org.apache.hyracks.control.common.config.OptionTypes.LONG;
+import static 
org.apache.hyracks.control.common.config.OptionTypes.LONG_BYTE_UNIT;
+import static 
org.apache.hyracks.control.common.config.OptionTypes.POSITIVE_INTEGER;
+import static 
org.apache.hyracks.control.common.config.OptionTypes.POSITIVE_INTEGER_BYTE_UNIT;
+
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.hyracks.api.config.IOption;
+import org.apache.hyracks.api.config.IOptionType;
+import org.apache.hyracks.api.config.Section;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.fasterxml.jackson.core.StreamReadConstraints;
+import com.fasterxml.jackson.core.StreamWriteConstraints;
+
+public class JacksonProperties extends AbstractProperties {
+
+    public enum Option implements IOption {
+        JSON_MAX_DEPTH(POSITIVE_INTEGER, 
StreamReadConstraints.DEFAULT_MAX_DEPTH),
+        JSON_MAX_DOC_LENGTH(LONG_BYTE_UNIT, 
StreamReadConstraints.DEFAULT_MAX_DOC_LEN),
+        JSON_MAX_TOKEN_COUNT(LONG, 
StreamReadConstraints.DEFAULT_MAX_TOKEN_COUNT),
+        JSON_MAX_NUMBER_LENGTH(POSITIVE_INTEGER_BYTE_UNIT, 
StreamReadConstraints.DEFAULT_MAX_NUM_LEN),
+        JSON_MAX_STRING_LENGTH(POSITIVE_INTEGER_BYTE_UNIT, Integer.MAX_VALUE),
+        JSON_MAX_NAME_LENGTH(POSITIVE_INTEGER_BYTE_UNIT, 
StreamReadConstraints.DEFAULT_MAX_NAME_LEN);
+
+        private final IOptionType type;
+        private final Object defaultValue;
+
+        Option(IOptionType type, Object defaultValue) {
+            this.type = type;
+            this.defaultValue = defaultValue;
+        }
+
+        @Override
+        public Section section() {
+            return Section.COMMON;
+        }
+
+        @Override
+        public String description() {
+            switch (this) {
+                case JSON_MAX_DEPTH:
+                    return "The maximum nesting depth for JSON objects. The 
depth is a count of objects and arrays that have not been closed, `{` and `[` 
respectively";
+                case JSON_MAX_DOC_LENGTH:
+                    return "The maximum length of a JSON document in bytes";
+                case JSON_MAX_TOKEN_COUNT:
+                    return "The maximum number of JSON tokens in a JSON object 
(<=0 is no limit). A token is a single unit of input, such as a number, a 
string, an object start or end, or an array start or end";
+                case JSON_MAX_NUMBER_LENGTH:
+                    return "The maximum length of a JSON number in bytes (<=0 
is no limit)";
+                case JSON_MAX_STRING_LENGTH:
+                    return "The maximum length of a JSON string in bytes (<=0 
is no limit)";
+                case JSON_MAX_NAME_LENGTH:
+                    return "The maximum length of a JSON name in bytes";
+                default:
+                    throw new IllegalStateException("NYI: " + this);
+            }
+        }
+
+        @Override
+        public IOptionType type() {
+            return type;
+        }
+
+        @Override
+        public Object defaultValue() {
+            return defaultValue;
+        }
+    }
+
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    static void configureJackson(PropertiesAccessor accessor) {
+        StreamWriteConstraints writeConstraints =
+                
StreamWriteConstraints.builder().maxNestingDepth(accessor.getInt(Option.JSON_MAX_DEPTH)).build();
+        
StreamWriteConstraints.overrideDefaultStreamWriteConstraints(writeConstraints);
+        StreamReadConstraints readConstraints =
+                
StreamReadConstraints.builder().maxNestingDepth(accessor.getInt(Option.JSON_MAX_DEPTH))
+                        
.maxDocumentLength(accessor.getLong(Option.JSON_MAX_DOC_LENGTH))
+                        
.maxTokenCount(accessor.getLong(Option.JSON_MAX_TOKEN_COUNT))
+                        
.maxNameLength(accessor.getInt(Option.JSON_MAX_NAME_LENGTH))
+                        
.maxStringLength(accessor.getInt(Option.JSON_MAX_STRING_LENGTH))
+                        
.maxNumberLength(accessor.getInt(Option.JSON_MAX_NUMBER_LENGTH)).build();
+        
StreamReadConstraints.overrideDefaultStreamReadConstraints(readConstraints);
+        LOGGER.info("Configured Jackson read & write constraints: {{}}", 
Stream.of(Option.values())
+                .map(option -> option.camelCase() + "=" + 
accessor.get(option)).collect(Collectors.joining(", ")));
+    }
+
+    public JacksonProperties(PropertiesAccessor accessor) {
+        super(accessor);
+    }
+
+    public int getJsonMaxDepth() {
+        return accessor.getInt(Option.JSON_MAX_DEPTH);
+    }
+
+    public long getJsonMaxDocLength() {
+        return accessor.getLong(Option.JSON_MAX_DOC_LENGTH);
+    }
+
+    public long getJsonMaxTokenCount() {
+        return accessor.getLong(Option.JSON_MAX_TOKEN_COUNT);
+    }
+
+    public int getJsonMaxNumberLength() {
+        return accessor.getInt(Option.JSON_MAX_NUMBER_LENGTH);
+    }
+
+    public int getJsonMaxStringLength() {
+        return accessor.getInt(Option.JSON_MAX_STRING_LENGTH);
+    }
+
+    public int getJsonMaxNameLength() {
+        return accessor.getInt(Option.JSON_MAX_NAME_LENGTH);
+    }
+
+}
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesFactory.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesFactory.java
index 8f75397..88bf908 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesFactory.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesFactory.java
@@ -77,4 +77,9 @@
     public NodeProperties newNodeProperties() {
         return new NodeProperties(propertiesAccessor);
     }
+
+    @Override
+    public JacksonProperties newJacksonProperties() {
+        return new JacksonProperties(propertiesAccessor);
+    }
 }
diff --git a/asterixdb/pom.xml b/asterixdb/pom.xml
index 0edbe0f..c5c278c 100644
--- a/asterixdb/pom.xml
+++ b/asterixdb/pom.xml
@@ -90,10 +90,14 @@
     <awsjavasdk.version>2.29.27</awsjavasdk.version>
     <parquet.version>1.15.2</parquet.version> <!-- NOTICE: please update 
transitives from parquet below on any change -->
     <hadoop-awsjavasdk.version>1.12.779</hadoop-awsjavasdk.version>
-    <azureblobjavasdk.version>12.25.1</azureblobjavasdk.version>
-    <azurecommonjavasdk.version>12.24.1</azurecommonjavasdk.version>
-    <azureidentity.version>1.13.3</azureidentity.version>
-    <azuredatalakejavasdk.version>12.18.1</azuredatalakejavasdk.version>
+
+    <azureblobjavasdk.version>12.31.1</azureblobjavasdk.version>
+    <azurecommonjavasdk.version>12.30.1</azurecommonjavasdk.version>
+    <azureidentity.version>1.17.0</azureidentity.version>
+    <azuredatalakejavasdk.version>12.24.1</azuredatalakejavasdk.version>
+    <azurecore.version>1.56.0</azurecore.version>
+    <azurecorehttpnetty.version>1.16.0</azurecorehttpnetty.version>
+
     <gcsjavasdk.version>2.45.0</gcsjavasdk.version>
     <hadoop-azuresdk.version>8.6.6</hadoop-azuresdk.version>

@@ -1053,10 +1057,6 @@
             <artifactId>reload4j</artifactId>
           </exclusion>
           <exclusion>
-            <groupId>com.fasterxml</groupId>
-            <artifactId>woodstox-core</artifactId>
-          </exclusion>
-          <exclusion>
             <groupId>dnsjava</groupId>
             <artifactId>dnsjava</artifactId>
           </exclusion>
@@ -1215,6 +1215,16 @@
         </exclusions>
       </dependency>
       <dependency>
+        <groupId>org.codehaus.woodstox</groupId>
+        <artifactId>stax2-api</artifactId>
+        <version>4.2.2</version>
+      </dependency>
+      <dependency>
+        <groupId>com.fasterxml.woodstox</groupId>
+        <artifactId>woodstox-core</artifactId>
+        <version>7.1.1</version>
+      </dependency>
+      <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-compress</artifactId>
         <version>1.27.1</version>
@@ -1619,6 +1629,34 @@
         <artifactId>azure-storage-common</artifactId>
         <version>${azurecommonjavasdk.version}</version>
       </dependency>
+      <dependency>
+        <groupId>com.azure</groupId>
+        <artifactId>azure-core</artifactId>
+        <version>${azurecore.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.azure</groupId>
+        <artifactId>azure-core-http-netty</artifactId>
+        <version>${azurecorehttpnetty.version}</version>
+        <exclusions>
+          <exclusion>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-transport-native-epoll</artifactId>
+          </exclusion>
+          <exclusion>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-transport-native-unix-common</artifactId>
+          </exclusion>
+          <exclusion>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-transport-native-kqueue</artifactId>
+          </exclusion>
+          <exclusion>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-resolver-dns-native-macos</artifactId>
+          </exclusion>
+        </exclusions>
+      </dependency>
       <!-- Azure Blob Storage end -->
       <!-- Google Cloud Storage start -->
       <dependency>
@@ -1802,7 +1840,7 @@
       <dependency>
         <groupId>io.netty</groupId>
         <artifactId>netty-tcnative-boringssl-static</artifactId>
-        <version>2.0.71.Final</version>
+        <version>2.0.72.Final</version>
       </dependency>
     </dependencies>
   </dependencyManagement>
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/CCDriver.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/CCDriver.java
index 8b58046..80ce8ce 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/CCDriver.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/CCDriver.java
@@ -22,6 +22,7 @@

 import java.io.IOException;
 import java.util.Arrays;
+import java.util.concurrent.Semaphore;

 import org.apache.hyracks.api.application.ICCApplication;
 import org.apache.hyracks.control.common.config.ConfigManager;
@@ -57,9 +58,7 @@
             ctx.start(logCfgFactory.getConfiguration(ctx, 
ConfigurationSource.NULL_SOURCE));
             ClusterControllerService ccService = new 
ClusterControllerService(ccConfig, application);
             ccService.start();
-            while (true) {
-                Thread.sleep(100000);
-            }
+            new Semaphore(0).acquire();
         } catch (CmdLineException e) {
             LOGGER.log(Level.DEBUG, "Exception parsing command line: " + 
Arrays.toString(args), e);
             System.exit(2);
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
index 9c5a9fa..9ebb142 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
@@ -585,12 +585,17 @@
     }

     public String defaultTextForUsage(IOption option, Function<IOption, 
String> optionPrinter) {
+        return defaultTextForUsage(option, optionPrinter, 
IOption::defaultValue);
+    }
+
+    public String defaultTextForUsage(IOption option, Function<IOption, 
String> optionPrinter,
+            Function<IOption, Object> defaultValueFunction) {
         StringBuilder buf = new StringBuilder();
         String override = option.usageDefaultOverride(appConfig, 
optionPrinter);
         if (override != null) {
             buf.append(override);
         } else {
-            final Object value = option.defaultValue();
+            final Object value = defaultValueFunction.apply(option);
             if (value instanceof IOption) {
                 buf.append("same as ").append(optionPrinter.apply((IOption) 
value));
             } else if (value instanceof Function) {
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java
index 01cb9bf..44cb7e6 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java
@@ -101,8 +101,7 @@
         PYTHON_ENV(STRING_ARRAY, (String[]) null),
         CREDENTIAL_FILE(
                 OptionTypes.STRING,
-                (Function<IApplicationConfig, String>) appConfig -> FileUtil
-                        
.joinPath(appConfig.getString(ControllerConfig.Option.DEFAULT_DIR), "passwd"),
+                appConfig -> 
FileUtil.joinPath(appConfig.getString(ControllerConfig.Option.DEFAULT_DIR), 
"passwd"),
                 ControllerConfig.Option.DEFAULT_DIR.cmdline() + "/passwd");

         private final IOptionType parser;
diff --git 
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java
 
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java
index 0456dc7..e7b6ec7 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java
@@ -26,15 +26,15 @@
 public class StorageUtil {

     public static final int BASE = 1024;
-    private static final Pattern PATTERN = 
Pattern.compile("^(-?[.0-9]+)([A-Z]{0,2})$");
+    private static final Pattern PATTERN = 
Pattern.compile("^(-?[.0-9]+)([A-Z]{0,3})$");

     public enum StorageUnit {
         BYTE("B", "b", 1),
-        KILOBYTE("KB", "kb", BASE),
-        MEGABYTE("MB", "m", KILOBYTE.multiplier * BASE),
-        GIGABYTE("GB", "g", MEGABYTE.multiplier * BASE),
-        TERABYTE("TB", "t", GIGABYTE.multiplier * BASE),
-        PETABYTE("PB", "p", TERABYTE.multiplier * BASE);
+        KILOBYTE("KiB", "kb", BASE),
+        MEGABYTE("MiB", "m", KILOBYTE.multiplier * BASE),
+        GIGABYTE("GiB", "g", MEGABYTE.multiplier * BASE),
+        TERABYTE("TiB", "t", GIGABYTE.multiplier * BASE),
+        PETABYTE("PiB", "p", TERABYTE.multiplier * BASE);

         private final String unitTypeInLetter;
         private final String linuxUnitTypeInLetter;
@@ -43,7 +43,8 @@

         static {
             for (StorageUnit unit : values()) {
-                SUFFIX_TO_UNIT_MAP.put(unit.unitTypeInLetter, unit);
+                SUFFIX_TO_UNIT_MAP.put(unit.unitTypeInLetter.toUpperCase(), 
unit);
+                SUFFIX_TO_UNIT_MAP.put(unit.unitTypeInLetter.replace("i", ""), 
unit);
             }
         }

@@ -124,11 +125,11 @@

     private static IllegalArgumentException invalidFormatException(String s) {
         return new IllegalArgumentException(
-                "The given string: " + s + " is not a byte unit string (e.g., 
320KB or 1024).");
+                "The given string: " + s + " is not a byte unit string (e.g., 
320KiB or 1024).");
     }

     /**
-     * Return byte value for the given string (e.g., 0.1KB, 100kb, 1mb, 3MB, 
8.5GB ...)
+     * Return byte value for the given string (e.g., 0.1KiB, 100kb, 1mb, 3MiB, 
8.5GiB ...)
      *
      * @throws IllegalArgumentException
      */
@@ -143,7 +144,7 @@

     /**
      * Returns a human readable value in storage units rounded up to two 
decimal places.
-     * e.g. toHumanReadableSize(1024L * 1024L * 1024l * 10L *) + 1024l * 1024l 
* 59) returns 1.06 GB
+     * e.g. toHumanReadableSize(1024L * 1024L * 1024l * 10L *) + 1024l * 1024l 
* 59) returns 1.06 GiB
      *
      * @param bytes
      * @return Value in storage units.
@@ -153,7 +154,7 @@
             return bytes + " B";
         }
         final int baseValue = (63 - Long.numberOfLeadingZeros(bytes)) / 10;
-        final char bytePrefix = " kMGTPE".charAt(baseValue);
+        final String bytePrefix = new String[] { " ", "Ki", "Mi", "Gi", "Ti", 
"Pi" }[baseValue];
         final long divisor = 1L << (baseValue * 10);
         if (bytes % divisor == 0) {
             return String.format("%d %sB", bytes / divisor, bytePrefix);
diff --git 
a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/StorageUnitTest.java
 
b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/StorageUnitTest.java
index 445d15f..c15ee80 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/StorageUnitTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/StorageUnitTest.java
@@ -24,7 +24,7 @@
 public class StorageUnitTest {

     @Test
-    public void test() {
+    public void testParse() {
         // Valid cases
         double result1NoUnit = StorageUtil.getSizeInBytes("1"); // Defaults to 
bytes
         Assert.assertEquals(1.0, result1NoUnit, 0);
@@ -38,6 +38,9 @@
         double result1Kb = StorageUtil.getSizeInBytes("1KB");
         Assert.assertEquals(1024.0, result1Kb, 0);

+        double result1Kb2 = StorageUtil.getSizeInBytes("1KiB");
+        Assert.assertEquals(1024.0, result1Kb2, 0);
+
         double result1KbWithSpaces = StorageUtil.getSizeInBytes(" 1 K B ");
         Assert.assertEquals(1024.0, result1KbWithSpaces, 0);

@@ -68,6 +71,17 @@
         invalidCase("123MBB");
     }

+    @Test
+    public void testToString() {
+        Assert.assertEquals("1 KiB", StorageUtil.toHumanReadableSize(1024));
+        Assert.assertEquals("1.02 KiB", StorageUtil.toHumanReadableSize(1048));
+        Assert.assertEquals("1 MiB", StorageUtil.toHumanReadableSize(1024 * 
1024));
+        Assert.assertEquals("1.50 MiB", StorageUtil.toHumanReadableSize(1024 * 
1536));
+        Assert.assertEquals("1.75 MiB", 
StorageUtil.toHumanReadableSize(StorageUtil.getByteValue("1.75 MiB")));
+        Assert.assertEquals("1.75 MiB", 
StorageUtil.toHumanReadableSize(StorageUtil.getByteValue("1.75 MB")));
+        Assert.assertEquals("11.77 TiB", 
StorageUtil.toHumanReadableSize(StorageUtil.getByteValue("12345678 MB")));
+    }
+
     private void invalidCase(String value) {
         try {
             StorageUtil.getSizeInBytes(value);
@@ -76,4 +90,5 @@
                     .contains("IllegalArgumentException: The given string: " + 
value + " is not a byte unit string"));
         }
     }
+
 }
diff --git a/hyracks-fullstack/pom.xml b/hyracks-fullstack/pom.xml
index 19bffbb..a72968d 100644
--- a/hyracks-fullstack/pom.xml
+++ b/hyracks-fullstack/pom.xml
@@ -74,9 +74,9 @@
     <jacoco.version>0.7.6.201602180812</jacoco.version>
     <log4j.version>2.19.0</log4j.version>
     <snappy.version>1.1.10.5</snappy.version>
-    <jackson.version>2.14.3</jackson.version>
+    <jackson.version>2.19.2</jackson.version>
     <jackson-databind.version>${jackson.version}</jackson-databind.version>
-    <netty.version>4.1.121.Final</netty.version>
+    <netty.version>4.1.124.Final</netty.version>

     <implementation.title>Apache Hyracks and Algebricks - 
${project.name}</implementation.title>
     <implementation.url>https://asterixdb.apache.org/</implementation.url>
@@ -108,6 +108,10 @@
           </exclusion>
           <exclusion>
             <groupId>io.netty</groupId>
+            <artifactId>netty-resolver-dns</artifactId>
+          </exclusion>
+          <exclusion>
+            <groupId>io.netty</groupId>
             <artifactId>netty-resolver-dns-classes-macos</artifactId>
           </exclusion>
           <exclusion>
@@ -171,6 +175,24 @@
         <groupId>io.netty</groupId>
         <artifactId>netty-transport</artifactId>
         <version>${netty.version}</version>
+        <exclusions>
+          <exclusion>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-transport-native-epoll</artifactId>
+          </exclusion>
+          <exclusion>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-transport-classes-epoll</artifactId>
+          </exclusion>
+          <exclusion>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-transport-native-kqueue</artifactId>
+          </exclusion>
+          <exclusion>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-transport-classes-kqueue</artifactId>
+          </exclusion>
+        </exclusions>
       </dependency>
       <dependency>
         <groupId>io.netty</groupId>
@@ -205,11 +227,6 @@
       </dependency>
       <dependency>
         <groupId>io.netty</groupId>
-        <artifactId>netty-transport-classes-epoll</artifactId>
-        <version>${netty.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>io.netty</groupId>
         <artifactId>netty-transport-native-epoll</artifactId>
         <version>${netty.version}</version>
       </dependency>
@@ -217,7 +234,39 @@
         <groupId>io.netty</groupId>
         <artifactId>netty-resolver</artifactId>
         <version>${netty.version}</version>
+        <exclusions>
+          <exclusion>
+            <groupId>*</groupId>
+            <artifactId>*</artifactId>
+          </exclusion>
+        </exclusions>
       </dependency>
+      <!--
+      <dependency>
+        <groupId>io.netty</groupId>
+        <artifactId>netty-resolver-dns-native-macos</artifactId>
+        <version>${netty.version}</version>
+        <scope>provided</scope>
+        <exclusions>
+          <exclusion>
+            <groupId>*</groupId>
+            <artifactId>*</artifactId>
+          </exclusion>
+        </exclusions>
+      </dependency>
+      <dependency>
+        <groupId>io.netty</groupId>
+        <artifactId>netty-resolver-dns-classes-macos</artifactId>
+        <version>${netty.version}</version>
+        <scope>provided</scope>
+        <exclusions>
+          <exclusion>
+            <groupId>*</groupId>
+            <artifactId>*</artifactId>
+          </exclusion>
+        </exclusions>
+      </dependency>
+      -->
       <dependency>
         <groupId>io.netty</groupId>
         <artifactId>netty-transport-native-epoll</artifactId>
@@ -242,10 +291,32 @@
       </dependency>
       <dependency>
         <groupId>io.netty</groupId>
+        <artifactId>netty-resolver-dns-native-macos</artifactId>
+        <version>${netty.version}</version>
+        <classifier>osx-x86_64</classifier>
+      </dependency>
+      <dependency>
+        <groupId>io.netty</groupId>
+        <artifactId>netty-resolver-dns-native-macos</artifactId>
+        <version>${netty.version}</version>
+        <classifier>osx-aarch_64</classifier>
+      </dependency>
+      <dependency>
+        <groupId>io.netty</groupId>
+        <artifactId>netty-resolver-dns-classes-macos</artifactId>
+        <version>${netty.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>io.netty</groupId>
         <artifactId>netty-codec-http2</artifactId>
         <version>${netty.version}</version>
       </dependency>
       <dependency>
+        <groupId>io.netty</groupId>
+        <artifactId>netty-transport-native-unix-common</artifactId>
+        <version>${netty.version}</version>
+      </dependency>
+      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.13.2</version>
@@ -382,6 +453,21 @@
         <version>${jackson.version}</version>
       </dependency>
       <dependency>
+        <groupId>com.fasterxml.jackson.dataformat</groupId>
+        <artifactId>jackson-dataformat-cbor</artifactId>
+        <version>${jackson.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.fasterxml.jackson.dataformat</groupId>
+        <artifactId>jackson-dataformat-xml</artifactId>
+        <version>${jackson.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.fasterxml.jackson.datatype</groupId>
+        <artifactId>jackson-datatype-jsr310</artifactId>
+        <version>${jackson.version}</version>
+      </dependency>
+      <dependency>
         <groupId>com.google.guava</groupId>
         <artifactId>guava</artifactId>
         <version>33.3.1-jre</version>

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20251
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings

Gerrit-Project: asterixdb
Gerrit-Branch: neo
Gerrit-Change-Id: Ic0b744711dd5097fbc3bff581f49e6fce857a409
Gerrit-Change-Number: 20251
Gerrit-PatchSet: 9
Gerrit-Owner: Michael Blow <[email protected]>
Gerrit-Reviewer: Ali Alsuliman <[email protected]>
Gerrit-Reviewer: Anon. E. Moose #1000171
Gerrit-Reviewer: Jenkins <[email protected]>
Gerrit-Reviewer: Michael Blow <[email protected]>
Gerrit-MessageType: merged

Reply via email to