Skip to content

Commit f1b6d18

Browse files
author
Philip Marzullo
committed
0006661: Logging of exceptions on data load can show values used in the
wrong order when conflict resolution is in play
1 parent 0637f2c commit f1b6d18

File tree

3 files changed

+17
-5
lines changed

3 files changed

+17
-5
lines changed

symmetric-client/src/main/java/org/jumpmind/symmetric/io/HbaseDatabaseWriter.java

+4
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,8 @@ protected boolean sql(CsvData data) {
140140
@Override
141141
protected void logFailureDetails(Throwable e, CsvData data, boolean logLastDmlDetails) {
142142
}
143+
144+
@Override
145+
protected void logFailureDetails(Throwable e, CsvData data, boolean logLastDmlDetails, Object[] values) {
146+
}
143147
}

symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/AbstractDatabaseWriter.java

+2
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,8 @@ protected void filterAfter(CsvData data) {
411411
protected abstract boolean sql(CsvData data);
412412

413413
protected abstract void logFailureDetails(Throwable e, CsvData data, boolean logLastDmlDetails);
414+
415+
protected abstract void logFailureDetails(Throwable e, CsvData data, boolean logLastDmlDetails, Object[] values);
414416

415417
protected String[] getRowData(CsvData data, String dataType) {
416418
String[] targetValues = new String[targetTable.getColumnCount()];

symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriter.java

+11-5
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ protected boolean isDml(String sql) {
260260

261261
@Override
262262
protected LoadStatus insert(CsvData data) {
263+
String[] values = null;
263264
try {
264265
if (isRequiresSavePointsInTransaction && conflictResolver != null && conflictResolver.isIgnoreRow(this, data)) {
265266
statistics.get(batch).increment(DataWriterStatisticConstants.IGNOREROWCOUNT);
@@ -279,7 +280,7 @@ protected LoadStatus insert(CsvData data) {
279280
boolean isFindAndThrowException = false;
280281
try {
281282
Conflict conflict = writerSettings.pickConflict(targetTable, batch);
282-
String[] values = (String[]) ArrayUtils.addAll(getRowData(data, CsvData.ROW_DATA),
283+
values = (String[]) ArrayUtils.addAll(getRowData(data, CsvData.ROW_DATA),
283284
currentDmlStatement.getLookupKeyData(getLookupDataMap(data, conflict)));
284285
long count = execute(data, values);
285286
statistics.get(batch).increment(DataWriterStatisticConstants.INSERTCOUNT, count);
@@ -305,7 +306,7 @@ protected LoadStatus insert(CsvData data) {
305306
}
306307
}
307308
} catch (RuntimeException ex) {
308-
logFailureDetails(ex, data, true);
309+
logFailureDetails(ex, data, true, values);
309310
throw ex;
310311
} finally {
311312
statistics.get(batch).stopTimer(DataWriterStatisticConstants.LOADMILLIS);
@@ -967,6 +968,11 @@ private void removeExcludedColumns(Conflict conflict,
967968

968969
@Override
969970
protected void logFailureDetails(Throwable e, CsvData data, boolean logLastDmlDetails) {
971+
logFailureDetails(e, data, logLastDmlDetails, currentDmlValues);
972+
}
973+
974+
@Override
975+
protected void logFailureDetails(Throwable e, CsvData data, boolean logLastDmlDetails, Object[] values) {
970976
StringBuilder failureMessage = new StringBuilder();
971977
failureMessage.append("Failed to process ");
972978
failureMessage.append(data.getDataEventType().toString().toLowerCase());
@@ -979,7 +985,7 @@ protected void logFailureDetails(Throwable e, CsvData data, boolean logLastDmlDe
979985
boolean shouldLogRawSql = true;
980986
if (writerSettings.isLogSqlParamsOnError()) {
981987
failureMessage.append("Failed sql was: ");
982-
String dynamicSQL = logSqlBuilder.buildDynamicSqlForLog(currentDmlStatement.getSql(), currentDmlValues, currentDmlStatement.getTypes());
988+
String dynamicSQL = logSqlBuilder.buildDynamicSqlForLog(currentDmlStatement.getSql(), values, currentDmlStatement.getTypes());
983989
failureMessage.append(dynamicSQL);
984990
failureMessage.append("\n");
985991
shouldLogRawSql = !dynamicSQL.equals(currentDmlStatement.getSql());
@@ -990,10 +996,10 @@ protected void logFailureDetails(Throwable e, CsvData data, boolean logLastDmlDe
990996
}
991997
failureMessage.append("\n");
992998
}
993-
if (logLastDmlDetails && currentDmlValues != null && currentDmlStatement != null) {
999+
if (logLastDmlDetails && values != null && currentDmlStatement != null) {
9941000
if (writerSettings.isLogSqlParamsOnError()) {
9951001
failureMessage.append("Failed sql parameters: ");
996-
failureMessage.append(StringUtils.abbreviate("[" + dmlValuesToString(currentDmlValues, currentDmlStatement.getTypes()) + "]",
1002+
failureMessage.append(StringUtils.abbreviate("[" + dmlValuesToString(values, currentDmlStatement.getTypes()) + "]",
9971003
CsvData.MAX_DATA_SIZE_TO_PRINT_TO_LOG));
9981004
failureMessage.append("\n");
9991005
}

0 commit comments

Comments
 (0)