刘珍 created IOTDB-1401: ------------------------- Summary: Tablet's rowsize = 0 ,insertTablets throws an exception ,gives an unfriendly error message Key: IOTDB-1401 URL: https://issues.apache.org/jira/browse/IOTDB-1401 Project: Apache IoTDB Issue Type: Bug Components: Server Affects Versions: 0.12.0 Reporter: 刘珍 Attachments: image-2021-05-27-16-05-45-882.png
[rel/0.12] 05/18 99822c7feb7797f33b0e740b0f3ea38803d11d17 iotdb log : !image-2021-05-27-16-05-45-882.png|thumbnail! org.apache.iotdb.db.exception.BatchProcessException: {color:red}*Batch process failed:[]*{color} at org.apache.iotdb.db.engine.storagegroup.StorageGroupProcessor.insertTablet(StorageGroupProcessor.java:858) test case: import org.apache.iotdb.rpc.IoTDBConnectionException; import org.apache.iotdb.rpc.StatementExecutionException; import org.apache.iotdb.rpc.TSStatusCode; import org.apache.iotdb.session.Session; import org.apache.iotdb.session.SessionDataSet; import org.apache.iotdb.session.SessionDataSet.DataIterator; import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding; import org.apache.iotdb.tsfile.write.record.Tablet; import org.apache.iotdb.tsfile.write.schema.MeasurementSchema; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; @SuppressWarnings("squid:S106") public class SessionExample { private static Session session; private static Session sessionEnableRedirect; private static final String ROOT_SG1_D1_S1 = "root.sg1.d1.s1"; private static final String ROOT_SG1_D1_S2 = "root.sg1.d1.s2"; private static final String ROOT_SG1_D1_S3 = "root.sg1.d1.s3"; private static final String ROOT_SG1_D1_S4 = "root.sg1.d1.s4"; private static final String ROOT_SG1_D1_S5 = "root.sg1.d1.s5"; private static final String ROOT_SG1_D1 = "root.sg1.d1"; private static final String LOCAL_HOST = "127.0.0.1"; public static void main(String[] args) throws IoTDBConnectionException, StatementExecutionException { session = new Session(LOCAL_HOST, 6667, "root", "root"); session.open(false); // set session fetchSize session.setFetchSize(10000); try { session.setStorageGroup("root.sg1"); } catch (StatementExecutionException e) { if (e.getStatusCode() != TSStatusCode.PATH_ALREADY_EXIST_ERROR.getStatusCode()) { throw e; } } createTimeseries(); createMultiTimeseries(); insertTablets(); session.close(); } private static void createTimeseries() throws IoTDBConnectionException, StatementExecutionException { if (!session.checkTimeseriesExists(ROOT_SG1_D1_S1)) { session.createTimeseries( ROOT_SG1_D1_S1, TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY); } if (!session.checkTimeseriesExists(ROOT_SG1_D1_S2)) { session.createTimeseries( ROOT_SG1_D1_S2, TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY); } if (!session.checkTimeseriesExists(ROOT_SG1_D1_S3)) { session.createTimeseries( ROOT_SG1_D1_S3, TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY); } // create timeseries with tags and attributes if (!session.checkTimeseriesExists(ROOT_SG1_D1_S4)) { Map<String, String> tags = new HashMap<>(); tags.put("tag1", "v1"); Map<String, String> attributes = new HashMap<>(); tags.put("description", "v1"); session.createTimeseries( ROOT_SG1_D1_S4, TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY, null, tags, attributes, "temperature"); } // create timeseries with SDT property, SDT will take place when flushing if (!session.checkTimeseriesExists(ROOT_SG1_D1_S5)) { // COMPDEV is required // COMPMAXTIME and COMPMINTIME are optional and their unit is ms Map<String, String> props = new HashMap<>(); props.put("LOSS", "sdt"); props.put("COMPDEV", "0.01"); props.put("COMPMINTIME", "2"); props.put("COMPMAXTIME", "10"); session.createTimeseries( ROOT_SG1_D1_S5, TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY, props, null, null, null); } } private static void createMultiTimeseries() throws IoTDBConnectionException, StatementExecutionException { if (!session.checkTimeseriesExists("root.sg1.d2.s1") && !session.checkTimeseriesExists("root.sg1.d2.s2")) { List<String> paths = new ArrayList<>(); paths.add("root.sg1.d2.s1"); paths.add("root.sg1.d2.s2"); List<TSDataType> tsDataTypes = new ArrayList<>(); tsDataTypes.add(TSDataType.INT64); tsDataTypes.add(TSDataType.INT64); List<TSEncoding> tsEncodings = new ArrayList<>(); tsEncodings.add(TSEncoding.RLE); tsEncodings.add(TSEncoding.RLE); List<CompressionType> compressionTypes = new ArrayList<>(); compressionTypes.add(CompressionType.SNAPPY); compressionTypes.add(CompressionType.SNAPPY); List<Map<String, String>> tagsList = new ArrayList<>(); Map<String, String> tags = new HashMap<>(); tags.put("unit", "kg"); tagsList.add(tags); tagsList.add(tags); List<Map<String, String>> attributesList = new ArrayList<>(); Map<String, String> attributes = new HashMap<>(); attributes.put("minValue", "1"); attributes.put("maxValue", "100"); attributesList.add(attributes); attributesList.add(attributes); List<String> alias = new ArrayList<>(); alias.add("weight1"); alias.add("weight2"); session.createMultiTimeseries( paths, tsDataTypes, tsEncodings, compressionTypes, null, tagsList, attributesList, alias); } } private static void insertTablets() throws IoTDBConnectionException, StatementExecutionException { // The schema of measurements of one device // only measurementId and data type in MeasurementSchema take effects in Tablet List<MeasurementSchema> schemaList = new ArrayList<>(); schemaList.add(new MeasurementSchema("s1", TSDataType.INT64)); schemaList.add(new MeasurementSchema("s2", TSDataType.INT64)); schemaList.add(new MeasurementSchema("s3", TSDataType.INT64)); Tablet tablet1 = new Tablet(ROOT_SG1_D1, schemaList, 100); Tablet tablet2 = new Tablet("root.sg1.d2", schemaList, 100); Tablet tablet3 = new Tablet("root.sg1.d3", schemaList, 100); Map<String, Tablet> tabletMap = new HashMap<>(); tabletMap.put(ROOT_SG1_D1, tablet1); tabletMap.put("root.sg1.d2", tablet2); tabletMap.put("root.sg1.d3", tablet3); // Method 1 to add tablet data long timestamp = System.currentTimeMillis(); for (long row = 0; row < 100; row++) { int row1 = tablet1.rowSize++; //int row2 = tablet2.rowSize++; int row3 = tablet3.rowSize++; tablet1.addTimestamp(row1, timestamp); //tablet2.addTimestamp(row2, timestamp); tablet3.addTimestamp(row3, timestamp); for (int i = 0; i < 3; i++) { long value = new Random().nextLong(); tablet1.addValue(schemaList.get(i).getMeasurementId(), row1, value); //tablet2.addValue(schemaList.get(i).getMeasurementId(), row2, value); tablet3.addValue(schemaList.get(i).getMeasurementId(), row3, value); } if (tablet1.rowSize == tablet1.getMaxRowNumber()) { session.insertTablets(tabletMap, true); tablet1.reset(); tablet2.reset(); tablet3.reset(); } timestamp++; } if (tablet1.rowSize != 0) { session.insertTablets(tabletMap, true); tablet1.reset(); tablet2.reset(); tablet3.reset(); } } } -- This message was sent by Atlassian Jira (v8.3.4#803005)