From ed287a491d7964c2e46d1e8169a6f6ff9974afb5 Mon Sep 17 00:00:00 2001 From: Chris Henson Date: Wed, 14 Dec 2016 19:34:17 -0600 Subject: [PATCH] 0002944: Attempt to recover if sym_trigger_hist is deleted. If the table and trigger can be found then recreate the row. --- .../symmetric/model/TriggerReBuildReason.java | 3 ++- .../symmetric/service/impl/DataService.java | 25 +++++++++++++++++-- .../service/impl/TriggerRouterService.java | 4 ++- symmetric-server/.gitignore | 1 + symmetric-server/src/.gitignore | 1 + symmetric-server/src/main/.gitignore | 1 + symmetric-server/src/main/deploy/.gitignore | 1 + 7 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 symmetric-server/src/.gitignore create mode 100644 symmetric-server/src/main/.gitignore create mode 100644 symmetric-server/src/main/deploy/.gitignore diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/model/TriggerReBuildReason.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/model/TriggerReBuildReason.java index 6cd8bf6975..ca810c8cd7 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/model/TriggerReBuildReason.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/model/TriggerReBuildReason.java @@ -31,7 +31,8 @@ public enum TriggerReBuildReason { TABLE_SYNC_CONFIGURATION_CHANGED("C"), FORCED("F"), TRIGGERS_MISSING("T"), - TRIGGER_TEMPLATE_CHANGED("E"); + TRIGGER_TEMPLATE_CHANGED("E"), + TRIGGER_HIST_MISSIG("H"); private String code; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataService.java index aaee39a31b..cef3d8efb7 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/DataService.java @@ -81,6 +81,7 @@ import org.jumpmind.symmetric.model.TableReloadRequestKey; import org.jumpmind.symmetric.model.Trigger; import org.jumpmind.symmetric.model.TriggerHistory; +import org.jumpmind.symmetric.model.TriggerReBuildReason; import org.jumpmind.symmetric.model.TriggerRouter; import org.jumpmind.symmetric.service.ClusterConstants; import org.jumpmind.symmetric.service.IDataService; @@ -2092,7 +2093,8 @@ public Data mapRow(Row row) { data.putCsvData(CsvData.OLD_DATA, row.getString("OLD_DATA", false)); data.putAttribute(CsvData.ATTRIBUTE_CHANNEL_ID, row.getString("CHANNEL_ID")); data.putAttribute(CsvData.ATTRIBUTE_TX_ID, row.getString("TRANSACTION_ID", false)); - data.putAttribute(CsvData.ATTRIBUTE_TABLE_NAME, row.getString("TABLE_NAME")); + String tableName = row.getString("TABLE_NAME"); + data.putAttribute(CsvData.ATTRIBUTE_TABLE_NAME, tableName); data.setDataEventType(DataEventType.getEventType(row.getString("EVENT_TYPE"))); data.putAttribute(CsvData.ATTRIBUTE_SOURCE_NODE_ID, row.getString("SOURCE_NODE_ID")); data.putAttribute(CsvData.ATTRIBUTE_EXTERNAL_DATA, row.getString("EXTERNAL_DATA")); @@ -2105,7 +2107,26 @@ public Data mapRow(Row row) { TriggerHistory triggerHistory = engine.getTriggerRouterService().getTriggerHistory( triggerHistId); if (triggerHistory == null) { - triggerHistory = new TriggerHistory(triggerHistId); + Table table = platform.getTableFromCache(null, null, tableName, true); + Trigger trigger = null; + List triggerRouters = engine.getTriggerRouterService().getAllTriggerRoutersForCurrentNode(engine.getNodeService().findIdentity().getNodeGroupId()); + for (TriggerRouter triggerRouter : triggerRouters) { + if (triggerRouter.getTrigger().getSourceTableName().equalsIgnoreCase(tableName)) { + trigger = triggerRouter.getTrigger(); + break; + } + } + + if (table != null && trigger != null) { + triggerHistory = new TriggerHistory(table, trigger, engine.getSymmetricDialect().getTriggerTemplate()); + triggerHistory.setTriggerHistoryId(triggerHistId); + triggerHistory.setLastTriggerBuildReason(TriggerReBuildReason.TRIGGER_HIST_MISSIG); + engine.getTriggerRouterService().insert(triggerHistory); + log.warn("Could not find a trigger history row for the table {} for data_id {}. \"Attempting\" to generate a new trigger history row", tableName, data.getDataId()); + } else { + log.warn("A captured data row could not be matched with an existing trigger history row and we could not find a matching trigger. The data_id of {} will be ignored", data.getDataId()); + return null; + } } else { if (!triggerHistory.getSourceTableName().equals(data.getTableName())) { log.warn("There was a mismatch between the data table name {} and the trigger_hist " diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java index 054d56ea2e..dff3cd33b2 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java @@ -955,7 +955,9 @@ public Map> getTriggerRoutersByChannel(String nodeGr } public void insert(TriggerHistory newHistRecord) { - newHistRecord.setTriggerHistoryId((int)sequenceService.nextVal(Constants.SEQUENCE_TRIGGER_HIST)); + if (newHistRecord.getTriggerHistoryId() <= 0) { + newHistRecord.setTriggerHistoryId((int)sequenceService.nextVal(Constants.SEQUENCE_TRIGGER_HIST)); + } historyMap.put(newHistRecord.getTriggerHistoryId(), newHistRecord); sqlTemplate.update( getSql("insertTriggerHistorySql"), diff --git a/symmetric-server/.gitignore b/symmetric-server/.gitignore index 0e000bff73..03b5ded534 100644 --- a/symmetric-server/.gitignore +++ b/symmetric-server/.gitignore @@ -3,3 +3,4 @@ *.settings /target /bin/ +/.DS_Store diff --git a/symmetric-server/src/.gitignore b/symmetric-server/src/.gitignore new file mode 100644 index 0000000000..9bb88d3761 --- /dev/null +++ b/symmetric-server/src/.gitignore @@ -0,0 +1 @@ +/.DS_Store diff --git a/symmetric-server/src/main/.gitignore b/symmetric-server/src/main/.gitignore new file mode 100644 index 0000000000..9bb88d3761 --- /dev/null +++ b/symmetric-server/src/main/.gitignore @@ -0,0 +1 @@ +/.DS_Store diff --git a/symmetric-server/src/main/deploy/.gitignore b/symmetric-server/src/main/deploy/.gitignore new file mode 100644 index 0000000000..9bb88d3761 --- /dev/null +++ b/symmetric-server/src/main/deploy/.gitignore @@ -0,0 +1 @@ +/.DS_Store