Skip to content

Commit c145070

Browse files
Avoid undue cache misses
Some caches Put implementations checks if the item is already cached, removed it if present, then re-insert it. This is fundamentally non-thread safe, and can cause undue cache misses. Instead, use directly methods having an "add or update" semantic.
1 parent 5c6f609 commit c145070

File tree

6 files changed

+429
-428
lines changed

6 files changed

+429
-428
lines changed

RtMemoryCache/NHibernate.Caches.RtMemoryCache/NHibernate.Caches.RtMemoryCache.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
<SignAssembly>True</SignAssembly>
99
<AssemblyOriginatorKeyFile>..\..\NHibernate.Caches.snk</AssemblyOriginatorKeyFile>
1010
<GenerateDocumentationFile>true</GenerateDocumentationFile>
11-
<PackageReleaseNotes>* Task
11+
<PackageReleaseNotes>* Bug
12+
* #48 - Avoid undue cache misses
13+
14+
* Task
1215
* #46 - Update NHibernate to 5.1.0</PackageReleaseNotes>
1316
</PropertyGroup>
1417
<ItemGroup>

RtMemoryCache/NHibernate.Caches.RtMemoryCache/RtMemoryCache.cs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -214,24 +214,20 @@ public void Put(object key, object value)
214214
throw new ArgumentNullException(nameof(value), "null value not allowed");
215215
}
216216
var cacheKey = GetCacheKey(key);
217-
if (_cache[cacheKey] != null)
217+
if (Log.IsDebugEnabled())
218218
{
219-
Log.Debug("updating value of key '{0}' to '{1}'.", cacheKey, value);
220-
221-
// Remove the key to re-add it again below
222-
_cache.Remove(cacheKey);
223-
}
224-
else
225-
{
226-
Log.Debug("adding new data: key={0}&value={1}", cacheKey, value);
219+
Log.Debug(
220+
_cache[cacheKey] != null
221+
? "updating value of key '{0}' to '{1}'."
222+
: "adding new data: key={0}&value={1}", cacheKey, value);
227223
}
228224

229225
if (!_rootCacheKeyStored)
230226
{
231227
StoreRootCacheKey();
232228
}
233229

234-
_cache.Add(cacheKey, new DictionaryEntry(key, value),
230+
_cache.Set(cacheKey, new DictionaryEntry(key, value),
235231
new CacheItemPolicy
236232
{
237233
AbsoluteExpiration = UseSlidingExpiration ? ObjectCache.InfiniteAbsoluteExpiration : DateTimeOffset.UtcNow.Add(Expiration),
Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,36 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
2-
<Import Project="../../NHibernate.Caches.props" />
3-
<PropertyGroup>
4-
<Product>NHibernate.Caches.SysCache</Product>
5-
<Title>NHibernate.Caches.SysCache</Title>
6-
<Description>Cache provider for NHibernate using ASP.NET Cache object.</Description>
7-
<TargetFramework>net461</TargetFramework>
8-
<SignAssembly>True</SignAssembly>
9-
<AssemblyOriginatorKeyFile>..\..\NHibernate.Caches.snk</AssemblyOriginatorKeyFile>
10-
<GenerateDocumentationFile>true</GenerateDocumentationFile>
11-
<PackageReleaseNotes>* Task
12-
* #46 - Update NHibernate to 5.1.0</PackageReleaseNotes>
13-
</PropertyGroup>
14-
<ItemGroup>
15-
<None Include="..\..\NHibernate.Caches.snk" Link="NHibernate.snk" />
16-
<None Include="..\default.build" Link="default.build" />
17-
</ItemGroup>
18-
<ItemGroup>
19-
<PackageReference Include="NHibernate" Version="5.1.0" />
20-
</ItemGroup>
21-
<ItemGroup>
22-
<Reference Include="System.Configuration" />
23-
<Reference Include="System.Web" />
24-
</ItemGroup>
25-
<ItemGroup>
26-
<Content Include="../../readme.md">
27-
<PackagePath>./NHibernate.Caches.readme.md</PackagePath>
28-
</Content>
29-
<Content Include="../../LICENSE.txt">
30-
<PackagePath>./NHibernate.Caches.license.txt</PackagePath>
31-
</Content>
32-
</ItemGroup>
33-
</Project>
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<Import Project="../../NHibernate.Caches.props" />
3+
<PropertyGroup>
4+
<Product>NHibernate.Caches.SysCache</Product>
5+
<Title>NHibernate.Caches.SysCache</Title>
6+
<Description>Cache provider for NHibernate using ASP.NET Cache object.</Description>
7+
<TargetFramework>net461</TargetFramework>
8+
<SignAssembly>True</SignAssembly>
9+
<AssemblyOriginatorKeyFile>..\..\NHibernate.Caches.snk</AssemblyOriginatorKeyFile>
10+
<GenerateDocumentationFile>true</GenerateDocumentationFile>
11+
<PackageReleaseNotes>* Bug
12+
* #48 - Avoid undue cache misses
13+
14+
* Task
15+
* #46 - Update NHibernate to 5.1.0</PackageReleaseNotes>
16+
</PropertyGroup>
17+
<ItemGroup>
18+
<None Include="..\..\NHibernate.Caches.snk" Link="NHibernate.snk" />
19+
<None Include="..\default.build" Link="default.build" />
20+
</ItemGroup>
21+
<ItemGroup>
22+
<PackageReference Include="NHibernate" Version="5.1.0" />
23+
</ItemGroup>
24+
<ItemGroup>
25+
<Reference Include="System.Configuration" />
26+
<Reference Include="System.Web" />
27+
</ItemGroup>
28+
<ItemGroup>
29+
<Content Include="../../readme.md">
30+
<PackagePath>./NHibernate.Caches.readme.md</PackagePath>
31+
</Content>
32+
<Content Include="../../LICENSE.txt">
33+
<PackagePath>./NHibernate.Caches.license.txt</PackagePath>
34+
</Content>
35+
</ItemGroup>
36+
</Project>

0 commit comments

Comments
 (0)