define.go 2.0 KB
Newer Older
Y
yangrui07 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
package agent

import (
	"errors"
	_ "github.com/Badangel/logex"
	"github.com/Badangel/pipeline"
	"os/exec"
	"strconv"
	"strings"
	"sync"
)

var (
	Dir           string
	WorkerNum     int
	QueueCapacity int32
	MasterHost    []string
	MasterPort    []string

	TestHostname string
	TestIdc      string
	ShardLock    sync.RWMutex

	CmdWorkPool   *WorkPool
	CmdWorkFilter sync.Map
)

type (
	Status struct {
		Status  string `json:"status"`
		Version string `json:"version"`
	}

	MasterResp struct {
		Success string `json:"success"`
		Message string `json:"message"`
		Data    string `json:"data"`
	}

	ShardInfo struct {
		DictName   string
		ShardSeq   int
		SlotIdList string
		DataDir    string
		Service    string `json:"service,omitempty"`
		Libcube    string `json:"libcube,omitempty"`
	}

	CubeResp struct {
		Status     int    `json:"status"`
		CurVersion string `json:"cur_version"`
		BgVersion  string `json:"bg_version"`
	}
)

var BUILTIN_STATUS = Status{"RUNNING", "3.0.0.1"}

var ShardInfoMap map[string]map[string]*ShardInfo
var disks []string

func GetMaster(master string) (host, port string, err error) {
	if len(ShardInfoMap) < 1 {
		return "", "", errors.New("empty master list.")
	}
	if master == "" {
		return MasterHost[0], MasterPort[0], nil
	}
	if _, ok := ShardInfoMap[master]; ok {
		m := strings.Split(master, ":")
		if len(m) != 2 {
			return MasterHost[0], MasterPort[0], nil
		}
		return m[0], m[1], nil
	} else {
		return MasterHost[0], MasterPort[0], nil
	}
}

func init() {
	dfCmd := "df -h | grep -E '/home|/ssd'"
	stdout, _, err := pipeline.Run(exec.Command("/bin/bash", "-c", dfCmd))

	if err == nil && stdout.String() != "" {
		t := strings.TrimSpace(stdout.String())
		diskLi := strings.Split(t, "\n")
		for _, diskStr := range diskLi {
			disk := strings.Fields(diskStr)
			usedPercent, _ := strconv.Atoi(strings.TrimRight(disk[4], "%"))
			if usedPercent <= 40 {
				disks = append(disks, disk[5])
			}
		}
	}

	if len(disks) == 0 {
		disks = append(disks, "/home")
	}

	//logex.Debugf("available disks found: (%+v)", disks)
}