Zhipeng Xie 4335408875 atune: init code
upload code to gitee

Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
2019-11-13 17:14:15 +08:00

117 lines
2.6 KiB
Go

/*
* Copyright (c) 2019 Huawei Technologies Co., Ltd.
* A-Tune is licensed under the Mulan PSL v1.
* You can use this software according to the terms and conditions of the Mulan PSL v1.
* You may obtain a copy of Mulan PSL v1 at:
* http://license.coscl.org.cn/MulanPSL
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v1 for more details.
* Create: 2019-10-29
*/
package timer
import (
PB "atune/api/profile"
"atune/common/client"
"atune/common/config"
"atune/common/log"
"atune/common/utils"
"fmt"
"io"
"strconv"
"time"
CTX "golang.org/x/net/context"
)
func init() {
// registry.RegisterDaemonService("timer", &Timer{})
}
// Timer : a timer for dynamic tuning
type Timer struct {
Cfg *config.Cfg
ticker *time.Ticker
interval int
isRun bool
}
// Init method init the Timer service
func (t *Timer) Init() error {
t.interval = 60
return nil
}
// Set the config of the monitor
func (t *Timer) Set(cfg *config.Cfg) {
t.Cfg = cfg
}
//Run method start the ticker, auto-tuning the system
func (t *Timer) Run() error {
/* Static & Dynamic judge */
if err := utils.WaitForPyservice(); err != nil {
log.Errorf("waiting for pyservice faild: %v", err)
return err
}
section, err := t.Cfg.Raw.GetSection("server")
if err != nil {
log.Errorf("Faild to get section system, error: %v", err)
return err
}
if !section.Haskey("type") {
return fmt.Errorf("type is not exist in the server section")
}
if section.Key("type").Value() == "static" {
return nil
} else if section.Key("type").Value() == "dynamic" {
if section.Haskey("interval") {
t.interval, _ = section.Key("interval").Int()
}
d, _ := time.ParseDuration(strconv.FormatInt(int64(t.interval), 10) + "s")
t.ticker = time.NewTicker(d)
t.isRun = true
c, err := client.NewClientWithoutCli(config.DefaultTgtAddr, config.DefaultTgtPort)
if err != nil {
return err
}
defer c.Close()
for {
<-t.ticker.C
log.Info("active the ticker, starting dynamic tuning,")
go func() error {
svc := PB.NewProfileMgrClient(c.Connection())
stream, err := svc.Analysis(CTX.Background(), &PB.AnalysisMessage{})
if err != nil {
log.Error(err)
return err
}
for {
_, err := stream.Recv()
if err == io.EOF {
break
}
if err != nil {
log.Error(err)
return err
}
}
return nil
}()
}
} else {
return fmt.Errorf("in section server, type must be dynamic or statis")
}
return nil
}