Skip to content

Commit

Permalink
Avoid spawning already running services -- rpt files become declarative
Browse files Browse the repository at this point in the history
  • Loading branch information
jhkolb committed Oct 6, 2016
1 parent 7daf037 commit a8aec6f
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 3 deletions.
20 changes: 19 additions & 1 deletion backend/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,15 @@ import (
"github.com/golang/protobuf/proto"
"github.com/immesys/spawnpoint/objects"
"github.com/immesys/spawnpoint/spawnclient"
"github.com/mgutz/ansi"
uuid "github.com/satori/go.uuid"
)

const successPrefix = "[SUCCESS]"
const failurePrefix = "[FAILURE]"

const serviceCutoff = 10 * time.Second

func readProtoFile(name string) (*Deployment, error) {
rawBytes, err := ioutil.ReadFile(name)
if err != nil {
Expand Down Expand Up @@ -59,6 +62,7 @@ func DeployConfig(configFile string, sched Scheduler, printMsgs bool) ([]chan *o
}

allSpawnpoints := make(map[string]spawnpointInfo)
existingServices := make(map[string]string)
for _, uri := range deployment.SpawnpointUris {
spawnpoints, err := spawnClient.Scan(uri)
if err == nil {
Expand All @@ -71,7 +75,7 @@ func DeployConfig(configFile string, sched Scheduler, printMsgs bool) ([]chan *o
}

for alias, spawnpoint := range allSpawnpoints {
_, rawMd, err := spawnClient.Inspect(spawnpoint.URI)
svcs, rawMd, err := spawnClient.Inspect(spawnpoint.URI)
if err != nil {
return nil, err
}
Expand All @@ -84,6 +88,13 @@ func DeployConfig(configFile string, sched Scheduler, printMsgs bool) ([]chan *o
}
spawnpoint.Metadata = metadata
allSpawnpoints[alias] = spawnpoint

for _, service := range svcs {
if time.Now().Sub(service.LastSeen) < serviceCutoff {
hostAlias := service.HostURI[strings.LastIndex(service.HostURI, "/")+1:]
existingServices[service.Name] = hostAlias
}
}
}

placement, err := sched.schedule(deployment, allSpawnpoints)
Expand All @@ -98,6 +109,13 @@ func DeployConfig(configFile string, sched Scheduler, printMsgs bool) ([]chan *o

logs := make([]chan *objects.SPLogMsg, len(placement))
for _, service := range ordering {
alias, ok := existingServices[service.Name]
if ok {
fmt.Printf("%sService %s is already running on spawnpoint \"%s\", skipping deployment%s\n",
ansi.ColorCode("yellow+b"), service.Name, alias, ansi.ColorCode("reset"))
continue
}

spAlias := placement[service]
build := paramStringToSlice(&service.Params, "build")
run := paramStringToSlice(&service.Params, "run")
Expand Down
4 changes: 2 additions & 2 deletions backend/firstFitScheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ func (sched *FirstFitScheduler) schedule(deployment *Deployment,
return nil, fmt.Errorf("Service %s references unkonwn spawnpoint %s", service.Name, service.SpawnpointName)
} else if relevantSp.AvailableCPUShares < int64(cpuShares) {
return nil, fmt.Errorf("Insufficient CPU shares on Spawnpoint %s for service %s (want %d, have %d)",
service.Name, service.SpawnpointName, cpuShares, relevantSp.AvailableCPUShares)
service.SpawnpointName, service.Name, cpuShares, relevantSp.AvailableCPUShares)
} else if relevantSp.AvailableMem < int64(memAlloc) {
return nil, fmt.Errorf("Insufficient memory on Spawnpoint %s for service %s (want %d, have %d)",
service.Name, service.SpawnpointName, memAlloc, relevantSp.AvailableMem)
service.SpawnpointName, service.Name, memAlloc, relevantSp.AvailableMem)
}

placements[service] = relevantSp.Alias
Expand Down

0 comments on commit a8aec6f

Please sign in to comment.