X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/9cb175a358a7ac410901827d5f7de6a5aabe52bf..fb9e39f948b75cbae8de76359f589a9f33ebd1ac:/tools/keep-rsync/keep-rsync_test.go diff --git a/tools/keep-rsync/keep-rsync_test.go b/tools/keep-rsync/keep-rsync_test.go index c2a8112dc5..5cfd30a032 100644 --- a/tools/keep-rsync/keep-rsync_test.go +++ b/tools/keep-rsync/keep-rsync_test.go @@ -226,3 +226,86 @@ func (s *ServerRequiredSuite) TestRsyncWithBlobSigning_PutInOne_GetFromOtherShou _, _, _, err = kcSrc.Get(locatorInDst) c.Assert(err.Error(), Equals, "Block not found") } + +// Put 5 blocks in src. Put 2 of those blocks in dst +// Hence there are 3 additional blocks in src +// Also, put 2 extra blocks in dts; they are hence only in dst +// Run rsync and verify that those 7 blocks are now available in dst +func (s *ServerRequiredSuite) TestKeepRsync(c *C) { + setupRsync(c, false) + + // Put a few blocks in src using kcSrc + var srcLocators []string + for i := 0; i < 5; i++ { + data := []byte(fmt.Sprintf("test-data-%d", i)) + hash := fmt.Sprintf("%x", md5.Sum(data)) + + hash2, rep, err := kcSrc.PutB(data) + c.Check(hash2, Matches, fmt.Sprintf(`^%s\+11(\+.+)?$`, hash)) + c.Check(rep, Equals, 2) + c.Check(err, Equals, nil) + + reader, blocklen, _, err := kcSrc.Get(hash) + c.Assert(err, Equals, nil) + c.Check(blocklen, Equals, int64(11)) + all, err := ioutil.ReadAll(reader) + c.Check(all, DeepEquals, data) + + srcLocators = append(srcLocators, fmt.Sprintf("%s+%d", hash, blocklen)) + } + + // Put just two of those blocks in dst using kcDst + var dstLocators []string + for i := 0; i < 2; i++ { + data := []byte(fmt.Sprintf("test-data-%d", i)) + hash := fmt.Sprintf("%x", md5.Sum(data)) + + hash2, rep, err := kcDst.PutB(data) + c.Check(hash2, Matches, fmt.Sprintf(`^%s\+11(\+.+)?$`, hash)) + c.Check(rep, Equals, 1) + c.Check(err, Equals, nil) + + reader, blocklen, _, err := kcDst.Get(hash) + c.Assert(err, Equals, nil) + c.Check(blocklen, Equals, int64(11)) + all, err := ioutil.ReadAll(reader) + c.Check(all, DeepEquals, data) + + dstLocators = append(dstLocators, fmt.Sprintf("%s+%d", hash, blocklen)) + } + + // Put two more blocks in dst; they are not in src at all + var extraDstLocators []string + for i := 0; i < 2; i++ { + data := []byte(fmt.Sprintf("other-data-%d", i)) + hash := fmt.Sprintf("%x", md5.Sum(data)) + + hash2, rep, err := kcDst.PutB(data) + c.Check(hash2, Matches, fmt.Sprintf(`^%s\+12(\+.+)?$`, hash)) + c.Check(rep, Equals, 1) + c.Check(err, Equals, nil) + + reader, blocklen, _, err := kcDst.Get(hash) + c.Assert(err, Equals, nil) + c.Check(blocklen, Equals, int64(12)) + all, err := ioutil.ReadAll(reader) + c.Check(all, DeepEquals, data) + + extraDstLocators = append(extraDstLocators, fmt.Sprintf("%s+%d", hash, blocklen)) + } + + err := performKeepRsync() + c.Check(err, Equals, nil) + + // Now GetIndex from dst and verify that all 5 from src and the 2 extra blocks are found + dstIndex, err := getUniqueLocators(kcDst, "") + c.Check(err, Equals, nil) + for _, locator := range srcLocators { + _, ok := dstIndex[locator] + c.Assert(ok, Equals, true) + } + for _, locator := range extraDstLocators { + _, ok := dstIndex[locator] + c.Assert(ok, Equals, true) + } +}