9998: Handle timestamp collisions in collection index.
[arvados.git] / services / keep-balance / balance_run_test.go
index a138d911a3352a6edf261c6295110d1091b3d98a..02080329ec2baf1d9dd17feac8c6dd9719bff110 100644 (file)
@@ -138,7 +138,9 @@ func (s *stubServer) serveCollectionsButSkipOne() *reqTracker {
                rt.Add(r)
                if strings.Contains(r.Form.Get("filters"), `"modified_at","\u003c="`) {
                        io.WriteString(w, `{"items_available":3,"items":[]}`)
-               } else if strings.Contains(r.Form.Get("filters"), `"modified_at","\u003e="`) {
+               } else if strings.Contains(r.Form.Get("filters"), `"modified_at","\u003e`) {
+                       io.WriteString(w, `{"items_available":0,"items":[]}`)
+               } else if strings.Contains(r.Form.Get("filters"), `"modified_at","="`) && strings.Contains(r.Form.Get("filters"), `"uuid","\u003e"`) {
                        io.WriteString(w, `{"items_available":0,"items":[]}`)
                } else {
                        io.WriteString(w, `{"items_available":2,"items":[
@@ -236,7 +238,7 @@ func (s *runSuite) TestRefuseZeroCollections(c *check.C) {
        s.stub.serveKeepstoreIndexFoo4Bar1()
        trashReqs := s.stub.serveKeepstoreTrash()
        pullReqs := s.stub.serveKeepstorePull()
-       err := (&Balancer{}).Run(s.config, opts)
+       _, err := (&Balancer{}).Run(s.config, opts)
        c.Check(err, check.ErrorMatches, "received zero collections")
        c.Check(trashReqs.Count(), check.Equals, 4)
        c.Check(pullReqs.Count(), check.Equals, 0)
@@ -254,7 +256,7 @@ func (s *runSuite) TestServiceTypes(c *check.C) {
        s.stub.serveFourDiskKeepServices()
        indexReqs := s.stub.serveKeepstoreIndexFoo4Bar1()
        trashReqs := s.stub.serveKeepstoreTrash()
-       err := (&Balancer{}).Run(s.config, opts)
+       _, err := (&Balancer{}).Run(s.config, opts)
        c.Check(err, check.IsNil)
        c.Check(indexReqs.Count(), check.Equals, 0)
        c.Check(trashReqs.Count(), check.Equals, 0)
@@ -271,7 +273,7 @@ func (s *runSuite) TestRefuseNonAdmin(c *check.C) {
        s.stub.serveFourDiskKeepServices()
        trashReqs := s.stub.serveKeepstoreTrash()
        pullReqs := s.stub.serveKeepstorePull()
-       err := (&Balancer{}).Run(s.config, opts)
+       _, err := (&Balancer{}).Run(s.config, opts)
        c.Check(err, check.ErrorMatches, "current user .* is not .* admin user")
        c.Check(trashReqs.Count(), check.Equals, 0)
        c.Check(pullReqs.Count(), check.Equals, 0)
@@ -289,7 +291,7 @@ func (s *runSuite) TestDetectSkippedCollections(c *check.C) {
        s.stub.serveKeepstoreIndexFoo4Bar1()
        trashReqs := s.stub.serveKeepstoreTrash()
        pullReqs := s.stub.serveKeepstorePull()
-       err := (&Balancer{}).Run(s.config, opts)
+       _, err := (&Balancer{}).Run(s.config, opts)
        c.Check(err, check.ErrorMatches, `Retrieved 2 collections with modtime <= .* but server now reports there are 3 collections.*`)
        c.Check(trashReqs.Count(), check.Equals, 4)
        c.Check(pullReqs.Count(), check.Equals, 0)
@@ -302,14 +304,17 @@ func (s *runSuite) TestDryRun(c *check.C) {
                Logger:      s.logger(c),
        }
        s.stub.serveCurrentUserAdmin()
-       s.stub.serveFooBarFileCollections()
+       collReqs := s.stub.serveFooBarFileCollections()
        s.stub.serveFourDiskKeepServices()
        s.stub.serveKeepstoreIndexFoo4Bar1()
        trashReqs := s.stub.serveKeepstoreTrash()
        pullReqs := s.stub.serveKeepstorePull()
        var bal Balancer
-       err := bal.Run(s.config, opts)
+       _, err := bal.Run(s.config, opts)
        c.Check(err, check.IsNil)
+       for _, req := range collReqs.reqs {
+               c.Check(req.Form.Get("include_trash"), check.Equals, "true")
+       }
        c.Check(trashReqs.Count(), check.Equals, 0)
        c.Check(pullReqs.Count(), check.Equals, 0)
        stats := bal.getStatistics()
@@ -332,7 +337,7 @@ func (s *runSuite) TestCommit(c *check.C) {
        trashReqs := s.stub.serveKeepstoreTrash()
        pullReqs := s.stub.serveKeepstorePull()
        var bal Balancer
-       err := bal.Run(s.config, opts)
+       _, err := bal.Run(s.config, opts)
        c.Check(err, check.IsNil)
        c.Check(trashReqs.Count(), check.Equals, 8)
        c.Check(pullReqs.Count(), check.Equals, 4)
@@ -362,13 +367,14 @@ func (s *runSuite) TestRunForever(c *check.C) {
        s.config.RunPeriod = arvados.Duration(time.Millisecond)
        go RunForever(s.config, opts, stop)
 
-       // Each run should send 4 clear trash lists + 4 pull lists + 4
-       // trash lists. We should complete four runs in much less than
+       // Each run should send 4 pull lists + 4 trash lists. The
+       // first run should also send 4 empty trash lists at
+       // startup. We should complete all four runs in much less than
        // a second.
        for t0 := time.Now(); pullReqs.Count() < 16 && time.Since(t0) < 10*time.Second; {
                time.Sleep(time.Millisecond)
        }
        stop <- true
        c.Check(pullReqs.Count() >= 16, check.Equals, true)
-       c.Check(trashReqs.Count(), check.Equals, 2*pullReqs.Count())
+       c.Check(trashReqs.Count(), check.Equals, pullReqs.Count()+4)
 }