Skip to content

Commit 723f69d

Browse files
committed
Merge pull request #230 from sharwell/UntrustedServerStatus
Untrusted server status
2 parents d43c029 + 030efec commit 723f69d

2 files changed

Lines changed: 18 additions & 4 deletions

File tree

src/corelib/Providers/Rackspace/CloudServersProvider.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,9 +329,19 @@ public Server WaitForServerState(string serverId, ServerState[] expectedStates,
329329

330330
var serverDetails = GetDetails(serverId, region, identity);
331331

332+
/*
333+
* The polling implementation uses triple-checked polling to work around a known bug in Cloud
334+
* Servers status reporting. Occasionally, for a brief period of time during an asynchronous
335+
* server operation, the service will return incorrect values in all of the status fields.
336+
* Polling multiple times allows this SDK to provide reliable wait operations even when the
337+
* server returns unreliable values.
338+
*/
339+
340+
Func<bool> exitCondition = () => serverDetails.TaskState == null && (expectedStates.Contains(serverDetails.Status) || errorStates.Contains(serverDetails.Status));
332341
int count = 0;
333342
int currentProgress = -1;
334-
while (!expectedStates.Contains(serverDetails.Status) && !errorStates.Contains(serverDetails.Status) && count < refreshCount)
343+
int exitCount = exitCondition() ? 1 : 0;
344+
while (exitCount < 3 && count < refreshCount)
335345
{
336346
if (progressUpdatedCallback != null)
337347
{
@@ -345,6 +355,10 @@ public Server WaitForServerState(string serverId, ServerState[] expectedStates,
345355
Thread.Sleep(refreshDelay ?? TimeSpan.FromMilliseconds(2400));
346356
serverDetails = GetDetails(serverId, region, identity);
347357
count++;
358+
if (exitCondition())
359+
exitCount++;
360+
else
361+
exitCount = 0;
348362
}
349363

350364
if (errorStates.Contains(serverDetails.Status))

src/testing/integration/Providers/Rackspace/UserServerTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ public void TestRescueServer()
214214

215215
string rescueResult = provider.RescueServer(_server.Id);
216216
Assert.IsFalse(string.IsNullOrEmpty(rescueResult));
217-
Server rescueServer = provider.WaitForServerState(_server.Id, ServerState.Rescue, new[] { ServerState.Error });
217+
Server rescueServer = provider.WaitForServerState(_server.Id, ServerState.Rescue, new[] { ServerState.Active, ServerState.Error, ServerState.Unknown, ServerState.Suspended });
218218
Assert.AreEqual(ServerState.Rescue, rescueServer.Status);
219219

220220
bool unrescueResult = provider.UnRescueServer(_server.Id);
@@ -335,7 +335,7 @@ public void TestConfirmServerResize()
335335

336336
bool resized = provider.ResizeServer(_server.Id, serverName, flavor.Id);
337337
Assert.IsTrue(resized);
338-
Server resizedServer = provider.WaitForServerState(_server.Id, ServerState.VerifyResize, new[] { ServerState.Error, ServerState.Unknown, ServerState.Suspended });
338+
Server resizedServer = provider.WaitForServerState(_server.Id, ServerState.VerifyResize, new[] { ServerState.Active, ServerState.Error, ServerState.Unknown, ServerState.Suspended });
339339
Assert.AreEqual(ServerState.VerifyResize, resizedServer.Status);
340340
_server = resizedServer;
341341

@@ -361,7 +361,7 @@ public void TestRevertServerResize()
361361

362362
bool resized = provider.ResizeServer(_server.Id, serverName, flavor.Id);
363363
Assert.IsTrue(resized);
364-
Server resizedServer = provider.WaitForServerState(_server.Id, ServerState.VerifyResize, new[] { ServerState.Error, ServerState.Unknown, ServerState.Suspended });
364+
Server resizedServer = provider.WaitForServerState(_server.Id, ServerState.VerifyResize, new[] { ServerState.Active, ServerState.Error, ServerState.Unknown, ServerState.Suspended });
365365
Assert.AreEqual(ServerState.VerifyResize, resizedServer.Status);
366366
_server = resizedServer;
367367

0 commit comments

Comments
 (0)