Skip to content

Commit c56e9d2

Browse files
authored
Merge pull request #56 from cnblogs/enhance-GetValueOrCreateAsync
Catch exception in GetValueOrCreateAsync method
2 parents bbfe81d + 6d41f90 commit c56e9d2

File tree

7 files changed

+85
-78
lines changed

7 files changed

+85
-78
lines changed

Enyim.Caching.Tests/Enyim.Caching.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<ItemGroup>
77
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.0" />
88
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.0" />
9+
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.1.0" />
910
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.2" />
1011
<PackageReference Include="xunit" Version="2.3.1" />
1112
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />

Enyim.Caching.Tests/MemcachedClientTestsBase.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Xunit;
99
using Microsoft.Extensions.DependencyInjection;
1010
using Microsoft.Extensions.Configuration;
11+
using Microsoft.Extensions.Logging;
1112

1213
namespace Enyim.Caching.Tests
1314
{
@@ -18,10 +19,8 @@ public abstract class MemcachedClientTestsBase
1819
public MemcachedClientTestsBase()
1920
{
2021
IServiceCollection services = new ServiceCollection();
21-
var configuration = new ConfigurationBuilder().Build();
22-
services.AddSingleton<IConfiguration>(configuration);
2322
services.AddEnyimMemcached(options => options.AddServer("memcached", 11211));
24-
services.AddLogging();
23+
services.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Debug).AddConsole());
2524
IServiceProvider serviceProvider = services.BuildServiceProvider();
2625
_client = serviceProvider.GetService<IMemcachedClient>() as MemcachedClient;
2726
}

Enyim.Caching/Enyim.Caching.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<Description>EnyimMemcachedCore is a Memcached client library for .NET Core. Usage: Add services.AddEnyimMemcached(...) and app.UseEnyimMemcached() in Startup. Add IMemcachedClient into constructor.</Description>
5-
<VersionPrefix>2.1.5</VersionPrefix>
5+
<VersionPrefix>2.1.6</VersionPrefix>
66
<Authors>cnblogs.com</Authors>
77
<TargetFramework>netstandard2.0</TargetFramework>
88
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

Enyim.Caching/MemcachedClient.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,16 +221,30 @@ public async Task<T> GetValueAsync<T>(string key)
221221

222222
public async Task<T> GetValueOrCreateAsync<T>(string key, int cacheSeconds, Func<Task<T>> generator)
223223
{
224-
var result = await GetAsync<T>(key);
225-
if (result.Success)
224+
try
225+
{
226+
var result = await GetAsync<T>(key);
227+
if (result.Success)
228+
{
229+
return result.Value;
230+
}
231+
}
232+
catch (Exception ex)
226233
{
227-
return result.Value;
234+
_logger.LogError(ex, $"{nameof(GetAsync)}<{typeof(T)}>(\"{key}\")");
228235
}
229236

230237
var value = await generator?.Invoke();
231238
if (value != null)
232239
{
233-
await AddAsync(key, value, cacheSeconds);
240+
try
241+
{
242+
await AddAsync(key, value, cacheSeconds);
243+
}
244+
catch(Exception ex)
245+
{
246+
_logger.LogError(ex, $"{nameof(AddAsync)}(\"{key}\", ..., {cacheSeconds})");
247+
}
234248
}
235249
return value;
236250
}

MemcachedTest/FailurePolicyTest.cs

Lines changed: 59 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -9,88 +9,85 @@
99
using Xunit;
1010
using Microsoft.Extensions.DependencyInjection;
1111
using Microsoft.Extensions.Logging;
12-
using Microsoft.Extensions.Configuration;
1312

