Skip to content

Commit 81a15e7

Browse files
authored
Merge pull request tuna#54 from tuna/dev
Dev
2 parents 96f9db8 + 3f31e83 commit 81a15e7

File tree

6 files changed

+83
-15
lines changed

6 files changed

+83
-15
lines changed

manager/db.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ func (b *boltAdapter) FlushDisabledJobs() (err error) {
182182
err = fmt.Errorf("%s; %s", err.Error(), jsonErr)
183183
continue
184184
}
185-
if m.Status == Disabled {
185+
if m.Status == Disabled || len(m.Name) == 0 {
186186
err = c.Delete()
187187
}
188188
}

worker/base_provider.go

+11-3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type baseProvider struct {
2323
logFile *os.File
2424

2525
cgroup *cgroupHook
26+
zfs *zfsHook
2627
hooks []jobHook
2728
}
2829

@@ -77,12 +78,15 @@ func (p *baseProvider) LogFile() string {
7778
return s
7879
}
7980
}
80-
panic("log dir is impossible to be unavailable")
81+
panic("log file is impossible to be unavailable")
8182
}
8283

8384
func (p *baseProvider) AddHook(hook jobHook) {
84-
if cg, ok := hook.(*cgroupHook); ok {
85-
p.cgroup = cg
85+
switch v := hook.(type) {
86+
case *cgroupHook:
87+
p.cgroup = v
88+
case *zfsHook:
89+
p.zfs = v
8690
}
8791
p.hooks = append(p.hooks, hook)
8892
}
@@ -95,6 +99,10 @@ func (p *baseProvider) Cgroup() *cgroupHook {
9599
return p.cgroup
96100
}
97101

102+
func (p *baseProvider) ZFS() *zfsHook {
103+
return p.zfs
104+
}
105+
98106
func (p *baseProvider) prepareLogFile() error {
99107
if p.LogFile() == "/dev/null" {
100108
p.cmd.SetLogFile(nil)

worker/config.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ type Config struct {
3737
Manager managerConfig `toml:"manager"`
3838
Server serverConfig `toml:"server"`
3939
Cgroup cgroupConfig `toml:"cgroup"`
40+
ZFS zfsConfig `toml:"zfs"`
4041
Include includeConfig `toml:"include"`
4142
Mirrors []mirrorConfig `toml:"mirrors"`
4243
}
@@ -53,9 +54,10 @@ type globalConfig struct {
5354
}
5455

5556
type managerConfig struct {
56-
APIBase string `toml:"api_base"`
57-
CACert string `toml:"ca_cert"`
58-
Token string `toml:"token"`
57+
APIBase string `toml:"api_base"`
58+
CACert string `toml:"ca_cert"`
59+
ExtraStatusAPIs []string `toml:"extra_status_managers"`
60+
// Token string `toml:"token"`
5961
}
6062

6163
type serverConfig struct {
@@ -72,6 +74,11 @@ type cgroupConfig struct {
7274
Group string `toml:"group"`
7375
}
7476

77+
type zfsConfig struct {
78+
Enable bool `toml:"enable"`
79+
Zpool string `toml:"zpool"`
80+
}
81+
7582
type includeConfig struct {
7683
IncludeMirrors string `toml:"include_mirrors"`
7784
}

worker/provider.go

+7
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ type mirrorProvider interface {
3636
IsRunning() bool
3737
// Cgroup
3838
Cgroup() *cgroupHook
39+
// ZFS
40+
ZFS() *zfsHook
3941

4042
AddHook(hook jobHook)
4143
Hooks() []jobHook
@@ -162,6 +164,11 @@ func newMirrorProvider(mirror mirrorConfig, cfg *Config) mirrorProvider {
162164
// Add Logging Hook
163165
provider.AddHook(newLogLimiter(provider))
164166

167+
// Add ZFS Hook
168+
if cfg.ZFS.Enable {
169+
provider.AddHook(newZfsHook(provider, cfg.ZFS.Zpool))
170+
}
171+
165172
// Add Cgroup Hook
166173
if cfg.Cgroup.Enable {
167174
provider.AddHook(

worker/worker.go

+9-8
Original file line numberDiff line numberDiff line change
@@ -405,12 +405,6 @@ func (w *Worker) registorWorker() {
405405
}
406406

407407
func (w *Worker) updateStatus(job *mirrorJob, jobMsg jobMessage) {
408-
url := fmt.Sprintf(
409-
"%s/workers/%s/jobs/%s",
410-
w.cfg.Manager.APIBase,
411-
w.Name(),
412-
jobMsg.name,
413-
)
414408
p := job.provider
415409
smsg := MirrorStatus{
416410
Name: jobMsg.name,
@@ -422,8 +416,15 @@ func (w *Worker) updateStatus(job *mirrorJob, jobMsg jobMessage) {
422416
ErrorMsg: jobMsg.msg,
423417
}
424418

425-
if _, err := PostJSON(url, smsg, w.httpClient); err != nil {
426-
logger.Errorf("Failed to update mirror(%s) status: %s", jobMsg.name, err.Error())
419+
apiBases := []string{w.cfg.Manager.APIBase}
420+
apiBases = append(apiBases, w.cfg.Manager.ExtraStatusAPIs...)
421+
for _, root := range apiBases {
422+
url := fmt.Sprintf(
423+
"%s/workers/%s/jobs/%s", root, w.Name(), jobMsg.name,
424+
)
425+
if _, err := PostJSON(url, smsg, w.httpClient); err != nil {
426+
logger.Errorf("Failed to update mirror(%s) status: %s", jobMsg.name, err.Error())
427+
}
427428
}
428429
}
429430

worker/zfs_hook.go

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package worker
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
8+
"github.com/codeskyblue/go-sh"
9+
)
10+
11+
type zfsHook struct {
12+
emptyHook
13+
provider mirrorProvider
14+
zpool string
15+
}
16+
17+
func newZfsHook(provider mirrorProvider, zpool string) *zfsHook {
18+
return &zfsHook{
19+
provider: provider,
20+
zpool: zpool,
21+
}
22+
}
23+
24+
// create zfs dataset for a new mirror
25+
func (z *zfsHook) preJob() error {
26+
workingDir := z.provider.WorkingDir()
27+
if _, err := os.Stat(workingDir); os.IsNotExist(err) {
28+
// sudo zfs create $zfsDataset
29+
// sudo zfs set mountpoint=${absPath} ${zfsDataset}
30+
31+
zfsDataset := fmt.Sprintf("%s/%s", z.zpool, z.provider.Name())
32+
// Unknown issue of ZFS:
33+
// dataset name should not contain upper case letters
34+
zfsDataset = strings.ToLower(zfsDataset)
35+
logger.Infof("Creating ZFS dataset %s", zfsDataset)
36+
if err := sh.Command("sudo", "zfs", "create", zfsDataset).Run(); err != nil {
37+
return err
38+
}
39+
logger.Infof("Mount ZFS dataset %s to %s", zfsDataset, workingDir)
40+
if err := sh.Command("sudo", "zfs", "set", "mountpoint="+workingDir, zfsDataset).Run(); err != nil {
41+
return err
42+
}
43+
}
44+
return nil
45+
}

0 commit comments

Comments
 (0)