From 1ac989ee729dce91ab6b9174716fe58aff38f9ea Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 30 Aug 2013 15:42:11 -0700 Subject: [PATCH] Making azure db cache provider tenant aware again ICacheProvider calls Start() and provides the region prefix as a property, which lets us create a dedicated DataCache. The BuildCache method is called once per record, and reuse by Nhibernate. --- .../Caching/CacheClientConfiguration.cs | 14 +++---- .../Caching/Database/AzureCacheProvider.cs | 38 ++++++++++++------- .../Output/AzureOutputCacheStorageProvider.cs | 2 +- .../Configuration/PlatformConfiguration.cs | 10 ----- 4 files changed, 33 insertions(+), 31 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Azure/Services/Caching/CacheClientConfiguration.cs b/src/Orchard.Web/Modules/Orchard.Azure/Services/Caching/CacheClientConfiguration.cs index c2adaaf8f..97ae40bf8 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure/Services/Caching/CacheClientConfiguration.cs +++ b/src/Orchard.Web/Modules/Orchard.Azure/Services/Caching/CacheClientConfiguration.cs @@ -6,15 +6,15 @@ namespace Orchard.Azure.Services.Caching { public class CacheClientConfiguration { - public static CacheClientConfiguration FromPlatformConfiguration(string settingNamePrefix) { - var portString = PlatformConfiguration.GetSetting(Constants.CachePortSettingName, settingNamePrefix); - var isSharedCachingString = PlatformConfiguration.GetSetting(Constants.CacheIsSharedCachingSettingName, settingNamePrefix); + public static CacheClientConfiguration FromPlatformConfiguration(string tenant, string settingNamePrefix) { + var portString = PlatformConfiguration.GetSetting(Constants.CachePortSettingName, tenant, settingNamePrefix); + var isSharedCachingString = PlatformConfiguration.GetSetting(Constants.CacheIsSharedCachingSettingName, tenant, settingNamePrefix); return new CacheClientConfiguration { - HostIdentifier = PlatformConfiguration.GetSetting(Constants.CacheHostIdentifierSettingName, settingNamePrefix), - CacheName = PlatformConfiguration.GetSetting(Constants.CacheCacheNameSettingName, settingNamePrefix), - Hostname = PlatformConfiguration.GetSetting(Constants.CacheHostnameSettingName, settingNamePrefix), + HostIdentifier = PlatformConfiguration.GetSetting(Constants.CacheHostIdentifierSettingName, tenant, settingNamePrefix), + CacheName = PlatformConfiguration.GetSetting(Constants.CacheCacheNameSettingName, tenant, settingNamePrefix), + Hostname = PlatformConfiguration.GetSetting(Constants.CacheHostnameSettingName, tenant, settingNamePrefix), Port = String.IsNullOrWhiteSpace(portString) ? 0 : Int32.Parse(portString), - AuthorizationToken = PlatformConfiguration.GetSetting(Constants.CacheAuthorizationTokenSettingName, settingNamePrefix), + AuthorizationToken = PlatformConfiguration.GetSetting(Constants.CacheAuthorizationTokenSettingName, tenant, settingNamePrefix), IsSharedCaching = !String.IsNullOrWhiteSpace(isSharedCachingString) && Boolean.Parse(isSharedCachingString) }; } diff --git a/src/Orchard.Web/Modules/Orchard.Azure/Services/Caching/Database/AzureCacheProvider.cs b/src/Orchard.Web/Modules/Orchard.Azure/Services/Caching/Database/AzureCacheProvider.cs index ecb181c10..dcc2e5db6 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure/Services/Caching/Database/AzureCacheProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.Azure/Services/Caching/Database/AzureCacheProvider.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Microsoft.ApplicationServer.Caching; using NHibernate.Cache; using System; @@ -6,29 +7,26 @@ namespace Orchard.Azure.Services.Caching.Database { public class AzureCacheProvider : ICacheProvider { - public ICache BuildCache(string regionName, IDictionary properties) { - CacheClientConfiguration configuration; - - try { - configuration = CacheClientConfiguration.FromPlatformConfiguration(Constants.DatabaseCacheSettingNamePrefix); - configuration.Validate(); - } - catch (Exception ex) { - throw new Exception(String.Format("The {0} configuration settings are missing or invalid.", Constants.DatabaseCacheFeatureName), ex); - } + private DataCache _dataCache; + private bool _sharedCaching; + public ICache BuildCache(string regionName, IDictionary properties) { + + if (_dataCache == null) { + throw new ApplicationException("DataCache should be available"); + } + string enableCompressionString; properties.TryGetValue("compression_enabled", out enableCompressionString); - var cache = configuration.CreateCache(); - + TimeSpan? expiration = null; string expirationString; if (properties.TryGetValue("expiration", out expirationString) || properties.TryGetValue(NHibernate.Cfg.Environment.CacheDefaultExpiration, out expirationString)) { expiration = TimeSpan.FromSeconds(Int32.Parse(expirationString)); } - return new AzureCacheClient(cache, configuration.IsSharedCaching, regionName, expiration); + return new AzureCacheClient(_dataCache, _sharedCaching, regionName, expiration); } public long NextTimestamp() { @@ -36,6 +34,20 @@ namespace Orchard.Azure.Services.Caching.Database { } public void Start(IDictionary properties) { + CacheClientConfiguration configuration; + + try { + var tenant = properties["region_prefix"]; + + configuration = CacheClientConfiguration.FromPlatformConfiguration(tenant, Constants.DatabaseCacheSettingNamePrefix); + configuration.Validate(); + } + catch (Exception ex) { + throw new Exception(String.Format("The {0} configuration settings are missing or invalid.", Constants.DatabaseCacheFeatureName), ex); + } + + _dataCache = configuration.CreateCache(); + _sharedCaching = configuration.IsSharedCaching; } public void Stop() { diff --git a/src/Orchard.Web/Modules/Orchard.Azure/Services/Caching/Output/AzureOutputCacheStorageProvider.cs b/src/Orchard.Web/Modules/Orchard.Azure/Services/Caching/Output/AzureOutputCacheStorageProvider.cs index a5ade4f8b..94af0f158 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure/Services/Caching/Output/AzureOutputCacheStorageProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.Azure/Services/Caching/Output/AzureOutputCacheStorageProvider.cs @@ -17,7 +17,7 @@ namespace Orchard.Azure.Services.Caching.Output { public AzureOutputCacheStorageProvider(ShellSettings shellSettings) { try { - _cacheConfig = CacheClientConfiguration.FromPlatformConfiguration(Constants.OutputCacheSettingNamePrefix); + _cacheConfig = CacheClientConfiguration.FromPlatformConfiguration(shellSettings.Name, Constants.OutputCacheSettingNamePrefix); _cacheConfig.Validate(); } catch (Exception ex) { diff --git a/src/Orchard.Web/Modules/Orchard.Azure/Services/Environment/Configuration/PlatformConfiguration.cs b/src/Orchard.Web/Modules/Orchard.Azure/Services/Environment/Configuration/PlatformConfiguration.cs index 1ec9b3857..e3e616346 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure/Services/Environment/Configuration/PlatformConfiguration.cs +++ b/src/Orchard.Web/Modules/Orchard.Azure/Services/Environment/Configuration/PlatformConfiguration.cs @@ -17,15 +17,5 @@ namespace Orchard.Azure.Services.Environment.Configuration { var fallbackName = namePrefix + name; return CloudConfigurationManager.GetSetting(tenantName) ?? CloudConfigurationManager.GetSetting(fallbackName); } - - /// - /// Reads a setting from platform configuration - /// - /// The name of the setting to read. - /// An optional prefix to prepend the setting name with. - /// The value of the setting if found with or without tenant name prefix, otherwise null. - public static string GetSetting(string name, string namePrefix = null) { - return CloudConfigurationManager.GetSetting(namePrefix + name); - } } } \ No newline at end of file