public void TestVolatileSet() { var clock = new MemoryClock(); var set = new VolatileSet<int>(clock); set.Add(0, TimeSpan.FromSeconds(100)); set.Add(1, TimeSpan.FromSeconds(10)); set.Contains(1).Should().BeTrue(); // Increment time to invalidate item clock.UtcNow += TimeSpan.FromSeconds(11); // Item 1 should be invalidated, but 0 should remain set.Contains(1).Should().BeFalse(); set.Contains(0).Should().BeTrue(); // Explicitly invalidating item should remove it set.Invalidate(0); set.Contains(0).Should().BeFalse(); set = new VolatileSet<int>(clock); set.Add(1, TimeSpan.FromSeconds(10)); set.Add(2, TimeSpan.FromSeconds(20)); set.Add(3, TimeSpan.FromSeconds(30)); set.Add(4, TimeSpan.FromSeconds(40)); set.Add(5, TimeSpan.FromSeconds(50)); clock.UtcNow += TimeSpan.FromSeconds(25); // Should only be able to remove items 1 and 2 since they have expired set.CleanStaleItems(20).Should().Be(2); set.Contains(1).Should().BeFalse(); set.Contains(2).Should().BeFalse(); set.Contains(3).Should().BeTrue(); set.Contains(4).Should().BeTrue(); set.Contains(5).Should().BeTrue(); // Move time past original timeout for 3 but add with 20 seconds from current time // 3 should be retained set.Add(3, TimeSpan.FromSeconds(20)); clock.UtcNow += TimeSpan.FromSeconds(10); set.Contains(3).Should().BeTrue(); }
public void TestVolatileWithShortHashSet() { var clock = new MemoryClock(); var set = new VolatileSet <ShortHash>(clock); for (int i = 0; i < 500_000; i++) { var hash = ContentHash.Random(HashType.Vso0); var shortHash = new ShortHash(hash); set.Add(shortHash, TimeSpan.FromMinutes(30)); set.Contains(shortHash).Should().BeTrue(); } }
public async Task EmitIncidentAsync(IcmIncident incident) { if (incident.CacheTimeToLive is not null) { if (_cachedIcms.Contains(incident.Title)) { // Update TTL and return. _cachedIcms.Add(incident.Title, incident.CacheTimeToLive.Value); return; } else { // Add to cached incidents. _cachedIcms.Add(incident.Title, incident.CacheTimeToLive.Value); } } var cert = await _keyVault.GetCertificateAsync(_connectorCertificateName); var incidentToSend = GetIncidentToSend(incident); using var client = ConnectorClientFactory.CreateClient(_uri, cert); try { var result = client.AddOrUpdateIncident2(_connectorId, incidentToSend, RoutingOptions.None); if (result.Status != IncidentAddUpdateStatus.AddedNew && // Discarded means that we're updating hit count or it was suppressed because it's too soon // since we updated hit count last and the incident is still active. result.Status != IncidentAddUpdateStatus.Discarded) { throw new Exception($"Result status does not indicate success: {result.Status}."); } } catch (Exception e) { Console.WriteLine("Failed to submit incident to IcM:\n" + e.ToString()); throw; } }