Skip to content

Commit 020988f

Browse files
committed
FIX: [API] restart service.
1 parent d6501be commit 020988f

File tree

11 files changed

+50
-74
lines changed

11 files changed

+50
-74
lines changed

api/V0ComposeRestartService.go

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package api
22

33
import (
4+
"time"
45
"net/http"
56

67
cfg "github.com/AVENTER-UG/mesos-compose/types"
78
"github.com/gorilla/mux"
89
"github.com/sirupsen/logrus"
10+
"github.com/AVENTER-UG/util/util"
911
)
1012

1113
// V0ComposeRestartService will restart a service from a specific project
@@ -41,22 +43,49 @@ func (e *API) V0ComposeRestartService(w http.ResponseWriter, r *http.Request) {
4143
return
4244
}
4345

44-
logrus.WithField("func", "api.V0ComposeRestartService").Infof("Restart Tasks the service %s in project %s", project, servicename)
46+
logrus.WithField("func", "api.V0ComposeRestartService").Infof("Restart the service %s in project %s", project, servicename)
4547

48+
// generate new task as copy of old task
49+
newTask := new(cfg.Command)
4650
for keys.Next(e.Redis.CTX) {
4751
key := e.Redis.GetRedisKey(keys.Val())
4852
task := e.Mesos.DecodeTask(key)
49-
newTask := new(cfg.Command)
5053
*newTask = *task
5154
task.State = "__KILL"
5255
task.Restart = "no"
5356
e.Redis.SaveTaskRedis(task)
5457

5558
logrus.WithField("func", "api.V0ComposeRestartService").Tracef("Restart Task (%s) of service \"%s\" in project \"%s\"", task.TaskID, project, servicename)
59+
}
60+
61+
go e.increaseAfterKill(newTask, project, servicename)
62+
}
63+
64+
// increaseAfterKill
65+
// check every 5 seconds if all tasks of this service is killed.
66+
// if it so, start a new
67+
func (e *API) increaseAfterKill(task *cfg.Command, project, serviceName string) {
68+
done := false
69+
ticker := time.NewTicker(5 * time.Second)
70+
defer ticker.Stop()
71+
72+
for !done {
73+
select {
74+
case <-ticker.C:
75+
if e.Redis.CountRedisKey(e.Config.PrefixTaskName + ":" + project + ":" + serviceName + ":*", "") <= 0 {
76+
done = true
77+
78+
logrus.WithField("func", "api.increaseAfterKill").Infof("Restart Task %s", serviceName)
5679

57-
// generate new task as copy of old task
58-
newTask.TaskID = e.IncreaseTaskCount(newTask.TaskID)
59-
newTask.State = ""
60-
e.Redis.SaveTaskRedis(newTask)
80+
uuid, err := util.GenUUID()
81+
if err != nil {
82+
logrus.WithField("func", "api.increaseAfterKill").Error("Error during create uuid: ", err.Error())
83+
return
84+
}
85+
task.TaskID = e.IncreaseTaskCount(project + "_" + serviceName + "." + uuid)
86+
task.State = ""
87+
e.Redis.SaveTaskRedis(task)
88+
}
89+
}
6190
}
6291
}

api/V0ComposeRestartTask.go

Lines changed: 0 additions & 56 deletions
This file was deleted.

