diff --git a/src/restic/testing.go b/src/restic/testing.go index 49a848965..719ff336d 100644 --- a/src/restic/testing.go +++ b/src/restic/testing.go @@ -23,16 +23,26 @@ type fakeFileSystem struct { repo Repository knownBlobs IDSet duplication float32 + buf []byte + chunker *chunker.Chunker } // saveFile reads from rd and saves the blobs in the repository. The list of // IDs is returned. -func (fs fakeFileSystem) saveFile(rd io.Reader) (blobs IDs) { - blobs = IDs{} - ch := chunker.New(rd, fs.repo.Config().ChunkerPolynomial) +func (fs *fakeFileSystem) saveFile(rd io.Reader) (blobs IDs) { + if fs.buf == nil { + fs.buf = make([]byte, chunker.MaxSize) + } + if fs.chunker == nil { + fs.chunker = chunker.New(rd, fs.repo.Config().ChunkerPolynomial) + } else { + fs.chunker.Reset(rd, fs.repo.Config().ChunkerPolynomial) + } + + blobs = IDs{} for { - chunk, err := ch.Next(getBuf()) + chunk, err := fs.chunker.Next(fs.buf) if errors.Cause(err) == io.EOF { break } @@ -50,7 +60,6 @@ func (fs fakeFileSystem) saveFile(rd io.Reader) (blobs IDs) { fs.knownBlobs.Insert(id) } - freeBuf(chunk.Data) blobs = append(blobs, id) } @@ -64,7 +73,7 @@ const ( maxNodes = 32 ) -func (fs fakeFileSystem) treeIsKnown(tree *Tree) (bool, []byte, ID) { +func (fs *fakeFileSystem) treeIsKnown(tree *Tree) (bool, []byte, ID) { data, err := json.Marshal(tree) if err != nil { fs.t.Fatalf("json.Marshal(tree) returned error: %v", err) @@ -76,7 +85,7 @@ func (fs fakeFileSystem) treeIsKnown(tree *Tree) (bool, []byte, ID) { return fs.blobIsKnown(id, TreeBlob), data, id } -func (fs fakeFileSystem) blobIsKnown(id ID, t BlobType) bool { +func (fs *fakeFileSystem) blobIsKnown(id ID, t BlobType) bool { if rand.Float32() < fs.duplication { return false } @@ -94,7 +103,7 @@ func (fs fakeFileSystem) blobIsKnown(id ID, t BlobType) bool { } // saveTree saves a tree of fake files in the repo and returns the ID. -func (fs fakeFileSystem) saveTree(seed int64, depth int) ID { +func (fs *fakeFileSystem) saveTree(seed int64, depth int) ID { rnd := rand.NewSource(seed) numNodes := int(rnd.Int63() % maxNodes) diff --git a/src/restic/testing_test.go b/src/restic/testing_test.go index 1258bf208..86b18a001 100644 --- a/src/restic/testing_test.go +++ b/src/restic/testing_test.go @@ -47,3 +47,14 @@ func TestCreateSnapshot(t *testing.T) { checker.TestCheckRepo(t, repo) } + +func BenchmarkTestCreateSnapshot(t *testing.B) { + repo, cleanup := repository.TestRepository(t) + defer cleanup() + + t.ResetTimer() + + for i := 0; i < t.N; i++ { + restic.TestCreateSnapshot(t, repo, testSnapshotTime.Add(time.Duration(i)*time.Second), testDepth, 0) + } +}