X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/400210f8c9d8b111a3efdaa76c8be579ea5666cb..8a27fe370239ecb8e50d53f46b45ed61203a35ca:/services/keepstore/unix_volume_test.go diff --git a/services/keepstore/unix_volume_test.go b/services/keepstore/unix_volume_test.go index 1ffc46513c..75d9b22de5 100644 --- a/services/keepstore/unix_volume_test.go +++ b/services/keepstore/unix_volume_test.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: AGPL-3.0 -package main +package keepstore import ( "bytes" @@ -13,12 +13,12 @@ import ( "io" "io/ioutil" "os" - "strings" "sync" "syscall" "time" - "git.curoverse.com/arvados.git/sdk/go/arvados" + "git.arvados.org/arvados.git/sdk/go/arvados" + "git.arvados.org/arvados.git/sdk/go/ctxlog" "github.com/prometheus/client_golang/prometheus" "github.com/sirupsen/logrus" check "gopkg.in/check.v1" @@ -90,6 +90,7 @@ func (s *UnixVolumeSuite) newTestableUnixVolume(c *check.C, cluster *arvados.Clu Root: d, locker: locker, cluster: cluster, + logger: ctxlog.TestLogger(c), volume: volume, metrics: metrics, }, @@ -166,11 +167,10 @@ func (s *UnixVolumeSuite) TestPutBadVolume(c *check.C) { v := s.newTestableUnixVolume(c, s.cluster, arvados.Volume{Replication: 1}, s.metrics, false) defer v.Teardown() - os.Chmod(v.Root, 000) - err := v.Put(context.Background(), TestHash, TestBlock) - if err == nil { - c.Error("Write should have failed") - } + err := os.RemoveAll(v.Root) + c.Assert(err, check.IsNil) + err = v.Put(context.Background(), TestHash, TestBlock) + c.Check(err, check.IsNil) } func (s *UnixVolumeSuite) TestUnixVolumeReadonly(c *check.C) { @@ -328,11 +328,14 @@ func (s *UnixVolumeSuite) TestUnixVolumeCompare(c *check.C) { c.Errorf("Got err %q, expected %q", err, DiskHashError) } - p := fmt.Sprintf("%s/%s/%s", v.Root, TestHash[:3], TestHash) - os.Chmod(p, 000) - err = v.Compare(context.Background(), TestHash, TestBlock) - if err == nil || strings.Index(err.Error(), "permission denied") < 0 { - c.Errorf("Got err %q, expected %q", err, "permission denied") + if os.Getuid() == 0 { + c.Log("skipping 'permission denied' check when running as root") + } else { + p := fmt.Sprintf("%s/%s/%s", v.Root, TestHash[:3], TestHash) + err = os.Chmod(p, 000) + c.Assert(err, check.IsNil) + err = v.Compare(context.Background(), TestHash, TestBlock) + c.Check(err, check.ErrorMatches, ".*permission denied.*") } } @@ -392,7 +395,7 @@ func (s *UnixVolumeSuite) TestStats(c *check.C) { c.Check(err, check.NotNil) c.Check(stats(), check.Matches, `.*"StatOps":[^0],.*`) c.Check(stats(), check.Matches, `.*"Errors":[^0],.*`) - c.Check(stats(), check.Matches, `.*"\*os\.PathError":[^0].*`) + c.Check(stats(), check.Matches, `.*"\*(fs|os)\.PathError":[^0].*`) // os.PathError changed to fs.PathError in Go 1.16 c.Check(stats(), check.Matches, `.*"InBytes":0,.*`) c.Check(stats(), check.Matches, `.*"OpenOps":0,.*`) c.Check(stats(), check.Matches, `.*"CreateOps":0,.*`) @@ -402,13 +405,13 @@ func (s *UnixVolumeSuite) TestStats(c *check.C) { c.Check(stats(), check.Matches, `.*"OutBytes":3,.*`) c.Check(stats(), check.Matches, `.*"CreateOps":1,.*`) c.Check(stats(), check.Matches, `.*"OpenOps":0,.*`) - c.Check(stats(), check.Matches, `.*"UtimesOps":0,.*`) + c.Check(stats(), check.Matches, `.*"UtimesOps":1,.*`) err = vol.Touch(loc) c.Check(err, check.IsNil) c.Check(stats(), check.Matches, `.*"FlockOps":1,.*`) c.Check(stats(), check.Matches, `.*"OpenOps":1,.*`) - c.Check(stats(), check.Matches, `.*"UtimesOps":1,.*`) + c.Check(stats(), check.Matches, `.*"UtimesOps":2,.*`) _, err = vol.Get(context.Background(), loc, make([]byte, 3)) c.Check(err, check.IsNil) @@ -421,3 +424,26 @@ func (s *UnixVolumeSuite) TestStats(c *check.C) { c.Check(err, check.IsNil) c.Check(stats(), check.Matches, `.*"FlockOps":2,.*`) } + +func (s *UnixVolumeSuite) TestSkipUnusedDirs(c *check.C) { + vol := s.newTestableUnixVolume(c, s.cluster, arvados.Volume{Replication: 1}, s.metrics, false) + + err := os.Mkdir(vol.UnixVolume.Root+"/aaa", 0777) + c.Assert(err, check.IsNil) + err = os.Mkdir(vol.UnixVolume.Root+"/.aaa", 0777) // EmptyTrash should not look here + c.Assert(err, check.IsNil) + deleteme := vol.UnixVolume.Root + "/aaa/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.trash.1" + err = ioutil.WriteFile(deleteme, []byte{1, 2, 3}, 0777) + c.Assert(err, check.IsNil) + skipme := vol.UnixVolume.Root + "/.aaa/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.trash.1" + err = ioutil.WriteFile(skipme, []byte{1, 2, 3}, 0777) + c.Assert(err, check.IsNil) + vol.EmptyTrash() + + _, err = os.Stat(skipme) + c.Check(err, check.IsNil) + + _, err = os.Stat(deleteme) + c.Check(err, check.NotNil) + c.Check(os.IsNotExist(err), check.Equals, true) +}