From 79757672ca64c2cce262ae72243f3bbd4538321f Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Sun, 7 Jun 2020 17:21:56 -0700 Subject: [PATCH] server: implemented 'flush' and 'refresh' API Added test that verifies that when client performs Flush (which happens at the end of each snapshot and when repository is closed), the server writes new blobs to the storage. Fixes #464 --- internal/server/server.go | 10 +++++-- repo/api_server_repository.go | 4 +-- .../api_server_repository_test.go | 28 ++++++++++++++++++- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/internal/server/server.go b/internal/server/server.go index 22ca2ee40..050632c04 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -135,12 +135,18 @@ func (s *Server) handleAPIPossiblyNotConnected(f func(ctx context.Context, r *ht } func (s *Server) handleRefresh(ctx context.Context, r *http.Request) (interface{}, *apiError) { - log(ctx).Infof("refreshing") + if err := s.rep.Refresh(ctx); err != nil { + return nil, internalServerError(err) + } + return &serverapi.Empty{}, nil } func (s *Server) handleFlush(ctx context.Context, r *http.Request) (interface{}, *apiError) { - log(ctx).Infof("flushing") + if err := s.rep.Flush(ctx); err != nil { + return nil, internalServerError(err) + } + return &serverapi.Empty{}, nil } diff --git a/repo/api_server_repository.go b/repo/api_server_repository.go index c017e2b46..1b6664b05 100644 --- a/repo/api_server_repository.go +++ b/repo/api_server_repository.go @@ -118,7 +118,7 @@ func (r *apiServerRepository) Refresh(ctx context.Context) error { } func (r *apiServerRepository) Flush(ctx context.Context) error { - return nil + return r.cli.Post(ctx, "flush", nil, nil) } func (r *apiServerRepository) Close(ctx context.Context) error { @@ -126,7 +126,7 @@ func (r *apiServerRepository) Close(ctx context.Context) error { return errors.Wrap(err, "error closing object manager") } - return nil + return r.Flush(ctx) } func (r *apiServerRepository) ContentInfo(ctx context.Context, contentID content.ID) (content.Info, error) { diff --git a/tests/end_to_end_test/api_server_repository_test.go b/tests/end_to_end_test/api_server_repository_test.go index f5b149d5d..afb2cb432 100644 --- a/tests/end_to_end_test/api_server_repository_test.go +++ b/tests/end_to_end_test/api_server_repository_test.go @@ -33,6 +33,9 @@ func TestAPIServerRepository(t *testing.T) { e1.RunAndExpectSuccess(t, "repo", "connect", "filesystem", "--path", e.RepoDir, "--override-username", "not-foo", "--override-hostname", "bar") e1.RunAndExpectSuccess(t, "snapshot", "create", sharedTestDataDir1) + originalPBlobCount := len(e1.RunAndExpectSuccess(t, "blob", "list", "--prefix=p")) + originalQBlobCount := len(e1.RunAndExpectSuccess(t, "blob", "list", "--prefix=q")) + htpasswordFile := filepath.Join(e.ConfigDir, "htpasswd.txt") ioutil.WriteFile(htpasswordFile, htpasswdFileContents, 0755) @@ -81,12 +84,35 @@ func TestAPIServerRepository(t *testing.T) { t.Errorf("invalid number of snapshots for foo@bar") } + // create very small directory + smallDataDir := filepath.Join(sharedTestDataDirBase, "dir-small") + + testenv.CreateDirectoryTree(smallDataDir, testenv.DirectoryTreeOptions{ + Depth: 1, + MaxSubdirsPerDirectory: 1, + MaxFilesPerDirectory: 1, + MaxFileSize: 100, + }, nil) + + // create snapshot of a very small directory using remote repository client + e2.RunAndExpectSuccess(t, "snapshot", "create", smallDataDir) + + // make sure snapshot created by the client resulted in blobs being created by the server + // as opposed to buffering it in memory + if got, want := len(e.RunAndExpectSuccess(t, "blob", "list", "--prefix=p")), originalPBlobCount; got <= want { + t.Errorf("unexpected number of P blobs on the server: %v, wanted > %v", got, want) + } + + if got, want := len(e.RunAndExpectSuccess(t, "blob", "list", "--prefix=q")), originalQBlobCount; got <= want { + t.Errorf("unexpected number of Q blobs on the server: %v, wanted > %v", got, want) + } + // create snapshot using remote repository client e2.RunAndExpectSuccess(t, "snapshot", "create", sharedTestDataDir2) // now should see two snapshots snapshots = e2.ListSnapshotsAndExpectSuccess(t) - if got, want := len(snapshots), 2; got != want { + if got, want := len(snapshots), 3; got != want { t.Errorf("invalid number of snapshots for foo@bar") } }