Skip to content

Commit

Permalink
Added mutex to sync access to the SidecarEgressMap (istio-ecosystem#220)
Browse files Browse the repository at this point in the history
Signed-off-by: psikka1 <pankaj_sikka@intuit.com>
  • Loading branch information
shriramsharma authored and psikka1 committed Jun 15, 2022
1 parent f146f52 commit 08f8eaf
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 0 deletions.
14 changes: 14 additions & 0 deletions admiral/pkg/controller/common/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@ func (s *SidecarEgressMap) Put(identity string, namespace string, fqdn string, c
}

func (s *SidecarEgressMap) Get(key string) map[string]SidecarEgress {
defer s.mutex.Unlock()
s.mutex.Lock()
return s.cache[key]
}

Expand All @@ -186,6 +188,18 @@ func (s *SidecarEgressMap) Delete(key string) {
delete(s.cache, key)
}

// Map func returns a map of identity to namespace:SidecarEgress map
// Iterating through the returned map is not implicitly thread safe,
// use (s *SidecarEgressMap) Range() func instead.
func (s *SidecarEgressMap) Map() map[string]map[string]SidecarEgress {
return s.cache
}

// Range is a thread safe iterator to iterate through the SidecarEgress map
func (s *SidecarEgressMap) Range(fn func(k string, v map[string]SidecarEgress)) {
defer s.mutex.Unlock()
s.mutex.Lock()
for k, v := range s.cache {
fn(k, v)
}
}
57 changes: 57 additions & 0 deletions admiral/pkg/controller/common/types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package common
import (
"context"
"strings"
"sync"
"testing"
"time"

Expand Down Expand Up @@ -191,3 +192,59 @@ func TestMapRange(t *testing.T) {
assert.Equal(t, 3, numOfIter)

}

func TestSidecarEgressGet(t *testing.T) {

egressMap := NewSidecarEgressMap()
egressMap.Put("pkey1", "pkey2", "fqdn", map[string]string{"pkey2": "pkey2"})

ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(3*time.Second))
defer cancel()

var wg sync.WaitGroup
wg.Add(2)
// Producer go routine
go func(ctx context.Context) {
defer wg.Done()
for {
select {
case <-ctx.Done():
return
default:
egressMap.Put("pkey1", string(uuid.NewUUID()), "fqdn", map[string]string{"pkey2": "pkey2"})
}
}
}(ctx)

// Consumer go routine
go func(ctx context.Context) {
defer wg.Done()
for {
select {
case <-ctx.Done():
return
default:
assert.NotNil(t, egressMap.Get("pkey1"))
}
}
}(ctx)

wg.Wait()
}

func TestSidecarEgressRange(t *testing.T) {

egressMap := NewSidecarEgressMap()
egressMap.Put("pkey1", "pkey2", "fqdn", map[string]string{"pkey2": "pkey2"})
egressMap.Put("pkey2", "pkey2", "fqdn", map[string]string{"pkey2": "pkey2"})
egressMap.Put("pkey3", "pkey2", "fqdn", map[string]string{"pkey2": "pkey2"})

numOfIter := 0
egressMap.Range(func(k string, v map[string]SidecarEgress) {
assert.NotNil(t, v)
numOfIter++
})

assert.Equal(t, 3, numOfIter)

}

0 comments on commit 08f8eaf

Please sign in to comment.