Kaynağa Gözat

Merge pull request #1416 from fjl/one-interrupt

cmd/geth, cmd/utils: improve interrupt handling
Jeffrey Wilcke 10 yıl önce
ebeveyn
işleme
4c30f0f9ac
2 değiştirilmiş dosya ile 17 ekleme ve 37 silme
  1. 1 3
      cmd/geth/main.go
  2. 16 34
      cmd/utils/cmd.go

+ 1 - 3
cmd/geth/main.go

@@ -347,7 +347,6 @@ func main() {
 }
 
 func run(ctx *cli.Context) {
-	utils.HandleInterrupt()
 	cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx)
 	ethereum, err := eth.New(cfg)
 	if err != nil {
@@ -527,10 +526,9 @@ func blockRecovery(ctx *cli.Context) {
 
 func startEth(ctx *cli.Context, eth *eth.Ethereum) {
 	// Start Ethereum itself
-
 	utils.StartEthereum(eth)
-	am := eth.AccountManager()
 
+	am := eth.AccountManager()
 	account := ctx.GlobalString(utils.UnlockedAccountFlag.Name)
 	accounts := strings.Split(account, " ")
 	for i, account := range accounts {

+ 16 - 34
cmd/utils/cmd.go

@@ -46,29 +46,6 @@ const (
 
 var interruptCallbacks = []func(os.Signal){}
 
-// Register interrupt handlers callbacks
-func RegisterInterrupt(cb func(os.Signal)) {
-	interruptCallbacks = append(interruptCallbacks, cb)
-}
-
-// go routine that call interrupt handlers in order of registering
-func HandleInterrupt() {
-	c := make(chan os.Signal, 1)
-	go func() {
-		signal.Notify(c, os.Interrupt)
-		for sig := range c {
-			glog.V(logger.Error).Infof("Shutting down (%v) ... \n", sig)
-			RunInterruptCallbacks(sig)
-		}
-	}()
-}
-
-func RunInterruptCallbacks(sig os.Signal) {
-	for _, cb := range interruptCallbacks {
-		cb(sig)
-	}
-}
-
 func openLogFile(Datadir string, filename string) *os.File {
 	path := common.AbsolutePath(Datadir, filename)
 	file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
@@ -149,19 +126,24 @@ func StartEthereum(ethereum *eth.Ethereum) {
 	if err := ethereum.Start(); err != nil {
 		Fatalf("Error starting Ethereum: %v", err)
 	}
-	RegisterInterrupt(func(sig os.Signal) {
-		ethereum.Stop()
-		logger.Flush()
-	})
-}
-
-func StartEthereumForTest(ethereum *eth.Ethereum) {
-	glog.V(logger.Info).Infoln("Starting ", ethereum.Name())
-	ethereum.StartForTest()
-	RegisterInterrupt(func(sig os.Signal) {
+	go func() {
+		sigc := make(chan os.Signal, 1)
+		signal.Notify(sigc, os.Interrupt)
+		defer signal.Stop(sigc)
+		<-sigc
+		glog.V(logger.Info).Infoln("Got interrupt, shutting down...")
 		ethereum.Stop()
 		logger.Flush()
-	})
+		for i := 10; i > 0; i-- {
+			<-sigc
+			if i > 1 {
+				glog.V(logger.Info).Infoln("Already shutting down, please be patient.")
+				glog.V(logger.Info).Infoln("Interrupt", i-1, "more times to induce panic.")
+			}
+		}
+		glog.V(logger.Error).Infof("Force quitting: this might not end so well.")
+		panic("boom")
+	}()
 }
 
 func FormatTransactionData(data string) []byte {