code: func (g *memberSet) Open() (err error) {
  	g.mu.Lock()
  	g.memberlist, err = memberlist.Create(g.config.memberlistConfig)
  	g.mu.Unlock()
  	if err != nil {
  		return errors.Wrap(err, "creating memberlist")
  	}
  
  	g.broadcasts = &memberlist.TransmitLimitedQueue{
  		NumNodes: func() int {
  			g.mu.RLock()
  			defer g.mu.RUnlock()
  			return g.memberlist.NumMembers()
  		},
  		RetransmitMult: 3,
  	}
  
  	var uris = make([]*pilosa.URI, len(g.config.gossipSeeds))
  	for i, addr := range g.config.gossipSeeds {
  		uris[i], err = pilosa.NewURIFromAddress(addr)
  		if err != nil {
  			return fmt.Errorf("new uri from address: %s", err)
  		}
  	}
  
  	var nodes = make([]*pilosa.Node, len(uris))
  	for i, uri := range uris {
  		nodes[i] = &pilosa.Node{URI: *uri}
  	}
  
  	g.mu.RLock()
  	err = g.joinWithRetry(pilosa.URIs(pilosa.Nodes(nodes).URIs()).HostPortStrings())
  	g.mu.RUnlock()
  	if err != nil {
  		return errors.Wrap(err, "joinWithRetry")
  	}
  	return nil
  }
docs: // Open implements the MemberSet interface to start network activity.