diff --git a/tests/worker.conf b/tests/worker.conf index 2a27567..42550a0 100644 --- a/tests/worker.conf +++ b/tests/worker.conf @@ -29,6 +29,7 @@ command = "/tmp/tunasync/bin/myrsync2.sh" upstream = "https://aosp.google.com/" interval = 2 mirror_dir = "/tmp/tunasync/git/AOSP" +role = "slave" [mirrors.env] REPO = "/usr/local/bin/aosp-repo" diff --git a/worker/config.go b/worker/config.go index 96f4d28..0a37210 100644 --- a/worker/config.go +++ b/worker/config.go @@ -75,6 +75,7 @@ type mirrorConfig struct { MirrorDir string `toml:"mirror_dir"` LogDir string `toml:"log_dir"` Env map[string]string `toml:"env"` + Role string `toml:"role"` ExecOnSuccess string `toml:"exec_on_success"` ExecOnFailure string `toml:"exec_on_failure"` diff --git a/worker/provider.go b/worker/provider.go index 6686290..3a44b04 100644 --- a/worker/provider.go +++ b/worker/provider.go @@ -44,6 +44,7 @@ type mirrorProvider interface { WorkingDir() string LogDir() string LogFile() string + IsMaster() bool // enter context EnterContext() *Context @@ -59,6 +60,7 @@ type baseProvider struct { ctx *Context name string interval time.Duration + isMaster bool cmd *cmdJob isRunning atomic.Value @@ -92,6 +94,10 @@ func (p *baseProvider) Interval() time.Duration { return p.interval } +func (p *baseProvider) IsMaster() bool { + return p.isMaster +} + func (p *baseProvider) WorkingDir() string { if v, ok := p.ctx.Get(_WorkingDirKey); ok { if s, ok := v.(string); ok { diff --git a/worker/worker.go b/worker/worker.go index 64d0bbf..19bc067 100644 --- a/worker/worker.go +++ b/worker/worker.go @@ -90,6 +90,16 @@ func (w *Worker) initProviders() { } 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 switch mirror.Provider { @@ -105,6 +115,7 @@ func (w *Worker) initProviders() { env: mirror.Env, } p, err := newCmdProvider(pc) + p.isMaster = isMaster if err != nil { panic(err) } @@ -123,6 +134,7 @@ func (w *Worker) initProviders() { interval: time.Duration(mirror.Interval) * time.Minute, } p, err := newRsyncProvider(rc) + p.isMaster = isMaster if err != nil { panic(err) } @@ -142,6 +154,7 @@ func (w *Worker) initProviders() { interval: time.Duration(mirror.Interval) * time.Minute, } p, err := newTwoStageRsyncProvider(rc) + p.isMaster = isMaster if err != nil { panic(err) } @@ -395,7 +408,7 @@ func (w *Worker) updateStatus(jobMsg jobMessage) { smsg := MirrorStatus{ Name: jobMsg.name, Worker: w.cfg.Global.Name, - IsMaster: true, + IsMaster: p.IsMaster(), Status: jobMsg.status, Upstream: p.Upstream(), Size: "unknown",