Skip to content

Commit 1c25acb

Browse files
authored
Switching worker indexing feature flag from opt-in to opt-out (#8941)
1 parent 265dc83 commit 1c25acb

File tree

10 files changed

+33
-29
lines changed

10 files changed

+33
-29
lines changed

release_notes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
<!-- Please add your release notes in the following format:
33
- My change description (#PR)
44
-->
5+
- Making feature flag for worker indexing opt-out instead of opt-in
56
**Release sprint:** Sprint 132
67
[ [bugs](https://github.com/Azure/azure-functions-host/issues?q=is%3Aissue+milestone%3A%22Functions+Sprint+132%22+label%3Abug+is%3Aclosed) | [features](https://github.com/Azure/azure-functions-host/issues?q=is%3Aissue+milestone%3A%22Functions+Sprint+132%22+label%3Afeature+is%3Aclosed) ]

src/WebJobs.Script/Host/WorkerFunctionMetadataProvider.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,20 @@ namespace Microsoft.Azure.WebJobs.Script
2020
internal class WorkerFunctionMetadataProvider : IWorkerFunctionMetadataProvider
2121
{
2222
private readonly Dictionary<string, ICollection<string>> _functionErrors = new Dictionary<string, ICollection<string>>();
23-
private readonly IOptions<ScriptJobHostOptions> _scriptOptions;
23+
private readonly IOptions<ScriptApplicationHostOptions> _scriptApplicationHostOptions;
2424
private readonly ILogger _logger;
2525
private readonly IEnvironment _environment;
2626
private readonly IWebHostRpcWorkerChannelManager _channelManager;
2727
private readonly string _workerRuntime;
2828
private ImmutableArray<FunctionMetadata> _functions;
2929

3030
public WorkerFunctionMetadataProvider(
31-
IOptions<ScriptJobHostOptions> scriptOptions,
31+
IOptions<ScriptApplicationHostOptions> scriptOptions,
3232
ILogger<WorkerFunctionMetadataProvider> logger,
3333
IEnvironment environment,
3434
IWebHostRpcWorkerChannelManager webHostRpcWorkerChannelManager)
3535
{
36-
_scriptOptions = scriptOptions;
36+
_scriptApplicationHostOptions = scriptOptions;
3737
_logger = logger;
3838
_environment = environment;
3939
_channelManager = webHostRpcWorkerChannelManager;
@@ -91,7 +91,7 @@ public async Task<FunctionMetadataResult> GetFunctionMetadataAsync(IEnumerable<R
9191
_logger.FunctionMetadataProviderFunctionFound(_functions.IsDefault ? 0 : _functions.Count());
9292

9393
// Validate if the app has functions in legacy format and add in logs to inform about the mixed app
94-
_ = Task.Delay(TimeSpan.FromMinutes(1)).ContinueWith(t => ValidateFunctionAppFormat(_scriptOptions.Value.RootScriptPath, _logger, environment));
94+
_ = Task.Delay(TimeSpan.FromMinutes(1)).ContinueWith(t => ValidateFunctionAppFormat(_scriptApplicationHostOptions.Value.ScriptPath, _logger, environment));
9595

9696
break;
9797
}

src/WebJobs.Script/ScriptConstants.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public static class ScriptConstants
118118
public const string FeatureFlagDisableDiagnosticEventLogging = "DisableDiagnosticEventLogging";
119119
public const string FeatureFlagDisableMergedWebHostScriptHostConfiguration = "DisableMergedConfiguration";
120120
public const string FeatureFlagDisableAspNetCoreGrpc = "DisableAspNetCoreGrpc";
121-
public const string FeatureFlagEnableWorkerIndexing = "EnableWorkerIndexing";
121+
public const string FeatureFlagDisableWorkerIndexing = "DisableWorkerIndexing";
122122
public const string FeatureFlagEnableMultiLanguageWorker = "EnableMultiLanguageWorker";
123123
public const string FeatureFlagEnableLinuxEPExecutionCount = "EnableLinuxFEC";
124124

src/WebJobs.Script/Utility.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -912,12 +912,9 @@ public static void ValidateRetryOptions(RetryOptions
912912

913913
public static bool CanWorkerIndex(IEnumerable<RpcWorkerConfig> workerConfigs, IEnvironment environment)
914914
{
915-
if (!FeatureFlags.IsEnabled(ScriptConstants.FeatureFlagEnableWorkerIndexing, environment))
916-
{
917-
return false;
918-
}
919-
920-
if (workerConfigs != null && !environment.IsMultiLanguageRuntimeEnvironment())
915+
if (!FeatureFlags.IsEnabled(ScriptConstants.FeatureFlagDisableWorkerIndexing, environment)
916+
&& workerConfigs != null
917+
&& !environment.IsMultiLanguageRuntimeEnvironment())
921918
{
922919
var workerRuntime = environment.GetEnvironmentVariable(EnvironmentSettingNames.FunctionWorkerRuntime);
923920
var workerConfig = workerConfigs.Where(c => c.Description != null && c.Description.Language != null && c.Description.Language.Equals(workerRuntime, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();

test/WebJobs.Script.Tests.Integration/WebHostEndToEnd/EndToEndTestFixture.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ string GetDestPath(int counter)
122122
string logPath = Path.Combine(Path.GetTempPath(), @"Functions");
123123
if (!string.IsNullOrEmpty(_functionsWorkerRuntime))
124124
{
125+
string currentFeatureFlags = Environment.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags);
126+
var featureFlags = string.IsNullOrEmpty(currentFeatureFlags) ? ScriptConstants.FeatureFlagDisableWorkerIndexing : $"{currentFeatureFlags}, {ScriptConstants.FeatureFlagDisableWorkerIndexing}";
127+
Environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, featureFlags);
125128
Environment.SetEnvironmentVariable(RpcWorkerConstants.FunctionWorkerRuntimeSettingName, _functionsWorkerRuntime);
126129
Environment.SetEnvironmentVariable(RpcWorkerConstants.FunctionsWorkerProcessCountSettingName, _workerProcessCount.ToString());
127130
}

test/WebJobs.Script.Tests.Shared/TestHostBuilderExtensions.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.Collections.Immutable;
7+
using System.Threading.Tasks;
68
using Microsoft.Azure.WebJobs;
79
using Microsoft.Azure.WebJobs.Script;
810
using Microsoft.Azure.WebJobs.Script.Description;
@@ -98,11 +100,13 @@ private static IServiceCollection AddFunctionMetadataManager(this IServiceCollec
98100
var optionsMonitor = new OptionsMonitor<ScriptApplicationHostOptions>(factory, changeTokens, factory);
99101

100102
var hostMetadataProvider = new HostFunctionMetadataProvider(optionsMonitor, NullLogger<HostFunctionMetadataProvider>.Instance, metricsLogger);
101-
var defaultProvider = new FunctionMetadataProvider(NullLogger<FunctionMetadataProvider>.Instance, null, hostMetadataProvider);
103+
104+
var workerProvider = new Mock<IWorkerFunctionMetadataProvider>();
105+
workerProvider.Setup(m => m.GetFunctionMetadataAsync(It.IsAny<IEnumerable<RpcWorkerConfig>>(), SystemEnvironment.Instance, false)).Returns(Task.FromResult(new FunctionMetadataResult(true, ImmutableArray<FunctionMetadata>.Empty)));
106+
var defaultProvider = new FunctionMetadataProvider(NullLogger<FunctionMetadataProvider>.Instance, workerProvider.Object, hostMetadataProvider);
102107
var metadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper<ScriptJobHostOptions>(new ScriptJobHostOptions()), defaultProvider, new List<IFunctionProvider>(), new OptionsWrapper<HttpWorkerOptions>(new HttpWorkerOptions()), new NullLoggerFactory(), new OptionsWrapper<LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions()));
103108
services.AddSingleton<IFunctionMetadataManager>(metadataManager);
104109
services.AddSingleton<IFunctionMetadataProvider>(defaultProvider);
105-
106110
return services;
107111
}
108112
}

test/WebJobs.Script.Tests/FunctionMetadataProviderTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public void GetFunctionMetadataAsync_HostIndexing()
8484
functionMetadataCollection.Add(GetTestFunctionMetadata());
8585

8686
var workerConfigs = TestHelpers.GetTestWorkerConfigs().ToImmutableArray();
87-
workerConfigs.ToList().ForEach(config => config.Description.WorkerIndexing = "true");
87+
workerConfigs.ToList().ForEach(config => config.Description.WorkerIndexing = "false");
8888
var scriptjobhostoptions = new ScriptJobHostOptions();
8989
scriptjobhostoptions.RootScriptPath = Path.Combine(Environment.CurrentDirectory, @"..", "..", "..", "..", "..", "sample", "node");
9090

test/WebJobs.Script.Tests/ScriptStartupTypeDiscovererTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,6 @@ void CopyToBin(string path)
517517
tempOptions.WorkerConfigs.Add(workerConfig);
518518

519519
var languageWorkerOptions = new OptionsWrapper<LanguageWorkerOptions>(tempOptions);
520-
Environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, ScriptConstants.FeatureFlagEnableWorkerIndexing);
521520
Environment.SetEnvironmentVariable(EnvironmentSettingNames.FunctionWorkerRuntime, "python");
522521
var discoverer = new ScriptStartupTypeLocator(directory.Path, testLogger, mockExtensionBundleManager.Object, mockFunctionMetadataManager, testMetricsLogger, languageWorkerOptions);
523522

test/WebJobs.Script.Tests/UtilityTests.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -854,17 +854,17 @@ public void GetFunctionAppContentEditingState_Returns_Expected(bool isFileSystem
854854
}
855855

856856
[Theory]
857-
[InlineData(false, true, false)]
858-
[InlineData(false, false, false)]
857+
[InlineData(true, true, false)]
859858
[InlineData(true, false, false)]
860-
[InlineData(true, true, true)]
861-
public void VerifyWorkerIndexingDecisionLogic(bool workerIndexingFeatureFlag, bool workerIndexingConfigProperty, bool expected)
859+
[InlineData(false, false, false)]
860+
[InlineData(false, true, true)]
861+
public void VerifyWorkerIndexingDecisionLogic(bool disableWorkerIndexingFeatureFlag, bool workerIndexingConfigProperty, bool expected)
862862
{
863863
var testEnv = new TestEnvironment();
864864
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.FunctionWorkerRuntime, RpcWorkerConstants.PythonLanguageWorkerName);
865-
if (workerIndexingFeatureFlag)
865+
if (disableWorkerIndexingFeatureFlag)
866866
{
867-
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, ScriptConstants.FeatureFlagEnableWorkerIndexing);
867+
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, ScriptConstants.FeatureFlagDisableWorkerIndexing);
868868
}
869869
RpcWorkerConfig workerConfig = new RpcWorkerConfig() { Description = TestHelpers.GetTestWorkerDescription("python", "none", workerIndexingConfigProperty) };
870870
bool workerShouldIndex = Utility.CanWorkerIndex(new List<RpcWorkerConfig>() { workerConfig }, testEnv);
@@ -878,9 +878,9 @@ public void WorkerIndexingDecisionLogic_NullConfig(bool workerIndexingFeatureFla
878878
{
879879
var testEnv = new TestEnvironment();
880880
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.FunctionWorkerRuntime, RpcWorkerConstants.PythonLanguageWorkerName);
881-
if (workerIndexingFeatureFlag)
881+
if (!workerIndexingFeatureFlag)
882882
{
883-
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, ScriptConstants.FeatureFlagEnableWorkerIndexing);
883+
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, ScriptConstants.FeatureFlagDisableWorkerIndexing);
884884
}
885885
bool workerShouldIndex = Utility.CanWorkerIndex(null, testEnv);
886886
Assert.Equal(expected, workerShouldIndex);
@@ -893,9 +893,9 @@ public void WorkerIndexingDecisionLogic_NullConfigDescription(bool workerIndexin
893893
{
894894
var testEnv = new TestEnvironment();
895895
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.FunctionWorkerRuntime, RpcWorkerConstants.PythonLanguageWorkerName);
896-
if (workerIndexingFeatureFlag)
896+
if (!workerIndexingFeatureFlag)
897897
{
898-
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, ScriptConstants.FeatureFlagEnableWorkerIndexing);
898+
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, ScriptConstants.FeatureFlagDisableWorkerIndexing);
899899
}
900900
RpcWorkerConfig workerConfig = new RpcWorkerConfig();
901901
bool workerShouldIndex = Utility.CanWorkerIndex(new List<RpcWorkerConfig>() { workerConfig }, testEnv);
@@ -909,9 +909,9 @@ public void WorkerIndexingDecisionLogic_NullWorkerIndexingProperty(bool workerIn
909909
{
910910
var testEnv = new TestEnvironment();
911911
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.FunctionWorkerRuntime, RpcWorkerConstants.PythonLanguageWorkerName);
912-
if (workerIndexingFeatureFlag)
912+
if (!workerIndexingFeatureFlag)
913913
{
914-
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, ScriptConstants.FeatureFlagEnableWorkerIndexing);
914+
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, ScriptConstants.FeatureFlagDisableWorkerIndexing);
915915
}
916916
RpcWorkerConfig workerConfig = new RpcWorkerConfig()
917917
{

test/WebJobs.Script.Tests/Workers/Rpc/RpcFunctionInvocationDispatcherTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -625,9 +625,9 @@ private static RpcFunctionInvocationDispatcher GetTestFunctionDispatcher(int max
625625
{
626626
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.FunctionWorkerRuntime, runtime);
627627
}
628-
if (workerIndexing)
628+
if (!workerIndexing)
629629
{
630-
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, ScriptConstants.FeatureFlagEnableWorkerIndexing);
630+
testEnv.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsFeatureFlags, ScriptConstants.FeatureFlagDisableWorkerIndexing);
631631
}
632632
if (placeholder)
633633
{

0 commit comments

Comments
 (0)