Skip to content

Commit

Permalink
Refactor cmd code of easegress-server (#1043)
Browse files Browse the repository at this point in the history
* prepare for custom build

* add comments
  • Loading branch information
suchen-sci committed Jul 20, 2023
1 parent 0187d5e commit 3904080
Show file tree
Hide file tree
Showing 2 changed files with 153 additions and 125 deletions.
151 changes: 151 additions & 0 deletions cmd/server.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
/*
* Copyright (c) 2017, MegaEase
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http:https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

// Package cmd contains useful functions for Easegress server and client.
package cmd

import (
"log"
"math/rand"
"os"
"sync"
"time"

"github.com/megaease/easegress/pkg/api"
"github.com/megaease/easegress/pkg/cluster"
"github.com/megaease/easegress/pkg/common"
"github.com/megaease/easegress/pkg/env"
"github.com/megaease/easegress/pkg/graceupdate"
"github.com/megaease/easegress/pkg/logger"
"github.com/megaease/easegress/pkg/option"
"github.com/megaease/easegress/pkg/pidfile"
"github.com/megaease/easegress/pkg/profile"
"github.com/megaease/easegress/pkg/supervisor"
"github.com/megaease/easegress/pkg/version"
)

// RunServer runs Easegress server.
func RunServer() {
rand.Seed(time.Now().UnixNano())

opt := option.New()
if err := opt.Parse(); err != nil {
common.Exit(1, err.Error())
}

if opt.ShowVersion {
common.Exit(0, version.Short)
}
if opt.ShowHelp {
common.Exit(0, opt.FlagUsages())
}

err := env.InitServerDir(opt)
if err != nil {
log.Printf("failed to init env: %v", err)
os.Exit(1)
}

logger.Init(opt)
defer logger.Sync()
logger.Infof("%s", version.Long)

if opt.SignalUpgrade {
pid, err := pidfile.Read(opt)

if err != nil {
logger.Errorf("failed to read pidfile: %v", err)
os.Exit(1)
}

if err := common.RaiseSignal(pid, common.SignalUsr2); err != nil {
logger.Errorf("failed to send signal: %v", err)
os.Exit(1)
}

logger.Infof("graceful upgrade signal sent")

return
}

// disable force-new-cluster for graceful update
if graceupdate.IsInherit() {
opt.ForceNewCluster = false
} else {
err := pidfile.Write(opt)
if err != nil {
logger.Errorf("write pidfile failed: %v", err)
os.Exit(1)
}
}

profile, err := profile.New(opt)
if err != nil {
logger.Errorf("new profile failed: %v", err)
os.Exit(1)
}
cls, err := cluster.New(opt)
if err != nil {
logger.Errorf("new cluster failed: %v", err)
os.Exit(1)
}

super := supervisor.MustNew(opt, cls)

apiServer := api.MustNewServer(opt, cls, super, profile)

if graceupdate.CallOriProcessTerm(super.FirstHandleDone()) {
pidfile.Write(opt)
}

closeCls := func() {
wg := &sync.WaitGroup{}
wg.Add(2)
apiServer.Close(wg)
cls.CloseServer(wg)
wg.Wait()
}
restartCls := func() {
cls.StartServer()
apiServer = api.MustNewServer(opt, cls, super, profile)
}
if err := graceupdate.NotifySigUsr2(closeCls, restartCls); err != nil {
log.Printf("failed to notify signal: %v", err)
os.Exit(1)
}

sigChan := make(chan common.Signal, 1)
if err := common.NotifySignal(sigChan, common.SignalInt, common.SignalTerm); err != nil {
log.Printf("failed to register signal: %v", err)
os.Exit(1)
}
sig := <-sigChan
go func() {
sig := <-sigChan
logger.Infof("%s signal received, closing easegress immediately", sig)
os.Exit(255)
}()
logger.Infof("%s signal received, closing easegress", sig)

wg := &sync.WaitGroup{}
wg.Add(4)
apiServer.Close(wg)
super.Close(wg)
cls.Close(wg)
profile.Close(wg)
wg.Wait()
}
127 changes: 2 additions & 125 deletions cmd/server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,133 +19,10 @@
package main

import (
"log"
"math/rand"
"os"
"sync"
"time"

"github.com/megaease/easegress/pkg/api"
"github.com/megaease/easegress/pkg/cluster"
"github.com/megaease/easegress/pkg/common"
"github.com/megaease/easegress/pkg/env"
"github.com/megaease/easegress/pkg/graceupdate"
"github.com/megaease/easegress/pkg/logger"
"github.com/megaease/easegress/pkg/option"
"github.com/megaease/easegress/pkg/pidfile"
"github.com/megaease/easegress/pkg/profile"
"github.com/megaease/easegress/cmd"
_ "github.com/megaease/easegress/pkg/registry"
"github.com/megaease/easegress/pkg/supervisor"
"github.com/megaease/easegress/pkg/version"
)

func main() {
rand.Seed(time.Now().UnixNano())

opt := option.New()
if err := opt.Parse(); err != nil {
common.Exit(1, err.Error())
}

if opt.ShowVersion {
common.Exit(0, version.Short)
}
if opt.ShowHelp {
common.Exit(0, opt.FlagUsages())
}

err := env.InitServerDir(opt)
if err != nil {
log.Printf("failed to init env: %v", err)
os.Exit(1)
}

logger.Init(opt)
defer logger.Sync()
logger.Infof("%s", version.Long)

if opt.SignalUpgrade {
pid, err := pidfile.Read(opt)

if err != nil {
logger.Errorf("failed to read pidfile: %v", err)
os.Exit(1)
}

if err := common.RaiseSignal(pid, common.SignalUsr2); err != nil {
logger.Errorf("failed to send signal: %v", err)
os.Exit(1)
}

logger.Infof("graceful upgrade signal sent")

return
}

// disable force-new-cluster for graceful update
if graceupdate.IsInherit() {
opt.ForceNewCluster = false
} else {
err := pidfile.Write(opt)
if err != nil {
logger.Errorf("write pidfile failed: %v", err)
os.Exit(1)
}
}

profile, err := profile.New(opt)
if err != nil {
logger.Errorf("new profile failed: %v", err)
os.Exit(1)
}
cls, err := cluster.New(opt)
if err != nil {
logger.Errorf("new cluster failed: %v", err)
os.Exit(1)
}

super := supervisor.MustNew(opt, cls)

apiServer := api.MustNewServer(opt, cls, super, profile)

if graceupdate.CallOriProcessTerm(super.FirstHandleDone()) {
pidfile.Write(opt)
}

closeCls := func() {
wg := &sync.WaitGroup{}
wg.Add(2)
apiServer.Close(wg)
cls.CloseServer(wg)
wg.Wait()
}
restartCls := func() {
cls.StartServer()
apiServer = api.MustNewServer(opt, cls, super, profile)
}
if err := graceupdate.NotifySigUsr2(closeCls, restartCls); err != nil {
log.Printf("failed to notify signal: %v", err)
os.Exit(1)
}

sigChan := make(chan common.Signal, 1)
if err := common.NotifySignal(sigChan, common.SignalInt, common.SignalTerm); err != nil {
log.Printf("failed to register signal: %v", err)
os.Exit(1)
}
sig := <-sigChan
go func() {
sig := <-sigChan
logger.Infof("%s signal received, closing easegress immediately", sig)
os.Exit(255)
}()
logger.Infof("%s signal received, closing easegress", sig)

wg := &sync.WaitGroup{}
wg.Add(4)
apiServer.Close(wg)
super.Close(wg)
cls.Close(wg)
profile.Close(wg)
wg.Wait()
cmd.RunServer()
}

0 comments on commit 3904080

Please sign in to comment.