This is an automated email from the ASF dual-hosted git repository.
yongzao pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/dev/1.3 by this push:
new e0a90fbc49d Print measurement for putting buffer exceptions (#15873)
(#16213)
e0a90fbc49d is described below
commit e0a90fbc49dc2f7c00dec439cfe42e9de395a1e5
Author: Jiang Tian <[email protected]>
AuthorDate: Wed Aug 20 18:40:52 2025 +0800
Print measurement for putting buffer exceptions (#15873) (#16213)
---
.../iotdb/session/it/IoTDBSessionSimpleIT.java | 16 +++
.../java/org/apache/iotdb/session/Session.java | 17 ++-
.../apache/iotdb/session/util/SessionUtils.java | 139 ++++++++++++++-------
.../iotdb/session/util/SessionUtilsTest.java | 29 ++++-
.../metrics/IoTDBInternalLocalReporter.java | 2 +-
5 files changed, 146 insertions(+), 57 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSimpleIT.java
b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSimpleIT.java
index 536bab31171..a4b84bab7d3 100644
---
a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSimpleIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSimpleIT.java
@@ -79,6 +79,7 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -2130,4 +2131,19 @@ public class IoTDBSessionSimpleIT {
}
}
}
+
+ @Test
+ public void testInsertWrongTypeRecord() throws IoTDBConnectionException {
+ try (ISession session = EnvFactory.getEnv().getSessionConnection()) {
+ assertThrows(
+ ClassCastException.class,
+ () ->
+ session.insertRecord(
+ "root.db1.d1",
+ 0,
+ Collections.singletonList("s1"),
+ Collections.singletonList(TSDataType.INT32),
+ Collections.singletonList(1L)));
+ }
+ }
}
diff --git
a/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
b/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
index d554c4c57a6..e61d86c2f20 100644
--- a/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
+++ b/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
@@ -1440,7 +1440,7 @@ public class Session implements ISession {
request.setPrefixPath(prefixPath);
request.setTimestamp(time);
request.setMeasurements(measurements);
- ByteBuffer buffer = SessionUtils.getValueBuffer(types, values);
+ ByteBuffer buffer = SessionUtils.getValueBuffer(types, values,
measurements);
request.setValues(buffer);
request.setIsAligned(isAligned);
return request;
@@ -2405,7 +2405,8 @@ public class Session implements ISession {
request.setPrefixPath(prefixPath);
request.setTimestamps(times);
request.setMeasurementsList(measurementsList);
- List<ByteBuffer> buffersList =
objectValuesListToByteBufferList(valuesList, typesList);
+ List<ByteBuffer> buffersList =
+ objectValuesListToByteBufferList(valuesList, typesList,
measurementsList);
request.setValuesList(buffersList);
request.setIsAligned(isAligned);
return request;
@@ -2479,11 +2480,14 @@ public class Session implements ISession {
}
private List<ByteBuffer> objectValuesListToByteBufferList(
- List<List<Object>> valuesList, List<List<TSDataType>> typesList)
+ List<List<Object>> valuesList,
+ List<List<TSDataType>> typesList,
+ List<List<String>> measurementsList)
throws IoTDBConnectionException {
List<ByteBuffer> buffersList = new ArrayList<>();
for (int i = 0; i < valuesList.size(); i++) {
- ByteBuffer buffer = SessionUtils.getValueBuffer(typesList.get(i),
valuesList.get(i));
+ ByteBuffer buffer =
+ SessionUtils.getValueBuffer(typesList.get(i), valuesList.get(i),
measurementsList.get(i));
buffersList.add(buffer);
}
return buffersList;
@@ -2555,7 +2559,8 @@ public class Session implements ISession {
request.setTimestamps(times);
request.setMeasurementsList(measurementsList);
request.setIsAligned(isAligned);
- List<ByteBuffer> buffersList =
objectValuesListToByteBufferList(valuesList, typesList);
+ List<ByteBuffer> buffersList =
+ objectValuesListToByteBufferList(valuesList, typesList,
measurementsList);
request.setValuesList(buffersList);
return request;
}
@@ -2592,7 +2597,7 @@ public class Session implements ISession {
request.addToPrefixPaths(deviceId);
request.addToTimestamps(time);
request.addToMeasurementsList(measurements);
- ByteBuffer buffer = SessionUtils.getValueBuffer(types, values);
+ ByteBuffer buffer = SessionUtils.getValueBuffer(types, values,
measurements);
request.addToValuesList(buffer);
}
diff --git
a/iotdb-client/session/src/main/java/org/apache/iotdb/session/util/SessionUtils.java
b/iotdb-client/session/src/main/java/org/apache/iotdb/session/util/SessionUtils.java
index 88ecda05248..31ca44aa3ff 100644
---
a/iotdb-client/session/src/main/java/org/apache/iotdb/session/util/SessionUtils.java
+++
b/iotdb-client/session/src/main/java/org/apache/iotdb/session/util/SessionUtils.java
@@ -33,6 +33,8 @@ import org.apache.tsfile.utils.ReadWriteIOUtils;
import org.apache.tsfile.write.UnSupportedDataTypeException;
import org.apache.tsfile.write.record.Tablet;
import org.apache.tsfile.write.schema.MeasurementSchema;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.nio.ByteBuffer;
import java.time.LocalDate;
@@ -43,6 +45,7 @@ import static
org.apache.iotdb.session.Session.MSG_UNSUPPORTED_DATA_TYPE;
public class SessionUtils {
+ private static final Logger LOGGER =
LoggerFactory.getLogger(SessionUtils.class);
private static final byte TYPE_NULL = -2;
public static ByteBuffer getTimeBuffer(Tablet tablet) {
@@ -77,10 +80,47 @@ public class SessionUtils {
return valueBuffer;
}
- public static ByteBuffer getValueBuffer(List<TSDataType> types, List<Object>
values)
+ private static int calOccupationOfOneColumn(
+ TSDataType dataType, Object[] values, int columnIndex, int rowSize) {
+ int valueOccupation = 0;
+ switch (dataType) {
+ case BOOLEAN:
+ valueOccupation += rowSize;
+ break;
+ case INT32:
+ case FLOAT:
+ case DATE:
+ valueOccupation += rowSize * 4;
+ break;
+ case INT64:
+ case DOUBLE:
+ case TIMESTAMP:
+ valueOccupation += rowSize * 8;
+ break;
+ case TEXT:
+ case BLOB:
+ case STRING:
+ valueOccupation += rowSize * 4;
+ Binary[] binaries = (Binary[]) values[columnIndex];
+ for (int rowIndex = 0; rowIndex < rowSize; rowIndex++) {
+ valueOccupation +=
+ binaries[rowIndex] != null
+ ? binaries[rowIndex].getLength()
+ : Binary.EMPTY_VALUE.getLength();
+ }
+ break;
+ default:
+ throw new UnSupportedDataTypeException(
+ String.format("Data type %s is not supported.", dataType));
+ }
+ return valueOccupation;
+ }
+
+ public static ByteBuffer getValueBuffer(
+ List<TSDataType> types, List<Object> values, List<String> measurements)
throws IoTDBConnectionException {
ByteBuffer buffer =
ByteBuffer.allocate(SessionUtils.calculateLength(types, values));
- SessionUtils.putValues(types, values, buffer);
+ SessionUtils.putValues(types, values, buffer, measurements);
return buffer;
}
@@ -136,53 +176,60 @@ public class SessionUtils {
* @param buffer buffer to insert
* @throws IoTDBConnectionException
*/
- private static void putValues(List<TSDataType> types, List<Object> values,
ByteBuffer buffer)
+ private static void putValues(
+ List<TSDataType> types, List<Object> values, ByteBuffer buffer,
List<String> measurements)
throws IoTDBConnectionException {
for (int i = 0; i < values.size(); i++) {
- if (values.get(i) == null) {
- ReadWriteIOUtils.write(TYPE_NULL, buffer);
- continue;
- }
- ReadWriteIOUtils.write(types.get(i), buffer);
- switch (types.get(i)) {
- case BOOLEAN:
- ReadWriteIOUtils.write((Boolean) values.get(i), buffer);
- break;
- case INT32:
- ReadWriteIOUtils.write((Integer) values.get(i), buffer);
- break;
- case DATE:
- ReadWriteIOUtils.write(
- DateUtils.parseDateExpressionToInt((LocalDate) values.get(i)),
buffer);
- break;
- case INT64:
- case TIMESTAMP:
- ReadWriteIOUtils.write((Long) values.get(i), buffer);
- break;
- case FLOAT:
- ReadWriteIOUtils.write((Float) values.get(i), buffer);
- break;
- case DOUBLE:
- ReadWriteIOUtils.write((Double) values.get(i), buffer);
- break;
- case TEXT:
- case STRING:
- byte[] bytes;
- if (values.get(i) instanceof Binary) {
+ try {
+ if (values.get(i) == null) {
+ ReadWriteIOUtils.write(TYPE_NULL, buffer);
+ continue;
+ }
+ ReadWriteIOUtils.write(types.get(i), buffer);
+ switch (types.get(i)) {
+ case BOOLEAN:
+ ReadWriteIOUtils.write((Boolean) values.get(i), buffer);
+ break;
+ case INT32:
+ ReadWriteIOUtils.write((Integer) values.get(i), buffer);
+ break;
+ case DATE:
+ ReadWriteIOUtils.write(
+ DateUtils.parseDateExpressionToInt((LocalDate) values.get(i)),
buffer);
+ break;
+ case INT64:
+ case TIMESTAMP:
+ ReadWriteIOUtils.write((Long) values.get(i), buffer);
+ break;
+ case FLOAT:
+ ReadWriteIOUtils.write((Float) values.get(i), buffer);
+ break;
+ case DOUBLE:
+ ReadWriteIOUtils.write((Double) values.get(i), buffer);
+ break;
+ case TEXT:
+ case STRING:
+ byte[] bytes;
+ if (values.get(i) instanceof Binary) {
+ bytes = ((Binary) values.get(i)).getValues();
+ } else {
+ bytes = ((String)
values.get(i)).getBytes(TSFileConfig.STRING_CHARSET);
+ }
+ ReadWriteIOUtils.write(bytes.length, buffer);
+ buffer.put(bytes);
+ break;
+ case BLOB:
bytes = ((Binary) values.get(i)).getValues();
- } else {
- bytes = ((String)
values.get(i)).getBytes(TSFileConfig.STRING_CHARSET);
- }
- ReadWriteIOUtils.write(bytes.length, buffer);
- buffer.put(bytes);
- break;
- case BLOB:
- bytes = ((Binary) values.get(i)).getValues();
- ReadWriteIOUtils.write(bytes.length, buffer);
- buffer.put(bytes);
- break;
- default:
- throw new IoTDBConnectionException(MSG_UNSUPPORTED_DATA_TYPE +
types.get(i));
+ ReadWriteIOUtils.write(bytes.length, buffer);
+ buffer.put(bytes);
+ break;
+ default:
+ throw new IoTDBConnectionException(MSG_UNSUPPORTED_DATA_TYPE +
types.get(i));
+ }
+ } catch (Throwable e) {
+ LOGGER.error(
+ "Cannot put values for measurement {}, type={}",
measurements.get(i), types.get(i), e);
+ throw e;
}
}
buffer.flip();
diff --git
a/iotdb-client/session/src/test/java/org/apache/iotdb/session/util/SessionUtilsTest.java
b/iotdb-client/session/src/test/java/org/apache/iotdb/session/util/SessionUtilsTest.java
index 7fb93e49a23..82f19d3d332 100644
---
a/iotdb-client/session/src/test/java/org/apache/iotdb/session/util/SessionUtilsTest.java
+++
b/iotdb-client/session/src/test/java/org/apache/iotdb/session/util/SessionUtilsTest.java
@@ -35,8 +35,11 @@ import org.junit.Test;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
+import static org.junit.Assert.assertThrows;
+
public class SessionUtilsTest {
@Test
@@ -122,24 +125,42 @@ public class SessionUtilsTest {
TSDataType.DOUBLE,
TSDataType.TEXT,
TSDataType.BOOLEAN);
- ByteBuffer timeBuffer = SessionUtils.getValueBuffer(typeList, valueList);
+ List<String> measurements = Arrays.asList("s1", "s2", "s3", "s4", "s5",
"s6");
+ ByteBuffer timeBuffer = SessionUtils.getValueBuffer(typeList, valueList,
measurements);
Assert.assertNotNull(timeBuffer);
valueList = new ArrayList<>();
valueList.add(null);
- typeList = Arrays.asList(TSDataType.INT32);
- timeBuffer = SessionUtils.getValueBuffer(typeList, valueList);
+ typeList = Collections.singletonList(TSDataType.INT32);
+ timeBuffer = SessionUtils.getValueBuffer(typeList, valueList,
measurements);
Assert.assertNotNull(timeBuffer);
valueList = Arrays.asList(false);
typeList = Arrays.asList(TSDataType.UNKNOWN);
try {
- timeBuffer = SessionUtils.getValueBuffer(typeList, valueList);
+ SessionUtils.getValueBuffer(typeList, valueList, measurements);
} catch (Exception e) {
Assert.assertTrue(e instanceof IoTDBConnectionException);
}
}
+ @Test
+ public void testGetValueBufferWithWrongType() {
+ List<Object> valueList = Arrays.asList(12L, 13, 1.2, 0.707f, false,
"false");
+ List<TSDataType> typeList =
+ Arrays.asList(
+ TSDataType.INT32,
+ TSDataType.INT64,
+ TSDataType.FLOAT,
+ TSDataType.DOUBLE,
+ TSDataType.TEXT,
+ TSDataType.BOOLEAN);
+ List<String> measurements = Arrays.asList("s1", "s2", "s3", "s4", "s5",
"s6");
+ assertThrows(
+ ClassCastException.class,
+ () -> SessionUtils.getValueBuffer(typeList, valueList, measurements));
+ }
+
@Test
public void testParseSeedNodeUrls() {
List<String> nodeUrls = Arrays.asList("127.0.0.1:1234");
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/IoTDBInternalLocalReporter.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/IoTDBInternalLocalReporter.java
index bd8ca1e8654..2dc54e564f2 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/IoTDBInternalLocalReporter.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/IoTDBInternalLocalReporter.java
@@ -194,7 +194,7 @@ public class IoTDBInternalLocalReporter extends
IoTDBInternalReporter {
types.add(inferType(value));
values.add(value);
}
- ByteBuffer buffer = SessionUtils.getValueBuffer(types, values);
+ ByteBuffer buffer = SessionUtils.getValueBuffer(types, values,
measurements);
request.setPrefixPath(prefix);
request.setTimestamp(time);