diff --git a/libnetwork/drivers/overlay/peerdb.go b/libnetwork/drivers/overlay/peerdb.go index 303e8af4cb..31ea2d3445 100644 --- a/libnetwork/drivers/overlay/peerdb.go +++ b/libnetwork/drivers/overlay/peerdb.go @@ -63,7 +63,7 @@ func (p *peerEntryDB) UnMarshalDB() peerEntry { type peerMap struct { // set of peerEntry, note they have to be objects and not pointers to maintain the proper equality checks - mp setmatrix.SetMatrix + mp *setmatrix.SetMatrix sync.Mutex } diff --git a/libnetwork/internal/setmatrix/setmatrix.go b/libnetwork/internal/setmatrix/setmatrix.go index 4a57d841cf..31bf7e78b4 100644 --- a/libnetwork/internal/setmatrix/setmatrix.go +++ b/libnetwork/internal/setmatrix/setmatrix.go @@ -6,52 +6,28 @@ import ( mapset "github.com/deckarep/golang-set" ) -// SetMatrix is a map of Sets -type SetMatrix interface { - // Get returns the members of the set for a specific key as a slice. - Get(key string) ([]interface{}, bool) - // Contains is used to verify if an element is in a set for a specific key - // returns true if the element is in the set - // returns true if there is a set for the key - Contains(key string, value interface{}) (bool, bool) - // Insert inserts the value in the set of a key - // returns true if the value is inserted (was not already in the set), false otherwise - // returns also the length of the set for the key - Insert(key string, value interface{}) (bool, int) - // Remove removes the value in the set for a specific key - // returns true if the value is deleted, false otherwise - // returns also the length of the set for the key - Remove(key string, value interface{}) (bool, int) - // Cardinality returns the number of elements in the set for a key - // returns false if the set is not present - Cardinality(key string) (int, bool) - // String returns the string version of the set, empty otherwise - // returns false if the set is not present - String(key string) (string, bool) - // Returns all the keys in the map - Keys() []string -} - -type setMatrix struct { +// SetMatrix is a map of Sets. +type SetMatrix struct { matrix map[string]mapset.Set - sync.Mutex + mu sync.Mutex } -// NewSetMatrix creates a new set matrix object -func NewSetMatrix() SetMatrix { - s := &setMatrix{} +// NewSetMatrix creates a new set matrix object. +func NewSetMatrix() *SetMatrix { + s := &SetMatrix{} s.init() return s } -func (s *setMatrix) init() { +func (s *SetMatrix) init() { s.matrix = make(map[string]mapset.Set) } -func (s *setMatrix) Get(key string) ([]interface{}, bool) { - s.Lock() - defer s.Unlock() +// Get returns the members of the set for a specific key as a slice. +func (s *SetMatrix) Get(key string) ([]interface{}, bool) { + s.mu.Lock() + defer s.mu.Unlock() set, ok := s.matrix[key] if !ok { return nil, ok @@ -59,9 +35,10 @@ func (s *setMatrix) Get(key string) ([]interface{}, bool) { return set.ToSlice(), ok } -func (s *setMatrix) Contains(key string, value interface{}) (bool, bool) { - s.Lock() - defer s.Unlock() +// Contains is used to verify if an element is in a set for a specific key. +func (s *SetMatrix) Contains(key string, value interface{}) (containsElement, setExists bool) { + s.mu.Lock() + defer s.mu.Unlock() set, ok := s.matrix[key] if !ok { return false, ok @@ -69,9 +46,11 @@ func (s *setMatrix) Contains(key string, value interface{}) (bool, bool) { return set.Contains(value), ok } -func (s *setMatrix) Insert(key string, value interface{}) (bool, int) { - s.Lock() - defer s.Unlock() +// Insert inserts the value in the set of a key and returns whether the value is +// inserted (was not already in the set) and the number of elements in the set. +func (s *SetMatrix) Insert(key string, value interface{}) (insetrted bool, cardinality int) { + s.mu.Lock() + defer s.mu.Unlock() set, ok := s.matrix[key] if !ok { s.matrix[key] = mapset.NewSet() @@ -82,15 +61,15 @@ func (s *setMatrix) Insert(key string, value interface{}) (bool, int) { return set.Add(value), set.Cardinality() } -func (s *setMatrix) Remove(key string, value interface{}) (bool, int) { - s.Lock() - defer s.Unlock() +// Remove removes the value in the set for a specific key. +func (s *SetMatrix) Remove(key string, value interface{}) (removed bool, cardinality int) { + s.mu.Lock() + defer s.mu.Unlock() set, ok := s.matrix[key] if !ok { return false, 0 } - var removed bool if set.Contains(value) { set.Remove(value) removed = true @@ -103,9 +82,10 @@ func (s *setMatrix) Remove(key string, value interface{}) (bool, int) { return removed, set.Cardinality() } -func (s *setMatrix) Cardinality(key string) (int, bool) { - s.Lock() - defer s.Unlock() +// Cardinality returns the number of elements in the set for a key. +func (s *SetMatrix) Cardinality(key string) (cardinality int, ok bool) { + s.mu.Lock() + defer s.mu.Unlock() set, ok := s.matrix[key] if !ok { return 0, ok @@ -114,9 +94,11 @@ func (s *setMatrix) Cardinality(key string) (int, bool) { return set.Cardinality(), ok } -func (s *setMatrix) String(key string) (string, bool) { - s.Lock() - defer s.Unlock() +// String returns the string version of the set. +// The empty string is returned if there is no set for key. +func (s *SetMatrix) String(key string) (v string, ok bool) { + s.mu.Lock() + defer s.mu.Unlock() set, ok := s.matrix[key] if !ok { return "", ok @@ -124,9 +106,10 @@ func (s *setMatrix) String(key string) (string, bool) { return set.String(), ok } -func (s *setMatrix) Keys() []string { - s.Lock() - defer s.Unlock() +// Keys returns all the keys in the map. +func (s *SetMatrix) Keys() []string { + s.mu.Lock() + defer s.mu.Unlock() keys := make([]string, 0, len(s.matrix)) for k := range s.matrix { keys = append(keys, k) diff --git a/libnetwork/internal/setmatrix/setmatrix_test.go b/libnetwork/internal/setmatrix/setmatrix_test.go index 058a0f07cf..08dba15caa 100644 --- a/libnetwork/internal/setmatrix/setmatrix_test.go +++ b/libnetwork/internal/setmatrix/setmatrix_test.go @@ -135,7 +135,7 @@ func TestSetSerialInsertDelete(t *testing.T) { } } -func insertDeleteRotuine(ctx context.Context, endCh chan int, s SetMatrix, key, value string) { +func insertDeleteRotuine(ctx context.Context, endCh chan int, s *SetMatrix, key, value string) { for { select { case <-ctx.Done(): diff --git a/libnetwork/network.go b/libnetwork/network.go index bbd321584d..aad1e93383 100644 --- a/libnetwork/network.go +++ b/libnetwork/network.go @@ -105,9 +105,9 @@ type svcMapEntry struct { } type svcInfo struct { - svcMap setmatrix.SetMatrix - svcIPv6Map setmatrix.SetMatrix - ipMap setmatrix.SetMatrix + svcMap *setmatrix.SetMatrix + svcIPv6Map *setmatrix.SetMatrix + ipMap *setmatrix.SetMatrix service map[string][]servicePorts } @@ -1362,7 +1362,7 @@ func (n *network) updateSvcRecord(ep *Endpoint, localEps []*Endpoint, isAdd bool } } -func addIPToName(ipMap setmatrix.SetMatrix, name, serviceID string, ip net.IP) { +func addIPToName(ipMap *setmatrix.SetMatrix, name, serviceID string, ip net.IP) { reverseIP := netutils.ReverseIP(ip.String()) ipMap.Insert(reverseIP, ipInfo{ name: name, @@ -1370,7 +1370,7 @@ func addIPToName(ipMap setmatrix.SetMatrix, name, serviceID string, ip net.IP) { }) } -func delIPToName(ipMap setmatrix.SetMatrix, name, serviceID string, ip net.IP) { +func delIPToName(ipMap *setmatrix.SetMatrix, name, serviceID string, ip net.IP) { reverseIP := netutils.ReverseIP(ip.String()) ipMap.Remove(reverseIP, ipInfo{ name: name, @@ -1378,7 +1378,7 @@ func delIPToName(ipMap setmatrix.SetMatrix, name, serviceID string, ip net.IP) { }) } -func addNameToIP(svcMap setmatrix.SetMatrix, name, serviceID string, epIP net.IP) { +func addNameToIP(svcMap *setmatrix.SetMatrix, name, serviceID string, epIP net.IP) { // Since DNS name resolution is case-insensitive, Use the lower-case form // of the name as the key into svcMap lowerCaseName := strings.ToLower(name) @@ -1388,7 +1388,7 @@ func addNameToIP(svcMap setmatrix.SetMatrix, name, serviceID string, epIP net.IP }) } -func delNameToIP(svcMap setmatrix.SetMatrix, name, serviceID string, epIP net.IP) { +func delNameToIP(svcMap *setmatrix.SetMatrix, name, serviceID string, epIP net.IP) { lowerCaseName := strings.ToLower(name) svcMap.Remove(lowerCaseName, svcMapEntry{ ip: epIP.String(), diff --git a/libnetwork/service.go b/libnetwork/service.go index abe8020422..eff371ed70 100644 --- a/libnetwork/service.go +++ b/libnetwork/service.go @@ -54,7 +54,7 @@ type service struct { // associated with it. At stable state the endpoint ID expected is 1 // but during transition and service change it is possible to have // temporary more than 1 - ipToEndpoint setmatrix.SetMatrix + ipToEndpoint *setmatrix.SetMatrix deleted bool