From ae0baf3fab184cb9ae02fe1e5c789e362a0f138e Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Thu, 24 Jul 2014 21:55:56 -0700 Subject: [PATCH] Make replication controller synchronizations independent. --- pkg/controller/replication_controller.go | 17 ++++++++++++----- pkg/controller/replication_controller_test.go | 6 ++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/pkg/controller/replication_controller.go b/pkg/controller/replication_controller.go index b5d283e23a4..5734a3e12fb 100644 --- a/pkg/controller/replication_controller.go +++ b/pkg/controller/replication_controller.go @@ -19,6 +19,7 @@ package controller import ( "encoding/json" "fmt" + "sync" "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" @@ -203,10 +204,16 @@ func (rm *ReplicationManager) synchronize() { glog.Errorf("Synchronization error: %v (%#v)", err, err) return } - for _, controllerSpec := range controllerSpecs { - err = rm.syncHandler(controllerSpec) - if err != nil { - glog.Errorf("Error synchronizing: %#v", err) - } + wg := sync.WaitGroup{} + wg.Add(len(controllerSpecs)) + for ix := range controllerSpecs { + go func(ix int) { + defer wg.Done() + err := rm.syncHandler(controllerSpecs[ix]) + if err != nil { + glog.Errorf("Error synchronizing: %#v", err) + } + }(ix) } + wg.Wait() } diff --git a/pkg/controller/replication_controller_test.go b/pkg/controller/replication_controller_test.go index 95530b980c2..1d6b0e1cf5b 100644 --- a/pkg/controller/replication_controller_test.go +++ b/pkg/controller/replication_controller_test.go @@ -21,6 +21,7 @@ import ( "fmt" "net/http/httptest" "reflect" + "sync" "testing" "time" @@ -41,13 +42,18 @@ func makeURL(suffix string) string { type FakePodControl struct { controllerSpec []api.ReplicationController deletePodID []string + lock sync.Mutex } func (f *FakePodControl) createReplica(spec api.ReplicationController) { + f.lock.Lock() + defer f.lock.Unlock() f.controllerSpec = append(f.controllerSpec, spec) } func (f *FakePodControl) deletePod(podID string) error { + f.lock.Lock() + defer f.lock.Unlock() f.deletePodID = append(f.deletePodID, podID) return nil }