aboutsummaryrefslogtreecommitdiff
path: root/plugins/VNLib.Data.Caching.Providers.VNCache/src
diff options
context:
space:
mode:
authorLibravatar vnugent <public@vaughnnugent.com>2024-03-24 21:26:44 -0400
committerLibravatar vnugent <public@vaughnnugent.com>2024-03-24 21:26:44 -0400
commit49c3641def5ae1b7557ed61ed7bb28bbf425ccc9 (patch)
tree4eb1bd863074e64922e35ff730f354ac40528698 /plugins/VNLib.Data.Caching.Providers.VNCache/src
parente5bb0ee302e789cb96e7ecfe839cbbcc8e3fd5d7 (diff)
Squashed commit of the following:
commit a504435151efbe1d19404fa44859b15c629f6d5d Author: vnugent <public@vaughnnugent.com> Date: Sun Mar 24 20:55:01 2024 -0400 chore: Updated compose and added some more logging commit c74440ff12daa03cc4b7792d0c3baad46a11a465 Author: vnugent <public@vaughnnugent.com> Date: Mon Mar 18 21:57:57 2024 -0400 feat: message checksum support & dynamic serializers commit 9983582db08d3e6c456295ea96e482cbb4f31f42 Author: vnugent <public@vaughnnugent.com> Date: Sun Mar 10 21:58:28 2024 -0400 source tree project location updated commit 60f09bde87b5c59ef937c62ef64b7745bc3711b5 Merge: 2f75659 e5bb0ee Author: vnugent <public@vaughnnugent.com> Date: Sun Mar 10 16:50:09 2024 -0400 Merge remote-tracking branch 'origin/master' into develop commit 2f7565976472f0f056db60520bf253a776112c10 Merge: 323ff67 6b87785 Author: vnugent <public@vaughnnugent.com> Date: Sun Mar 10 16:45:23 2024 -0400 merge master commit 323ff67badfc46ad638d75f059d60d9425ccb2fa Author: vnugent <public@vaughnnugent.com> Date: Sun Mar 10 15:50:07 2024 -0400 ci(server): Conainerize and add vncache server packages commit 5d4192880654fd6e00e587814169415b42621327 Author: vnugent <public@vaughnnugent.com> Date: Sat Mar 9 19:13:21 2024 -0500 chore: #2 Minor fixes and polish before release commit a4b3504bb891829074d1efde0433eae010862181 Author: vnugent <public@vaughnnugent.com> Date: Sat Mar 9 16:30:44 2024 -0500 package updates commit 4d8cfc10382105b0acbd94df93ad3d05ff91db54 Author: vnugent <public@vaughnnugent.com> Date: Wed Mar 6 21:30:58 2024 -0500 refactor: #2 Centralize server state, default discovery endpoints & more commit 016a96a80cce025a86c6cf26707738f6a2eb2658 Author: vnugent <public@vaughnnugent.com> Date: Thu Feb 29 21:22:38 2024 -0500 feat: add future support for memory diagnostics, and some docs commit 456ead9bc8b0f61357bae93152ad0403c4940101 Author: vnugent <public@vaughnnugent.com> Date: Tue Feb 13 14:46:35 2024 -0500 fix: #1 shared cluster index on linux & latested core updates commit a481d63f964a5d5204cac2e95141f37f9a28d573 Author: vnugent <public@vaughnnugent.com> Date: Tue Jan 23 15:43:50 2024 -0500 cache extension api tweaks
Diffstat (limited to 'plugins/VNLib.Data.Caching.Providers.VNCache/src')
-rw-r--r--plugins/VNLib.Data.Caching.Providers.VNCache/src/FBMCacheClient.cs30
-rw-r--r--plugins/VNLib.Data.Caching.Providers.VNCache/src/VNCacheBase.cs49
-rw-r--r--plugins/VNLib.Data.Caching.Providers.VNCache/src/VNCacheConfig.cs9
-rw-r--r--plugins/VNLib.Data.Caching.Providers.VNCache/src/VNLib.Data.Caching.Providers.VNCache.csproj2
4 files changed, 65 insertions, 25 deletions
diff --git a/plugins/VNLib.Data.Caching.Providers.VNCache/src/FBMCacheClient.cs b/plugins/VNLib.Data.Caching.Providers.VNCache/src/FBMCacheClient.cs
index 07fc9ee..e84a077 100644
--- a/plugins/VNLib.Data.Caching.Providers.VNCache/src/FBMCacheClient.cs
+++ b/plugins/VNLib.Data.Caching.Providers.VNCache/src/FBMCacheClient.cs
@@ -78,7 +78,8 @@ namespace VNLib.Data.Caching.Providers.VNCache
public FBMCacheClient(PluginBase plugin, IConfigScope config)
: this(
config.Deserialze<VnCacheClientConfig>(),
- plugin.IsDebug() ? plugin.Log : null
+ plugin.IsDebug() ? plugin.Log : null,
+ plugin
)
{
ILogProvider scoped = plugin.Log.CreateScope(LOG_NAME);
@@ -103,7 +104,11 @@ namespace VNLib.Data.Caching.Providers.VNCache
}
}
- public FBMCacheClient(VnCacheClientConfig config, ILogProvider? debugLog):base(config)
+ public FBMCacheClient(VnCacheClientConfig config, ILogProvider? debugLog) : this(config, debugLog, null)
+ { }
+
+
+ private FBMCacheClient(VnCacheClientConfig config, ILogProvider? debugLog, PluginBase? plugin) : base(config)
{
//Validate config
(config as IOnConfigValidation).Validate();
@@ -115,13 +120,13 @@ namespace VNLib.Data.Caching.Providers.VNCache
//Init the client with default settings
FBMClientConfig conf = FBMDataCacheExtensions.GetDefaultConfig(BufferHeap, (int)config.MaxBlobSize, config.RequestTimeout, debugLog);
-
+
FBMClientFactory clientFactory = new(
- in conf,
- new FBMFallbackClientWsFactory(),
+ in conf,
+ new FBMFallbackClientWsFactory(),
10
);
-
+
_cluster = (new CacheClientConfiguration())
.WithTls(config.UseTls)
.WithInitialPeers(config.GetInitialNodeUris())
@@ -129,6 +134,9 @@ namespace VNLib.Data.Caching.Providers.VNCache
//Init index
_index = ClusterNodeIndex.CreateIndex(_cluster);
+
+ //Init serializers
+ InitSerializers(config, plugin);
}
/*
@@ -296,7 +304,7 @@ namespace VNLib.Data.Caching.Providers.VNCache
public override Task<bool> DeleteAsync(string key, CancellationToken cancellation)
{
return !IsConnected
- ? throw new InvalidOperationException("The underlying client is not connected to a cache node")
+ ? Task.FromException<bool>(new InvalidOperationException("The underlying client is not connected to a cache node"))
: _client!.DeleteObjectAsync(key, cancellation);
}
@@ -304,7 +312,7 @@ namespace VNLib.Data.Caching.Providers.VNCache
public override Task<T> GetAsync<T>(string key, ICacheObjectDeserializer deserializer, CancellationToken cancellation)
{
return !IsConnected
- ? throw new InvalidOperationException("The underlying client is not connected to a cache node")
+ ? Task.FromException<T>(new InvalidOperationException("The underlying client is not connected to a cache node"))
: _client!.GetObjectAsync<T>(key, deserializer, cancellation);
}
@@ -312,7 +320,7 @@ namespace VNLib.Data.Caching.Providers.VNCache
public override Task AddOrUpdateAsync<T>(string key, string? newKey, T value, ICacheObjectSerializer serialzer, CancellationToken cancellation)
{
return !IsConnected
- ? throw new InvalidOperationException("The underlying client is not connected to a cache node")
+ ? Task.FromException(new InvalidOperationException("The underlying client is not connected to a cache node"))
: _client!.AddOrUpdateObjectAsync(key, newKey, value, serialzer, cancellation);
}
@@ -320,7 +328,7 @@ namespace VNLib.Data.Caching.Providers.VNCache
public override Task GetAsync<T>(string key, ObjectDataSet<T> callback, T state, CancellationToken cancellation)
{
return !IsConnected
- ? throw new InvalidOperationException("The underlying client is not connected to a cache node")
+ ? Task.FromException(new InvalidOperationException("The underlying client is not connected to a cache node"))
: _client!.GetObjectAsync(key, callback, state, cancellation);
}
@@ -328,7 +336,7 @@ namespace VNLib.Data.Caching.Providers.VNCache
public override Task AddOrUpdateAsync<T>(string key, string? newKey, ObjectDataGet<T> callback, T state, CancellationToken cancellation)
{
return !IsConnected
- ? throw new InvalidOperationException("The underlying client is not connected to a cache node")
+ ? Task.FromException(new InvalidOperationException("The underlying client is not connected to a cache node"))
: _client!.AddOrUpdateObjectAsync(key, newKey, callback, state, cancellation);
}
diff --git a/plugins/VNLib.Data.Caching.Providers.VNCache/src/VNCacheBase.cs b/plugins/VNLib.Data.Caching.Providers.VNCache/src/VNCacheBase.cs
index c337ef4..dc1ab8f 100644
--- a/plugins/VNLib.Data.Caching.Providers.VNCache/src/VNCacheBase.cs
+++ b/plugins/VNLib.Data.Caching.Providers.VNCache/src/VNCacheBase.cs
@@ -25,26 +25,22 @@
using System.Threading;
using System.Threading.Tasks;
+using VNLib.Plugins;
+using VNLib.Plugins.Extensions.Loading;
+
namespace VNLib.Data.Caching.Providers.VNCache
{
- internal abstract class VNCacheBase : IGlobalCacheProvider
+ internal abstract class VNCacheBase(VNCacheConfig conf) : IGlobalCacheProvider
{
///<inheritdoc/>
public abstract bool IsConnected { get; }
///<inheritdoc/>
- public virtual ICacheObjectDeserializer DefaultDeserializer { get; }
+ public virtual ICacheObjectDeserializer DefaultDeserializer => conf.CacheObjectDeserializer!;
///<inheritdoc/>
- public virtual ICacheObjectSerializer DefaultSerializer { get; }
-
- protected VNCacheBase(VNCacheConfig config)
- {
- //Set default serializers
- DefaultDeserializer = config.CacheObjectDeserializer ?? new JsonCacheObjectSerializer(256);
- DefaultSerializer = config.CacheObjectSerializer ?? new JsonCacheObjectSerializer(256);
- }
-
+ public virtual ICacheObjectSerializer DefaultSerializer => conf.CacheObjectSerializer!;
+
///<inheritdoc/>
public abstract Task AddOrUpdateAsync<T>(string key, string? newKey, T value, ICacheObjectSerializer serialzer, CancellationToken cancellation);
@@ -62,5 +58,36 @@ namespace VNLib.Data.Caching.Providers.VNCache
///<inheritdoc/>
public abstract object GetUnderlyingStore();
+
+ /// <summary>
+ /// Initializes a set of cache object serializers and deserializers
+ /// for the configuration instance and loads external serializers if specified
+ /// by the user.
+ /// </summary>
+ /// <param name="config">The configuration instance to initialzie</param>
+ /// <param name="plugin">Optional plugin for loading external serializers</param>
+ protected static void InitSerializers(VNCacheConfig config, PluginBase? plugin)
+ {
+ //See if user has specified a custom serializer assembly
+ if (!string.IsNullOrWhiteSpace(config.SerializerDllPath))
+ {
+ //Load the custom serializer assembly and get the serializer and deserializer instances
+ config.CacheObjectSerializer = plugin.CreateServiceExternal<ICacheObjectSerializer>(config.SerializerDllPath);
+
+ //Avoid creating another instance if the deserializer is the same as the serializer
+ if(config.CacheObjectSerializer is ICacheObjectDeserializer cod)
+ {
+ config.CacheObjectDeserializer = cod;
+ }
+ else
+ {
+ config.CacheObjectDeserializer = plugin.CreateServiceExternal<ICacheObjectDeserializer>(config.SerializerDllPath);
+ }
+ }
+
+ //If no default serializer is set, use the default JSON serializer
+ config.CacheObjectSerializer ??= new JsonCacheObjectSerializer(256);
+ config.CacheObjectDeserializer ??= new JsonCacheObjectSerializer(256);
+ }
}
} \ No newline at end of file
diff --git a/plugins/VNLib.Data.Caching.Providers.VNCache/src/VNCacheConfig.cs b/plugins/VNLib.Data.Caching.Providers.VNCache/src/VNCacheConfig.cs
index 8311519..24008b3 100644
--- a/plugins/VNLib.Data.Caching.Providers.VNCache/src/VNCacheConfig.cs
+++ b/plugins/VNLib.Data.Caching.Providers.VNCache/src/VNCacheConfig.cs
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2023 Vaughn Nugent
+* Copyright (c) 2024 Vaughn Nugent
*
* Library: VNLib
* Package: VNLib.Data.Caching.Providers.VNCache
@@ -98,6 +98,11 @@ namespace VNLib.Data.Caching.Providers.VNCache
throw new ArgumentException("You must configure a maximum object size", "max_object_size");
}
}
-
+
+ /// <summary>
+ /// Optional external cache serializer library to load
+ /// </summary>
+ [JsonPropertyName("serializer_assebly_name")]
+ public string? SerializerDllPath { get; set; }
}
} \ No newline at end of file
diff --git a/plugins/VNLib.Data.Caching.Providers.VNCache/src/VNLib.Data.Caching.Providers.VNCache.csproj b/plugins/VNLib.Data.Caching.Providers.VNCache/src/VNLib.Data.Caching.Providers.VNCache.csproj
index 99a5962..ded805a 100644
--- a/plugins/VNLib.Data.Caching.Providers.VNCache/src/VNLib.Data.Caching.Providers.VNCache.csproj
+++ b/plugins/VNLib.Data.Caching.Providers.VNCache/src/VNLib.Data.Caching.Providers.VNCache.csproj
@@ -39,7 +39,7 @@
</ItemGroup>
<ItemGroup>
- <ProjectReference Include="..\..\..\..\Extensions\lib\VNLib.Plugins.Extensions.Loading\src\VNLib.Plugins.Extensions.Loading.csproj" />
+ <ProjectReference Include="..\..\..\..\VNLib.Plugins.Extensions\lib\VNLib.Plugins.Extensions.Loading\src\VNLib.Plugins.Extensions.Loading.csproj" />
<ProjectReference Include="..\..\..\lib\VNLib.Data.Caching.Extensions\src\VNLib.Data.Caching.Extensions.csproj" />
<ProjectReference Include="..\..\..\lib\VNLib.Data.Caching.ObjectCache\src\VNLib.Data.Caching.ObjectCache.csproj" />
<ProjectReference Include="..\..\..\lib\VNLib.Data.Caching\src\VNLib.Data.Caching.csproj" />