public CacheEntry(byte[] keyBasis, HashBasedPathBuilder builder) { Hash = builder.HashKeyBasis(keyBasis); RelativePath = builder.GetRelativePathFromHash(Hash); PhysicalPath = builder.GetPhysicalPathFromRelativePath(RelativePath); StringKey = builder.GetStringFromHash(Hash); }
public void TestGetTrailingBits() { var data = new byte[] { 1, 2, 3 }; var result1 = HashBasedPathBuilder.GetTrailingBits(data, 1); Assert.Equal(1, result1[0]); Assert.Single(result1); var result2 = HashBasedPathBuilder.GetTrailingBits(data, 2); Assert.Equal(3, result2[0]); Assert.Single(result2); var result3 = HashBasedPathBuilder.GetTrailingBits(data, 8); Assert.Equal(3, result3[0]); Assert.Single(result3); var result4 = HashBasedPathBuilder.GetTrailingBits(data, 9); Assert.Equal(3, result4[1]); Assert.Equal(0, result4[0]); Assert.Equal(2, result4.Length); var result5 = HashBasedPathBuilder.GetTrailingBits(data, 10); Assert.Equal(3, result5[1]); Assert.Equal(2, result5[0]); Assert.Equal(2, result5.Length); var result6 = HashBasedPathBuilder.GetTrailingBits(data, 17); Assert.Equal(3, result6[2]); Assert.Equal(2, result6[1]); Assert.Equal(1, result6[0]); Assert.Equal(3, result6.Length); }
public async void SmokeTestSyncMissHit() { var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}"); Directory.CreateDirectory(path); AsyncCache cache = null; try { var asyncCacheOptions = new AsyncCacheOptions() { MaxQueuedBytes = 0 }; var builder = new HashBasedPathBuilder(path, 8192, '/', ".jpg"); cache = new AsyncCache(asyncCacheOptions, new NullCacheManager(), builder, null); var keyBasis = new byte[] { 6, 1, 2 }; var result = await cache.GetOrCreateBytes(keyBasis, (token) => { return(Task.FromResult(new Tuple <string, ArraySegment <byte> >( null, new ArraySegment <byte>(new byte[] { 3, 2, 1 })))); }, CancellationToken.None, false); Assert.NotNull(result.Data); Assert.Equal("WriteSucceeded", result.Status); await cache.AwaitEnqueuedTasks(); var result2 = await cache.GetOrCreateBytes(keyBasis, (token) => { return(Task.FromResult(new Tuple <string, ArraySegment <byte> >( null, new ArraySegment <byte>(new byte[] { 3, 2, 1 })))); }, CancellationToken.None, false); Assert.NotNull(result2.Data); Assert.Equal("DiskHit", result2.Status); var hash = builder.HashKeyBasis(keyBasis); var expectedPhysicalPath = builder.GetPhysicalPathFromHash(hash); Assert.True(File.Exists(expectedPhysicalPath)); } finally { try { await cache?.AwaitEnqueuedTasks(); } finally { Directory.Delete(path, true); } } }
public MetaStore(MetaStoreOptions options, HybridCacheOptions cacheOptions, ILogger logger) { if (options.Shards <= 0 || options.Shards > 2048) { throw new ArgumentException("Shards must be between 1 and 2048"); } var pathBuilder = new HashBasedPathBuilder(cacheOptions.PhysicalCacheDir, cacheOptions.Subfolders, '/', ".jpg"); var directoryEntriesBytes = pathBuilder.GetDirectoryEntriesBytesTotal() + CleanupManager.DirectoryEntrySize(); var shardCount = options.Shards; shards = new Shard[shardCount]; for (var i = 0; i < shardCount; i++) { shards[i] = new Shard(i, options, Path.Combine(options.DatabaseDir, "db", i.ToString()), directoryEntriesBytes / shardCount, logger); } }