From 7de29b260d8bfe2d919896249a1a3e2db78254ed Mon Sep 17 00:00:00 2001 From: chenson42 Date: Thu, 13 Dec 2012 01:23:47 +0000 Subject: [PATCH] 0000951: use_timestamp conflict resolution with transform can get into endless loop --- ...DefaultDatabaseWriterConflictResolver.java | 24 +++++++++---------- ...efaultTransformWriterConflictResolver.java | 12 +++++----- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriterConflictResolver.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriterConflictResolver.java index dca0a29701..447de84374 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriterConflictResolver.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriterConflictResolver.java @@ -60,14 +60,14 @@ public void needsResolved(DatabaseWriter writer, CsvData data, LoadStatus loadSt case INSERT: switch (conflict.getResolveType()) { case FALLBACK: - performFallbackToUpdate(writer, data, conflict); + performFallbackToUpdate(writer, data, conflict, true); break; case NEWER_WINS: if ((conflict.getDetectType() == DetectConflict.USE_TIMESTAMP && isTimestampNewer( conflict, writer, data)) || (conflict.getDetectType() == DetectConflict.USE_VERSION && isVersionNewer( conflict, writer, data))) { - performFallbackToUpdate(writer, data, conflict); + performFallbackToUpdate(writer, data, conflict, true); } else { if (!conflict.isResolveRowOnly()) { throw new IgnoreBatchException(); @@ -93,15 +93,15 @@ public void needsResolved(DatabaseWriter writer, CsvData data, LoadStatus loadSt new CsvData(data.getDataEventType(), data.getParsedData(CsvData.ROW_DATA)); try { // we already tried to update using the pk - performFallbackToInsert(writer, withoutOldData, conflict); + performFallbackToInsert(writer, withoutOldData, conflict, true); } catch (ConflictException ex) { - performFallbackToUpdate(writer, withoutOldData, conflict); + performFallbackToUpdate(writer, withoutOldData, conflict, true); } } else { try { - performFallbackToUpdate(writer, data, conflict); + performFallbackToUpdate(writer, data, conflict, true); } catch (ConflictException ex) { - performFallbackToInsert(writer, data, conflict); + performFallbackToInsert(writer, data, conflict, true); } } break; @@ -111,9 +111,9 @@ public void needsResolved(DatabaseWriter writer, CsvData data, LoadStatus loadSt || (conflict.getDetectType() == DetectConflict.USE_VERSION && isVersionNewer( conflict, writer, data))) { try { - performFallbackToUpdate(writer, data, conflict); + performFallbackToUpdate(writer, data, conflict, false); } catch (ConflictException ex) { - performFallbackToInsert(writer, data, conflict); + performFallbackToInsert(writer, data, conflict, true); } } else { @@ -220,9 +220,9 @@ protected void attemptToResolve(ResolvedData resolvedData, CsvData data, Databas if (!resolvedData.isIgnoreRow()) { data.putCsvData(CsvData.ROW_DATA, resolvedData.getResolvedData()); try { - performFallbackToUpdate(writer, data, conflict); + performFallbackToUpdate(writer, data, conflict, true); } catch (ConflictException ex) { - performFallbackToInsert(writer, data, conflict); + performFallbackToInsert(writer, data, conflict, true); } } } else { @@ -297,7 +297,7 @@ protected boolean isVersionNewer(Conflict conflict, DatabaseWriter writer, CsvDa return loadingVersion > existingVersion; } - protected void performFallbackToUpdate(DatabaseWriter writer, CsvData data, Conflict conflict) { + protected void performFallbackToUpdate(DatabaseWriter writer, CsvData data, Conflict conflict, boolean retransform) { try { beforeResolutionAttempt(conflict); LoadStatus loadStatus = writer.update(data, conflict.isResolveChangesOnly(), false); @@ -312,7 +312,7 @@ protected void performFallbackToUpdate(DatabaseWriter writer, CsvData data, Conf } } - protected void performFallbackToInsert(DatabaseWriter writer, CsvData csvData, Conflict conflict) { + protected void performFallbackToInsert(DatabaseWriter writer, CsvData csvData, Conflict conflict, boolean retransform) { try { beforeResolutionAttempt(conflict); LoadStatus loadStatus = writer.insert(csvData); diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultTransformWriterConflictResolver.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultTransformWriterConflictResolver.java index ddfe086b76..f869ec966e 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultTransformWriterConflictResolver.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultTransformWriterConflictResolver.java @@ -36,9 +36,9 @@ public DefaultTransformWriterConflictResolver(TransformWriter transformWriter) { } @Override - protected void performFallbackToInsert(DatabaseWriter writer, CsvData data, Conflict conflict) { + protected void performFallbackToInsert(DatabaseWriter writer, CsvData data, Conflict conflict, boolean retransform) { TransformedData transformedData = data.getAttribute(TransformedData.class.getName()); - if (transformedData != null) { + if (transformedData != null && retransform) { List newlyTransformedDatas = transformWriter.transform( DataEventType.INSERT, writer.getContext(), transformedData.getTransformation(), transformedData.getSourceKeyValues(), transformedData.getOldSourceValues(), @@ -65,14 +65,14 @@ protected void performFallbackToInsert(DatabaseWriter writer, CsvData data, Conf } } } else { - super.performFallbackToInsert(writer, data, conflict); + super.performFallbackToInsert(writer, data, conflict, retransform); } } @Override - protected void performFallbackToUpdate(DatabaseWriter writer, CsvData data, Conflict conflict) { + protected void performFallbackToUpdate(DatabaseWriter writer, CsvData data, Conflict conflict, boolean retransform) { TransformedData transformedData = data.getAttribute(TransformedData.class.getName()); - if (transformedData != null) { + if (transformedData != null && retransform) { List newlyTransformedDatas = transformWriter.transform( DataEventType.UPDATE, writer.getContext(), transformedData.getTransformation(), transformedData.getSourceKeyValues(), transformedData.getOldSourceValues(), @@ -86,7 +86,7 @@ protected void performFallbackToUpdate(DatabaseWriter writer, CsvData data, Conf } } } else { - super.performFallbackToUpdate(writer, data, conflict); + super.performFallbackToUpdate(writer, data, conflict, retransform); } }