functions: performance improvements - LRU & singleflight DB calls (#322)

* functions: add cache and singleflight to ease database load

* runner: upgrade

* deps: upgrade glide files

* license: add third party notifications

* functions: fix handling of implicitly created apps

* functions: code deduplication

* functions: fix missing variable
This commit is contained in:
C Cirello
2016-11-21 19:48:11 +01:00
committed by GitHub
parent a4d360fb2e
commit f6d19c3cc9
14 changed files with 289 additions and 69 deletions

View File

@@ -86,24 +86,12 @@ func deleteTask(url string, task *models.Task) error {
// RunAsyncRunner pulls tasks off a queue and processes them
func RunAsyncRunner(ctx context.Context, tasksrv string, tasks chan TaskRequest, rnr *Runner) {
u, h := tasksrvURL(tasksrv)
if isHostOpen(h) {
return
}
u := tasksrvURL(tasksrv)
startAsyncRunners(ctx, u, tasks, rnr)
<-ctx.Done()
}
func isHostOpen(host string) bool {
conn, err := net.Dial("tcp", host)
available := err == nil
if available {
conn.Close()
}
return available
}
func startAsyncRunners(ctx context.Context, url string, tasks chan TaskRequest, rnr *Runner) {
var wg sync.WaitGroup
ctx, log := common.LoggerWithFields(ctx, logrus.Fields{"runner": "async"})
@@ -159,15 +147,11 @@ func startAsyncRunners(ctx context.Context, url string, tasks chan TaskRequest,
}
}
func tasksrvURL(tasksrv string) (parsedURL, host string) {
func tasksrvURL(tasksrv string) string {
parsed, err := url.Parse(tasksrv)
if err != nil {
logrus.WithError(err).Fatalln("cannot parse TASKSRV endpoint")
logrus.WithError(err).Fatalln("cannot parse API_URL endpoint")
}
// host, port, err := net.SplitHostPort(parsed.Host)
// if err != nil {
// log.WithError(err).Fatalln("net.SplitHostPort")
// }
if parsed.Scheme == "" {
parsed.Scheme = "http"
@@ -177,9 +161,5 @@ func tasksrvURL(tasksrv string) (parsedURL, host string) {
parsed.Path = "/tasks"
}
// if _, _, err := net.SplitHostPort(parsed.Host); err != nil {
// parsed.Host = net.JoinHostPort(parsed.Host, parsed)
// }
return parsed.String(), parsed.Host
return parsed.String()
}

View File

@@ -182,7 +182,7 @@ func TestTasksrvURL(t *testing.T) {
}
for _, tt := range tests {
if got, _ := tasksrvURL(tt.in); got != tt.out {
if got := tasksrvURL(tt.in); got != tt.out {
t.Errorf("tasksrv: %s\texpected: %s\tgot: %s\t", tt.in, tt.out, got)
}
}

View File

@@ -3,6 +3,7 @@ package runner
import (
"context"
"io"
"time"
"github.com/fsouza/go-dockerclient"
"github.com/iron-io/runner/drivers"
@@ -32,7 +33,7 @@ func (t *containerTask) Labels() map[string]string {
func (t *containerTask) Id() string { return t.cfg.ID }
func (t *containerTask) Route() string { return "" }
func (t *containerTask) Image() string { return t.cfg.Image }
func (t *containerTask) Timeout() uint { return uint(t.cfg.Timeout.Seconds()) }
func (t *containerTask) Timeout() time.Duration { return t.cfg.Timeout }
func (t *containerTask) Logger() (stdout, stderr io.Writer) { return t.cfg.Stdout, t.cfg.Stderr }
func (t *containerTask) Volumes() [][2]string { return [][2]string{} }
func (t *containerTask) WorkDir() string { return "" }