Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
package org.apache.iotdb.db.i18n;

public final class DataNodeQueryMessages {
public static final String MESSAGE_FAIL_TO_INSERT_MEASUREMENTS_ARG_CAUSED_BY_ARG_B9858E6B =
"Fail to insert measurements %s caused by %s";

private DataNodeQueryMessages() {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
package org.apache.iotdb.db.i18n;

public final class DataNodeQueryMessages {
public static final String MESSAGE_FAIL_TO_INSERT_MEASUREMENTS_ARG_CAUSED_BY_ARG_B9858E6B =
"测点 %s 插入失败,原因:%s";

private DataNodeQueryMessages() {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import org.apache.iotdb.db.exception.metadata.view.UnsupportedViewException;
import org.apache.iotdb.db.exception.sql.SemanticException;
import org.apache.iotdb.db.exception.sql.StatementAnalyzeException;
import org.apache.iotdb.db.i18n.DataNodeQueryMessages;
import org.apache.iotdb.db.protocol.client.ConfigNodeClient;
import org.apache.iotdb.db.protocol.client.ConfigNodeClientManager;
import org.apache.iotdb.db.protocol.client.ConfigNodeInfo;
Expand Down Expand Up @@ -3120,16 +3121,43 @@ private void validateSchema(
boolean hasFailedMeasurement = insertStatement.hasFailedMeasurements();
String partialInsertMessage;
if (hasFailedMeasurement) {
final List<String> failedMeasurements = new ArrayList<>();
final List<String> failedMessages = new ArrayList<>();
collectDistinctFailedMeasurementMessages(
insertStatement.getFailedMeasurements(),
insertStatement.getFailedMessages(),
failedMeasurements,
failedMessages);
partialInsertMessage =
String.format(
"Fail to insert measurements %s caused by %s",
insertStatement.getFailedMeasurements(), insertStatement.getFailedMessages());
DataNodeQueryMessages.MESSAGE_FAIL_TO_INSERT_MEASUREMENTS_ARG_CAUSED_BY_ARG_B9858E6B,
failedMeasurements,
failedMessages);
logger.warn(partialInsertMessage);
analysis.setFailStatus(
RpcUtils.getStatus(TSStatusCode.METADATA_ERROR.getStatusCode(), partialInsertMessage));
}
}

private static void collectDistinctFailedMeasurementMessages(
List<String> rawFailedMeasurements,
List<String> rawFailedMessages,
List<String> failedMeasurements,
List<String> failedMessages) {
final Set<List<String>> distinctFailures = new LinkedHashSet<>();
for (int i = 0; i < rawFailedMeasurements.size(); i++) {
final String failedMeasurement = rawFailedMeasurements.get(i);
final String failedMessage = i < rawFailedMessages.size() ? rawFailedMessages.get(i) : null;
final List<String> failureKey = new ArrayList<>(2);
failureKey.add(failedMeasurement);
failureKey.add(failedMessage);
if (distinctFailures.add(failureKey)) {
failedMeasurements.add(failedMeasurement);
failedMessages.add(failedMessage);
}
}
}

private InsertBaseStatement removeLogicalView(
Analysis analysis, InsertBaseStatement insertBaseStatement) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

import org.apache.iotdb.commons.conf.CommonDescriptor;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
import org.apache.iotdb.db.queryengine.plan.analyze.schema.ISchemaValidation;
import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor;
Expand All @@ -31,6 +30,7 @@
import org.apache.tsfile.utils.RamUsageEstimator;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -104,12 +104,45 @@ public List<ISchemaValidation> getSchemaValidationList() {
}

@Override
public void updateAfterSchemaValidation(MPPQueryContext context) {
for (InsertTabletStatement insertTabletStatement : insertTabletStatementList) {
if (!this.hasFailedMeasurements() && insertTabletStatement.hasFailedMeasurements()) {
this.failedMeasurementIndex2Info = insertTabletStatement.failedMeasurementIndex2Info;
}
}
public boolean hasFailedMeasurements() {
return insertTabletStatementList != null
&& insertTabletStatementList.stream().anyMatch(InsertBaseStatement::hasFailedMeasurements);
}

@Override
public int getFailedMeasurementNumber() {
return insertTabletStatementList == null
? 0
: insertTabletStatementList.stream()
.mapToInt(InsertBaseStatement::getFailedMeasurementNumber)
.sum();
}

@Override
public List<String> getFailedMeasurements() {
return insertTabletStatementList == null
? Collections.emptyList()
: insertTabletStatementList.stream()
.flatMap(statement -> statement.getFailedMeasurements().stream())
.collect(Collectors.toList());
}

@Override
public List<Exception> getFailedExceptions() {
return insertTabletStatementList == null
? Collections.emptyList()
: insertTabletStatementList.stream()
.flatMap(statement -> statement.getFailedExceptions().stream())
.collect(Collectors.toList());
}

@Override
public List<String> getFailedMessages() {
return insertTabletStatementList == null
? Collections.emptyList()
: insertTabletStatementList.stream()
.flatMap(statement -> statement.getFailedMessages().stream())
.collect(Collectors.toList());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.apache.tsfile.utils.RamUsageEstimator;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
Expand Down Expand Up @@ -127,12 +128,51 @@ public List<ISchemaValidation> getSchemaValidationList() {
public void updateAfterSchemaValidation(MPPQueryContext context) throws QueryProcessException {
for (InsertRowStatement insertRowStatement : insertRowStatementList) {
insertRowStatement.updateAfterSchemaValidation(context);
if (!this.hasFailedMeasurements() && insertRowStatement.hasFailedMeasurements()) {
this.failedMeasurementIndex2Info = insertRowStatement.failedMeasurementIndex2Info;
}
}
}

@Override
public boolean hasFailedMeasurements() {
return insertRowStatementList != null
&& insertRowStatementList.stream().anyMatch(InsertBaseStatement::hasFailedMeasurements);
}

@Override
public int getFailedMeasurementNumber() {
return insertRowStatementList == null
? 0
: insertRowStatementList.stream()
.mapToInt(InsertBaseStatement::getFailedMeasurementNumber)
.sum();
}

@Override
public List<String> getFailedMeasurements() {
return insertRowStatementList == null
? Collections.emptyList()
: insertRowStatementList.stream()
.flatMap(statement -> statement.getFailedMeasurements().stream())
.collect(Collectors.toList());
}

@Override
public List<Exception> getFailedExceptions() {
return insertRowStatementList == null
? Collections.emptyList()
: insertRowStatementList.stream()
.flatMap(statement -> statement.getFailedExceptions().stream())
.collect(Collectors.toList());
}

@Override
public List<String> getFailedMessages() {
return insertRowStatementList == null
? Collections.emptyList()
: insertRowStatementList.stream()
.flatMap(statement -> statement.getFailedMessages().stream())
.collect(Collectors.toList());
}

@Override
protected boolean checkAndCastDataType(int columnIndex, TSDataType dataType) {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class InsertRowsStatement extends InsertBaseStatement {

Expand All @@ -44,6 +45,8 @@ public class InsertRowsStatement extends InsertBaseStatement {
/** the InsertRowsStatement list */
private List<InsertRowStatement> insertRowStatementList;

private List<InsertRowStatement> schemaValidatedRowStatementList;

public InsertRowsStatement() {
super();
statementType = StatementType.BATCH_INSERT_ROWS;
Expand Down Expand Up @@ -124,10 +127,51 @@ public List<ISchemaValidation> getSchemaValidationList() {
public void updateAfterSchemaValidation(MPPQueryContext context) throws QueryProcessException {
for (InsertRowStatement insertRowStatement : insertRowStatementList) {
insertRowStatement.updateAfterSchemaValidation(context);
if (!this.hasFailedMeasurements() && insertRowStatement.hasFailedMeasurements()) {
this.failedMeasurementIndex2Info = insertRowStatement.failedMeasurementIndex2Info;
}
}
// Table schema validation can remove rows without valid fields. Keep their failures for
// reporting.
schemaValidatedRowStatementList = insertRowStatementList;
}

private Stream<InsertRowStatement> getRowsForFailureReporting() {
final List<InsertRowStatement> rows =
schemaValidatedRowStatementList == null
? insertRowStatementList
: schemaValidatedRowStatementList;
return rows == null ? Stream.empty() : rows.stream();
}

@Override
public boolean hasFailedMeasurements() {
return getRowsForFailureReporting().anyMatch(InsertBaseStatement::hasFailedMeasurements);
}

@Override
public int getFailedMeasurementNumber() {
return getRowsForFailureReporting()
.mapToInt(InsertBaseStatement::getFailedMeasurementNumber)
.sum();
}

@Override
public List<String> getFailedMeasurements() {
return getRowsForFailureReporting()
.flatMap(statement -> statement.getFailedMeasurements().stream())
.collect(Collectors.toList());
}

@Override
public List<Exception> getFailedExceptions() {
return getRowsForFailureReporting()
.flatMap(statement -> statement.getFailedExceptions().stream())
.collect(Collectors.toList());
}

@Override
public List<String> getFailedMessages() {
return getRowsForFailureReporting()
.flatMap(statement -> statement.getFailedMessages().stream())
.collect(Collectors.toList());
}

@Override
Expand Down
Loading
Loading