Skip to content

Commit

Permalink
Fix startPolling_ bug
Browse files Browse the repository at this point in the history
While iterating over all the waiters, if we happen to remove a waiter, it would skip the next item on the next iteration because the indexes changed. So, I changed it to wait until after it finishes iterating over all the waiters in the array to remove them.

I also changed it to use a 'for of' loop since there was no longer a reason to keep the index around.
  • Loading branch information
Nick Zatkovich authored and Nick Zatkovich committed Mar 29, 2017
1 parent d078ecd commit 6aa4859
Showing 1 changed file with 16 additions and 11 deletions.
27 changes: 16 additions & 11 deletions packages/compute/src/vm.js
Original file line number Diff line number Diff line change
Expand Up @@ -851,26 +851,31 @@ VM.prototype.startPolling_ = function() {

this.getMetadata(function(err, metadata) {
var now = new Date();
for (var index in self.waiters) {
var waitersToRemove = [];
for (var waiter of self.waiters) {
if (err) {
self.waiters[index].callback(err, null);
self.waiters.splice(index, 1);
} else if (metadata && metadata.status === self.waiters[index].status) {
self.waiters[index].callback(null, metadata);
self.waiters.splice(index, 1);
waiter.callback(err, null);
waitersToRemove.push(waiter);
} else if (metadata && metadata.status === waiter.status) {
waiter.callback(null, metadata);
waitersToRemove.push(waiter);
} else {
if ((now.getTime() / 1000) - self.waiters[index].startTime >=
self.waiters[index].timeout) {
if ((now.getTime() / 1000) - waiter.startTime >= waiter.timeout) {
var message = 'waitFor() timed out waiting for VM ' + self.name +
' to be in status ' + self.waiters[index].status;
' to be in status ' + waiter.status;
var error = new Error(message);
error.code = 'WAIT_FOR_TIMEOUT';
error.name = 'WaitForTimeout';
self.waiters[index].callback(error, null);
self.waiters.splice(index, 1);
waiter.callback(error, null);
waitersToRemove.push(waiter);
}
}
}

for (var waiterToRemove of waitersToRemove) {
self.waiters.splice(self.waiters.indexOf(waiterToRemove), 1);
}

if (self.waiters.length <= 0) {
self.hasActiveWaiters = false;
} else {
Expand Down

0 comments on commit 6aa4859

Please sign in to comment.