diff --git a/src/Orleans.Runtime/Catalog/ActivationCollector.cs b/src/Orleans.Runtime/Catalog/ActivationCollector.cs
index 11e1c0781f..72953b5d78 100644
--- a/src/Orleans.Runtime/Catalog/ActivationCollector.cs
+++ b/src/Orleans.Runtime/Catalog/ActivationCollector.cs
@@ -85,7 +85,7 @@ public int GetNumRecentlyUsed(TimeSpan recencyPeriod)
///
/// The current idle collection time for the grain.
///
- public void ScheduleCollection(ICollectibleGrainContext item, TimeSpan timeout)
+ public void ScheduleCollection(ICollectibleGrainContext item, TimeSpan timeout, DateTime now)
{
lock (item)
{
@@ -94,7 +94,7 @@ public void ScheduleCollection(ICollectibleGrainContext item, TimeSpan timeout)
return;
}
- DateTime ticket = MakeTicketFromTimeSpan(timeout);
+ DateTime ticket = MakeTicketFromTimeSpan(timeout, now);
if (default != item.CollectionTicket)
{
@@ -154,7 +154,7 @@ private bool TryRescheduleCollection_Impl(ICollectibleGrainContext item, TimeSpa
if (IsExpired(item.CollectionTicket)) return false;
DateTime oldTicket = item.CollectionTicket;
- DateTime newTicket = MakeTicketFromTimeSpan(timeout);
+ DateTime newTicket = MakeTicketFromTimeSpan(timeout, DateTime.UtcNow);
// if the ticket value doesn't change, then the source and destination bucket are the same and there's nothing to do.
if (newTicket.Equals(oldTicket)) return true;
@@ -239,11 +239,11 @@ public List ScanStale()
{
var keepAliveDuration = activation.KeepAliveUntil - now;
var timeout = TimeSpan.FromTicks(Math.Max(keepAliveDuration.Ticks, activation.CollectionAgeLimit.Ticks));
- ScheduleCollection(activation, timeout);
+ ScheduleCollection(activation, timeout, now);
}
else if (!activation.IsInactive || !activation.IsStale())
{
- ScheduleCollection(activation, activation.CollectionAgeLimit);
+ ScheduleCollection(activation, activation.CollectionAgeLimit, now);
}
else
{
@@ -354,14 +354,14 @@ private DateTime MakeTicketFromDateTime(DateTime timestamp)
return ticket;
}
- private DateTime MakeTicketFromTimeSpan(TimeSpan timeout)
+ private DateTime MakeTicketFromTimeSpan(TimeSpan timeout, DateTime now)
{
if (timeout < quantum)
{
throw new ArgumentException(string.Format("timeout must be at least {0}, but it is {1}", quantum, timeout), nameof(timeout));
}
- return MakeTicketFromDateTime(DateTime.UtcNow + timeout);
+ return MakeTicketFromDateTime(now + timeout);
}
private void Add(ICollectibleGrainContext item, DateTime ticket)
@@ -379,7 +379,7 @@ void IActivationWorkingSetObserver.OnAdded(IActivationWorkingSetMember member)
{
if (activation.CollectionTicket == default)
{
- ScheduleCollection(activation, activation.CollectionAgeLimit);
+ ScheduleCollection(activation, activation.CollectionAgeLimit, DateTime.UtcNow);
}
else
{