From 7b82f2f1bf4936159c58d759419aa0da6997bb66 Mon Sep 17 00:00:00 2001 From: elong Date: Fri, 8 Apr 2016 11:22:16 -0400 Subject: [PATCH] 0002526: Improve performance of data gap detection --- .../symmetric/route/DataGapDetectorTest.java | 134 +++++++++++++++++- 1 file changed, 133 insertions(+), 1 deletion(-) diff --git a/symmetric-core/src/test/java/org/jumpmind/symmetric/route/DataGapDetectorTest.java b/symmetric-core/src/test/java/org/jumpmind/symmetric/route/DataGapDetectorTest.java index dfe301c192..75a47ec3a8 100644 --- a/symmetric-core/src/test/java/org/jumpmind/symmetric/route/DataGapDetectorTest.java +++ b/symmetric-core/src/test/java/org/jumpmind/symmetric/route/DataGapDetectorTest.java @@ -7,6 +7,7 @@ import static org.mockito.Mockito.when; import java.util.ArrayList; +import java.util.Date; import java.util.List; import org.jumpmind.db.platform.DatabaseInfo; @@ -105,7 +106,7 @@ protected void runGapDetector(List dataGaps, List dataIds, boolea DataGapFastDetector detector = newGapDetector(); detector.beforeRouting(); detector.addDataIds(dataIds); - detector.setIsAllDataRead(true); + detector.setIsAllDataRead(isAllDataRead); detector.afterRouting(); } @@ -126,4 +127,135 @@ public void testNewGap() throws Exception { verify(dataService).insertDataGap(new DataGap(101, 50000100)); verifyNoMoreInteractions(dataService); } + + @Test + public void testTwoNewGaps() throws Exception { + List dataGaps = new ArrayList(); + dataGaps.add(new DataGap(3, 3)); + dataGaps.add(new DataGap(4, 50000004)); + + List dataIds = new ArrayList(); + dataIds.add(5L); + dataIds.add(8L); + + runGapDetector(dataGaps, dataIds, true); + + verify(dataService).findDataGaps(); + verify(dataService).deleteDataGap(sqlTransaction, new DataGap(4, 50000004)); + verify(dataService).insertDataGap(sqlTransaction, new DataGap(4, 4)); + verify(dataService).insertDataGap(sqlTransaction, new DataGap(6, 7)); + verify(dataService).insertDataGap(new DataGap(9, 50000008)); + verifyNoMoreInteractions(dataService); + } + + @Test + public void testGapInGap() throws Exception { + List dataGaps = new ArrayList(); + dataGaps.add(new DataGap(3, 3)); + dataGaps.add(new DataGap(5, 10)); + dataGaps.add(new DataGap(15, 20)); + dataGaps.add(new DataGap(21, 50000020)); + + List dataIds = new ArrayList(); + dataIds.add(6L); + dataIds.add(18L); + dataIds.add(23L); + + runGapDetector(dataGaps, dataIds, true); + + verify(dataService).findDataGaps(); + verify(dataService).deleteDataGap(sqlTransaction, new DataGap(5, 10)); + verify(dataService).insertDataGap(sqlTransaction, new DataGap(5, 5)); + verify(dataService).insertDataGap(sqlTransaction, new DataGap(7, 10)); + verify(dataService).deleteDataGap(sqlTransaction, new DataGap(15, 20)); + verify(dataService).insertDataGap(sqlTransaction, new DataGap(15, 17)); + verify(dataService).insertDataGap(sqlTransaction, new DataGap(19, 20)); + verify(dataService).deleteDataGap(sqlTransaction, new DataGap(21, 50000020)); + verify(dataService).insertDataGap(sqlTransaction, new DataGap(21, 22)); + verify(dataService).insertDataGap(new DataGap(24, 50000023)); + verifyNoMoreInteractions(dataService); + } + + @Test + public void testGapExpire() throws Exception { + List dataGaps = new ArrayList(); + dataGaps.add(new DataGap(3, 3)); + dataGaps.add(new DataGap(5, 6)); + dataGaps.add(new DataGap(7, 50000006)); + + List dataIds = new ArrayList(); + + when(symmetricDialect.getDatabaseTime()).thenReturn(System.currentTimeMillis() + 60001L); + when(dataService.countDataInRange(4, 7)).thenReturn(1); + runGapDetector(dataGaps, dataIds, true); + + verify(dataService).findDataGaps(); + verify(dataService).countDataInRange(2, 4); + verify(dataService).countDataInRange(4, 7); + verify(dataService).deleteDataGap(sqlTransaction, new DataGap(3, 3)); + verifyNoMoreInteractions(dataService); + } + + @Test + public void testGapExpireBusyChannel() throws Exception { + List dataGaps = new ArrayList(); + dataGaps.add(new DataGap(3, 3)); + dataGaps.add(new DataGap(5, 6)); + dataGaps.add(new DataGap(7, 50000006)); + + List dataIds = new ArrayList(); + + when(symmetricDialect.getDatabaseTime()).thenReturn(System.currentTimeMillis() + 60001L); + when(dataService.countDataInRange(4, 7)).thenReturn(1); + runGapDetector(dataGaps, dataIds, false); + + verify(dataService).findDataGaps(); + verify(dataService).countDataInRange(2, 4); + verify(dataService).countDataInRange(4, 7); + verify(dataService).deleteDataGap(sqlTransaction, new DataGap(3, 3)); + verifyNoMoreInteractions(dataService); + } + + @Test + public void testGapExpireOracle() throws Exception { + List dataGaps = new ArrayList(); + dataGaps.add(new DataGap(3, 3)); + dataGaps.add(new DataGap(5, 6)); + dataGaps.add(new DataGap(7, 50000006)); + + List dataIds = new ArrayList(); + + when(symmetricDialect.supportsTransactionViews()).thenReturn(true); + when(symmetricDialect.getEarliestTransactionStartTime()).thenReturn(new Date(System.currentTimeMillis() + 60001L)); + when(dataService.countDataInRange(4, 7)).thenReturn(1); + runGapDetector(dataGaps, dataIds, true); + + verify(dataService).findDataGaps(); + verify(dataService).countDataInRange(2, 4); + verify(dataService).countDataInRange(4, 7); + verify(dataService).deleteDataGap(sqlTransaction, new DataGap(3, 3)); + verifyNoMoreInteractions(dataService); + } + + @Test + public void testGapExpireOracleBusyChannel() throws Exception { + List dataGaps = new ArrayList(); + dataGaps.add(new DataGap(3, 3)); + dataGaps.add(new DataGap(5, 6)); + dataGaps.add(new DataGap(7, 50000006)); + + List dataIds = new ArrayList(); + + when(symmetricDialect.supportsTransactionViews()).thenReturn(true); + when(symmetricDialect.getEarliestTransactionStartTime()).thenReturn(new Date(System.currentTimeMillis() + 60001L)); + when(dataService.countDataInRange(4, 7)).thenReturn(1); + runGapDetector(dataGaps, dataIds, false); + + verify(dataService).findDataGaps(); + verify(dataService).countDataInRange(2, 4); + verify(dataService).countDataInRange(4, 7); + verify(dataService).deleteDataGap(sqlTransaction, new DataGap(3, 3)); + verifyNoMoreInteractions(dataService); + } + }