github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/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/pf-qiu/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 }