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());