@@ -87,6 +87,7 @@ public PurgeService(IParameterService parameterService, ISymmetricDialect symmet
8787 setSqlMap (new PurgeServiceSqlMap (symmetricDialect .getPlatform (), createSqlReplacementTokens ()));
8888 }
8989
90+ @ Override
9091 public long purgeOutgoing (boolean force ) {
9192 long rowsPurged = 0 ;
9293 long startTime = System .currentTimeMillis ();
@@ -115,6 +116,7 @@ public long purgeOutgoing(boolean force) {
115116 return rowsPurged ;
116117 }
117118
119+ @ Override
118120 public long purgeIncoming (boolean force ) {
119121 long rowsPurged = 0 ;
120122 Calendar retentionCutoff = Calendar .getInstance ();
@@ -123,6 +125,7 @@ public long purgeIncoming(boolean force) {
123125 return rowsPurged ;
124126 }
125127
128+ @ Override
126129 public long purgeOutgoing (Calendar retentionCutoff , boolean force ) {
127130 long rowsPurged = 0 ;
128131 if (force || clusterService .lock (ClusterConstants .PURGE_OUTGOING )) {
@@ -455,15 +458,22 @@ private int purgeDataGapsExpired(OutgoingContext context) {
455458 long ts = System .currentTimeMillis ();
456459 int [] argTypes = new int [] { symmetricDialect .getSqlTypeForIds (), symmetricDialect .getSqlTypeForIds () };
457460 for (DataGap gap : dataGapsExpiredToCheck ) {
458- int count = dataService .reCaptureData (gap .getStartId (), gap .getEndId ());
461+ Object [] args = new Object [] { gap .getStartId (), gap .getEndId () };
462+ if (parameterService .is (ParameterConstants .PURGE_STRANDED_DATA_RECAPTURE_ENABLED )) {
463+ int recapturedRowCount = dataService .reCaptureData (gap .getStartId (), gap .getEndId ());
464+ if (log .isDebugEnabled ()) {
465+ log .debug ("Recaptured {} rows of stranded data for gap {} - {}" , recapturedRowCount , gap .getStartId (), gap .getEndId ());
466+ }
467+ } else if (log .isDebugEnabled ()) {
468+ log .debug ("Skipped recapture of stranded data for gap {} - {}" , gap .getStartId (), gap .getEndId ());
469+ }
470+ int count = sqlTemplate .update (getSql ("deleteDataByRangeSql" ), args , argTypes );
459471 purgedDataRowCount += count ;
460472 statisticManager .incrementPurgedExpiredDataRows (count );
461- Object [] args = new Object [] { gap .getStartId (), gap .getEndId () };
462- sqlTemplate .update (getSql ("deleteDataByRangeSql" ), args , argTypes );
463473 purgedDataGapCount ++;
464474 checkedDataGapCount ++;
465- if (System .currentTimeMillis () - ts > 60000 ) {
466- log .info ("Checked {} expired data gaps" , checkedDataGapCount );
475+ if (System .currentTimeMillis () - ts > DateUtils . MILLIS_PER_MINUTE ) {
476+ log .info ("Checked {} expired data gaps. Deleted {} data rows. " , checkedDataGapCount , count );
467477 ts = System .currentTimeMillis ();
468478 }
469479 }
@@ -646,7 +656,12 @@ private int purgeByMinMax(long[] minMax, MinMaxDeleteSql identifier, OutgoingCon
646656 }
647657 args = new Object [] { minId = minMaxAvoidGaps [0 ], maxId = minMaxAvoidGaps [1 ], cutoffTime };
648658 argTypes = new int [] { idSqlType , idSqlType , Types .TIMESTAMP };
649- dataService .reCaptureData (minId , maxId );
659+ if (parameterService .is (ParameterConstants .PURGE_STRANDED_DATA_RECAPTURE_ENABLED )) {
660+ int recapturedRowCount = dataService .reCaptureData (minId , maxId );
661+ log .debug ("Recaptured {} stranded data rows for range {} - {}" , recapturedRowCount , minId , maxId );
662+ } else if (log .isDebugEnabled ()) {
663+ log .debug ("Skipped recapture of stranded data for range {} - {}" , minId , maxId );
664+ }
650665 break ;
651666 case STRANDED_DATA_EVENT :
652667 deleteSql = getSql ("deleteStrandedDataEvent" );
@@ -659,11 +674,21 @@ private int purgeByMinMax(long[] minMax, MinMaxDeleteSql identifier, OutgoingCon
659674 log .debug ("Deleted {} rows" , count );
660675 statConsumer .accept (count );
661676 totalCount += count ;
677+ long currentRunTimeMs = System .currentTimeMillis () - ts ;
662678 if (count == 0 && (identifier == MinMaxDeleteSql .STRANDED_DATA || identifier == MinMaxDeleteSql .STRANDED_DATA_EVENT )) {
663- log .info ("Ending purge of {} early at {} after finding empty space" , name , maxId );
664- break ;
679+ long runtimeLimit = parameterService .getLong (ParameterConstants .PURGE_STRANDED_DATA_TIME_LIMIT_MS );
680+ if (runtimeLimit > 0 && currentRunTimeMs >= runtimeLimit ) {
681+ log .info ("Ending purge of {} early at {} after finding empty space. Total rows purged={}" , name , maxId , totalCount );
682+ break ;
683+ } else {
684+ if (currentRunTimeMs > DateUtils .MILLIS_PER_MINUTE * 5 ) {
685+ log .info ("Skipping empty space in {} for range {} - {}" , name , minId , maxId );
686+ } else {
687+ log .debug ("Skipping empty space in {} for range {} - {}. Total rows purged={}" , name , minId , maxId , totalCount );
688+ }
689+ }
665690 }
666- if (System . currentTimeMillis () - ts > DateUtils .MILLIS_PER_MINUTE * 5 ) {
691+ if (currentRunTimeMs > DateUtils .MILLIS_PER_MINUTE * 5 ) {
667692 log .info ("Purged {} of {} rows so far using {} statements" , new Object [] { totalCount , name , totalDeleteStmts });
668693 ts = System .currentTimeMillis ();
669694 clusterService .refreshLock (ClusterConstants .PURGE_OUTGOING );
@@ -747,6 +772,7 @@ public static long[] getMinMaxAvoidGaps(long minId, long maxId, List<DataGap> da
747772 return new long [] { minId , maxId };
748773 }
749774
775+ @ Override
750776 public long purgeIncoming (Calendar retentionCutoff , boolean force ) {
751777 long purgedRowCount = 0 ;
752778 long startTime = System .currentTimeMillis ();
@@ -807,6 +833,7 @@ private long purgeIncomingBatch(final Calendar time) {
807833 log .info ("Getting range for incoming batch" );
808834 List <NodeBatchRange > nodeBatchRangeList = sqlTemplateDirty .query (
809835 getSql ("selectIncomingBatchRangeSql" ), new ISqlRowMapper <NodeBatchRange >() {
836+ @ Override
810837 public NodeBatchRange mapRow (Row rs ) {
811838 return new NodeBatchRange (rs .getString ("node_id" ), rs .getLong ("min_id" ), rs
812839 .getLong ("max_id" ));
@@ -849,6 +876,7 @@ private int purgeByNodeBatchRangeList(List<NodeBatchRange> nodeBatchRangeList) {
849876 return totalCount ;
850877 }
851878
879+ @ Override
852880 public void purgeStats (boolean force ) {
853881 Calendar retentionCutoff = Calendar .getInstance ();
854882 retentionCutoff .add (Calendar .MINUTE ,
@@ -872,6 +900,7 @@ public void purgeStats(boolean force) {
872900 }
873901 }
874902
903+ @ Override
875904 public void purgeAllIncomingEventsForNode (String nodeId ) {
876905 int count = sqlTemplate .update (getSql ("deleteIncomingBatchByNodeSql" ),
877906 new Object [] { nodeId });
0 commit comments