15954: Fix deadlock.
[arvados.git] / lib / boot / passenger.go
index 61f97df5269ef8c70eedcc432b005a408a60e4e5..822e737cb972777466c12d0ed1eb9cda9a314148 100644 (file)
@@ -11,10 +11,15 @@ import (
        "os"
        "path/filepath"
        "strings"
+       "sync"
 
        "git.arvados.org/arvados.git/sdk/go/arvados"
 )
 
+// Don't trust "passenger-config" (or "bundle install") to handle
+// concurrent installs.
+var passengerInstallMutex sync.Mutex
+
 type installPassenger struct {
        src     string
        depends []bootTask
@@ -29,6 +34,10 @@ func (runner installPassenger) Run(ctx context.Context, fail func(error), boot *
        if err != nil {
                return err
        }
+
+       passengerInstallMutex.Lock()
+       defer passengerInstallMutex.Unlock()
+
        var buf bytes.Buffer
        err = boot.RunProgram(ctx, runner.src, &buf, nil, "gem", "list", "--details", "bundler")
        if err != nil {