long now = DateUtils.getDate( DateUtils.getGeneralizedTime() ).getTime();
long maxIdleTime = log.getMaxIdlePeriod() * 1000L;
long lastUpdatedTime = new Csn( lastSentCsn ).getTimestamp();
LOG.debug( "checking log idle time now={} lastUpdatedTime={} maxIdleTime={}", now,
lastUpdatedTime, maxIdleTime );
if ( ( now - lastUpdatedTime ) >= maxIdleTime )
{
//max idle time of the event log reached, delete it
removeEventLog( log );
// delete the associated entry from DiT, note that ConsumerLogEntryDeleteListener
// will get called eventually but removeEventLog() will not be called cause by
// that time this log will not be present in replicaLogMap
// The reason we don't call this method first is to guard against any rename
// operation performed on the log's entry in DiT
try
{
directoryService.getAdminSession().delete( log.getConsumerEntryDn() );
}
catch ( LdapException e )
{
LOG.warn( "Failed to delete the entry {} of replica event log {}",
log.getConsumerEntryDn(), log.getName(), e );
}
continue;
}
long thresholdCount = log.getPurgeThresholdCount();
if ( log.count() < thresholdCount )
{
continue;
}
LOG.debug( "starting to purge the log entries that are older than {} milliseconds",
thresholdTime );
long deleteCount = 0;
ReplicaJournalCursor cursor = log.getCursor( null ); // pass no CSN
cursor.skipQualifyingWhileFetching();
while ( cursor.next() )
{
ReplicaEventMessage message = cursor.get();
String csnVal = message.getEntry().get( SchemaConstants.ENTRY_CSN_AT ).getString();
// skip if we reach the lastSentCsn or got past it
if ( csnVal.compareTo( lastSentCsn ) >= 0 )
{
break;
}
Csn csn = new Csn( csnVal );
if ( ( now - csn.getTimestamp() ) >= thresholdTime )
{
cursor.delete();
deleteCount++;
}
}