X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/2b8f39b5067103d60f7bc43d26cb2f59126b2a42..442a871e7f3476938d0ebb3adbe3b9a7742f03ad:/services/keep-balance/balance_run_test.go diff --git a/services/keep-balance/balance_run_test.go b/services/keep-balance/balance_run_test.go index f7cb7f92bd..db530bc492 100644 --- a/services/keep-balance/balance_run_test.go +++ b/services/keep-balance/balance_run_test.go @@ -11,12 +11,13 @@ import ( "io/ioutil" "net/http" "net/http/httptest" + "os" "strings" "sync" "time" "git.curoverse.com/arvados.git/sdk/go/arvados" - "github.com/Sirupsen/logrus" + "github.com/sirupsen/logrus" check "gopkg.in/check.v1" ) @@ -203,6 +204,8 @@ func (s *stubServer) serveCollectionsButSkipOne() *reqTracker { 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 if strings.Contains(r.Form.Get("filters"), `"modified_at","=",null`) { + io.WriteString(w, `{"items_available":0,"items":[]}`) } else { io.WriteString(w, `{"items_available":2,"items":[ {"uuid":"zzzzz-4zz18-ehbhgtheo8909or","portable_data_hash":"fa7aeb5140e2848d39b416daeef4ffc5+45","manifest_text":". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n","modified_at":"2014-02-03T17:22:54Z"}, @@ -268,6 +271,28 @@ func (s *stubServer) serveKeepstoreIndexFoo4Bar1() *reqTracker { return rt } +func (s *stubServer) serveKeepstoreIndexFoo1() *reqTracker { + rt := &reqTracker{} + s.mux.HandleFunc("/index/", func(w http.ResponseWriter, r *http.Request) { + rt.Add(r) + io.WriteString(w, "acbd18db4cc2f85cedef654fccc4a4d8+3 12345678\n\n") + }) + for _, mounts := range stubMounts { + for i, mnt := range mounts { + i := i + s.mux.HandleFunc(fmt.Sprintf("/mounts/%s/blocks", mnt.UUID), func(w http.ResponseWriter, r *http.Request) { + rt.Add(r) + if i == 0 { + io.WriteString(w, "acbd18db4cc2f85cedef654fccc4a4d8+3 12345678\n\n") + } else { + io.WriteString(w, "\n") + } + }) + } + } + return rt +} + func (s *stubServer) serveKeepstoreTrash() *reqTracker { return s.serveStatic("/trash", `{}`) } @@ -404,6 +429,32 @@ func (s *runSuite) TestDetectSkippedCollections(c *check.C) { c.Check(pullReqs.Count(), check.Equals, 0) } +func (s *runSuite) TestWriteLostBlocks(c *check.C) { + lostf, err := ioutil.TempFile("", "keep-balance-lost-blocks-test-") + c.Assert(err, check.IsNil) + s.config.LostBlocksFile = lostf.Name() + defer os.Remove(lostf.Name()) + opts := RunOptions{ + CommitPulls: true, + CommitTrash: true, + Logger: s.logger(c), + } + s.stub.serveCurrentUserAdmin() + s.stub.serveFooBarFileCollections() + s.stub.serveKeepServices(stubServices) + s.stub.serveKeepstoreMounts() + s.stub.serveKeepstoreIndexFoo1() + s.stub.serveKeepstoreTrash() + s.stub.serveKeepstorePull() + srv, err := NewServer(s.config, opts) + c.Assert(err, check.IsNil) + _, err = srv.Run() + c.Check(err, check.IsNil) + lost, err := ioutil.ReadFile(lostf.Name()) + c.Assert(err, check.IsNil) + c.Check(string(lost), check.Equals, "37b51d194a7513e45b56f6524f2d51f2 fa7aeb5140e2848d39b416daeef4ffc5+45\n") +} + func (s *runSuite) TestDryRun(c *check.C) { opts := RunOptions{ CommitPulls: false, @@ -433,6 +484,11 @@ func (s *runSuite) TestDryRun(c *check.C) { } func (s *runSuite) TestCommit(c *check.C) { + lostf, err := ioutil.TempFile("", "keep-balance-lost-blocks-test-") + c.Assert(err, check.IsNil) + s.config.LostBlocksFile = lostf.Name() + defer os.Remove(lostf.Name()) + s.config.Listen = ":" s.config.ManagementToken = "xyzzy" opts := RunOptions{ @@ -460,6 +516,10 @@ func (s *runSuite) TestCommit(c *check.C) { // in a poor rendezvous position c.Check(bal.stats.pulls, check.Equals, 2) + lost, err := ioutil.ReadFile(lostf.Name()) + c.Assert(err, check.IsNil) + c.Check(string(lost), check.Equals, "") + metrics := s.getMetrics(c, srv) c.Check(metrics, check.Matches, `(?ms).*\narvados_keep_total_bytes 15\n.*`) c.Check(metrics, check.Matches, `(?ms).*\narvados_keepbalance_changeset_compute_seconds_sum [0-9\.]+\n.*`)