code: func (d *DedupManager) createSession(client *consulapi.Client) {
  START:
  	log.Printf("[INFO] (dedup) attempting to create session")
  	session := client.Session()
  	sessionCh := make(chan struct{})
  	ttl := fmt.Sprintf("%.6fs", float64(*d.config.TTL)/float64(time.Second))
  	se := &consulapi.SessionEntry{
  		Name:     "Consul-Template de-duplication",
  		Behavior: "delete",
  		TTL:      ttl,
  	}
  	id, _, err := session.Create(se, nil)
  	if err != nil {
  		log.Printf("[ERR] (dedup) failed to create session: %v", err)
  		goto WAIT
  	}
  	log.Printf("[INFO] (dedup) created session %s", id)
  
  	// Attempt to lock each template
  	for _, t := range d.templates {
  		d.wg.Add(1)
  		go d.attemptLock(client, id, sessionCh, t)
  	}
  
  	// Renew our session periodically
  	if err := session.RenewPeriodic("15s", id, nil, d.stopCh); err != nil {
  		log.Printf("[ERR] (dedup) failed to renew session: %v", err)
  	}
  	close(sessionCh)
  	d.wg.Wait()
  
  WAIT:
  	select {
  	case <-time.After(sessionCreateRetry):
  		goto START
  	case <-d.stopCh:
  		return
  	}
  }
docs: // createSession is used to create and maintain a session to Consul