[ARVADOS] created: 97aae1ab26418204078599a5ddbff493d26e32d8

Git user git at public.curoverse.com
Thu Sep 28 16:51:02 EDT 2017


        at  97aae1ab26418204078599a5ddbff493d26e32d8 (commit)


commit 97aae1ab26418204078599a5ddbff493d26e32d8
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Thu Sep 28 14:52:01 2017 -0400

    11583: Fix hung goroutines when stubbed container never runs.
    
    Test suite memory usage goes down from >8GB to 1.5GB.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/services/crunch-run/crunchrun_test.go b/services/crunch-run/crunchrun_test.go
index 935c61a..474ba5d 100644
--- a/services/crunch-run/crunchrun_test.go
+++ b/services/crunch-run/crunchrun_test.go
@@ -99,7 +99,7 @@ func NewTestDockerClient(exitCode int) *TestDockerClient {
 	t := &TestDockerClient{}
 	t.logReader, t.logWriter = io.Pipe()
 	t.finish = exitCode
-	t.stop = make(chan bool)
+	t.stop = make(chan bool, 1)
 	t.cwd = "/"
 	return t
 }

commit 53b06a2fd2fb9ef3f0cb1a82a5ad34144c50e51d
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Thu Sep 28 14:19:55 2017 -0400

    11583: Stop signal handlers on shutdown.
    
    Reduces noise in goroutine dumps during test suite.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/services/crunch-run/crunchrun.go b/services/crunch-run/crunchrun.go
index 3fdd374..8af1210 100644
--- a/services/crunch-run/crunchrun.go
+++ b/services/crunch-run/crunchrun.go
@@ -181,9 +181,9 @@ type ContainerRunner struct {
 	networkMode   string // passed through to HostConfig.NetworkMode
 }
 
-// SetupSignals sets up signal handling to gracefully terminate the underlying
+// setupSignals sets up signal handling to gracefully terminate the underlying
 // Docker container and update state when receiving a TERM, INT or QUIT signal.
