diff --git a/worker/peergrouper/worker.go b/worker/peergrouper/worker.go
index <HASH>..<HASH> 100644
--- a/worker/peergrouper/worker.go
+++ b/worker/peergrouper/worker.go
@@ -369,7 +369,9 @@ func (w *pgWorker) updateControllerMachines() (bool, error) {
 		if err != nil {
 			return false, errors.Annotatef(err, "cannot get status for machine %q", id)
 		}
-		if machineStatus.Status == status.Started {
+		// A machine in status Error or Stopped might still be properly running the controller. We still want to treat
+		// it as an active machine, even if we're trying to tear it down.
+		if machineStatus.Status != status.Pending {
 			logger.Debugf("machine %q has started, adding it to peergrouper list", id)
 			tracker, err := newMachineTracker(stm, w.machineChanges)
 			if err != nil {
Treat any state that isn't Pending as valid for controllers.

Stopped actually caused teardown problems, this should avoid that. (it
caused the peergrouper to freak out because one of the controller
machines was still voting but had been Stopped, but then we couldn't
remove the vote from it because peergrouper treated that machine as an
unknown voter.)