Skip to content

Commit

Permalink
0002139: Log original conflict error message if available. Makes it e…
Browse files Browse the repository at this point in the history
…asier to identify root cause conflict issues.
  • Loading branch information
chenson42 committed Jan 15, 2015
1 parent ccbdd40 commit 84e6dce
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 14 deletions.
Expand Up @@ -77,7 +77,7 @@ public static enum LoadStatus {

protected IDatabaseWriterConflictResolver conflictResolver;

protected Set<String> missingTables = new HashSet<String>();
protected Set<String> missingTables = new HashSet<String>();

public AbstractDatabaseWriter() {
this(null, null);
Expand Down Expand Up @@ -120,6 +120,7 @@ public boolean start(Table table) {
}

public void write(CsvData data) {
context.remove(AbstractDatabaseWriter.CONFLICT_ERROR);
write(data, false);
}

Expand Down Expand Up @@ -178,7 +179,8 @@ protected void write(CsvData data, boolean fallback) {
conflictResolver.needsResolved(this, data, loadStatus);
} else {
throw new ConflictException(data, targetTable, false,
writerSettings.pickConflict(targetTable, batch));
writerSettings.pickConflict(targetTable, batch),
(Exception) context.get(AbstractDatabaseWriter.CONFLICT_ERROR));
}
}

Expand Down
Expand Up @@ -156,7 +156,8 @@ public void needsResolved(AbstractDatabaseWriter writer, CsvData data, LoadStatu
}
}
} else {
throw new ConflictException(data, writer.getTargetTable(), false, conflict);
throw new ConflictException(data, writer.getTargetTable(), false, conflict,
(Exception) writer.getContext().get(AbstractDatabaseWriter.CONFLICT_ERROR));
}
break;

Expand Down Expand Up @@ -234,7 +235,8 @@ protected void performFallbackToUpdate(AbstractDatabaseWriter writer, CsvData da
beforeResolutionAttempt(conflict);
LoadStatus loadStatus = writer.update(data, conflict.isResolveChangesOnly(), false);
if (loadStatus != LoadStatus.SUCCESS) {
throw new ConflictException(data, writer.getTargetTable(), true, conflict);
throw new ConflictException(data, writer.getTargetTable(), true, conflict,
(Exception) writer.getContext().get(AbstractDatabaseWriter.CONFLICT_ERROR));
} else {
writer.getStatistics().get(writer.getBatch())
.increment(DataWriterStatisticConstants.FALLBACKUPDATECOUNT);
Expand All @@ -249,7 +251,8 @@ protected void performFallbackToInsert(AbstractDatabaseWriter writer, CsvData cs
beforeResolutionAttempt(conflict);
LoadStatus loadStatus = writer.insert(csvData);
if (loadStatus != LoadStatus.SUCCESS) {
throw new ConflictException(csvData, writer.getTargetTable(), true, conflict);
throw new ConflictException(csvData, writer.getTargetTable(), true, conflict,
(Exception) writer.getContext().get(AbstractDatabaseWriter.CONFLICT_ERROR));
} else {
writer.getStatistics().get(writer.getBatch())
.increment(DataWriterStatisticConstants.FALLBACKINSERTCOUNT);
Expand Down
Expand Up @@ -22,6 +22,7 @@

import java.util.Map;

import org.apache.commons.lang.exception.ExceptionUtils;
import org.jumpmind.db.model.Table;
import org.jumpmind.symmetric.io.data.CsvData;

Expand All @@ -37,24 +38,28 @@ public class ConflictException extends RuntimeException {

protected Conflict conflict;

public ConflictException(CsvData data, Table table, boolean fallbackOperationFailed, Conflict conflict, Exception cause) {
super(message(data, table, fallbackOperationFailed), cause);
public ConflictException(CsvData data, Table table, boolean fallbackOperationFailed, Conflict conflict, Exception originalCause) {
super(message(data, table, fallbackOperationFailed, originalCause));
this.data = data;
this.table = table;
this.fallbackOperationFailed = fallbackOperationFailed;
this.conflict = conflict;
}

public ConflictException(CsvData data, Table table, boolean fallbackOperationFailed, Conflict conflict) {
this(data, table, fallbackOperationFailed, conflict, null);
}

protected static String message(CsvData data, Table table, boolean fallbackOperationFailed) {
protected static String message(CsvData data, Table table, boolean fallbackOperationFailed, Exception originalCause) {
Map<String, String> pks = data.toKeyColumnValuePairs(table);
return String.format(
String msg = String.format(
"Detected conflict while executing %s on %s. The primary key data was: %s. %s",
data.getDataEventType().toString(), table.getFullyQualifiedTableName(), pks,
fallbackOperationFailed ? "Failed to fallback." : "");
fallbackOperationFailed ? "Failed to fallback. " : " ");
if (originalCause != null) {
Throwable originalRoot = ExceptionUtils.getRootCause(originalCause);
if (originalRoot == null) {
originalRoot = originalCause;
}
msg = msg + String.format("The original error message was: %s", originalRoot.getMessage());
}
return msg;
}

public CsvData getData() {
Expand Down

0 comments on commit 84e6dce

Please sign in to comment.