Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public sealed class ConfigurationFeatureDefinitionProvider : IFeatureDefinitionP
private readonly ConcurrentDictionary<string, Task<FeatureDefinition>> _definitions;
private IDisposable _changeSubscription;
private int _stale = 0;
private int _initialized = 0;
private readonly Func<string, Task<FeatureDefinition>> _getFeatureDefinitionFunc;

const string ParseValueErrorString = "Invalid setting '{0}' with value '{1}' for feature '{2}'.";
Expand All @@ -49,10 +50,6 @@ public ConfigurationFeatureDefinitionProvider(IConfiguration configuration)
{
return Task.FromResult(GetMicrosoftSchemaFeatureDefinition(featureName) ?? GetDotnetSchemaFeatureDefinition(featureName));
};

_dotnetFeatureDefinitionSections = GetDotnetFeatureDefinitionSections();

_microsoftFeatureDefinitionSections = GetMicrosoftFeatureDefinitionSections();
}

/// <summary>
Expand Down Expand Up @@ -92,13 +89,15 @@ public Task<FeatureDefinition> GetFeatureDefinitionAsync(string featureName)
throw new ArgumentException($"The value '{ConfigurationPath.KeyDelimiter}' is not allowed in the feature name.", nameof(featureName));
}

EnsureInit();

if (Interlocked.Exchange(ref _stale, 0) != 0)
{
_definitions.Clear();

_dotnetFeatureDefinitionSections = GetDotnetFeatureDefinitionSections();

_microsoftFeatureDefinitionSections = GetMicrosoftFeatureDefinitionSections();

_definitions.Clear();
}

return _definitions.GetOrAdd(featureName, _getFeatureDefinitionFunc);
Expand All @@ -115,13 +114,15 @@ public Task<FeatureDefinition> GetFeatureDefinitionAsync(string featureName)
public async IAsyncEnumerable<FeatureDefinition> GetAllFeatureDefinitionsAsync()
#pragma warning restore CS1998
{
EnsureInit();

if (Interlocked.Exchange(ref _stale, 0) != 0)
{
_definitions.Clear();

_dotnetFeatureDefinitionSections = GetDotnetFeatureDefinitionSections();

_microsoftFeatureDefinitionSections = GetMicrosoftFeatureDefinitionSections();

_definitions.Clear();
}

foreach (IConfigurationSection featureSection in _microsoftFeatureDefinitionSections)
Expand Down Expand Up @@ -163,6 +164,18 @@ public async IAsyncEnumerable<FeatureDefinition> GetAllFeatureDefinitionsAsync()
}
}

private void EnsureInit()
{
if (_initialized == 0)
{
_dotnetFeatureDefinitionSections = GetDotnetFeatureDefinitionSections();

_microsoftFeatureDefinitionSections = GetMicrosoftFeatureDefinitionSections();

_initialized = 1;
}
}

private FeatureDefinition GetDotnetSchemaFeatureDefinition(string featureName)
{
IConfigurationSection dotnetFeatureDefinitionConfiguration = _dotnetFeatureDefinitionSections
Expand Down
2 changes: 1 addition & 1 deletion tests/Tests.FeatureManagement/FeatureManagementTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public async Task ReadsTopLevelConfiguration()

IFeatureManager featureManager = serviceProvider.GetRequiredService<IFeatureManager>();

//Assert.True(await featureManager.IsEnabledAsync("FeatureX"));
Assert.True(await featureManager.IsEnabledAsync("FeatureX"));

string json = @"
{
Expand Down