private void TimerCallback(object state)
{
if (executing)
return;
executing = true;
try
{
DateTime currentTime = SystemTime.UtcNow;
string nowAsStr = currentTime.ToString(Default.DateTimeFormatsToWrite);
logger.Debug("Trying to find expired documents to delete");
var query = "Expiry:[* TO " + nowAsStr + "]";
var list = new List<string>();
int start = 0;
while (true)
{
const int pageSize = 1024;
QueryResultWithIncludes queryResult;
using (Database.DisableAllTriggersForCurrentThread())
{
queryResult = Database.Query(RavenDocumentsByExpirationDate, new IndexQuery
{
Start = start,
PageSize = pageSize,
Cutoff = currentTime,
Query = query,
FieldsToFetch = new[] { "__document_id" }
});
}
if(queryResult.Results.Count == 0)
break;
start += pageSize;
list.AddRange(queryResult.Results.Select(result => result.Value<string>("__document_id")).Where(x=>string.IsNullOrEmpty(x) == false));
}
if (list.Count == 0)
return;
logger.Debug(
() => string.Format("Deleting {0} expired documents: [{1}]", list.Count, string.Join(", ", list)));
foreach (var id in list)
{
Database.Delete(id, null, null);
}
}
catch (Exception e)
{
logger.ErrorException("Error when trying to find expired documents", e);
}
finally
{
executing = false;
}
}