1413
namespace MemcachedTest
1514
{
16-
public class FailurePolicyTest
17-
{
18-
[Fact]
19-
public void TestIfCalled()
20-
{
21-
IServiceProvider serviceProvider = getServiceProvider();
15+
public class FailurePolicyTest
16+
{
17+
[Fact]
18+
public void TestIfCalled()
19+
{
20+
IServiceCollection services = new ServiceCollection();
21+
services.AddEnyimMemcached(options => options.AddServer("memcached", 11212));
22+
services.AddLogging();
23+
IServiceProvider serviceProvider = services.BuildServiceProvider();
24+
2225
var config = serviceProvider.GetService<IMemcachedClientConfiguration>();
2326
config.SocketPool.FailurePolicyFactory = new FakePolicy();
2427
config.SocketPool.ConnectionTimeout = TimeSpan.FromSeconds(1);
2528
config.SocketPool.ReceiveTimeout = TimeSpan.FromSeconds(1);
2629

2730
var logger = serviceProvider.GetService<ILoggerFactory>();
2831

29-
var client = new MemcachedClient(logger, config);
32+
var client = new MemcachedClient(logger, config);
3033

3134
Assert.Null(client.Get("a"));
32-
}
33-
34-
class FakePolicy : INodeFailurePolicy, INodeFailurePolicyFactory
35-
{
36-
bool INodeFailurePolicy.ShouldFail()
37-
{
38-
Assert.True(true);
39-
40-
return true;
41-
}
42-
43-
INodeFailurePolicy INodeFailurePolicyFactory.Create(IMemcachedNode node)
44-
{
45-
return new FakePolicy();
46-
}
47-
}
48-
49-
[Fact]
50-
public void TestThrottlingFailurePolicy()
51-
{
52-
var serviceProvider = getServiceProvider();
53-
var config = serviceProvider.GetService<IMemcachedClientConfiguration>();
54-
config.SocketPool.FailurePolicyFactory = new ThrottlingFailurePolicyFactory(4, TimeSpan.FromMilliseconds(2000));
55-
config.SocketPool.ConnectionTimeout = TimeSpan.FromMilliseconds(5);
56-
config.SocketPool.ReceiveTimeout = TimeSpan.FromMilliseconds(5);
57-
config.SocketPool.MinPoolSize = 1;
58-
config.SocketPool.MaxPoolSize = 1;
35+
}
36+
37+
class FakePolicy : INodeFailurePolicy, INodeFailurePolicyFactory
38+
{
39+
bool INodeFailurePolicy.ShouldFail()
40+
{
41+
Assert.True(true);
42+
43+
return true;
44+
}
45+
46+
INodeFailurePolicy INodeFailurePolicyFactory.Create(IMemcachedNode node)
47+
{
48+
return new FakePolicy();
49+
}
50+
}
51+
52+
[Fact]
53+
public void TestThrottlingFailurePolicy()
54+
{
55+
IServiceCollection services = new ServiceCollection();
56+
services.AddEnyimMemcached(options => options.AddServer("localhost", 11212));
57+
services.AddLogging();
58+
IServiceProvider serviceProvider = services.BuildServiceProvider();
59+
60+
var config = serviceProvider.GetService<IMemcachedClientConfiguration>();
61+
config.SocketPool.FailurePolicyFactory = new ThrottlingFailurePolicyFactory(4, TimeSpan.FromMilliseconds(2000));
62+
config.SocketPool.ConnectionTimeout = TimeSpan.FromMilliseconds(5);
63+
config.SocketPool.ReceiveTimeout = TimeSpan.FromMilliseconds(5);
64+
config.SocketPool.MinPoolSize = 1;
65+
config.SocketPool.MaxPoolSize = 1;
5966

6067
var logger = serviceProvider.GetService<ILoggerFactory>();
6168
var client = new MemcachedClient(logger, config);
6269
var canFail = false;
63-
var didFail = false;
70+
var didFail = false;
6471

65-
client.NodeFailed += node =>
66-
{
67-
Assert.True(canFail, "canfail");
72+
client.NodeFailed += node =>
73+
{
74+
Assert.True(canFail, "canfail");
6875

69-
didFail = true;
70-
};
76+
didFail = true;
77+
};
7178

72-
Assert.Null(client.Get("a"));
73-
Assert.Null(client.Get("a"));
79+
Assert.Null(client.Get("a"));
80+
Assert.Null(client.Get("a"));
7481

75-
canFail = true;
76-
Thread.Sleep(2000);
82+
canFail = true;
83+
Thread.Sleep(2000);
7784

78-
Assert.Null(client.Get("a"));
79-
Assert.Null(client.Get("a"));
80-
Assert.Null(client.Get("a"));
81-
Assert.Null(client.Get("a"));
85+
Assert.Null(client.Get("a"));
86+
Assert.Null(client.Get("a"));
87+
Assert.Null(client.Get("a"));
88+
Assert.Null(client.Get("a"));
8289

83-
Assert.True(didFail, "didfail");
84-
}
85-
86-
private ServiceProvider getServiceProvider()
87-
{
88-
IServiceCollection services = new ServiceCollection();
89-
var configuration = new ConfigurationBuilder().Build();
90-
services.AddSingleton<IConfiguration>(configuration);
91-
services.AddEnyimMemcached(options => options.AddServer("localhost", 11212));
92-
services.AddLogging();
93-
return services.BuildServiceProvider();
94-
}
95-
}
90+
Assert.True(didFail, "didfail");
91+
}
92+
}
9693
}

MemcachedTest/MemcachedClientTest.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
using Microsoft.Extensions.Logging;
1010
using System.Threading.Tasks;
1111
using System.Linq;
12-
using Microsoft.Extensions.Configuration;
13-
using System.IO;
1412

1513
namespace MemcachedTest
1614
{
@@ -31,13 +29,11 @@ protected virtual MemcachedClient GetClient(MemcachedProtocol protocol = Memcach
3129
// options.Transcoder = "BinaryFormatterTranscoder";
3230
//}
3331
});
34-
if (useBinaryFormatterTranscoder)
32+
if(useBinaryFormatterTranscoder)
3533
{
36-
services.AddSingleton<ITranscoder, BinaryFormatterTranscoder>();
34+
services.AddSingleton<ITranscoder,BinaryFormatterTranscoder>();
3735
}
3836

39-
var configuration = new ConfigurationBuilder().Build();
40-
services.AddSingleton<IConfiguration>(configuration);
4137
services.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Error).AddConsole());
4238

4339
IServiceProvider serviceProvider = services.BuildServiceProvider();

test.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
#!/usr/bin/env bash
2-
dotnet test Enyim.Caching.Tests/Enyim.Caching.Tests.csproj -c Release
3-
dotnet test MemcachedTest/MemcachedTest.csproj -c Release
2+
dotnet test Enyim.Caching.Tests/Enyim.Caching.Tests.csproj -c Release -v normal
3+
dotnet test MemcachedTest/MemcachedTest.csproj -c Release -v normal

0 commit comments

Comments
 (0)