Don't panic when docker client cannot be obtained.
Make close session faster by deleting instances in parallel.
This commit is contained in:
@@ -129,7 +129,13 @@ func (p *pwd) InstanceNew(session *types.Session, conf types.InstanceConfig) (*t
|
|||||||
|
|
||||||
func (p *pwd) InstanceExec(instance *types.Instance, cmd []string) (int, error) {
|
func (p *pwd) InstanceExec(instance *types.Instance, cmd []string) (int, error) {
|
||||||
defer observeAction("InstanceExec", time.Now())
|
defer observeAction("InstanceExec", time.Now())
|
||||||
return p.docker(instance.SessionId).Exec(instance.Name, cmd)
|
|
||||||
|
dockerClient, err := p.dockerFactory.GetForSession(instance.SessionId)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return -1, err
|
||||||
|
}
|
||||||
|
return dockerClient.Exec(instance.Name, cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *pwd) InstanceAllowedImages() []string {
|
func (p *pwd) InstanceAllowedImages() []string {
|
||||||
|
|||||||
@@ -114,14 +114,6 @@ func (p *pwd) getProvisioner(t string) (provisioner.ProvisionerApi, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *pwd) docker(sessionId string) docker.DockerApi {
|
|
||||||
d, err := p.dockerFactory.GetForSession(sessionId)
|
|
||||||
if err != nil {
|
|
||||||
panic("Should not have got here. Session always need to be validated before calling this.")
|
|
||||||
}
|
|
||||||
return d
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *pwd) setGauges() {
|
func (p *pwd) setGauges() {
|
||||||
s, _ := p.storage.SessionCount()
|
s, _ := p.storage.SessionCount()
|
||||||
ses := float64(s)
|
ses := float64(s)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package pwd
|
package pwd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"math"
|
"math"
|
||||||
@@ -11,6 +12,8 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"golang.org/x/sync/errgroup"
|
||||||
|
|
||||||
"github.com/play-with-docker/play-with-docker/config"
|
"github.com/play-with-docker/play-with-docker/config"
|
||||||
"github.com/play-with-docker/play-with-docker/docker"
|
"github.com/play-with-docker/play-with-docker/docker"
|
||||||
"github.com/play-with-docker/play-with-docker/event"
|
"github.com/play-with-docker/play-with-docker/event"
|
||||||
@@ -63,7 +66,11 @@ func (p *pwd) SessionNew(duration time.Duration, stack, stackName, imageName str
|
|||||||
|
|
||||||
log.Printf("NewSession id=[%s]\n", s.Id)
|
log.Printf("NewSession id=[%s]\n", s.Id)
|
||||||
|
|
||||||
dockerClient := p.docker(s.Id)
|
dockerClient, err := p.dockerFactory.GetForSession(s.Id)
|
||||||
|
if err != nil {
|
||||||
|
// We assume we are out of capacity
|
||||||
|
return nil, fmt.Errorf("Out of capacity")
|
||||||
|
}
|
||||||
u, _ := url.Parse(dockerClient.GetDaemonHost())
|
u, _ := url.Parse(dockerClient.GetDaemonHost())
|
||||||
if u.Host == "" {
|
if u.Host == "" {
|
||||||
s.Host = "localhost"
|
s.Host = "localhost"
|
||||||
@@ -113,22 +120,33 @@ func (p *pwd) SessionClose(s *types.Session) error {
|
|||||||
s = updatedSession
|
s = updatedSession
|
||||||
|
|
||||||
log.Printf("Starting clean up of session [%s]\n", s.Id)
|
log.Printf("Starting clean up of session [%s]\n", s.Id)
|
||||||
|
g, _ := errgroup.WithContext(context.Background())
|
||||||
for _, i := range s.Instances {
|
for _, i := range s.Instances {
|
||||||
err := p.InstanceDelete(s, i)
|
i := i
|
||||||
if err != nil {
|
g.Go(func() error {
|
||||||
log.Println(err)
|
return p.InstanceDelete(s, i)
|
||||||
return err
|
})
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
err = g.Wait()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// Disconnect PWD daemon from the network
|
// Disconnect PWD daemon from the network
|
||||||
if err := p.docker(s.Id).DisconnectNetwork(config.L2ContainerName, s.Id); err != nil {
|
dockerClient, err := p.dockerFactory.GetForSession(s.Id)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := dockerClient.DisconnectNetwork(config.L2ContainerName, s.Id); err != nil {
|
||||||
if !strings.Contains(err.Error(), "is not connected to the network") {
|
if !strings.Contains(err.Error(), "is not connected to the network") {
|
||||||
log.Println("ERROR NETWORKING", err)
|
log.Println("ERROR NETWORKING", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.Printf("Disconnected l2 from network [%s]\n", s.Id)
|
log.Printf("Disconnected l2 from network [%s]\n", s.Id)
|
||||||
if err := p.docker(s.Id).DeleteNetwork(s.Id); err != nil {
|
if err := dockerClient.DeleteNetwork(s.Id); err != nil {
|
||||||
if !strings.Contains(err.Error(), "not found") {
|
if !strings.Contains(err.Error(), "not found") {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
return err
|
return err
|
||||||
@@ -189,7 +207,14 @@ func (p *pwd) SessionDeployStack(s *types.Session) error {
|
|||||||
cmd := fmt.Sprintf("docker swarm init --advertise-addr eth0 && docker-compose -f %s pull && docker stack deploy -c %s %s", file, file, s.StackName)
|
cmd := fmt.Sprintf("docker swarm init --advertise-addr eth0 && docker-compose -f %s pull && docker stack deploy -c %s %s", file, file, s.StackName)
|
||||||
|
|
||||||
w := sessionBuilderWriter{sessionId: s.Id, event: p.event}
|
w := sessionBuilderWriter{sessionId: s.Id, event: p.event}
|
||||||
code, err := p.docker(s.Id).ExecAttach(i.Name, []string{"sh", "-c", cmd}, &w)
|
|
||||||
|
dockerClient, err := p.dockerFactory.GetForSession(s.Id)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
code, err := dockerClient.ExecAttach(i.Name, []string{"sh", "-c", cmd}, &w)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error executing stack [%s]: %s\n", s.Stack, err)
|
log.Printf("Error executing stack [%s]: %s\n", s.Stack, err)
|
||||||
return err
|
return err
|
||||||
|
|||||||
Reference in New Issue
Block a user