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

imaxon pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 9bafae25a6 [ASTERIXDB-3658][COMP] Fix serialization error in query 
with many selected fields
9bafae25a6 is described below

commit 9bafae25a675823c82ba46c71013d93ff7986c58
Author: Shahrzad Shirazi <[email protected]>
AuthorDate: Tue Oct 28 10:55:58 2025 -0700

    [ASTERIXDB-3658][COMP] Fix serialization error in query with many selected 
fields
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Ext-ref: MB-68975
    Co-authored-by: Ian Maxon <[email protected]>
    Change-Id: If165897ba45cc685cd85258c1167a7252996666f
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20490
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Ian Maxon <[email protected]>
    Reviewed-by: Michael Blow <[email protected]>
---
 .../asterix/app/result/JobResultCallback.java      |  2 +-
 .../src/test/resources/runtimets/profiled.xml      | 19 +++++++++++++-
 .../long-description.1.query.sqlpp                 | 29 ++++++++++++++++++++++
 .../long-description/long-description.1.adm        |  0
 .../runtime/operators/DatasetStreamStats.java      |  4 +--
 .../hyracks/api/job/profiling/IOperatorStats.java  | 13 ++++++++--
 .../api/job/profiling/NoOpOperatorStats.java       | 13 +++++++---
 .../hyracks/api/job/profiling/OperatorStats.java   | 17 ++++++++++---
 .../common/job/profiling/StatsCollector.java       |  2 +-
 .../common/job/profiling/om/TaskProfile.java       |  4 +--
 .../dataflow/IndexSearchOperatorNodePushable.java  |  2 +-
 11 files changed, 87 insertions(+), 18 deletions(-)

diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/JobResultCallback.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/JobResultCallback.java
index 6e25be4942..08c459d6f9 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/JobResultCallback.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/JobResultCallback.java
@@ -91,7 +91,7 @@ public class JobResultCallback implements IJobResultCallback {
                 final Collection<TaskProfile> jobletTasksProfile = 
jp.getTaskProfiles().values();
                 for (TaskProfile tp : jobletTasksProfile) {
                     processedObjects += 
tp.getStatsCollector().getAggregatedStats().getInputTupleCounter().get();
-                    pagesRead += 
tp.getStatsCollector().getAggregatedStats().getPageReads().get();
+                    pagesRead += 
tp.getStatsCollector().getAggregatedStats().getPageReadCounter().get();
                     nonPagedReads += 
tp.getStatsCollector().getAggregatedStats().coldReadCounter().get();
                     cloudReadRequestsCount +=
                             
tp.getStatsCollector().getAggregatedStats().cloudReadRequestCounter().get();
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/profiled.xml 
b/asterixdb/asterix-app/src/test/resources/runtimets/profiled.xml
index 2efc64f627..15c52dc9d4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/profiled.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/profiled.xml
@@ -66,5 +66,22 @@
         <output-dir compare="Text">subplan</output-dir>
       </compilation-unit>
     </test-case>
+    <test-case FilePath="profile">
+      <compilation-unit name="long-description">
+        <output-dir compare="Text">long-description</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="profile">
+      <compilation-unit name="long-description">
+        <parameter name="profile" value="counts" type="string"/>
+        <output-dir compare="Text">long-description</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="profile">
+      <compilation-unit name="long-description">
+        <parameter name="profile" value="timings" type="string"/>
+        <output-dir compare="Text">long-description</output-dir>
+      </compilation-unit>
+    </test-case>
   </test-group>
-</test-suite>
\ No newline at end of file
+</test-suite>
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/profile/long-description/long-description.1.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/profile/long-description/long-description.1.query.sqlpp
new file mode 100644
index 0000000000..80a4b5d421
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/profile/long-description/long-description.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+/*
+ * Description  : Test for extremely long select list overflowing profile 
description serialization limit
+ * Expected Res : Success
+ * Date         : 28 Oct 2025
+ */
+SELECT `xryd`.`sa` AS `sgby.ka`, `anuk`.`seihfmxzge` AS `htyt.savygxcmbs`, 
`jaez`.`xsieyf` AS `bvod.emzuyu`, `ofpc`.`bpqfcswbeNR` AS `dsfw.rvmcsmjqyFU`, 
`caaq`.`vbolgolazjiXwk` AS `blvu.ajclxwobljlPgk`, `bucv`.`xssf` AS `hxmt.bylg`, 
`txnm`.`aaeXmub` AS `ibsh.rvmRpvy`, `kbisf`.`dkahem` AS `tveyz.pghrnk`, 
`izyem`.`qgfRqgfqj` AS `kfgjr.cwkCuzgji`, `hftm`.`gcikpfNc` AS `whrv.hhqfyvBe`, 
`gqsq`.`ykrOaznrxrdqJiq` AS `vhxu.aktDynossbhxZfv`, `nzgd`.`amfwzmcvSehf` AS 
`zpce.ejxcyehkLfkl`, `qkvc`.`y [...]
+FROM Metadata.`Dataset` AS a
+WHERE a.`xqok`.`dyksdkpxhBs` BETWEEN "1970-01-01" AND "1972-12-30"
+ORDER BY a.`pvuv`.`tj`
+LIMIT 10;
+
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/long-description/long-description.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/long-description/long-description.1.adm
new file mode 100644
index 0000000000..e69de29bb2
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/DatasetStreamStats.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/DatasetStreamStats.java
index 16135ee465..361bf55524 100644
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/DatasetStreamStats.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/DatasetStreamStats.java
@@ -37,14 +37,14 @@ public final class DatasetStreamStats {
 
     public DatasetStreamStats(IOperatorStats opStats) {
         this.cardinality = opStats.getTupleCounter().get();
-        long totalTupleSize = opStats.getPageReads().get();
+        long totalTupleSize = opStats.getPageReadCounter().get();
         this.avgTupleSize = cardinality > 0 ? (int) (totalTupleSize / 
cardinality) : 0;
         this.indexesStats = opStats.getIndexesStats();
     }
 
     static void update(IOperatorStats opStats, long tupleCount, long 
tupleSize, Map<String, IndexStats> indexStats) {
         opStats.getTupleCounter().update(tupleCount);
-        opStats.getPageReads().update(tupleSize);
+        opStats.getPageReadCounter().update(tupleSize);
         opStats.updateIndexesStats(indexStats);
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/IOperatorStats.java
 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/IOperatorStats.java
index 6b6f64a31f..66d7dc0060 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/IOperatorStats.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/IOperatorStats.java
@@ -21,6 +21,7 @@ package org.apache.hyracks.api.job.profiling;
 import java.io.DataInput;
 import java.io.IOException;
 import java.io.Serializable;
+import java.nio.charset.StandardCharsets;
 import java.util.Map;
 
 import org.apache.hyracks.api.io.IWritable;
@@ -48,7 +49,7 @@ public interface IOperatorStats extends IWritable, 
Serializable {
     /**
      * @return A counter used to track the number of pages pinned by an 
operator
      */
-    ICounter getPageReads();
+    ICounter getPageReadCounter();
 
     /**
      * @return A counter used to track the number of pages read from disk by 
an operator
@@ -112,8 +113,15 @@ public interface IOperatorStats extends IWritable, 
Serializable {
 
     void updateFrom(IOperatorStats stats);
 
+    static String readString(DataInput input) throws IOException {
+        int length = input.readInt();
+        byte[] data = new byte[length];
+        input.readFully(data);
+        return new String(data, StandardCharsets.UTF_8);
+    }
+
     static IOperatorStats create(DataInput input) throws IOException {
-        String name = input.readUTF();
+        String name = readString(input);
         if (NoOpOperatorStats.NOOP_NAME.equals(name)) {
             return NoOpOperatorStats.INSTANCE;
         }
@@ -122,4 +130,5 @@ public interface IOperatorStats extends IWritable, 
Serializable {
         operatorStats.readFields(input);
         return operatorStats;
     }
+
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/NoOpOperatorStats.java
 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/NoOpOperatorStats.java
index 57dd54672d..05c3683e42 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/NoOpOperatorStats.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/NoOpOperatorStats.java
@@ -18,9 +18,12 @@
  */
 package org.apache.hyracks.api.job.profiling;
 
+import static org.apache.hyracks.api.job.profiling.OperatorStats.writeString;
+
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.io.Serial;
 import java.util.Collections;
 import java.util.Map;
 
@@ -28,14 +31,16 @@ import 
org.apache.hyracks.api.job.profiling.counters.ICounter;
 
 public class NoOpOperatorStats implements IOperatorStats {
 
-    private static final long serialVersionUID = 9055940222300360256L;
+    @Serial
+    private static final long serialVersionUID = 9055940222300360257L;
 
     public static final NoOpOperatorStats INSTANCE = new NoOpOperatorStats();
     public static final String INVALID_ODID = "ODID:-1";
     public static final String NOOP_NAME = "NoOp";
 
     private static final ICounter NOOP_COUNTER = new ICounter() {
-        private static final long serialVersionUID = 1L;
+        @Serial
+        private static final long serialVersionUID = 2L;
 
         @Override
         public long update(long delta) {
@@ -60,7 +65,7 @@ public class NoOpOperatorStats implements IOperatorStats {
 
     @Override
     public void writeFields(DataOutput output) throws IOException {
-        output.writeUTF(NOOP_NAME);
+        writeString(output, NOOP_NAME);
         output.writeUTF(INVALID_ODID);
     }
 
@@ -85,7 +90,7 @@ public class NoOpOperatorStats implements IOperatorStats {
     }
 
     @Override
-    public ICounter getPageReads() {
+    public ICounter getPageReadCounter() {
         return NOOP_COUNTER;
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/OperatorStats.java
 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/OperatorStats.java
index 93ee0cd1ac..a70559c0b7 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/OperatorStats.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/OperatorStats.java
@@ -21,6 +21,8 @@ package org.apache.hyracks.api.job.profiling;
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.io.Serial;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -28,7 +30,8 @@ import 
org.apache.hyracks.api.com.job.profiling.counters.Counter;
 import org.apache.hyracks.api.job.profiling.counters.ICounter;
 
 public class OperatorStats implements IOperatorStats {
-    private static final long serialVersionUID = 6401830963361567128L;
+    @Serial
+    private static final long serialVersionUID = 6401830963361567130L;
     public final String operatorName;
 
     public final String operatorId;
@@ -92,7 +95,7 @@ public class OperatorStats implements IOperatorStats {
     }
 
     @Override
-    public ICounter getPageReads() {
+    public ICounter getPageReadCounter() {
         return pageReads;
     }
 
@@ -187,13 +190,13 @@ public class OperatorStats implements IOperatorStats {
     public void updateFrom(IOperatorStats stats) {
         tupleCounter.update(stats.getTupleCounter().get());
         timeCounter.update(stats.getTimeCounter().get());
-        pageReads.update(stats.getPageReads().get());
+        pageReads.update(stats.getPageReadCounter().get());
         updateIndexesStats(stats.getIndexesStats());
     }
 
     @Override
     public void writeFields(DataOutput output) throws IOException {
-        output.writeUTF(operatorName);
+        writeString(output, operatorName);
         output.writeUTF(operatorId);
         output.writeLong(tupleCounter.get());
         output.writeLong(timeCounter.get());
@@ -265,4 +268,10 @@ public class OperatorStats implements IOperatorStats {
                 + bytesWritten.getName() + "\": " + bytesWritten.get() + ", 
\"" + level.getName() + "\": " + level.get()
                 + ", \"indexStats\": \"" + indexesStats + "\" }";
     }
+
+    public static void writeString(DataOutput output, String value) throws 
IOException {
+        byte[] data = value.getBytes(StandardCharsets.UTF_8);
+        output.writeInt(data.length);
+        output.write(data);
+    }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/StatsCollector.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/StatsCollector.java
index a5eca8ed1d..2427941c4b 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/StatsCollector.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/StatsCollector.java
@@ -67,7 +67,7 @@ public class StatsCollector implements IStatsCollector {
         for (IOperatorStats stats : operatorStatsMap.values()) {
             
aggregatedStats.getInputTupleCounter().update(stats.getInputTupleCounter().get());
             
aggregatedStats.getTimeCounter().update(stats.getTimeCounter().get());
-            aggregatedStats.getPageReads().update(stats.getPageReads().get());
+            
aggregatedStats.getPageReadCounter().update(stats.getPageReadCounter().get());
             
aggregatedStats.coldReadCounter().update(stats.coldReadCounter().get());
             
aggregatedStats.cloudReadRequestCounter().update(stats.cloudReadRequestCounter().get());
             
aggregatedStats.cloudReadPageCounter().update(stats.cloudReadPageCounter().get());
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/TaskProfile.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/TaskProfile.java
index e361e420f0..db8effbd1b 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/TaskProfile.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/TaskProfile.java
@@ -136,8 +136,8 @@ public class TaskProfile extends AbstractProfile {
             if (!value.getOperatorId().equals(INVALID_ODID)) {
                 jpe.put("runtime-id", value.getOperatorId());
             }
-            if (value.getPageReads().get() > 0) {
-                jpe.put("pages-read", value.getPageReads().get());
+            if (value.getPageReadCounter().get() > 0) {
+                jpe.put("pages-read", value.getPageReadCounter().get());
                 jpe.put("pages-read-cold", value.coldReadCounter().get());
             }
             if (value.getTupleCounter().get() > 0) {
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
index da5df23997..f328de5798 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
@@ -342,7 +342,7 @@ public abstract class IndexSearchOperatorNodePushable 
extends AbstractUnaryInput
                 if (appender.getTupleCount() > 0) {
                     appender.write(writer, true);
                 }
-                
stats.getPageReads().update(ctx.getThreadStats().getPinnedPagesCount());
+                
stats.getPageReadCounter().update(ctx.getThreadStats().getPinnedPagesCount());
                 
stats.coldReadCounter().update(ctx.getThreadStats().getColdReadCount());
                 
stats.cloudReadRequestCounter().update(ctx.getThreadStats().getCloudReadRequestCount());
                 
stats.cloudReadPageCounter().update(ctx.getThreadStats().getCloudPageReadCount());

Reply via email to