You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2025/08/20 09:06:02 UTC

(iotdb) branch add_print created (now 2b5fefa1ab3)

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

jiangtian pushed a change to branch add_print
in repository https://gitbox.apache.org/repos/asf/iotdb.git


      at 2b5fefa1ab3 Print measurement for putting buffer exceptions (#15873)

This branch includes the following new commits:

     new 2b5fefa1ab3 Print measurement for putting buffer exceptions (#15873)

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(iotdb) 01/01: Print measurement for putting buffer exceptions (#15873)

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jiangtian pushed a commit to branch add_print
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 2b5fefa1ab3929e9e5f709c07695876542afa29b
Author: Jiang Tian <jt...@163.com>
AuthorDate: Fri Jul 4 14:00:04 2025 +0800

    Print measurement for putting buffer exceptions (#15873)
---
 .../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);