Job expiration not respected?

I am using the default SQL Server storage for Hangfire. Since the rate of job creation per-day can be quite high (in the count of hundreds of thousands), the size of the database also grows quite fast.

Initially I thought it will still be fine because Succeeded jobs would be removed after one day. To my surprise, even after several days, the job is not yet removed from Hangfire.Jobs table.

When I ran this query on 30 July 2015:

select min(ExpireAt) from Hangfire.Job
where StateName = 'Succeeded' 

I got 2015-07-21 13:28:27.543, which is about 9 days ago.

I can manually delete the jobs myself or create a batch job that would periodically clean it up, but is there any scenario where the Succeeded job are still retained beyond their ExpireAt?

For illustration. The job was expired 11 days ago, yet it still can be loaded in the dashboard?

Is there any active server? Looks like the ExpirationManager component is not working due to some exception. Please enable logging to get more details.

There is active server, although the server does got rebooted and new code deployed several times. Does it affect the ExpirationManager?

You can check whether ExpirationManager is working, just check the lowest HangFire.Job.Id column value. If it is increasing, then expiration manager does not remove jobs in time. Can you verify this?