From 627a0e24e86537d966bb7a26d6453bee1d19324b Mon Sep 17 00:00:00 2001
From: Matt Butcher <mbutcher@engineyard.com>
Date: Fri, 22 Apr 2016 16:51:51 -0600
Subject: [PATCH] fix(storage): add mutex to in-memory

This adds a RW Mutex on the in-memory storage.
---
 pkg/storage/memory.go | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/pkg/storage/memory.go b/pkg/storage/memory.go
index 28bf62495..bc57d7c4d 100644
--- a/pkg/storage/memory.go
+++ b/pkg/storage/memory.go
@@ -2,12 +2,14 @@ package storage
 
 import (
 	"errors"
+	"sync"
 
 	"github.com/deis/tiller/pkg/proto/hapi/release"
 )
 
 // Memory is an in-memory ReleaseStorage implementation.
 type Memory struct {
+	sync.RWMutex
 	releases map[string]*release.Release
 }
 
@@ -25,6 +27,8 @@ var ErrNotFound = errors.New("release not found")
 //
 // If the release is not found, an ErrNotFound error is returned.
 func (m *Memory) Read(k string) (*release.Release, error) {
+	m.RLock()
+	defer m.RUnlock()
 	v, ok := m.releases[k]
 	if !ok {
 		return v, ErrNotFound
@@ -34,12 +38,16 @@ func (m *Memory) Read(k string) (*release.Release, error) {
 
 // Create sets a release.
 func (m *Memory) Create(rel *release.Release) error {
+	m.Lock()
+	defer m.Unlock()
 	m.releases[rel.Name] = rel
 	return nil
 }
 
 // Update sets a release.
 func (m *Memory) Update(rel *release.Release) error {
+	m.Lock()
+	defer m.Unlock()
 	if _, ok := m.releases[rel.Name]; !ok {
 		return ErrNotFound
 	}
@@ -52,6 +60,8 @@ func (m *Memory) Update(rel *release.Release) error {
 
 // Delete removes a release.
 func (m *Memory) Delete(name string) (*release.Release, error) {
+	m.Lock()
+	defer m.Unlock()
 	rel, ok := m.releases[name]
 	if !ok {
 		return nil, ErrNotFound
@@ -62,6 +72,8 @@ func (m *Memory) Delete(name string) (*release.Release, error) {
 
 // List returns all releases.
 func (m *Memory) List() ([]*release.Release, error) {
+	m.RLock()
+	defer m.RUnlock()
 	buf := make([]*release.Release, len(m.releases))
 	i := 0
 	for _, v := range m.releases {
@@ -73,5 +85,7 @@ func (m *Memory) List() ([]*release.Release, error) {
 
 // Query searches all releases for matches.
 func (m *Memory) Query(labels map[string]string) ([]*release.Release, error) {
+	m.RLock()
+	defer m.RUnlock()
 	return []*release.Release{}, errors.New("Cannot implement until release.Release is defined.")
 }
-- 
GitLab