github.com/chenbh/concourse/v6@v6.4.2/worker/beacon_runner.go (about)

     1  package worker
     2  
     3  import (
     4  	"os"
     5  	"os/signal"
     6  	"time"
     7  
     8  	"code.cloudfoundry.org/lager"
     9  	"github.com/chenbh/concourse/v6/tsa"
    10  	"github.com/tedsuo/ifrit"
    11  	"github.com/tedsuo/ifrit/restart"
    12  	"golang.org/x/crypto/ssh"
    13  )
    14  
    15  func NewBeaconRunner(
    16  	logger lager.Logger,
    17  	tsaClient *tsa.Client,
    18  	rebalanceInterval time.Duration,
    19  	connectionDrainTimeout time.Duration,
    20  	gardenAddr string,
    21  	baggageclaimAddr string,
    22  ) ifrit.Runner {
    23  	signals := make(chan os.Signal, 2)
    24  	signal.Notify(signals, drainSignals...)
    25  
    26  	beacon := &Beacon{
    27  		Logger: logger.Session("beacon"),
    28  
    29  		Client: tsaClient,
    30  
    31  		RebalanceInterval:      rebalanceInterval,
    32  		ConnectionDrainTimeout: connectionDrainTimeout,
    33  
    34  		DrainSignals: signals,
    35  
    36  		LocalGardenNetwork: "tcp",
    37  		LocalGardenAddr:    gardenAddr,
    38  
    39  		LocalBaggageclaimNetwork: "tcp",
    40  		LocalBaggageclaimAddr:    baggageclaimAddr,
    41  	}
    42  
    43  	return restart.Restarter{
    44  		Runner: beacon,
    45  		Load: func(prevRunner ifrit.Runner, prevErr error) ifrit.Runner {
    46  			if prevErr == nil {
    47  				return nil
    48  			}
    49  
    50  			if prevErr == tsa.ErrAllGatewaysUnreachable && beacon.Drained() {
    51  				// this could happen if the whole deployment is being deleted. in this
    52  				// case, we should just exit and stop retrying, because draining can't
    53  				// complete anyway.
    54  				logger.Info("exiting", lager.Data{
    55  					"reason": "all SSH gateways disappeared while draining",
    56  				})
    57  				return nil
    58  			}
    59  
    60  			if _, ok := prevErr.(*ssh.ExitError); ok {
    61  				// the gateway caused the process to exit, either because the worker
    62  				// has landed, retired, or is ephemeral and stalled (resulting in its
    63  				// deletion)
    64  				logger.Info("exiting", lager.Data{
    65  					"reason": "registration process exited via SSH gateway",
    66  				})
    67  				return nil
    68  			}
    69  
    70  			logger.Error("failed", prevErr)
    71  
    72  			time.Sleep(5 * time.Second)
    73  
    74  			logger.Info("restarting")
    75  
    76  			return beacon
    77  		},
    78  	}
    79  }