api/api.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ func (e *API) Commands() *mux.Router {
5353
rtr.HandleFunc("/api/compose/versions", e.Versions).Methods("GET")
5454
rtr.HandleFunc("/api/compose/v0/tasks", e.V0ShowAllTasks).Methods("GET")
5555
rtr.HandleFunc("/api/compose/v0/tasks/{taskid}", e.V0ComposeKillTask).Methods("DELETE")
56-
rtr.HandleFunc("/api/compose/v0/tasks/{taskid}/restart", e.V0ComposeRestartTask).Methods("PUT")
5756
rtr.HandleFunc("/api/compose/v0/framework/reregister", e.V0FrameworkReRegister).Methods("PUT")
5857
rtr.HandleFunc("/api/compose/v0/framework/suppress", e.V0FrameworkSuppress).Methods("PUT")
5958
rtr.HandleFunc("/api/compose/v0/framework", e.V0FrameworkRemoveID).Methods("DELETE")

api/compose.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ func (e *API) getRuntime(cmd *cfg.Command) []*mesosproto.Parameter {
103103

104104
if e.getContainerType() == "docker" && e.Service.Deploy.Runtime != "" {
105105
param = e.addDockerParameter(param, "runtime", strings.ToLower(e.Service.Deploy.Runtime))
106+
param = e.addDockerParameter(param, "memory-swap", "0")
107+
param = e.addDockerParameter(param, "cpu-shares", "0")
106108
}
107109

108110
return param

changelog.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22

33
## master
44

5+
- CHANGE: !!!! If compose.networks is set, the network mode will be automaticly "user".
6+
It can be overwritten if compose.networks.driver is set. !!!!
57
- ADD: Enable/Disable event handling as own thread (ENV Variable THREAD_ENABLE)
68
- ADD: API Endpoint to cleanup the Framework ID. That will force a resubscription under
79
a new Framework ID.
8-
- CHANGE: !!!! If compose.networks is set, the network mode will be automaticly "user".
9-
It can be overwritten if compose.networks.driver is set. !!!!
1010
- ADD: Support for AMD and NVIDIA GPUs.
1111
- ADD: Mesos Framework GPU Capabilities to get GPU offers from mesos.
1212
- ADD: Runtime support for docker container (https://github.com/newsnowlabs/runcvm)
1313
- ADD: Support for Mesos attributes
14+
- FIX: [API] Restart service
15+
- DEL: [API] Remove useless restart task API
1416

1517
## v1.1.3
1618

docs/example/test-http.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ services:
1616
network_mode: "user"
1717
network: default
1818
deploy:
19-
replicas: 1
19+
replicas: 2
2020

2121
networks:
2222
default:

mesos_cli/compose/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ class mesosCompose(PluginBase):
119119
"restart": {
120120
"arguments": ["<framework-name>", "<task>"],
121121
"flags": {},
122-
"short_help": "Restart a single task (ID) or a whole service (Task Name)",
123-
"long_help": "Use the \"ID\" to restart a single task or the \"Task Name\" to restart the entire service."
122+
"short_help": "Restart a whole service (Task Name)",
123+
"long_help": "Use \"Task Name\" to restart the entire service."
124124
},
125125
"framework": {
126126
"arguments": ["<framework-name>", "<operations>"],

scheduler/handle_offers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func (e *Scheduler) HandleOffers(offers *mesosproto.Event_Offers) error {
1616
select {
1717
case cmd := <-e.Framework.CommandChan:
1818
// if no taskid or taskname is given, it's a wrong task.
19-
if cmd.TaskID == "" || cmd.TaskName == "" || cmd.Killed {
19+
if cmd.TaskID == "" || cmd.TaskName == "" {
2020
return nil
2121
}
2222

scheduler/handle_update.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ func (e *Scheduler) HandleUpdate(event *mesosproto.Event) {
2828
return
2929
}
3030

31-
task.State = update.Status.State.String()
31+
// don't update state message if the task is in KILL state
32+
if task.State != "__KILL" {
33+
task.State = update.Status.State.String()
34+
}
3235

3336
logrus.WithField("func", "scheduler.HandleUpdate").Tracef("Event %s, State %s, TaskID %s", event.GetType().String(), task.State, task.TaskID)
3437

@@ -70,7 +73,6 @@ func (e *Scheduler) HandleUpdate(event *mesosproto.Event) {
7073
e.Redis.DelRedisKey(task.TaskName + ":" + task.TaskID)
7174
task.TaskID = e.API.IncreaseTaskCount(task.TaskID)
7275
task.State = ""
73-
task.Killed = false
7476
break
7577
case mesosproto.TaskState_TASK_LOST:
7678
if task.TaskID == "" {

scheduler/heartbeat.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func (e *Scheduler) Heartbeat() {
2222

2323
task := e.Mesos.DecodeTask(key)
2424

25-
if task.TaskID == "" || task.TaskName == "" || task.Killed {
25+
if task.TaskID == "" || task.TaskName == "" {
2626
continue
2727
}
2828

@@ -34,7 +34,6 @@ func (e *Scheduler) Heartbeat() {
3434
continue
3535
} else {
3636
task.Restart = "no"
37-
task.Killed = true
3837
e.Redis.SaveTaskRedis(task)
3938
e.Mesos.Kill(task.TaskID, task.Agent)
4039
}

0 commit comments

Comments
 (0)