diff options
Diffstat (limited to 'model')
-rw-r--r-- | model/cluster_info.go | 50 | ||||
-rw-r--r-- | model/cluster_info_test.go | 10 | ||||
-rw-r--r-- | model/job.go | 10 |
3 files changed, 63 insertions, 7 deletions
diff --git a/model/cluster_info.go b/model/cluster_info.go index 7c3384ae2..0e4b1e365 100644 --- a/model/cluster_info.go +++ b/model/cluster_info.go @@ -6,19 +6,25 @@ package model import ( "encoding/json" "io" + "strings" + "sync" + "sync/atomic" ) type ClusterInfo struct { - Id string `json:"id"` - Version string `json:"version"` - ConfigHash string `json:"config_hash"` - InterNodeUrl string `json:"internode_url"` - Hostname string `json:"hostname"` - LastSuccessfulPing int64 `json:"last_ping"` - IsAlive bool `json:"is_alive"` + Id string `json:"id"` + Version string `json:"version"` + ConfigHash string `json:"config_hash"` + InterNodeUrl string `json:"internode_url"` + Hostname string `json:"hostname"` + LastSuccessfulPing int64 `json:"last_ping"` + Alive int32 `json:"is_alive"` + Mutex sync.RWMutex `json:"-"` } func (me *ClusterInfo) ToJson() string { + me.Mutex.RLock() + defer me.Mutex.RUnlock() b, err := json.Marshal(me) if err != nil { return "" @@ -27,9 +33,15 @@ func (me *ClusterInfo) ToJson() string { } } +func (me *ClusterInfo) Copy() *ClusterInfo { + json := me.ToJson() + return ClusterInfoFromJson(strings.NewReader(json)) +} + func ClusterInfoFromJson(data io.Reader) *ClusterInfo { decoder := json.NewDecoder(data) var me ClusterInfo + me.Mutex = sync.RWMutex{} err := decoder.Decode(&me) if err == nil { return &me @@ -38,7 +50,21 @@ func ClusterInfoFromJson(data io.Reader) *ClusterInfo { } } +func (me *ClusterInfo) SetAlive(alive bool) { + if alive { + atomic.StoreInt32(&me.Alive, 1) + } else { + atomic.StoreInt32(&me.Alive, 0) + } +} + +func (me *ClusterInfo) IsAlive() bool { + return atomic.LoadInt32(&me.Alive) == 1 +} + func (me *ClusterInfo) HaveEstablishedInitialContact() bool { + me.Mutex.RLock() + defer me.Mutex.RUnlock() if me.Id != "" { return true } @@ -46,6 +72,16 @@ func (me *ClusterInfo) HaveEstablishedInitialContact() bool { return false } +func (me *ClusterInfo) IdEqualTo(in string) bool { + me.Mutex.RLock() + defer me.Mutex.RUnlock() + if me.Id == in { + return true + } + + return false +} + func ClusterInfosToJson(objmap []*ClusterInfo) string { if b, err := json.Marshal(objmap); err != nil { return "" diff --git a/model/cluster_info_test.go b/model/cluster_info_test.go index d6348f5d1..e7aa9cd16 100644 --- a/model/cluster_info_test.go +++ b/model/cluster_info_test.go @@ -16,6 +16,16 @@ func TestClusterInfoJson(t *testing.T) { if cluster.Id != result.Id { t.Fatal("Ids do not match") } + + cluster.SetAlive(true) + if !cluster.IsAlive() { + t.Fatal("should be live") + } + + cluster.SetAlive(false) + if cluster.IsAlive() { + t.Fatal("should be not live") + } } func TestClusterInfosJson(t *testing.T) { diff --git a/model/job.go b/model/job.go index 09d74aa09..a139b154c 100644 --- a/model/job.go +++ b/model/job.go @@ -5,6 +5,7 @@ package model import ( "fmt" + "sync" "time" ) @@ -18,17 +19,24 @@ type ScheduledTask struct { timer *time.Timer } +var taskMutex = sync.Mutex{} var tasks = make(map[string]*ScheduledTask) func addTask(task *ScheduledTask) { + taskMutex.Lock() + defer taskMutex.Unlock() tasks[task.Name] = task } func removeTaskByName(name string) { + taskMutex.Lock() + defer taskMutex.Unlock() delete(tasks, name) } func GetTaskByName(name string) *ScheduledTask { + taskMutex.Lock() + defer taskMutex.Unlock() if task, ok := tasks[name]; ok { return task } @@ -36,6 +44,8 @@ func GetTaskByName(name string) *ScheduledTask { } func GetAllTasks() *map[string]*ScheduledTask { + taskMutex.Lock() + defer taskMutex.Unlock() return &tasks } |