aboutsummaryrefslogtreecommitdiff
path: root/VNLib.Data.Caching/src
diff options
context:
space:
mode:
authorLibravatar vman <public@vaughnnugent.com>2022-12-26 16:47:10 -0500
committerLibravatar vman <public@vaughnnugent.com>2022-12-26 16:47:10 -0500
commitcea64e619e714f6dbe51d37ca8329b58d8c271fb (patch)
tree8f8d401ed8b25df5584ba4f3eecbcea57a542c20 /VNLib.Data.Caching/src
parent18754085bf89a8a6cc28f9de1176e2943b36de7f (diff)
License + global cache removal
Diffstat (limited to 'VNLib.Data.Caching/src')
-rw-r--r--VNLib.Data.Caching/src/BlobCache.cs142
-rw-r--r--VNLib.Data.Caching/src/BlobItem.cs209
-rw-r--r--VNLib.Data.Caching/src/CacheListener.cs64
-rw-r--r--VNLib.Data.Caching/src/ClientExtensions.cs329
-rw-r--r--VNLib.Data.Caching/src/ClientRetryManager.cs107
-rw-r--r--VNLib.Data.Caching/src/Constants.cs56
-rw-r--r--VNLib.Data.Caching/src/Exceptions/InvalidStatusException.cs63
-rw-r--r--VNLib.Data.Caching/src/Exceptions/MessageTooLargeException.cs50
-rw-r--r--VNLib.Data.Caching/src/Exceptions/ObjectNotFoundException.cs47
-rw-r--r--VNLib.Data.Caching/src/VNLib.Data.Caching.csproj36
-rw-r--r--VNLib.Data.Caching/src/VNLib.Data.Caching.xml357
-rw-r--r--VNLib.Data.Caching/src/WaitForChangeResult.cs45
12 files changed, 0 insertions, 1505 deletions
diff --git a/VNLib.Data.Caching/src/BlobCache.cs b/VNLib.Data.Caching/src/BlobCache.cs
deleted file mode 100644
index f2a1af7..0000000
--- a/VNLib.Data.Caching/src/BlobCache.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
-* Copyright (c) 2022 Vaughn Nugent
-*
-* Library: VNLib
-* Package: VNLib.Data.Caching
-* File: BlobCache.cs
-*
-* BlobCache.cs is part of VNLib.Data.Caching which is part of the larger
-* VNLib collection of libraries and utilities.
-*
-* VNLib.Data.Caching is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License,
-* or (at your option) any later version.
-*
-* VNLib.Data.Caching is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with VNLib.Data.Caching. If not, see http://www.gnu.org/licenses/.
-*/
-
-using System;
-using System.IO;
-using System.Linq;
-using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
-
-using VNLib.Utils.IO;
-using VNLib.Utils.Logging;
-using VNLib.Utils.Memory;
-using VNLib.Utils.Memory.Caching;
-
-
-#nullable enable
-
-namespace VNLib.Data.Caching
-{
- /// <summary>
- /// A general purpose binary data storage
- /// </summary>
- public class BlobCache : LRUCache<string, MemoryHandle<byte>>
- {
- readonly IUnmangedHeap Heap;
- readonly DirectoryInfo SwapDir;
- readonly ILogProvider Log;
- ///<inheritdoc/>
- public override bool IsReadOnly { get; }
- ///<inheritdoc/>
- protected override int MaxCapacity { get; }
-
-
- /// <summary>
- /// Initializes a new <see cref="BlobCache"/> store
- /// </summary>
- /// <param name="swapDir">The <see cref="IsolatedStorageDirectory"/> to swap blob data to when cache</param>
- /// <param name="maxCapacity">The maximum number of items to keep in memory</param>
- /// <param name="log">A <see cref="ILogProvider"/> to write log data to</param>
- /// <param name="heap">A <see cref="IUnmangedHeap"/> to allocate buffers and store <see cref="BlobItem"/> data in memory</param>
- public BlobCache(DirectoryInfo swapDir, int maxCapacity, ILogProvider log, IUnmangedHeap heap)
- :base(StringComparer.Ordinal)
- {
- IsReadOnly = false;
- MaxCapacity = maxCapacity;
- SwapDir = swapDir;
- //Update the lookup table size
- LookupTable.EnsureCapacity(maxCapacity);
- //Set default heap if not specified
- Heap = heap;
- Log = log;
- }
- ///<inheritdoc/>
- protected override bool CacheMiss(string key, [NotNullWhen(true)] out MemoryHandle<byte>? value)
- {
- value = null;
- return false;
- }
- ///<inheritdoc/>
- protected override void Evicted(KeyValuePair<string, MemoryHandle<byte>> evicted)
- {
- //Dispose the blob
- evicted.Value.Dispose();
- }
- /// <summary>
- /// If the <see cref="BlobItem"/> is found in the store, changes the key
- /// that referrences the blob.
- /// </summary>
- /// <param name="currentKey">The key that currently referrences the blob in the store</param>
- /// <param name="newKey">The new key that will referrence the blob</param>
- /// <param name="blob">The <see cref="BlobItem"/> if its found in the store</param>
- /// <returns>True if the record was found and the key was changes</returns>
- public bool TryChangeKey(string currentKey, string newKey, [NotNullWhen(true)] out MemoryHandle<byte>? blob)
- {
- if (LookupTable.Remove(currentKey, out LinkedListNode<KeyValuePair<string, MemoryHandle<byte>>>? node))
- {
- //Remove the node from the ll
- List.Remove(node);
- //Update the node kvp
- blob = node.Value.Value;
- node.Value = new KeyValuePair<string, MemoryHandle<byte>>(newKey, blob);
- //Add to end of list
- List.AddLast(node);
- //Re-add to lookup table with new key
- LookupTable.Add(newKey, node);
- return true;
- }
- blob = null;
- return false;
- }
- /// <summary>
- /// Removes the <see cref="BlobItem"/> from the store without disposing the blobl
- /// </summary>
- /// <param name="key">The key that referrences the <see cref="BlobItem"/> in the store</param>
- /// <returns>A value indicating if the blob was removed</returns>
- public override bool Remove(string key)
- {
- //Remove the item from the lookup table and if it exists, remove the node from the list
- if (LookupTable.Remove(key, out LinkedListNode<KeyValuePair<string, MemoryHandle<byte>>>? node))
- {
- //Remove the new from the list
- List.Remove(node);
- //dispose the buffer
- node.Value.Value.Dispose();
- return true;
- }
- return false;
- }
- /// <summary>
- /// Removes and disposes all blobl elements in cache (or in the backing store)
- /// </summary>
- public override void Clear()
- {
- foreach (MemoryHandle<byte> blob in List.Select(kp => kp.Value))
- {
- blob.Dispose();
- }
- base.Clear();
- }
- }
-}
diff --git a/VNLib.Data.Caching/src/BlobItem.cs b/VNLib.Data.Caching/src/BlobItem.cs
deleted file mode 100644
index 675933e..0000000
--- a/VNLib.Data.Caching/src/BlobItem.cs
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
-* Copyright (c) 2022 Vaughn Nugent
-*
-* Library: VNLib
-* Package: VNLib.Data.Caching
-* File: BlobItem.cs
-*
-* BlobItem.cs is part of VNLib.Data.Caching which is part of the larger
-* VNLib collection of libraries and utilities.
-*
-* VNLib.Data.Caching is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License,
-* or (at your option) any later version.
-*
-* VNLib.Data.Caching is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with VNLib.Data.Caching. If not, see http://www.gnu.org/licenses/.
-*/
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-using VNLib.Utils;
-using VNLib.Utils.IO;
-using VNLib.Utils.Memory;
-using VNLib.Utils.Logging;
-using VNLib.Utils.Extensions;
-
-#nullable enable
-
-namespace VNLib.Data.Caching
-{
- /// <summary>
- /// A general purpose binary storage item
- /// </summary>
- public class BlobItem //: VnDisposeable
- {
- /*
- private static readonly JoinableTaskContext JTX = new();
- private static readonly Semaphore CentralSwapLock = new(Environment.ProcessorCount, Environment.ProcessorCount);
-
- private readonly VnMemoryStream _loadedData;
- private bool _loaded;
-
- /// <summary>
- /// The time the blob was last modified
- /// </summary>
- public DateTimeOffset LastAccessed { get; private set; }
-
-
- /// <summary>
- /// Gets the current size of the file (in bytes) as an atomic operation
- /// </summary>
- public int FileSize => (int)_loadedData.Length;
- /// <summary>
- /// The operation synchronization lock
- /// </summary>
- public AsyncReaderWriterLock OpLock { get; }
- /// <summary>
- /// Initializes a new <see cref="BlobItem"/>
- /// </summary>
- /// <param name="heap">The heap to allocate buffers from</param>
- internal BlobItem(IUnmangedHeap heap)
- {
- _loadedData = new(heap);
- OpLock = new AsyncReaderWriterLock(JTX);
- _loaded = true;
- LastAccessed = DateTimeOffset.UtcNow;
- }
- ///<inheritdoc/>
- protected override void Free()
- {
- _loadedData.Dispose();
- OpLock.Dispose();
- }
-
- /// <summary>
- /// Reads data from the internal buffer and copies it to the specified buffer.
- /// Use the <see cref="FileSize"/> property to obtain the size of the internal buffer
- /// </summary>
- /// <param name="buffer">The buffer to copy data to</param>
- /// <returns>When completed, the number of bytes copied to the buffer</returns>
- public int Read(Span<byte> buffer)
- {
- //Make sure the blob has been swapped back into memory
- if (!_loaded)
- {
- throw new InvalidOperationException("The blob was not loaded from the disk");
- }
- //Read all data from the buffer and write it to the output buffer
- _loadedData.AsSpan().CopyTo(buffer);
- //Update last-accessed
- LastAccessed = DateTimeOffset.UtcNow;
- return (int)_loadedData.Length;
- }
- /// <summary>
- /// Overwrites the internal buffer with the contents of the supplied buffer
- /// </summary>
- /// <param name="buffer">The buffer containing data to store within the blob</param>
- /// <returns>A <see cref="ValueTask"/> that completes when write access has been granted and copied</returns>
- /// <exception cref="InvalidOperationException"></exception>
- public void Write(ReadOnlySpan<byte> buffer)
- {
- //Make sure the blob has been swapped back into memory
- if (!_loaded)
- {
- throw new InvalidOperationException("The blob was not loaded from the disk");
- }
- //Reset the buffer
- _loadedData.SetLength(buffer.Length);
- _loadedData.Seek(0, SeekOrigin.Begin);
- _loadedData.Write(buffer);
- LastAccessed = DateTimeOffset.UtcNow;
- }
-
- /// <summary>
- /// Writes the contents of the memory buffer to its designated file on the disk
- /// </summary>
- /// <param name="heap">The heap to allocate buffers from</param>
- /// <param name="swapDir">The <see cref="IsolatedStorageDirectory"/> that stores the file</param>
- /// <param name="filename">The name of the file to write data do</param>
- /// <param name="log">A log to write errors to</param>
- /// <returns>A task that completes when the swap to disk is complete</returns>
- internal async Task SwapToDiskAsync(IUnmangedHeap heap, DirectoryInfo swapDir, string filename, ILogProvider log)
- {
- try
- {
- //Wait for write lock
- await using (AsyncReaderWriterLock.Releaser releaser = await OpLock.WriteLockAsync())
- {
- //Enter swap lock
- await CentralSwapLock;
- try
- {
- //Open swap file data stream
- await using FileStream swapFile = swapDir.OpenFile(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite, bufferSize: 8128);
- //reset swap file
- swapFile.SetLength(0);
- //Seek loaded-data back to 0 before writing
- _loadedData.Seek(0, SeekOrigin.Begin);
- //Write loaded data to disk
- await _loadedData.CopyToAsync(swapFile, 8128, heap);
- }
- finally
- {
- CentralSwapLock.Release();
- }
- //Release memory held by stream
- _loadedData.SetLength(0);
- //Clear loaded flag
- _loaded = false;
- LastAccessed = DateTimeOffset.UtcNow;
- }
- log.Debug("Blob {name} swapped to disk", filename);
- }
- catch(Exception ex)
- {
- log.Error(ex, "Blob swap to disk error");
- }
- }
- /// <summary>
- /// Reads the contents of the blob into a memory buffer from its designated file on disk
- /// </summary>
- /// <param name="heap">The heap to allocate buffers from</param>
- /// <param name="swapDir">The <see cref="IsolatedStorageDirectory"/> that stores the file</param>
- /// <param name="filename">The name of the file to write the blob data to</param>
- /// <param name="log">A log to write errors to</param>
- /// <returns>A task that completes when the swap from disk is complete</returns>
- internal async Task SwapFromDiskAsync(IUnmangedHeap heap, DirectoryInfo swapDir, string filename, ILogProvider log)
- {
- try
- {
- //Wait for write lock
- await using (AsyncReaderWriterLock.Releaser releaser = await OpLock.WriteLockAsync())
- {
- //Enter swap lock
- await CentralSwapLock;
- try
- {
- //Open swap file data stream
- await using FileStream swapFile = swapDir.OpenFile(filename, FileMode.OpenOrCreate, FileAccess.Read, bufferSize:8128);
- //Copy from disk to memory
- await swapFile.CopyToAsync(_loadedData, 8128, heap);
- }
- finally
- {
- CentralSwapLock.Release();
- }
- //Set loaded flag
- _loaded = true;
- LastAccessed = DateTimeOffset.UtcNow;
- }
- log.Debug("Blob {name} swapped from disk", filename);
- }
- catch(Exception ex)
- {
- log.Error(ex, "Blob swap from disk error");
- }
- }
- */
- }
-}
diff --git a/VNLib.Data.Caching/src/CacheListener.cs b/VNLib.Data.Caching/src/CacheListener.cs
deleted file mode 100644
index 4ef7529..0000000
--- a/VNLib.Data.Caching/src/CacheListener.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-* Copyright (c) 2022 Vaughn Nugent
-*
-* Library: VNLib
-* Package: VNLib.Data.Caching
-* File: CacheListener.cs
-*
-* CacheListener.cs is part of VNLib.Data.Caching which is part of the larger
-* VNLib collection of libraries and utilities.
-*
-* VNLib.Data.Caching is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License,
-* or (at your option) any later version.
-*
-* VNLib.Data.Caching is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with VNLib.Data.Caching. If not, see http://www.gnu.org/licenses/.
-*/
-
-using System;
-using System.IO;
-
-using VNLib.Utils.Memory;
-using VNLib.Net.Messaging.FBM.Server;
-
-namespace VNLib.Data.Caching
-{
- /// <summary>
- /// A base implementation of a memory/disk LRU data cache FBM listener
- /// </summary>
- public abstract class CacheListener : FBMListenerBase
- {
- /// <summary>
- /// The directory swap files will be stored
- /// </summary>
- public DirectoryInfo? Directory { get; private set; }
- /// <summary>
- /// The Cache store to access data blobs
- /// </summary>
- protected BlobCache? Cache { get; private set; }
- /// <summary>
- /// The <see cref="IUnmangedHeap"/> to allocate buffers from
- /// </summary>
- protected IUnmangedHeap? Heap { get; private set; }
-
- /// <summary>
- /// Initializes the <see cref="Cache"/> data store
- /// </summary>
- /// <param name="dir">The directory to swap cache records to</param>
- /// <param name="cacheSize">The size of the LRU cache</param>
- /// <param name="heap">The heap to allocate buffers from</param>
- protected void InitCache(DirectoryInfo dir, int cacheSize, IUnmangedHeap heap)
- {
- Heap = heap;
- Cache = new(dir, cacheSize, Log, Heap);
- Directory = dir;
- }
- }
-}
diff --git a/VNLib.Data.Caching/src/ClientExtensions.cs b/VNLib.Data.Caching/src/ClientExtensions.cs
deleted file mode 100644
index 6787d4e..0000000
--- a/VNLib.Data.Caching/src/ClientExtensions.cs
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
-* Copyright (c) 2022 Vaughn Nugent
-*
-* Library: VNLib
-* Package: VNLib.Data.Caching
-* File: ClientExtensions.cs
-*
-* ClientExtensions.cs is part of VNLib.Data.Caching which is part of the larger
-* VNLib collection of libraries and utilities.
-*
-* VNLib.Data.Caching is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License,
-* or (at your option) any later version.
-*
-* VNLib.Data.Caching is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with VNLib.Data.Caching. If not, see http://www.gnu.org/licenses/.
-*/
-
-using System;
-using System.IO;
-using System.Linq;
-using System.Buffers;
-using System.Text.Json;
-using System.Threading;
-using System.Threading.Tasks;
-using System.Collections.Generic;
-using System.Text.Json.Serialization;
-using System.Runtime.CompilerServices;
-
-using VNLib.Utils.Logging;
-using VNLib.Net.Messaging.FBM;
-using VNLib.Net.Messaging.FBM.Client;
-using VNLib.Net.Messaging.FBM.Server;
-using VNLib.Data.Caching.Exceptions;
-
-using static VNLib.Data.Caching.Constants;
-
-namespace VNLib.Data.Caching
-{
-
- /// <summary>
- /// Provides caching extension methods for <see cref="FBMClient"/>
- /// </summary>
- public static class ClientExtensions
- {
- private static readonly JsonSerializerOptions LocalOptions = new()
- {
- DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
- NumberHandling = JsonNumberHandling.Strict,
- ReadCommentHandling = JsonCommentHandling.Disallow,
- WriteIndented = false,
- DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
- IgnoreReadOnlyFields = true,
- PropertyNameCaseInsensitive = true,
- IncludeFields = false,
-
- //Use small buffers
- DefaultBufferSize = 128
- };
-
- private static void LogDebug(this FBMClient client, string message, params object?[] args)
- {
- if (client.Config.DebugLog != null)
- {
- client.Config.DebugLog.Debug($"[CACHE] : {message}", args);
- }
- }
-
- /// <summary>
- /// Gets an object from the server if it exists
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="client"></param>
- /// <param name="objectId">The id of the object to get</param>
- /// <param name="cancellationToken">A token to cancel the operation</param>
- /// <returns>A task that completes to return the results of the response payload</returns>
- /// <exception cref="JsonException"></exception>
- /// <exception cref="OutOfMemoryException"></exception>
- /// <exception cref="InvalidStatusException"></exception>
- /// <exception cref="ObjectDisposedException"></exception>
- /// <exception cref="InvalidResponseException"></exception>
- public static async Task<T?> GetObjectAsync<T>(this FBMClient client, string objectId, CancellationToken cancellationToken = default)
- {
- _ = client ?? throw new ArgumentNullException(nameof(client));
-
- client.LogDebug("Getting object {id}", objectId);
-
- //Rent a new request
- FBMRequest request = client.RentRequest();
- try
- {
- //Set action as get/create
- request.WriteHeader(HeaderCommand.Action, Actions.Get);
- //Set session-id header
- request.WriteHeader(Constants.ObjectId, objectId);
-
- //Make request
- using FBMResponse response = await client.SendAsync(request, cancellationToken);
-
- response.ThrowIfNotSet();
- //Get the status code
- ReadOnlyMemory<char> status = response.Headers.FirstOrDefault(static a => a.Key == HeaderCommand.Status).Value;
- if (status.Span.Equals(ResponseCodes.Okay, StringComparison.Ordinal))
- {
- return JsonSerializer.Deserialize<T>(response.ResponseBody, LocalOptions);
- }
- //Session may not exist on the server yet
- if (status.Span.Equals(ResponseCodes.NotFound, StringComparison.Ordinal))
- {
- return default;
- }
- throw new InvalidStatusException("Invalid status code recived for object get request", status.ToString());
- }
- finally
- {
- client.ReturnRequest(request);
- }
- }
-
- /// <summary>
- /// Updates the state of the object, and optionally updates the ID of the object. The data
- /// parameter is serialized, buffered, and streamed to the remote server
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="client"></param>
- /// <param name="objectId">The id of the object to update or replace</param>
- /// <param name="newId">An optional parameter to specify a new ID for the old object</param>
- /// <param name="data">The payload data to serialize and set as the data state of the session</param>
- /// <param name="cancellationToken">A token to cancel the operation</param>
- /// <returns>A task that resolves when the server responds</returns>
- /// <exception cref="JsonException"></exception>
- /// <exception cref="OutOfMemoryException"></exception>
- /// <exception cref="InvalidStatusException"></exception>
- /// <exception cref="ObjectDisposedException"></exception>
- /// <exception cref="InvalidResponseException"></exception>
- /// <exception cref="MessageTooLargeException"></exception>
- /// <exception cref="ObjectNotFoundException"></exception>
- public static async Task AddOrUpdateObjectAsync<T>(this FBMClient client, string objectId, string? newId, T data, CancellationToken cancellationToken = default)
- {
- _ = client ?? throw new ArgumentNullException(nameof(client));
-
- client.LogDebug("Updating object {id}, newid {nid}", objectId, newId);
-
- //Rent a new request
- FBMRequest request = client.RentRequest();
- try
- {
- //Set action as get/create
- request.WriteHeader(HeaderCommand.Action, Actions.AddOrUpdate);
- //Set session-id header
- request.WriteHeader(Constants.ObjectId, objectId);
- //if new-id set, set the new-id header
- if (!string.IsNullOrWhiteSpace(newId))
- {
- request.WriteHeader(Constants.NewObjectId, newId);
- }
- //Get the body writer for the message
- IBufferWriter<byte> bodyWriter = request.GetBodyWriter();
- //Write json data to the message
- using (Utf8JsonWriter jsonWriter = new(bodyWriter))
- {
- JsonSerializer.Serialize(jsonWriter, data, LocalOptions);
- }
-
- //Make request
- using FBMResponse response = await client.SendAsync(request, cancellationToken);
-
- response.ThrowIfNotSet();
- //Get the status code
- ReadOnlyMemory<char> status = response.Headers.FirstOrDefault(static a => a.Key == HeaderCommand.Status).Value;
- //Check status code
- if (status.Span.Equals(ResponseCodes.Okay, StringComparison.OrdinalIgnoreCase))
- {
- return;
- }
- else if(status.Span.Equals(ResponseCodes.NotFound, StringComparison.OrdinalIgnoreCase))
- {
- throw new ObjectNotFoundException($"object {objectId} not found on remote server");
- }
- //Invalid status
- throw new InvalidStatusException("Invalid status code recived for object upsert request", status.ToString());
- }
- finally
- {
- //Return the request(clears data and reset)
- client.ReturnRequest(request);
- }
- }
-
- /// <summary>
- /// Asynchronously deletes an object in the remote store
- /// </summary>
- /// <param name="client"></param>
- /// <param name="objectId">The id of the object to update or replace</param>
- /// <param name="cancellationToken">A token to cancel the operation</param>
- /// <returns>A task that resolves when the operation has completed</returns>
- /// <exception cref="InvalidStatusException"></exception>
- /// <exception cref="ObjectDisposedException"></exception>
- /// <exception cref="InvalidResponseException"></exception>
- /// <exception cref="ObjectNotFoundException"></exception>
- public static async Task DeleteObjectAsync(this FBMClient client, string objectId, CancellationToken cancellationToken = default)
- {
- _ = client ?? throw new ArgumentNullException(nameof(client));
-
- client.LogDebug("Deleting object {id}", objectId);
- //Rent a new request
- FBMRequest request = client.RentRequest();
- try
- {
- //Set action as delete
- request.WriteHeader(HeaderCommand.Action, Actions.Delete);
- //Set session-id header
- request.WriteHeader(Constants.ObjectId, objectId);
-
- //Make request
- using FBMResponse response = await client.SendAsync(request, cancellationToken);
-
- response.ThrowIfNotSet();
- //Get the status code
- ReadOnlyMemory<char> status = response.Headers.FirstOrDefault(static a => a.Key == HeaderCommand.Status).Value;
- if (status.Span.Equals(ResponseCodes.Okay, StringComparison.Ordinal))
- {
- return;
- }
- else if(status.Span.Equals(ResponseCodes.NotFound, StringComparison.OrdinalIgnoreCase))
- {
- throw new ObjectNotFoundException($"object {objectId} not found on remote server");
- }
- throw new InvalidStatusException("Invalid status code recived for object get request", status.ToString());
- }
- finally
- {
- client.ReturnRequest(request);
- }
- }
-
- /// <summary>
- /// Dequeues a change event from the server event queue for the current connection, or waits until a change happens
- /// </summary>
- /// <param name="client"></param>
- /// <param name="cancellationToken">A token to cancel the deuque operation</param>
- /// <returns>A <see cref="KeyValuePair{TKey, TValue}"/> that contains the modified object id and optionally its new id</returns>
- public static async Task<WaitForChangeResult> WaitForChangeAsync(this FBMClient client, CancellationToken cancellationToken = default)
- {
- //Rent a new request
- FBMRequest request = client.RentRequest();
- try
- {
- //Set action as event dequeue to dequeue a change event
- request.WriteHeader(HeaderCommand.Action, Actions.Dequeue);
-
- //Make request
- using FBMResponse response = await client.SendAsync(request, cancellationToken);
-
- response.ThrowIfNotSet();
-
- return new()
- {
- Status = response.Headers.FirstOrDefault(static a => a.Key == HeaderCommand.Status).Value.ToString(),
- CurrentId = response.Headers.SingleOrDefault(static v => v.Key == Constants.ObjectId).Value.ToString(),
- NewId = response.Headers.SingleOrDefault(static v => v.Key == Constants.NewObjectId).Value.ToString()
- };
- }
- finally
- {
- client.ReturnRequest(request);
- }
- }
-
- /// <summary>
- /// Gets the Object-id for the request message, or throws an <see cref="InvalidOperationException"/> if not specified
- /// </summary>
- /// <param name="context"></param>
- /// <returns>The id of the object requested</returns>
- /// <exception cref="InvalidOperationException"></exception>
- public static string ObjectId(this FBMContext context)
- {
- return context.Request.Headers.First(static kvp => kvp.Key == Constants.ObjectId).Value.ToString();
- }
- /// <summary>
- /// Gets the new ID of the object if specified from the request. Null if the request did not specify an id update
- /// </summary>
- /// <param name="context"></param>
- /// <returns>The new ID of the object if speicifed, null otherwise</returns>
- public static string? NewObjectId(this FBMContext context)
- {
- return context.Request.Headers.FirstOrDefault(static kvp => kvp.Key == Constants.NewObjectId).Value.ToString();
- }
- /// <summary>
- /// Gets the request method for the request
- /// </summary>
- /// <param name="context"></param>
- /// <returns>The request method string</returns>
- public static string Method(this FBMContext context)
- {
- return context.Request.Headers.First(static kvp => kvp.Key == HeaderCommand.Action).Value.ToString();
- }
- /// <summary>
- /// Closes a response with a status code
- /// </summary>
- /// <param name="context"></param>
- /// <param name="responseCode">The status code to send to the client</param>
- public static void CloseResponse(this FBMContext context, string responseCode)
- {
- context.Response.WriteHeader(HeaderCommand.Status, responseCode);
- }
-
-
- /// <summary>
- /// Initializes the worker for a reconnect policy and returns an object that can listen for changes
- /// and configure the connection as necessary
- /// </summary>
- /// <param name="worker"></param>
- /// <param name="retryDelay">The amount of time to wait between retries</param>
- /// <param name="serverUri">The uri to reconnect the client to</param>
- /// <returns>A <see cref="ClientRetryManager{T}"/> for listening for retry events</returns>
- public static ClientRetryManager<T> SetReconnectPolicy<T>(this T worker, TimeSpan retryDelay, Uri serverUri) where T: IStatefulConnection
- {
- //Return new manager
- return new (worker, retryDelay, serverUri);
- }
- }
-}
diff --git a/VNLib.Data.Caching/src/ClientRetryManager.cs b/VNLib.Data.Caching/src/ClientRetryManager.cs
deleted file mode 100644
index 9400678..0000000
--- a/VNLib.Data.Caching/src/ClientRetryManager.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-* Copyright (c) 2022 Vaughn Nugent
-*
-* Library: VNLib
-* Package: VNLib.Data.Caching
-* File: ClientRetryManager.cs
-*
-* ClientRetryManager.cs is part of VNLib.Data.Caching which is part of the larger
-* VNLib collection of libraries and utilities.
-*
-* VNLib.Data.Caching is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License,
-* or (at your option) any later version.
-*
-* VNLib.Data.Caching is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with VNLib.Data.Caching. If not, see http://www.gnu.org/licenses/.
-*/
-
-using System;
-using System.Threading.Tasks;
-using System.Security.Cryptography;
-
-using VNLib.Utils;
-using VNLib.Net.Messaging.FBM.Client;
-
-namespace VNLib.Data.Caching
-{
- /// <summary>
- /// Manages a <see cref="FBMClientWorkerBase"/> reconnect policy
- /// </summary>
- public class ClientRetryManager<T> : VnDisposeable where T: IStatefulConnection
- {
- const int RetryRandMaxMsDelay = 1000;
-
- private readonly TimeSpan RetryDelay;
- private readonly T Client;
- private readonly Uri ServerUri;
-
- internal ClientRetryManager(T worker, TimeSpan delay, Uri serverUri)
- {
- this.Client = worker;
- this.RetryDelay = delay;
- this.ServerUri = serverUri;
- //Register disconnect listener
- worker.ConnectionClosed += Worker_Disconnected;
- }
-
- private void Worker_Disconnected(object? sender, EventArgs args)
- {
- //Exec retry on exit
- _ = RetryAsync().ConfigureAwait(false);
- }
-
-
- /// <summary>
- /// Raised before client is to be reconnected
- /// </summary>
- public event Action<T>? OnBeforeReconnect;
- /// <summary>
- /// Raised when the client fails to reconnect. Should return a value that instructs the
- /// manager to reconnect
- /// </summary>
- public event Func<T, Exception, bool>? OnReconnectFailed;
-
- async Task RetryAsync()
- {
-
- //Begin random delay with retry ms
- int randomDelayMs = (int)RetryDelay.TotalMilliseconds;
- //random delay to add to prevent retry-storm
- randomDelayMs += RandomNumberGenerator.GetInt32(RetryRandMaxMsDelay);
- //Retry loop
- bool retry = true;
- while (retry)
- {
- try
- {
- //Inform Listener for the retry
- OnBeforeReconnect?.Invoke(Client);
- //wait for delay before reconnecting
- await Task.Delay(randomDelayMs);
- //Reconnect async
- await Client.ConnectAsync(ServerUri).ConfigureAwait(false);
- break;
- }
- catch (Exception Ex)
- {
- //Invoke error handler, may be null, incase exit
- retry = OnReconnectFailed?.Invoke(Client, Ex) ?? false;
- }
- }
- }
-
- ///<inheritdoc/>
- protected override void Free()
- {
- //Unregister the event listener
- Client.ConnectionClosed -= Worker_Disconnected;
- }
- }
-}
diff --git a/VNLib.Data.Caching/src/Constants.cs b/VNLib.Data.Caching/src/Constants.cs
deleted file mode 100644
index 2b747b8..0000000
--- a/VNLib.Data.Caching/src/Constants.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
-* Copyright (c) 2022 Vaughn Nugent
-*
-* Library: VNLib
-* Package: VNLib.Data.Caching
-* File: Constants.cs
-*
-* Constants.cs is part of VNLib.Data.Caching which is part of the larger
-* VNLib collection of libraries and utilities.
-*
-* VNLib.Data.Caching is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License,
-* or (at your option) any later version.
-*
-* VNLib.Data.Caching is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with VNLib.Data.Caching. If not, see http://www.gnu.org/licenses/.
-*/
-
-using System;
-
-using VNLib.Net.Messaging.FBM;
-
-namespace VNLib.Data.Caching
-{
- public static class Constants
- {
- /// <summary>
- /// Contains constants the define actions
- /// </summary>
- public static class Actions
- {
- public const string Get= "g";
- public const string AddOrUpdate = "u";
- public const string Delete = "d";
- public const string Dequeue = "dq";
- }
- /// <summary>
- /// Containts constants for operation response codes
- /// </summary>
- public static class ResponseCodes
- {
- public const string Okay = "ok";
- public const string Error = "err";
- public const string NotFound = "nf";
- }
-
- public const HeaderCommand ObjectId = (HeaderCommand)0xAA;
- public const HeaderCommand NewObjectId = (HeaderCommand)0xAB;
- }
-}
diff --git a/VNLib.Data.Caching/src/Exceptions/InvalidStatusException.cs b/VNLib.Data.Caching/src/Exceptions/InvalidStatusException.cs
deleted file mode 100644
index 687842c..0000000
--- a/VNLib.Data.Caching/src/Exceptions/InvalidStatusException.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
-* Copyright (c) 2022 Vaughn Nugent
-*
-* Library: VNLib
-* Package: VNLib.Data.Caching
-* File: InvalidStatusException.cs
-*
-* InvalidStatusException.cs is part of VNLib.Data.Caching which is part of the larger
-* VNLib collection of libraries and utilities.
-*
-* VNLib.Data.Caching is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License,
-* or (at your option) any later version.
-*
-* VNLib.Data.Caching is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with VNLib.Data.Caching. If not, see http://www.gnu.org/licenses/.
-*/
-
-using System;
-
-using VNLib.Net.Messaging.FBM;
-
-namespace VNLib.Data.Caching.Exceptions
-{
- /// <summary>
- /// Raised when the response status code of an FBM Request message is not valid for
- /// the specified request
- /// </summary>
- public class InvalidStatusException : InvalidResponseException
- {
- private readonly string? StatusCode;
- /// <summary>
- /// Initalizes a new <see cref="InvalidStatusException"/> with the specfied status code
- /// </summary>
- /// <param name="message"></param>
- /// <param name="statusCode"></param>
- public InvalidStatusException(string message, string statusCode):this(message)
- {
- this.StatusCode = statusCode;
- }
-
- ///<inheritdoc/>
- public InvalidStatusException()
- {
- }
- ///<inheritdoc/>
- public InvalidStatusException(string message) : base(message)
- {
- }
- ///<inheritdoc/>
- public InvalidStatusException(string message, Exception innerException) : base(message, innerException)
- {
- }
- ///<inheritdoc/>
- public override string Message => $"InvalidStatusException: Status Code {StatusCode} \r\n {base.Message}";
- }
-}
diff --git a/VNLib.Data.Caching/src/Exceptions/MessageTooLargeException.cs b/VNLib.Data.Caching/src/Exceptions/MessageTooLargeException.cs
deleted file mode 100644
index f709411..0000000
--- a/VNLib.Data.Caching/src/Exceptions/MessageTooLargeException.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
-* Copyright (c) 2022 Vaughn Nugent
-*
-* Library: VNLib
-* Package: VNLib.Data.Caching
-* File: MessageTooLargeException.cs
-*
-* MessageTooLargeException.cs is part of VNLib.Data.Caching which is part of the larger
-* VNLib collection of libraries and utilities.
-*
-* VNLib.Data.Caching is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License,
-* or (at your option) any later version.
-*
-* VNLib.Data.Caching is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with VNLib.Data.Caching. If not, see http://www.gnu.org/licenses/.
-*/
-
-using System;
-using System.Runtime.Serialization;
-
-using VNLib.Net.Messaging.FBM;
-
-namespace VNLib.Data.Caching.Exceptions
-{
- /// <summary>
- /// Raised when a request (or server response) calculates the size of the message to be too large to proccess
- /// </summary>
- public class MessageTooLargeException : FBMException
- {
- ///<inheritdoc/>
- public MessageTooLargeException()
- {}
- ///<inheritdoc/>
- public MessageTooLargeException(string message) : base(message)
- {}
- ///<inheritdoc/>
- public MessageTooLargeException(string message, Exception innerException) : base(message, innerException)
- {}
- ///<inheritdoc/>
- protected MessageTooLargeException(SerializationInfo info, StreamingContext context) : base(info, context)
- {}
- }
-}
diff --git a/VNLib.Data.Caching/src/Exceptions/ObjectNotFoundException.cs b/VNLib.Data.Caching/src/Exceptions/ObjectNotFoundException.cs
deleted file mode 100644
index cc25b33..0000000
--- a/VNLib.Data.Caching/src/Exceptions/ObjectNotFoundException.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
-* Copyright (c) 2022 Vaughn Nugent
-*
-* Library: VNLib
-* Package: VNLib.Data.Caching
-* File: ObjectNotFoundException.cs
-*
-* ObjectNotFoundException.cs is part of VNLib.Data.Caching which is part of the larger
-* VNLib collection of libraries and utilities.
-*
-* VNLib.Data.Caching is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License,
-* or (at your option) any later version.
-*
-* VNLib.Data.Caching is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with VNLib.Data.Caching. If not, see http://www.gnu.org/licenses/.
-*/
-
-using System;
-
-namespace VNLib.Data.Caching.Exceptions
-{
- /// <summary>
- /// Raised when a command was executed on a desired object in the remote cache
- /// but the object was not found
- /// </summary>
- public class ObjectNotFoundException : InvalidStatusException
- {
- internal ObjectNotFoundException()
- {}
-
- internal ObjectNotFoundException(string message) : base(message)
- {}
-
- internal ObjectNotFoundException(string message, string statusCode) : base(message, statusCode)
- {}
-
- internal ObjectNotFoundException(string message, Exception innerException) : base(message, innerException)
- {}
- }
-}
diff --git a/VNLib.Data.Caching/src/VNLib.Data.Caching.csproj b/VNLib.Data.Caching/src/VNLib.Data.Caching.csproj
deleted file mode 100644
index f4d9269..0000000
--- a/VNLib.Data.Caching/src/VNLib.Data.Caching.csproj
+++ /dev/null
@@ -1,36 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <TargetFramework>net6.0</TargetFramework>
- <Authors>Vaughn Nugent</Authors>
- <Copyright>Copyright © 2022 Vaughn Nugent</Copyright>
- <Version>1.0.1.1</Version>
- <GenerateDocumentationFile>True</GenerateDocumentationFile>
- <Nullable>enable</Nullable>
- </PropertyGroup>
-
- <PropertyGroup>
- <DocumentationFile></DocumentationFile>
- <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
- <PackageProjectUrl>https://www.vaughnnugent.com/resources</PackageProjectUrl>
- <AnalysisLevel>latest-all</AnalysisLevel>
- </PropertyGroup>
-
- <ItemGroup>
- <PackageReference Include="ErrorProne.NET.CoreAnalyzers" Version="0.1.2">
- <PrivateAssets>all</PrivateAssets>
- <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
- </PackageReference>
- <PackageReference Include="ErrorProne.NET.Structs" Version="0.1.2">
- <PrivateAssets>all</PrivateAssets>
- <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
- </PackageReference>
- </ItemGroup>
-
- <ItemGroup>
- <ProjectReference Include="..\..\..\..\VNLib\Http\VNLib.Net.Http.csproj" />
- <ProjectReference Include="..\..\..\..\VNLib\Utils\src\VNLib.Utils.csproj" />
- <ProjectReference Include="..\..\..\..\VNLib\VNLib.Net.Messaging.FBM\src\VNLib.Net.Messaging.FBM.csproj" />
- </ItemGroup>
-
-</Project>
diff --git a/VNLib.Data.Caching/src/VNLib.Data.Caching.xml b/VNLib.Data.Caching/src/VNLib.Data.Caching.xml
deleted file mode 100644
index 475f0a9..0000000
--- a/VNLib.Data.Caching/src/VNLib.Data.Caching.xml
+++ /dev/null
@@ -1,357 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Copyright (c) 2022 Vaughn Nugent
--->
-<doc>
- <assembly>
- <name>VNLib.Data.Caching</name>
- </assembly>
- <members>
- <member name="T:VNLib.Data.Caching.BlobCache">
- <summary>
- A general purpose binary data storage
- </summary>
- </member>
- <member name="P:VNLib.Data.Caching.BlobCache.IsReadOnly">
- <inheritdoc/>
- </member>
- <member name="P:VNLib.Data.Caching.BlobCache.MaxCapacity">
- <inheritdoc/>
- </member>
- <member name="M:VNLib.Data.Caching.BlobCache.#ctor(System.IO.DirectoryInfo,System.Int32,VNLib.Utils.Logging.ILogProvider,VNLib.Utils.Memory.PrivateHeap)">
- <summary>
- Initializes a new <see cref="T:VNLib.Data.Caching.BlobCache"/> store
- </summary>
- <param name="swapDir">The <see cref="T:VNLib.Utils.IO.IsolatedStorageDirectory"/> to swap blob data to when cache</param>
- <param name="maxCapacity">The maximum number of items to keep in memory</param>
- <param name="log">A <see cref="T:VNLib.Utils.Logging.ILogProvider"/> to write log data to</param>
- <param name="heap">A <see cref="T:VNLib.Utils.Memory.PrivateHeap"/> to allocate buffers and store <see cref="T:VNLib.Data.Caching.BlobItem"/> data in memory</param>
- </member>
- <member name="M:VNLib.Data.Caching.BlobCache.SwapAllToDiskAsync">
- <summary>
- Swaps all <see cref="T:VNLib.Data.Caching.BlobItem"/>s that are cached in memory
- to disk.
- </summary>
- </member>
- <member name="M:VNLib.Data.Caching.BlobCache.CacheMiss(System.String,VNLib.Data.Caching.BlobItem@)">
- <inheritdoc/>
- </member>
- <member name="M:VNLib.Data.Caching.BlobCache.Evicted(System.Collections.Generic.KeyValuePair{System.String,VNLib.Data.Caching.BlobItem})">
- <inheritdoc/>
- </member>
- <member name="M:VNLib.Data.Caching.BlobCache.TryChangeKey(System.String,System.String,VNLib.Data.Caching.BlobItem@)">
- <summary>
- If the <see cref="T:VNLib.Data.Caching.BlobItem"/> is found in the store, changes the key
- that referrences the blob.
- </summary>
- <param name="currentKey">The key that currently referrences the blob in the store</param>
- <param name="newKey">The new key that will referrence the blob</param>
- <param name="blob">The <see cref="T:VNLib.Data.Caching.BlobItem"/> if its found in the store</param>
- <returns>True if the record was found and the key was changes</returns>
- </member>
- <member name="M:VNLib.Data.Caching.BlobCache.Remove(System.String)">
- <summary>
- Removes the <see cref="T:VNLib.Data.Caching.BlobItem"/> from the store without disposing the blobl
- </summary>
- <param name="key">The key that referrences the <see cref="T:VNLib.Data.Caching.BlobItem"/> in the store</param>
- <returns>A value indicating if the blob was removed</returns>
- </member>
- <member name="M:VNLib.Data.Caching.BlobCache.Clear">
- <summary>
- Removes and disposes all blobl elements in cache (or in the backing store)
- </summary>
- </member>
- <member name="T:VNLib.Data.Caching.BlobItem">
- <summary>
- A general purpose binary storage item
- </summary>
- </member>
- <member name="P:VNLib.Data.Caching.BlobItem.LastModified">
- <summary>
- The time the blob was last modified
- </summary>
- </member>
- <member name="P:VNLib.Data.Caching.BlobItem.FileSize">
- <summary>
- Gets the current size of the file (in bytes) as an atomic operation
- </summary>
- </member>
- <member name="P:VNLib.Data.Caching.BlobItem.OpLock">
- <summary>
- The operation synchronization lock
- </summary>
- </member>
- <member name="M:VNLib.Data.Caching.BlobItem.#ctor(VNLib.Utils.Memory.PrivateHeap)">
- <summary>
- Initializes a new <see cref="T:VNLib.Data.Caching.BlobItem"/>
- </summary>
- <param name="heap">The heap to allocate buffers from</param>
- </member>
- <member name="M:VNLib.Data.Caching.BlobItem.Free">
- <inheritdoc/>
- </member>
- <member name="M:VNLib.Data.Caching.BlobItem.Read(System.Span{System.Byte})">
- <summary>
- Reads data from the internal buffer and copies it to the specified buffer.
- Use the <see cref="P:VNLib.Data.Caching.BlobItem.FileSize"/> property to obtain the size of the internal buffer
- </summary>
- <param name="buffer">The buffer to copy data to</param>
- <returns>When completed, the number of bytes copied to the buffer</returns>
- </member>
- <member name="M:VNLib.Data.Caching.BlobItem.Write(System.ReadOnlySpan{System.Byte})">
- <summary>
- Overwrites the internal buffer with the contents of the supplied buffer
- </summary>
- <param name="buffer">The buffer containing data to store within the blob</param>
- <returns>A <see cref="T:System.Threading.Tasks.ValueTask"/> that completes when write access has been granted and copied</returns>
- <exception cref="T:System.InvalidOperationException"></exception>
- </member>
- <member name="M:VNLib.Data.Caching.BlobItem.SwapToDiskAsync(VNLib.Utils.Memory.PrivateHeap,System.IO.DirectoryInfo,System.String,VNLib.Utils.Logging.ILogProvider)">
- <summary>
- Writes the contents of the memory buffer to its designated file on the disk
- </summary>
- <param name="heap">The heap to allocate buffers from</param>
- <param name="swapDir">The <see cref="T:VNLib.Utils.IO.IsolatedStorageDirectory"/> that stores the file</param>
- <param name="filename">The name of the file to write data do</param>
- <param name="log">A log to write errors to</param>
- <returns>A task that completes when the swap to disk is complete</returns>
- </member>
- <member name="M:VNLib.Data.Caching.BlobItem.SwapFromDiskAsync(VNLib.Utils.Memory.PrivateHeap,System.IO.DirectoryInfo,System.String,VNLib.Utils.Logging.ILogProvider)">
- <summary>
- Reads the contents of the blob into a memory buffer from its designated file on disk
- </summary>
- <param name="heap">The heap to allocate buffers from</param>
- <param name="swapDir">The <see cref="T:VNLib.Utils.IO.IsolatedStorageDirectory"/> that stores the file</param>
- <param name="filename">The name of the file to write the blob data to</param>
- <param name="log">A log to write errors to</param>
- <returns>A task that completes when the swap from disk is complete</returns>
- </member>
- <member name="T:VNLib.Data.Caching.CacheListener">
- <summary>
- A base implementation of a memory/disk LRU data cache FBM listener
- </summary>
- </member>
- <member name="P:VNLib.Data.Caching.CacheListener.Cache">
- <summary>
- The Cache store to access data blobs
- </summary>
- </member>
- <member name="P:VNLib.Data.Caching.CacheListener.Heap">
- <summary>
- The <see cref="T:VNLib.Utils.Memory.PrivateHeap"/> to allocate buffers from
- </summary>
- </member>
- <member name="M:VNLib.Data.Caching.CacheListener.InitCache(System.IO.DirectoryInfo,System.Int32,VNLib.Utils.Memory.PrivateHeap)">
- <summary>
- Initializes the <see cref="P:VNLib.Data.Caching.CacheListener.Cache"/> data store
- </summary>
- <param name="dir"></param>
- <param name="cacheSize"></param>
- <param name="heap"></param>
- </member>
- <member name="M:VNLib.Data.Caching.CacheListener.SwapToDiskAsync">
- <summary>
- Asynchronously swaps all blobs to the disk
- </summary>
- <returns></returns>
- </member>
- <member name="M:VNLib.Data.Caching.CacheListener.Dispose(System.Boolean)">
- <inheritdoc/>
- </member>
- <member name="M:VNLib.Data.Caching.CacheListener.Dispose">
- <inheritdoc/>
- </member>
- <member name="T:VNLib.Data.Caching.ClientExtensions">
- <summary>
- Provides caching extension methods for <see cref="T:VNLib.Net.Messaging.FBM.Client.FBMClient"/>
- </summary>
- </member>
- <member name="M:VNLib.Data.Caching.ClientExtensions.GetObjectAsync``1(VNLib.Net.Messaging.FBM.Client.FBMClient,System.String,System.Text.Json.JsonSerializerOptions,System.Threading.CancellationToken)">
- <summary>
- Gets an object from the server if it exists
- </summary>
- <typeparam name="T"></typeparam>
- <param name="client"></param>
- <param name="objectId">The id of the object to get</param>
- <param name="jso">The <see cref="T:System.Text.Json.JsonSerializerOptions"/> to use for serialization</param>
- <param name="cancellationToken">A token to cancel the operation</param>
- <returns>A task that completes to return the results of the response payload</returns>
- <exception cref="T:System.Text.Json.JsonException"></exception>
- <exception cref="T:System.OutOfMemoryException"></exception>
- <exception cref="T:VNLib.Data.Caching.Exceptions.InvalidStatusException"></exception>
- <exception cref="T:System.ObjectDisposedException"></exception>
- <exception cref="T:VNLib.Net.Messaging.FBM.Client.InvalidResponseException"></exception>
- </member>
- <member name="M:VNLib.Data.Caching.ClientExtensions.AddOrUpdateObjectAsync``1(VNLib.Net.Messaging.FBM.Client.FBMClient,System.String,System.String,``0,System.Text.Json.JsonSerializerOptions,System.Threading.CancellationToken)">
- <summary>
- Updates the state of the session, and optionally updates the ID of the session. The data
- property is buffered and streamed to the remote server
- </summary>
- <typeparam name="T"></typeparam>
- <param name="client"></param>
- <param name="objectId">The id of the object to update or replace</param>
- <param name="newId">An optional parameter to specify a new ID for the old object</param>
- <param name="data">The payload data to serialize and set as the data state of the session</param>
- <param name="jso">Optional <see cref="T:System.Text.Json.JsonSerializerOptions"/></param>
- <param name="cancellationToken">A token to cancel the operation</param>
- <returns>A task that resolves when the server responds</returns>
- <exception cref="T:System.Text.Json.JsonException"></exception>
- <exception cref="T:System.OutOfMemoryException"></exception>
- <exception cref="T:VNLib.Data.Caching.Exceptions.InvalidStatusException"></exception>
- <exception cref="T:System.ObjectDisposedException"></exception>
- <exception cref="T:VNLib.Net.Messaging.FBM.Client.InvalidResponseException"></exception>
- <exception cref="T:VNLib.Data.Caching.Exceptions.MessageTooLargeException"></exception>
- </member>
- <member name="M:VNLib.Data.Caching.ClientExtensions.DeleteObjectAsync(VNLib.Net.Messaging.FBM.Client.FBMClient,System.String,System.Threading.CancellationToken)">
- <summary>
- Asynchronously deletes an object in the remote store
- </summary>
- <param name="client"></param>
- <param name="objectId">The id of the object to update or replace</param>
- <param name="cancellationToken">A token to cancel the operation</param>
- <returns>A task that resolves when the operation has completed</returns>
- <exception cref="T:VNLib.Data.Caching.Exceptions.InvalidStatusException"></exception>
- <exception cref="T:System.ObjectDisposedException"></exception>
- <exception cref="T:VNLib.Net.Messaging.FBM.Client.InvalidResponseException"></exception>
- </member>
- <member name="M:VNLib.Data.Caching.ClientExtensions.ObjectId(VNLib.Net.Messaging.FBM.Server.FBMContext)">
- <summary>
- Gets the Object-id for the request message, or throws an <see cref="T:System.InvalidOperationException"/> if not specified
- </summary>
- <param name="context"></param>
- <returns>The id of the object requested</returns>
- <exception cref="T:System.InvalidOperationException"></exception>
- </member>
- <member name="M:VNLib.Data.Caching.ClientExtensions.NewObjectId(VNLib.Net.Messaging.FBM.Server.FBMContext)">
- <summary>
- Gets the new ID of the object if specified from the request. Null if the request did not specify an id update
- </summary>
- <param name="context"></param>
- <returns>The new ID of the object if speicifed, null otherwise</returns>
- </member>
- <member name="M:VNLib.Data.Caching.ClientExtensions.Method(VNLib.Net.Messaging.FBM.Server.FBMContext)">
- <summary>
- Gets the request method for the request
- </summary>
- <param name="context"></param>
- <returns>The request method string</returns>
- </member>
- <member name="M:VNLib.Data.Caching.ClientExtensions.CloseResponse(VNLib.Net.Messaging.FBM.Server.FBMContext,System.String,System.IO.Stream)">
- <summary>
- Closes a response with a status code
- </summary>
- <param name="context"></param>
- <param name="responseCode">The status code to send to the client</param>
- <param name="payload">The payload to send to the client</param>
- </member>
- <member name="M:VNLib.Data.Caching.ClientExtensions.CloseResponse(VNLib.Net.Messaging.FBM.Server.FBMContext,System.String)">
- <summary>
- Closes a response with a status code
- </summary>
- <param name="context"></param>
- <param name="responseCode">The status code to send to the client</param>
- </member>
- <member name="M:VNLib.Data.Caching.ClientExtensions.SetAuth(VNLib.Net.Messaging.FBM.Client.FBMClientWorkerBase,System.ReadOnlySpan{System.Byte},System.Int32)">
- <summary>
- Computes the authorization headers for the initial client connection
- </summary>
- <param name="worker"></param>
- <param name="secret">The pre-shared secret used to compute a secure hash of a random token</param>
- <param name="saltSize">The size (in bytes) of the salt to compute the hash of</param>
- </member>
- <member name="M:VNLib.Data.Caching.ClientExtensions.Authorized(VNLib.Net.Http.ConnectionInfo,System.ReadOnlySpan{System.Byte})">
- <summary>
- Determines if the client has the proper authorization by verifying the client data can compute the same hash result with
- the specified secret
- </summary>
- <param name="server"></param>
- <param name="secret">The pre-shared secret used to verify the data</param>
- <returns>True if the authorization headers compute to the proper hash result (keys match), false otherwise</returns>
- <remarks>The verification is fixed-time</remarks>
- <exception cref="T:System.OutOfMemoryException"></exception>
- </member>
- <member name="M:VNLib.Data.Caching.ClientExtensions.SetReconnectPolicy(VNLib.Net.Messaging.FBM.Client.FBMClientWorkerBase,System.TimeSpan,System.Uri)">
- <summary>
- Initializes the worker for a reconnect policy and returns an object that can listen for changes
- and configure the connection as necessary
- </summary>
- <param name="worker"></param>
- <param name="retryDelay">The amount of time to wait between retries</param>
- <param name="serverUri">The uri to reconnect the client to</param>
- <returns>A <see cref="T:VNLib.Data.Caching.ClientRetryManager"/> for listening for retry events</returns>
- </member>
- <member name="T:VNLib.Data.Caching.ClientRetryManager">
- <summary>
- Manages a <see cref="T:VNLib.Net.Messaging.FBM.Client.FBMClientWorkerBase"/> reconnect policy
- </summary>
- </member>
- <member name="E:VNLib.Data.Caching.ClientRetryManager.OnBeforeReconnect">
- <summary>
- Raised before client is to be reconnected
- </summary>
- </member>
- <member name="E:VNLib.Data.Caching.ClientRetryManager.OnReconnectFailed">
- <summary>
- Raised when the client fails to reconnect. Should return a value that instructs the
- manager to reconnect
- </summary>
- </member>
- <member name="E:VNLib.Data.Caching.ClientRetryManager.OnSuccessfulReconnect">
- <summary>
- Raised when the client websocket is successfully reconnected
- </summary>
- </member>
- <member name="T:VNLib.Data.Caching.Constants.Actions">
- <summary>
- Contains constants the define actions
- </summary>
- </member>
- <member name="T:VNLib.Data.Caching.Constants.ResponseCodes">
- <summary>
- Containts constants for operation response codes
- </summary>
- </member>
- <member name="T:VNLib.Data.Caching.Exceptions.InvalidStatusException">
- <summary>
- Raised when the response status code of an FBM Request message is not valid for
- the specified request
- </summary>
- </member>
- <member name="M:VNLib.Data.Caching.Exceptions.InvalidStatusException.#ctor(System.String,System.String)">
- <summary>
- Initalizes a new <see cref="T:VNLib.Data.Caching.Exceptions.InvalidStatusException"/> with the specfied status code
- </summary>
- <param name="message"></param>
- <param name="statusCode"></param>
- </member>
- <member name="M:VNLib.Data.Caching.Exceptions.InvalidStatusException.#ctor">
- <inheritdoc/>
- </member>
- <member name="M:VNLib.Data.Caching.Exceptions.InvalidStatusException.#ctor(System.String)">
- <inheritdoc/>
- </member>
- <member name="M:VNLib.Data.Caching.Exceptions.InvalidStatusException.#ctor(System.String,System.Exception)">
- <inheritdoc/>
- </member>
- <member name="P:VNLib.Data.Caching.Exceptions.InvalidStatusException.Message">
- <inheritdoc/>
- </member>
- <member name="T:VNLib.Data.Caching.Exceptions.MessageTooLargeException">
- <summary>
- Raised when a request (or server response) calculates the size of the message to be too large to proccess
- </summary>
- </member>
- <member name="M:VNLib.Data.Caching.Exceptions.MessageTooLargeException.#ctor">
- <inheritdoc/>
- </member>
- <member name="M:VNLib.Data.Caching.Exceptions.MessageTooLargeException.#ctor(System.String)">
- <inheritdoc/>
- </member>
- <member name="M:VNLib.Data.Caching.Exceptions.MessageTooLargeException.#ctor(System.String,System.Exception)">
- <inheritdoc/>
- </member>
- <member name="M:VNLib.Data.Caching.Exceptions.MessageTooLargeException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
- <inheritdoc/>
- </member>
- </members>
-</doc>
diff --git a/VNLib.Data.Caching/src/WaitForChangeResult.cs b/VNLib.Data.Caching/src/WaitForChangeResult.cs
deleted file mode 100644
index cefb73d..0000000
--- a/VNLib.Data.Caching/src/WaitForChangeResult.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
-* Copyright (c) 2022 Vaughn Nugent
-*
-* Library: VNLib
-* Package: VNLib.Data.Caching
-* File: WaitForChangeResult.cs
-*
-* WaitForChangeResult.cs is part of VNLib.Data.Caching which is part of the larger
-* VNLib collection of libraries and utilities.
-*
-* VNLib.Data.Caching is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License,
-* or (at your option) any later version.
-*
-* VNLib.Data.Caching is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with VNLib.Data.Caching. If not, see http://www.gnu.org/licenses/.
-*/
-
-namespace VNLib.Data.Caching
-{
- /// <summary>
- /// The result of a cache server change event
- /// </summary>
- public readonly struct WaitForChangeResult
- {
- /// <summary>
- /// The operation status code
- /// </summary>
- public readonly string Status { get; init; }
- /// <summary>
- /// The current (or old) id of the element that changed
- /// </summary>
- public readonly string CurrentId { get; init; }
- /// <summary>
- /// The new id of the element that changed
- /// </summary>
- public readonly string NewId { get; init; }
- }
-}