Ejemplo n.º 1
0
 public CacheEntry(byte[] keyBasis, HashBasedPathBuilder builder)
 {
     Hash         = builder.HashKeyBasis(keyBasis);
     RelativePath = builder.GetRelativePathFromHash(Hash);
     PhysicalPath = builder.GetPhysicalPathFromRelativePath(RelativePath);
     StringKey    = builder.GetStringFromHash(Hash);
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
                }
            }
        }
Ejemplo n.º 4
0
        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);
            }
        }