w4c-workflows-api/Services/InMemoryLeaseService.cs
Vitali sharp8n 42ffcb9adc workflows
2026-09-13 19:28:47 +03:00

29 lines
1.1 KiB
C#

using System.Collections.Concurrent;
namespace w4c_workflows.Services;
/// <summary>
/// In-memory lease service for lite/self-hosted mode where Redis is not available.
/// Uses a ConcurrentDictionary with TTL tracking. Not distributed — only works
/// for a single-process deployment (which is the lite mode use case).
/// </summary>
public sealed class InMemoryLeaseService : ILeaseService
{
private record Lease(string Owner, DateTime ExpiresAt);
private readonly ConcurrentDictionary<string, Lease> _leases = new();
public Task<bool> AcquireAsync(string tenantId, string runId, string owner, TimeSpan ttl)
{
var key = $"{tenantId}:{runId}";
var lease = new Lease(owner, DateTime.UtcNow + ttl);
return Task.FromResult(_leases.TryAdd(key, lease));
}
public Task<bool> ReleaseAsync(string tenantId, string runId, string owner)
{
var key = $"{tenantId}:{runId}";
// Remove only if the owner still matches (compare-and-delete).
return Task.FromResult(_leases.TryRemove(key, out var lease) && lease.Owner == owner);
}
}