-func (runner *ContainerRunner) SetupSignals() {
+func (runner *ContainerRunner) setupSignals() {
 	runner.SigChan = make(chan os.Signal, 1)
 	signal.Notify(runner.SigChan, syscall.SIGTERM)
 	signal.Notify(runner.SigChan, syscall.SIGINT)
@@ -192,7 +192,6 @@ func (runner *ContainerRunner) SetupSignals() {
 	go func(sig chan os.Signal) {
 		<-sig
 		runner.stop()
-		signal.Stop(sig)
 	}(runner.SigChan)
 }
 
@@ -213,6 +212,13 @@ func (runner *ContainerRunner) stop() {
 	}
 }
 
+func (runner *ContainerRunner) teardown() {
+	if runner.SigChan != nil {
+		signal.Stop(runner.SigChan)
+		close(runner.SigChan)
+	}
+}
+
 // LoadImage determines the docker image id from the container record and
 // checks if it is available in the local Docker image store.  If not, it loads
 // the image from Keep.
@@ -1303,6 +1309,8 @@ func (runner *ContainerRunner) Run() (err error) {
 		// a new one in case we needed to log anything while
 		// finalizing.
 		runner.CrunchLog.Close()
+
+		runner.teardown()
 	}()
 
 	err = runner.fetchContainerRecord()
@@ -1311,7 +1319,7 @@ func (runner *ContainerRunner) Run() (err error) {
 	}
 
 	// setup signal handling
-	runner.SetupSignals()
+	runner.setupSignals()
 
 	// check for and/or load image
 	err = runner.LoadImage()

commit b5ffaa6737a50370de40d73839077b7e4ebb225f
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Thu Sep 28 13:57:21 2017 -0400

    12273: Skip non-regular files when uploading outputs to Keep.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/sdk/go/crunchrunner/upload.go b/sdk/go/crunchrunner/upload.go
index fd24908..2848d10 100644
--- a/sdk/go/crunchrunner/upload.go
+++ b/sdk/go/crunchrunner/upload.go
@@ -9,14 +9,15 @@ import (
 	"crypto/md5"
 	"errors"
 	"fmt"
-	"git.curoverse.com/arvados.git/sdk/go/keepclient"
-	"git.curoverse.com/arvados.git/sdk/go/manifest"
 	"io"
 	"log"
 	"os"
 	"path/filepath"
 	"sort"
 	"strings"
+
+	"git.curoverse.com/arvados.git/sdk/go/keepclient"
+	"git.curoverse.com/arvados.git/sdk/go/manifest"
 )
 
 type Block struct {
@@ -90,7 +91,26 @@ type ManifestWriter struct {
 }
 
 func (m *ManifestWriter) WalkFunc(path string, info os.FileInfo, err error) error {
-	if info.IsDir() {
+	if err != nil {
+		return err
+	}
+
+	targetPath, targetInfo := path, info
+	if info.Mode()&os.ModeSymlink != 0 {
+		// Update targetpath/info to reflect the symlink
+		// target, not the symlink itself
+		targetPath, err = filepath.EvalSymlinks(path)
+		if err != nil {
+			return err
+		}
+		targetInfo, err = os.Stat(targetPath)
+		if err != nil {
+			return fmt.Errorf("stat symlink %q target %q: %s", path, targetPath, err)
+		}
+	}
+
+	if targetInfo.Mode()&os.ModeType != 0 {
+		// Skip directories, pipes, other non-regular files
 		return nil
 	}
 
diff --git a/sdk/go/crunchrunner/upload_test.go b/sdk/go/crunchrunner/upload_test.go
index ceb89dc..5bc7492 100644
--- a/sdk/go/crunchrunner/upload_test.go
+++ b/sdk/go/crunchrunner/upload_test.go
@@ -8,9 +8,11 @@ import (
 	"crypto/md5"
 	"errors"
 	"fmt"
-	. "gopkg.in/check.v1"
 	"io/ioutil"
 	"os"
+	"syscall"
+
+	. "gopkg.in/check.v1"
 )
 
 type UploadTestSuite struct{}
@@ -38,18 +40,24 @@ func (s *TestSuite) TestSimpleUpload(c *C) {
 	c.Check(str, Equals, ". acbd18db4cc2f85cedef654fccc4a4d8+3 0:3:file1.txt\n")
 }
 
-func (s *TestSuite) TestSimpleUploadTwofiles(c *C) {
+func (s *TestSuite) TestSimpleUploadThreeFiles(c *C) {
 	tmpdir, _ := ioutil.TempDir("", "")
 	defer func() {
 		os.RemoveAll(tmpdir)
 	}()
 
-	ioutil.WriteFile(tmpdir+"/"+"file1.txt", []byte("foo"), 0600)
-	ioutil.WriteFile(tmpdir+"/"+"file2.txt", []byte("bar"), 0600)
+	for _, err := range []error{
+		ioutil.WriteFile(tmpdir+"/"+"file1.txt", []byte("foo"), 0600),
+		ioutil.WriteFile(tmpdir+"/"+"file2.txt", []byte("bar"), 0600),
+		os.Symlink("./file2.txt", tmpdir+"/file3.txt"),
+		syscall.Mkfifo(tmpdir+"/ignore.fifo", 0600),
+	} {
+		c.Assert(err, IsNil)
+	}
 
 	str, err := WriteTree(KeepTestClient{}, tmpdir)
 	c.Check(err, IsNil)
-	c.Check(str, Equals, ". 3858f62230ac3c915f300c664312c63f+6 0:3:file1.txt 3:3:file2.txt\n")
+	c.Check(str, Equals, ". aa65a413921163458c52fea478d5d3ee+9 0:3:file1.txt 3:3:file2.txt 6:3:file3.txt\n")
 }
 
 func (s *TestSuite) TestSimpleUploadSubdir(c *C) {
diff --git a/services/crunch-run/upload.go b/services/crunch-run/upload.go
index fa74eb0..bb2776a 100644
--- a/services/crunch-run/upload.go
+++ b/services/crunch-run/upload.go
@@ -18,14 +18,15 @@ import (
 	"crypto/md5"
 	"errors"
 	"fmt"
-	"git.curoverse.com/arvados.git/sdk/go/keepclient"
-	"git.curoverse.com/arvados.git/sdk/go/manifest"
 	"io"
 	"log"
 	"os"
 	"path/filepath"
 	"strings"
 	"sync"
+
+	"git.curoverse.com/arvados.git/sdk/go/keepclient"
+	"git.curoverse.com/arvados.git/sdk/go/manifest"
 )
 
 // Block is a data block in a manifest stream
@@ -265,8 +266,26 @@ type WalkUpload struct {
 // WalkFunc walks a directory tree, uploads each file found and adds it to the
 // CollectionWriter.
 func (m *WalkUpload) WalkFunc(path string, info os.FileInfo, err error) error {
+	if err != nil {
+		return err
+	}
+
+	targetPath, targetInfo := path, info
+	if info.Mode()&os.ModeSymlink != 0 {
+		// Update targetpath/info to reflect the symlink
+		// target, not the symlink itself
+		targetPath, err = filepath.EvalSymlinks(path)
+		if err != nil {
+			return err
+		}
+		targetInfo, err = os.Stat(targetPath)
+		if err != nil {
+			return fmt.Errorf("stat symlink %q target %q: %s", path, targetPath, err)
+		}
+	}
 
-	if info.IsDir() {
+	if targetInfo.Mode()&os.ModeType != 0 {
+		// Skip directories, pipes, other non-regular files
 		return nil
 	}
 
diff --git a/services/crunch-run/upload_test.go b/services/crunch-run/upload_test.go
index 86ad1b3..96ea2b1 100644
--- a/services/crunch-run/upload_test.go
+++ b/services/crunch-run/upload_test.go
@@ -5,11 +5,13 @@
 package main
 
 import (
-	. "gopkg.in/check.v1"
 	"io/ioutil"
 	"log"
 	"os"
 	"sync"
+	"syscall"
+
+	. "gopkg.in/check.v1"
 )
 
 type UploadTestSuite struct{}
@@ -31,20 +33,26 @@ func (s *TestSuite) TestSimpleUpload(c *C) {
 	c.Check(str, Equals, ". acbd18db4cc2f85cedef654fccc4a4d8+3 0:3:file1.txt\n")
 }
 
-func (s *TestSuite) TestSimpleUploadTwofiles(c *C) {
+func (s *TestSuite) TestSimpleUploadThreefiles(c *C) {
 	tmpdir, _ := ioutil.TempDir("", "")
 	defer func() {
 		os.RemoveAll(tmpdir)
 	}()
 
-	ioutil.WriteFile(tmpdir+"/"+"file1.txt", []byte("foo"), 0600)
-	ioutil.WriteFile(tmpdir+"/"+"file2.txt", []byte("bar"), 0600)
+	for _, err := range []error{
+		ioutil.WriteFile(tmpdir+"/"+"file1.txt", []byte("foo"), 0600),
+		ioutil.WriteFile(tmpdir+"/"+"file2.txt", []byte("bar"), 0600),
+		os.Symlink("./file2.txt", tmpdir+"/file3.txt"),
+		syscall.Mkfifo(tmpdir+"/ignore.fifo", 0600),
+	} {
+		c.Assert(err, IsNil)
+	}
 
 	cw := CollectionWriter{0, &KeepTestClient{}, nil, nil, sync.Mutex{}}
 	str, err := cw.WriteTree(tmpdir, log.New(os.Stdout, "", 0))
 
 	c.Check(err, IsNil)
-	c.Check(str, Equals, ". 3858f62230ac3c915f300c664312c63f+6 0:3:file1.txt 3:3:file2.txt\n")
+	c.Check(str, Equals, ". aa65a413921163458c52fea478d5d3ee+9 0:3:file1.txt 3:3:file2.txt 6:3:file3.txt\n")
 }
 
 func (s *TestSuite) TestSimpleUploadSubdir(c *C) {

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list