feature(worker): implemented mirror role (master/slave) option

This commit is contained in:
bigeagle 2016-04-29 22:38:47 +08:00
parent 8399417880
commit 56459f2ce0
No known key found for this signature in database
GPG Key ID: 9171A4571C27920A
4 changed files with 22 additions and 1 deletions

View File

@ -29,6 +29,7 @@ command = "/tmp/tunasync/bin/myrsync2.sh"
upstream = "https://aosp.google.com/" upstream = "https://aosp.google.com/"
interval = 2 interval = 2
mirror_dir = "/tmp/tunasync/git/AOSP" mirror_dir = "/tmp/tunasync/git/AOSP"
role = "slave"
[mirrors.env] [mirrors.env]
REPO = "/usr/local/bin/aosp-repo" REPO = "/usr/local/bin/aosp-repo"

View File

@ -75,6 +75,7 @@ type mirrorConfig struct {
MirrorDir string `toml:"mirror_dir"` MirrorDir string `toml:"mirror_dir"`
LogDir string `toml:"log_dir"` LogDir string `toml:"log_dir"`
Env map[string]string `toml:"env"` Env map[string]string `toml:"env"`
Role string `toml:"role"`
ExecOnSuccess string `toml:"exec_on_success"` ExecOnSuccess string `toml:"exec_on_success"`
ExecOnFailure string `toml:"exec_on_failure"` ExecOnFailure string `toml:"exec_on_failure"`

View File

@ -44,6 +44,7 @@ type mirrorProvider interface {
WorkingDir() string WorkingDir() string
LogDir() string LogDir() string
LogFile() string LogFile() string
IsMaster() bool
// enter context // enter context
EnterContext() *Context EnterContext() *Context
@ -59,6 +60,7 @@ type baseProvider struct {
ctx *Context ctx *Context
name string name string
interval time.Duration interval time.Duration
isMaster bool
cmd *cmdJob cmd *cmdJob
isRunning atomic.Value isRunning atomic.Value
@ -92,6 +94,10 @@ func (p *baseProvider) Interval() time.Duration {
return p.interval return p.interval
} }
func (p *baseProvider) IsMaster() bool {
return p.isMaster
}
func (p *baseProvider) WorkingDir() string { func (p *baseProvider) WorkingDir() string {
if v, ok := p.ctx.Get(_WorkingDirKey); ok { if v, ok := p.ctx.Get(_WorkingDirKey); ok {
if s, ok := v.(string); ok { if s, ok := v.(string); ok {

View File

@ -90,6 +90,16 @@ func (w *Worker) initProviders() {
} }
logDir = formatLogDir(logDir, mirror) logDir = formatLogDir(logDir, mirror)
// IsMaster
isMaster := true
if mirror.Role == "slave" {
isMaster = false
} else {
if mirror.Role != "" && mirror.Role != "master" {
logger.Warningf("Invalid role configuration for %s", mirror.Name)
}
}
var provider mirrorProvider var provider mirrorProvider
switch mirror.Provider { switch mirror.Provider {
@ -105,6 +115,7 @@ func (w *Worker) initProviders() {
env: mirror.Env, env: mirror.Env,
} }
p, err := newCmdProvider(pc) p, err := newCmdProvider(pc)
p.isMaster = isMaster
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -123,6 +134,7 @@ func (w *Worker) initProviders() {
interval: time.Duration(mirror.Interval) * time.Minute, interval: time.Duration(mirror.Interval) * time.Minute,
} }
p, err := newRsyncProvider(rc) p, err := newRsyncProvider(rc)
p.isMaster = isMaster
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -142,6 +154,7 @@ func (w *Worker) initProviders() {
interval: time.Duration(mirror.Interval) * time.Minute, interval: time.Duration(mirror.Interval) * time.Minute,
} }
p, err := newTwoStageRsyncProvider(rc) p, err := newTwoStageRsyncProvider(rc)
p.isMaster = isMaster
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -395,7 +408,7 @@ func (w *Worker) updateStatus(jobMsg jobMessage) {
smsg := MirrorStatus{ smsg := MirrorStatus{
Name: jobMsg.name, Name: jobMsg.name,
Worker: w.cfg.Global.Name, Worker: w.cfg.Global.Name,
IsMaster: true, IsMaster: p.IsMaster(),
Status: jobMsg.status, Status: jobMsg.status,
Upstream: p.Upstream(), Upstream: p.Upstream(),
Size: "unknown", Size: "unknown",