Skip to content

Commit b1f77b7

Browse files
committed
Gating host specialization on WEBSITE_CONFIGURATION_READY (#2867)
1 parent 3f15655 commit b1f77b7

File tree

5 files changed

+26
-8
lines changed

5 files changed

+26
-8
lines changed

src/WebJobs.Script.WebHost/App_Start/WebHostResolver.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ internal void EnsureInitialized(WebHostSettings settings)
137137
// 1) We _were_ in standby mode and now we're ready to specialize
138138
// 2) We're doing non-specialization normal initialization
139139
if (_activeHostManager == null &&
140-
(_standbyHostManager == null || _settingsManager.ContainerReady))
140+
(_standbyHostManager == null || (_settingsManager.ContainerReady && _settingsManager.ConfigurationReady)))
141141
{
142142
_specializationTimer?.Dispose();
143143
_specializationTimer = null;
@@ -290,12 +290,12 @@ private void OnSpecializationTimerTick(object state)
290290
{
291291
EnsureInitialized((WebHostSettings)state);
292292

293-
// We know we've just specialized, since this timer only runs
294-
// when in standby mode. We want to initialize the host manager
295-
// immediately. Note that the host might also be initialized
296-
// concurrently by incoming http requests, but the initialization
297-
// here ensures that it takes place in the absence of any http
298-
// traffic.
293+
// If the active manager is not null, we know we've just specialized,
294+
// since this timer only runs when in standby mode. We want to initialize
295+
// the host manager immediately.
296+
// Note that the host might also be initialized concurrently by incoming
297+
// http requests, but the initialization here ensures that it takes place
298+
// in the absence of any http traffic.
299299
_activeHostManager?.EnsureInitialized();
300300
}
301301

src/WebJobs.Script/Config/ScriptSettingsManager.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ public static ScriptSettingsManager Instance
2828

2929
public virtual bool ContainerReady => !string.IsNullOrEmpty(GetSetting(EnvironmentSettingNames.AzureWebsiteContainerReady));
3030

31+
public virtual bool ConfigurationReady => !string.IsNullOrEmpty(GetSetting(EnvironmentSettingNames.AzureWebsiteConfigurationReady));
32+
3133
public string WebsiteSku => GetSetting(EnvironmentSettingNames.AzureWebsiteSku);
3234

3335
public bool IsDynamicSku => WebsiteSku == ScriptConstants.DynamicSku;

src/WebJobs.Script/EnvironmentSettingNames.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ public static class EnvironmentSettingNames
1414
public const string AzureWebsiteZipDeployment = "WEBSITE_USE_ZIP";
1515
public const string RemoteDebuggingPort = "REMOTEDEBUGGINGPORT";
1616
public const string AzureWebsitePlaceholderMode = "WEBSITE_PLACEHOLDER_MODE";
17-
public const string AzureWebsiteContainerReady = "WEBSITE_CONTAINER_READY";
1817
public const string AzureWebsiteHomePath = "HOME";
1918
public const string AzureWebJobsScriptRoot = "AzureWebJobsScriptRoot";
2019
public const string CompilationReleaseMode = "AzureWebJobsDotNetReleaseCompilation";
@@ -26,5 +25,18 @@ public static class EnvironmentSettingNames
2625
public const string AppInsightsInstrumentationKey = "APPINSIGHTS_INSTRUMENTATIONKEY";
2726
public const string ProxySiteExtensionEnabledKey = "ROUTING_EXTENSION_VERSION";
2827
public const string FunctionsExtensionVersion = "FUNCTIONS_EXTENSION_VERSION";
28+
29+
/// <summary>
30+
/// Environment variable dynamically set by the platform when it is safe to
31+
/// start specializing the host instance (e.g. file system is ready, etc.)
32+
/// </summary>
33+
public const string AzureWebsiteContainerReady = "WEBSITE_CONTAINER_READY";
34+
35+
/// <summary>
36+
/// Environment variable dynamically set by the platform when configuration has been
37+
/// completely initialized (e.g. EnvSettings module has ran) and it is safe to read
38+
/// configuration values.
39+
/// </summary>
40+
public const string AzureWebsiteConfigurationReady = "WEBSITE_CONFIGURATION_READY";
2941
}
3042
}

test/WebJobs.Script.Tests.Integration/Host/StandbyManagerTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public async Task StandbyMode_EndToEnd()
6666
{
6767
{ EnvironmentSettingNames.AzureWebsitePlaceholderMode, "1" },
6868
{ EnvironmentSettingNames.AzureWebsiteContainerReady, null },
69+
{ EnvironmentSettingNames.AzureWebsiteConfigurationReady, null },
6970
{ EnvironmentSettingNames.AzureWebsiteInstanceId, "87654639876900123453445678890144" }
7071
};
7172
using (var env = new TestScopedEnvironmentVariable(vars))
@@ -114,6 +115,7 @@ public async Task StandbyMode_EndToEnd()
114115
// Now specialize the host
115116
ScriptSettingsManager.Instance.SetSetting(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "0");
116117
ScriptSettingsManager.Instance.SetSetting(EnvironmentSettingNames.AzureWebsiteContainerReady, "1");
118+
ScriptSettingsManager.Instance.SetSetting(EnvironmentSettingNames.AzureWebsiteConfigurationReady, "1");
117119

118120
// give time for the specialization to happen
119121
string[] logLines = null;

test/WebJobs.Script.Tests.Integration/Host/StandbyModeTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public void EnsureInitialized_PlaceholderMode()
117117

118118
_settingsManager.SetSetting(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "0");
119119
_settingsManager.SetSetting(EnvironmentSettingNames.AzureWebsiteContainerReady, "1");
120+
_settingsManager.SetSetting(EnvironmentSettingNames.AzureWebsiteConfigurationReady, "1");
120121
Assert.False(WebScriptHostManager.InStandbyMode);
121122
_webHostResolver.EnsureInitialized(settings);
122123

@@ -144,6 +145,7 @@ private void TestGetter<T>(Func<WebHostSettings, T> func)
144145

145146
_settingsManager.SetSetting(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "0");
146147
_settingsManager.SetSetting(EnvironmentSettingNames.AzureWebsiteContainerReady, "1");
148+
_settingsManager.SetSetting(EnvironmentSettingNames.AzureWebsiteConfigurationReady, "1");
147149
current = func(settings);
148150
Assert.NotNull(current);
149151
Assert.NotSame(prev, current);

0 commit comments

Comments
 (0)