From 3f6fa477a46a43b3a9c63133f70669d25b5575b2 Mon Sep 17 00:00:00 2001 From: Nan Deng Date: Wed, 18 Jun 2014 16:34:47 -0700 Subject: [PATCH] defer unlock --- storage/memory/memory.go | 62 ++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/storage/memory/memory.go b/storage/memory/memory.go index f86dacb1..28ed31ae 100644 --- a/storage/memory/memory.go +++ b/storage/memory/memory.go @@ -169,24 +169,34 @@ type InMemoryStorage struct { func (self *InMemoryStorage) AddStats(ref info.ContainerReference, stats *info.ContainerStats) error { var cstore *containerStorage var ok bool - self.lock.Lock() - if cstore, ok = self.containerStorageMap[ref.Name]; !ok { - cstore = newContainerStore(ref, self.maxNumSamples, self.maxNumStats) - self.containerStorageMap[ref.Name] = cstore - } - self.lock.Unlock() + + func() { + self.lock.Lock() + defer self.lock.Unlock() + if cstore, ok = self.containerStorageMap[ref.Name]; !ok { + cstore = newContainerStore(ref, self.maxNumSamples, self.maxNumStats) + self.containerStorageMap[ref.Name] = cstore + } + }() return cstore.AddStats(stats) } func (self *InMemoryStorage) Samples(name string, numSamples int) ([]*info.ContainerStatsSample, error) { var cstore *containerStorage var ok bool - self.lock.RLock() - if cstore, ok = self.containerStorageMap[name]; !ok { - self.lock.RUnlock() - return nil, fmt.Errorf("unable to find data for container %v", name) + + err := func() error { + self.lock.RLock() + defer self.lock.RUnlock() + if cstore, ok = self.containerStorageMap[name]; !ok { + return fmt.Errorf("unable to find data for container %v", name) + } + return nil + }() + + if err != nil { + return nil, err } - self.lock.RUnlock() return cstore.Samples(numSamples) } @@ -194,12 +204,17 @@ func (self *InMemoryStorage) Samples(name string, numSamples int) ([]*info.Conta func (self *InMemoryStorage) RecentStats(name string, numStats int) ([]*info.ContainerStats, error) { var cstore *containerStorage var ok bool - self.lock.RLock() - if cstore, ok = self.containerStorageMap[name]; !ok { - self.lock.RUnlock() - return nil, fmt.Errorf("unable to find data for container %v", name) + err := func() error { + self.lock.RLock() + defer self.lock.RUnlock() + if cstore, ok = self.containerStorageMap[name]; !ok { + return fmt.Errorf("unable to find data for container %v", name) + } + return nil + }() + if err != nil { + return nil, err } - self.lock.RUnlock() return cstore.RecentStats(numStats) } @@ -207,12 +222,17 @@ func (self *InMemoryStorage) RecentStats(name string, numStats int) ([]*info.Con func (self *InMemoryStorage) Percentiles(name string, cpuPercentiles, memPercentiles []int) (*info.ContainerStatsPercentiles, error) { var cstore *containerStorage var ok bool - self.lock.RLock() - if cstore, ok = self.containerStorageMap[name]; !ok { - self.lock.RUnlock() - return nil, fmt.Errorf("unable to find data for container %v", name) + err := func() error { + self.lock.RLock() + defer self.lock.RUnlock() + if cstore, ok = self.containerStorageMap[name]; !ok { + return fmt.Errorf("unable to find data for container %v", name) + } + return nil + }() + if err != nil { + return nil, err } - self.lock.RUnlock() return cstore.Percentiles(cpuPercentiles, memPercentiles) }