Skip to content

Commit e424599

Browse files
suwatchmathewc
authored andcommitted
fix issue RemoveWorker to handle 304 and worker running after being unassigned
1 parent 81adaec commit e424599

File tree

5 files changed

+24
-13
lines changed

5 files changed

+24
-13
lines changed

src/WebJobs.Script.Scaling/AppServiceScaleHandler.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ public async Task<bool> PingWorker(string activityId, IWorkerInfo worker)
175175
/// - FE should return success regardless if worker belongs.
176176
/// - Any unexpected error will throw.
177177
/// </summary>
178-
public async Task RemoveWorker(string activityId, IWorkerInfo worker)
178+
public async Task<bool> RemoveWorker(string activityId, IWorkerInfo worker)
179179
{
180180
var stampHostName = GetStampHostName(worker.StampName);
181181
var details = string.Format("Remove worker request from {0}:{1}", AppServiceSettings.CurrentStampName, AppServiceSettings.WorkerName);
@@ -187,7 +187,13 @@ public async Task RemoveWorker(string activityId, IWorkerInfo worker)
187187

188188
using (var response = await SendAsync(activityId, HttpMethod.Delete, pathAndQuery, worker, details))
189189
{
190+
if (response.StatusCode == HttpStatusCode.NotModified)
191+
{
192+
return false;
193+
}
194+
190195
response.EnsureSuccessStatusCode();
196+
return true;
191197
}
192198
}
193199

src/WebJobs.Script.Scaling/IScaleHandler.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ public interface IScaleHandler
2020

2121
/// <summary>
2222
/// ScaleManager requests worker removal
23+
/// true or false return value indicates whether worker was indeed removed
2324
/// </summary>
24-
Task RemoveWorker(string activityId, IWorkerInfo worker);
25+
Task<bool> RemoveWorker(string activityId, IWorkerInfo worker);
2526

2627
/// <summary>
2728
/// ScaleManager requests to ping specific worker

src/WebJobs.Script.Scaling/ScaleManager.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class ScaleManager : IDisposable
2020
private IWorkerInfo _worker;
2121
private Timer _workerUpdateTimer;
2222
private bool _disposed;
23+
private bool _pingResult;
2324

2425
private DateTime _pingWorkerUtc = DateTime.MinValue;
2526
private DateTime _managerCheckUtc = DateTime.MinValue;
@@ -155,18 +156,19 @@ protected virtual async Task ProcessWorkItem(string activityId)
155156
/// </summary>
156157
protected virtual async Task PingWorker(string activityId, IWorkerInfo worker)
157158
{
158-
var pingResult = true;
159-
if (_pingWorkerUtc < DateTime.UtcNow)
159+
// if ping was unsuccessful, keep pinging. this is to address
160+
// the issue where site continue to run on an unassigned worker.
161+
if (!_pingResult || _pingWorkerUtc < DateTime.UtcNow)
160162
{
161163
// if PingWorker throws, we will not update the worker status
162164
// this worker will be stale and eventually removed.
163-
pingResult = await _eventHandler.PingWorker(activityId, worker);
165+
_pingResult = await _eventHandler.PingWorker(activityId, worker);
164166

165167
_pingWorkerUtc = DateTime.UtcNow.Add(_settings.WorkerPingInterval);
166168
}
167169

168170
// check if worker is valid for the site
169-
if (pingResult)
171+
if (_pingResult)
170172
{
171173
await _table.AddOrUpdate(worker);
172174

@@ -531,11 +533,13 @@ protected virtual async Task<bool> RequestAddWorker(string activityId, IEnumerab
531533

532534
protected virtual async Task RequestRemoveWorker(string activityId, IWorkerInfo manager, IWorkerInfo toRemove)
533535
{
534-
await _eventHandler.RemoveWorker(activityId, toRemove);
535-
536-
await _table.Delete(toRemove);
536+
// remove worker return true if worker is indeed removed
537+
if (await _eventHandler.RemoveWorker(activityId, toRemove))
538+
{
539+
await _table.Delete(toRemove);
537540

538-
_tracer.TraceRemoveWorker(activityId, toRemove, string.Format("Worker removed by manager ({0})", manager.ToDisplayString()));
541+
_tracer.TraceRemoveWorker(activityId, toRemove, string.Format("Worker removed by manager ({0})", manager.ToDisplayString()));
542+
}
539543
}
540544
}
541545
}

test/WebJobs.Script.Scaling.Tests/MockScaleHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ public virtual Task<string> AddWorker(string activityId, IEnumerable<string> sta
1818
return Task.FromResult(stampNames.FirstOrDefault());
1919
}
2020

21-
public virtual Task RemoveWorker(string activityId, IWorkerInfo workerInfo)
21+
public virtual Task<bool> RemoveWorker(string activityId, IWorkerInfo workerInfo)
2222
{
23-
return Task.CompletedTask;
23+
return Task.FromResult(true);
2424
}
2525

2626
public virtual Task<bool> PingWorker(string activityId, IWorkerInfo workerInfo)

test/WebJobs.Script.Scaling.Tests/RequestRemoveWorkerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public async Task BasicTests(IWorkerInfo manager, IWorkerInfo toRemove)
2020
using (var scaleManager = new MockScaleManager(MockBehavior.Strict))
2121
{
2222
scaleManager.MockScaleHandler.Setup(s => s.RemoveWorker(activityId, toRemove))
23-
.Returns(Task.CompletedTask);
23+
.Returns(Task.FromResult(true));
2424
scaleManager.MockWorkerTable.Setup(t => t.Delete(toRemove))
2525
.Returns(Task.CompletedTask);
2626
scaleManager.MockScaleTracer.Setup(t => t.TraceRemoveWorker(activityId, toRemove, It.Is<string>(s => s.Contains(manager.ToDisplayString()))));

0 commit comments

Comments
 (0)