Пример #1
0
        private static BuildXL.Cache.MemoizationStore.Interfaces.Caches.ICache CreateDistributedCache(ILogger logger, Config cacheConfig)
        {
            int cacheKeyBumpTimeMins = cacheConfig.CacheKeyBumpTimeMins;

            if (cacheKeyBumpTimeMins <= 0)
            {
                logger.Debug("Config specified bump time in minutes is invalid {0}. Using default bump time {1}", cacheKeyBumpTimeMins, Config.DefaultCacheKeyBumpTimeMins);
                cacheKeyBumpTimeMins = Config.DefaultCacheKeyBumpTimeMins;
            }

            TimeSpan keyBump = TimeSpan.FromMinutes(cacheKeyBumpTimeMins);

            var metadataTracer = new DistributedCacheSessionTracer(logger, nameof(DistributedCache));

            string metadataKeyspace = cacheConfig.CacheNamespace;

            if (string.IsNullOrWhiteSpace(metadataKeyspace))
            {
                metadataKeyspace = DefaultMetadataKeyspace;
            }

            IMetadataCache metadataCache = RedisMetadataCacheFactory.Create(metadataTracer, keySpace: metadataKeyspace, cacheKeyBumpTime: keyBump);

            var innerCache = cacheConfig.DisableContent
                ?  new OneLevelCache(
                contentStoreFunc: () => new ReadOnlyEmptyContentStore(),
                memoizationStoreFunc: () => (BuildCacheCache)BuildCacheUtils.CreateBuildCacheCache(cacheConfig, logger, Environment.GetEnvironmentVariable("VSTSPERSONALACCESSTOKEN")),
                id: Guid.NewGuid(),
                passContentToMemoization: false)
                : BuildCacheUtils.CreateBuildCacheCache(cacheConfig, logger, Environment.GetEnvironmentVariable("VSTSPERSONALACCESSTOKEN"));

            ReadThroughMode readThroughMode = cacheConfig.SealUnbackedContentHashLists ? ReadThroughMode.ReadThrough : ReadThroughMode.None;

            return(new DistributedCache(logger, innerCache, metadataCache, metadataTracer, readThroughMode));
        }
        public void NoProviderThrows()
        {
            Action a = () => RedisMetadataCacheFactory.Create(_tracer).Dispose();

            a.Should().Throw <InvalidOperationException>().Where(e =>
                                                                 e.Message.Contains(ExecutableConnectionStringProvider.CredentialProviderVariableName) &&
                                                                 e.Message.Contains(EnvironmentConnectionStringProvider.RedisConnectionStringEnvironmentVariable));
        }
 public Task CreateWithCacheKeyBumpTime()
 {
     return(TestWithEnvironmentConnectionStringAsync(
                () => RedisMetadataCacheFactory.Create(tracer: _tracer, cacheKeyBumpTime: CacheKeyBumpTime),
                cache =>
     {
         cache.CacheKeyBumpTime.Should().Be(CacheKeyBumpTime);
     }));
 }
 public Task CreateWithKeySpace()
 {
     return(TestWithEnvironmentConnectionStringAsync(
                () => RedisMetadataCacheFactory.Create(_tracer, KeySpace),
                cache =>
     {
         cache.Keyspace.Should().Be(KeySpace + RedisMetadataCacheFactory.Salt);
     }));
 }
 public Task CreateDefault()
 {
     return(TestWithEnvironmentConnectionStringAsync(
                () => RedisMetadataCacheFactory.Create(_tracer),
                cache =>
     {
         cache.Keyspace.Should().Be(RedisMetadataCacheFactory.DefaultKeySpace + RedisMetadataCacheFactory.Salt);
         cache.CacheKeyBumpTime.Should().Be(RedisMetadataCache.DefaultCacheKeyBumpTime);
     }));
 }
        public Task CreateWithCacheKeyBumpTimeAndProvider()
        {
            var connectionString = $"ConnectionString{ThreadSafeRandom.Generator.Next()}";

            return(TestCacheAsync(
                       () => RedisMetadataCacheFactory.Create(CreateMockProvider(connectionString), _tracer, cacheKeyBumpTime: CacheKeyBumpTime),
                       cache =>
            {
                cache.CacheKeyBumpTime.Should().Be(CacheKeyBumpTime);
                return Task.FromResult(0);
            }));
        }
        public Task CreateDefaultWithProvider()
        {
            var connectionString = $"ConnectionString{ThreadSafeRandom.Generator.Next()}";

            return(TestCacheAsync(
                       () => RedisMetadataCacheFactory.Create(CreateMockProvider(connectionString), _tracer),
                       async cache =>
            {
                var connectionStringResult = await cache.ConnectionStringProvider.GetConnectionString().ConfigureAwait(false);
                connectionStringResult.ConnectionString.Should().Be(connectionString);
                cache.Keyspace.Should().Be(RedisMetadataCacheFactory.DefaultKeySpace + RedisMetadataCacheFactory.Salt);
                cache.CacheKeyBumpTime.Should().Be(RedisMetadataCache.DefaultCacheKeyBumpTime);
            }));
        }
 public async Task NonexistentExecutableConnectionStringProviderError()
 {
     using (var testDirectory = new DisposableDirectory(FileSystem))
     {
         var nonexistentPath = testDirectory.CreateRandomFileName();
         using (new TestEnvironmentVariable(ExecutableConnectionStringProvider.CredentialProviderVariableName, nonexistentPath.Path)
                )
         {
             await TestCacheAsync(
                 () => RedisMetadataCacheFactory.Create(_tracer),
                 async cache =>
             {
                 var connectionStringResult = await cache.ConnectionStringProvider.GetConnectionString().ConfigureAwait(false);
                 connectionStringResult.Succeeded.Should().BeFalse();
                 connectionStringResult.ErrorMessage.Should().Contain("The system cannot find the file specified");
             }).ConfigureAwait(false);
         }
     }
 }
        public async Task EnvironmentProviderOverridesExecutableProvider()
        {
            var connectionString = $"ConnectionString{ThreadSafeRandom.Generator.Next()}";

            using (var testDirectory = new DisposableDirectory(FileSystem))
            {
                var nonexistentPath = testDirectory.CreateRandomFileName();
                using (new TestEnvironmentVariable(ExecutableConnectionStringProvider.CredentialProviderVariableName, nonexistentPath.Path)
                       )
                    using (new TestEnvironmentVariable(EnvironmentConnectionStringProvider.RedisConnectionStringEnvironmentVariable, connectionString))
                    {
                        await TestCacheAsync(
                            () => RedisMetadataCacheFactory.Create(_tracer),
                            async cache =>
                        {
                            var connectionStringResult =
                                await cache.ConnectionStringProvider.GetConnectionString().ConfigureAwait(false);
                            connectionStringResult.ConnectionString.Should().Be(connectionString);
                        }).ConfigureAwait(false);
                    }
            }
        }