mirror of
https://github.com/tuna/tunasync.git
synced 2025-04-21 04:42:46 +00:00
commit
81a15e7dd1
@ -182,7 +182,7 @@ func (b *boltAdapter) FlushDisabledJobs() (err error) {
|
|||||||
err = fmt.Errorf("%s; %s", err.Error(), jsonErr)
|
err = fmt.Errorf("%s; %s", err.Error(), jsonErr)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if m.Status == Disabled {
|
if m.Status == Disabled || len(m.Name) == 0 {
|
||||||
err = c.Delete()
|
err = c.Delete()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ type baseProvider struct {
|
|||||||
logFile *os.File
|
logFile *os.File
|
||||||
|
|
||||||
cgroup *cgroupHook
|
cgroup *cgroupHook
|
||||||
|
zfs *zfsHook
|
||||||
hooks []jobHook
|
hooks []jobHook
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,12 +78,15 @@ func (p *baseProvider) LogFile() string {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
panic("log dir is impossible to be unavailable")
|
panic("log file is impossible to be unavailable")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *baseProvider) AddHook(hook jobHook) {
|
func (p *baseProvider) AddHook(hook jobHook) {
|
||||||
if cg, ok := hook.(*cgroupHook); ok {
|
switch v := hook.(type) {
|
||||||
p.cgroup = cg
|
case *cgroupHook:
|
||||||
|
p.cgroup = v
|
||||||
|
case *zfsHook:
|
||||||
|
p.zfs = v
|
||||||
}
|
}
|
||||||
p.hooks = append(p.hooks, hook)
|
p.hooks = append(p.hooks, hook)
|
||||||
}
|
}
|
||||||
@ -95,6 +99,10 @@ func (p *baseProvider) Cgroup() *cgroupHook {
|
|||||||
return p.cgroup
|
return p.cgroup
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *baseProvider) ZFS() *zfsHook {
|
||||||
|
return p.zfs
|
||||||
|
}
|
||||||
|
|
||||||
func (p *baseProvider) prepareLogFile() error {
|
func (p *baseProvider) prepareLogFile() error {
|
||||||
if p.LogFile() == "/dev/null" {
|
if p.LogFile() == "/dev/null" {
|
||||||
p.cmd.SetLogFile(nil)
|
p.cmd.SetLogFile(nil)
|
||||||
|
@ -37,6 +37,7 @@ type Config struct {
|
|||||||
Manager managerConfig `toml:"manager"`
|
Manager managerConfig `toml:"manager"`
|
||||||
Server serverConfig `toml:"server"`
|
Server serverConfig `toml:"server"`
|
||||||
Cgroup cgroupConfig `toml:"cgroup"`
|
Cgroup cgroupConfig `toml:"cgroup"`
|
||||||
|
ZFS zfsConfig `toml:"zfs"`
|
||||||
Include includeConfig `toml:"include"`
|
Include includeConfig `toml:"include"`
|
||||||
Mirrors []mirrorConfig `toml:"mirrors"`
|
Mirrors []mirrorConfig `toml:"mirrors"`
|
||||||
}
|
}
|
||||||
@ -53,9 +54,10 @@ type globalConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type managerConfig struct {
|
type managerConfig struct {
|
||||||
APIBase string `toml:"api_base"`
|
APIBase string `toml:"api_base"`
|
||||||
CACert string `toml:"ca_cert"`
|
CACert string `toml:"ca_cert"`
|
||||||
Token string `toml:"token"`
|
ExtraStatusAPIs []string `toml:"extra_status_managers"`
|
||||||
|
// Token string `toml:"token"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type serverConfig struct {
|
type serverConfig struct {
|
||||||
@ -72,6 +74,11 @@ type cgroupConfig struct {
|
|||||||
Group string `toml:"group"`
|
Group string `toml:"group"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type zfsConfig struct {
|
||||||
|
Enable bool `toml:"enable"`
|
||||||
|
Zpool string `toml:"zpool"`
|
||||||
|
}
|
||||||
|
|
||||||
type includeConfig struct {
|
type includeConfig struct {
|
||||||
IncludeMirrors string `toml:"include_mirrors"`
|
IncludeMirrors string `toml:"include_mirrors"`
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,8 @@ type mirrorProvider interface {
|
|||||||
IsRunning() bool
|
IsRunning() bool
|
||||||
// Cgroup
|
// Cgroup
|
||||||
Cgroup() *cgroupHook
|
Cgroup() *cgroupHook
|
||||||
|
// ZFS
|
||||||
|
ZFS() *zfsHook
|
||||||
|
|
||||||
AddHook(hook jobHook)
|
AddHook(hook jobHook)
|
||||||
Hooks() []jobHook
|
Hooks() []jobHook
|
||||||
@ -162,6 +164,11 @@ func newMirrorProvider(mirror mirrorConfig, cfg *Config) mirrorProvider {
|
|||||||
// Add Logging Hook
|
// Add Logging Hook
|
||||||
provider.AddHook(newLogLimiter(provider))
|
provider.AddHook(newLogLimiter(provider))
|
||||||
|
|
||||||
|
// Add ZFS Hook
|
||||||
|
if cfg.ZFS.Enable {
|
||||||
|
provider.AddHook(newZfsHook(provider, cfg.ZFS.Zpool))
|
||||||
|
}
|
||||||
|
|
||||||
// Add Cgroup Hook
|
// Add Cgroup Hook
|
||||||
if cfg.Cgroup.Enable {
|
if cfg.Cgroup.Enable {
|
||||||
provider.AddHook(
|
provider.AddHook(
|
||||||
|
@ -405,12 +405,6 @@ func (w *Worker) registorWorker() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (w *Worker) updateStatus(job *mirrorJob, jobMsg jobMessage) {
|
func (w *Worker) updateStatus(job *mirrorJob, jobMsg jobMessage) {
|
||||||
url := fmt.Sprintf(
|
|
||||||
"%s/workers/%s/jobs/%s",
|
|
||||||
w.cfg.Manager.APIBase,
|
|
||||||
w.Name(),
|
|
||||||
jobMsg.name,
|
|
||||||
)
|
|
||||||
p := job.provider
|
p := job.provider
|
||||||
smsg := MirrorStatus{
|
smsg := MirrorStatus{
|
||||||
Name: jobMsg.name,
|
Name: jobMsg.name,
|
||||||
@ -422,8 +416,15 @@ func (w *Worker) updateStatus(job *mirrorJob, jobMsg jobMessage) {
|
|||||||
ErrorMsg: jobMsg.msg,
|
ErrorMsg: jobMsg.msg,
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := PostJSON(url, smsg, w.httpClient); err != nil {
|
apiBases := []string{w.cfg.Manager.APIBase}
|
||||||
logger.Errorf("Failed to update mirror(%s) status: %s", jobMsg.name, err.Error())
|
apiBases = append(apiBases, w.cfg.Manager.ExtraStatusAPIs...)
|
||||||
|
for _, root := range apiBases {
|
||||||
|
url := fmt.Sprintf(
|
||||||
|
"%s/workers/%s/jobs/%s", root, w.Name(), jobMsg.name,
|
||||||
|
)
|
||||||
|
if _, err := PostJSON(url, smsg, w.httpClient); err != nil {
|
||||||
|
logger.Errorf("Failed to update mirror(%s) status: %s", jobMsg.name, err.Error())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
45
worker/zfs_hook.go
Normal file
45
worker/zfs_hook.go
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
package worker
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/codeskyblue/go-sh"
|
||||||
|
)
|
||||||
|
|
||||||
|
type zfsHook struct {
|
||||||
|
emptyHook
|
||||||
|
provider mirrorProvider
|
||||||
|
zpool string
|
||||||
|
}
|
||||||
|
|
||||||
|
func newZfsHook(provider mirrorProvider, zpool string) *zfsHook {
|
||||||
|
return &zfsHook{
|
||||||
|
provider: provider,
|
||||||
|
zpool: zpool,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// create zfs dataset for a new mirror
|
||||||
|
func (z *zfsHook) preJob() error {
|
||||||
|
workingDir := z.provider.WorkingDir()
|
||||||
|
if _, err := os.Stat(workingDir); os.IsNotExist(err) {
|
||||||
|
// sudo zfs create $zfsDataset
|
||||||
|
// sudo zfs set mountpoint=${absPath} ${zfsDataset}
|
||||||
|
|
||||||
|
zfsDataset := fmt.Sprintf("%s/%s", z.zpool, z.provider.Name())
|
||||||
|
// Unknown issue of ZFS:
|
||||||
|
// dataset name should not contain upper case letters
|
||||||
|
zfsDataset = strings.ToLower(zfsDataset)
|
||||||
|
logger.Infof("Creating ZFS dataset %s", zfsDataset)
|
||||||
|
if err := sh.Command("sudo", "zfs", "create", zfsDataset).Run(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
logger.Infof("Mount ZFS dataset %s to %s", zfsDataset, workingDir)
|
||||||
|
if err := sh.Command("sudo", "zfs", "set", "mountpoint="+workingDir, zfsDataset).Run(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user