code: func (s *Serf) Join(existing []string, ignoreOld bool) (int, error) {
  	// Do a quick state check
  	if s.State() != SerfAlive {
  		return 0, fmt.Errorf("Serf can't Join after Leave or Shutdown")
  	}
  
  	// Hold the joinLock, this is to make eventJoinIgnore safe
  	s.joinLock.Lock()
  	defer s.joinLock.Unlock()
  
  	// Ignore any events from a potential join. This is safe since we hold
  	// the joinLock and nobody else can be doing a Join
  	if ignoreOld {
  		s.eventJoinIgnore.Store(true)
  		defer func() {
  			s.eventJoinIgnore.Store(false)
  		}()
  	}
  
  	// Have memberlist attempt to join
  	num, err := s.memberlist.Join(existing)
  
  	// If we joined any nodes, broadcast the join message
  	if num > 0 {
  		// Start broadcasting the update
  		if err := s.broadcastJoin(s.clock.Time()); err != nil {
  			return num, err
  		}
  	}
  
  	return num, err
  }
docs: // Join joins an existing Serf cluster. Returns the number of nodes
  // successfully contacted. The returned error will be non-nil only in the
  // case that no nodes could be contacted. If ignoreOld is true, then any
  // user messages sent prior to the join will be ignored.