Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit 9250765

Browse files
Merge pull request #682 from github-for-unity/fixes/infinite-loop-on-cache-update
Fix an infinite cache invalidation loop
2 parents 1ebe6ca + 697e292 commit 9250765

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ abstract class ManagedCacheBase<T> : ScriptObjectSingleton<T> where T : Scriptab
136136
[SerializeField] private string initializedAtString = DateTimeOffset.MinValue.ToString(Constants.Iso8601Format);
137137
[NonSerialized] private DateTimeOffset? lastUpdatedAtValue;
138138
[NonSerialized] private DateTimeOffset? initializedAtValue;
139+
[NonSerialized] private bool isInvalidating;
139140

140141
public event Action<CacheType> CacheInvalidated;
141142
public event Action<CacheType, DateTimeOffset> CacheUpdated;
@@ -151,7 +152,7 @@ public bool ValidateData()
151152
var isInitialized = IsInitialized;
152153
var timedOut = DateTimeOffset.Now - LastUpdatedAt > DataTimeout;
153154
var needsInvalidation = !isInitialized || timedOut;
154-
if (needsInvalidation)
155+
if (needsInvalidation && !isInvalidating)
155156
{
156157
Logger.Trace("needsInvalidation isInitialized:{0} timedOut:{1}", isInitialized, timedOut);
157158
InvalidateData();
@@ -161,21 +162,27 @@ public bool ValidateData()
161162

162163
public void InvalidateData()
163164
{
164-
Logger.Trace("Invalidate");
165-
LastUpdatedAt = DateTimeOffset.MinValue;
166-
CacheInvalidated.SafeInvoke(CacheType);
165+
if (!isInvalidating)
166+
{
167+
Logger.Trace("Invalidate");
168+
isInvalidating = true;
169+
LastUpdatedAt = DateTimeOffset.MinValue;
170+
CacheInvalidated.SafeInvoke(CacheType);
171+
}
167172
}
168173

169174
protected void SaveData(DateTimeOffset now, bool isChanged)
170175
{
171176
var isInitialized = IsInitialized;
172177
isChanged = isChanged || !isInitialized;
173178

174-
InitializedAt = !isInitialized ? now : InitializedAt;
175-
LastUpdatedAt = isChanged ? now : LastUpdatedAt;
179+
InitializedAt = !isInitialized || InitializedAt == DateTimeOffset.MinValue ? now : InitializedAt;
180+
LastUpdatedAt = isChanged || LastUpdatedAt == DateTimeOffset.MinValue ? now : LastUpdatedAt;
176181

177182
Save(true);
178183

184+
isInvalidating = false;
185+
179186
if (isChanged)
180187
{
181188
Logger.Trace("Updated: {0}", now);

src/tests/IntegrationTests/CachingClasses.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public bool ValidateData()
124124
var isInitialized = IsInitialized;
125125
var timedOut = DateTimeOffset.Now - LastUpdatedAt > DataTimeout;
126126
var needsInvalidation = !isInitialized || timedOut;
127-
if (needsInvalidation)
127+
if (needsInvalidation && !isInvalidating)
128128
{
129129
Logger.Trace("needsInvalidation isInitialized:{0} timedOut:{1}", isInitialized, timedOut);
130130
InvalidateData();
@@ -134,9 +134,9 @@ public bool ValidateData()
134134

135135
public void InvalidateData()
136136
{
137-
Logger.Trace("Invalidate");
138137
if (!isInvalidating)
139138
{
139+
Logger.Trace("Invalidate");
140140
isInvalidating = true;
141141
LastUpdatedAt = DateTimeOffset.MinValue;
142142
CacheInvalidated.SafeInvoke(CacheType);
@@ -148,8 +148,8 @@ protected void SaveData(DateTimeOffset now, bool isChanged)
148148
var isInitialized = IsInitialized;
149149
isChanged = isChanged || !isInitialized;
150150

151-
InitializedAt = !isInitialized ? now : InitializedAt;
152-
LastUpdatedAt = isChanged ? now : LastUpdatedAt;
151+
InitializedAt = !isInitialized || InitializedAt == DateTimeOffset.MinValue ? now : InitializedAt;
152+
LastUpdatedAt = isChanged || LastUpdatedAt == DateTimeOffset.MinValue ? now : LastUpdatedAt;
153153

154154
Save(true);
155155

0 commit comments

Comments
 (0)