diff options
author | pg9182 <96569817+pg9182@users.noreply.github.com> | 2022-10-13 01:32:20 -0400 |
---|---|---|
committer | pg9182 <96569817+pg9182@users.noreply.github.com> | 2022-10-13 01:32:20 -0400 |
commit | f9612dfa1e203550a097f40bb738ddc8a74cc239 (patch) | |
tree | d0e09dabf2a5b1a6a2d1ab2759c6af781a1f86e7 /pkg/api/api0 | |
parent | 79375cc9de2a848b8f594de890f3bef806d154bf (diff) | |
download | Atlas-f9612dfa1e203550a097f40bb738ddc8a74cc239.tar.gz Atlas-f9612dfa1e203550a097f40bb738ddc8a74cc239.zip |
pkg/{api/api0/*,storage/*}: Add GetPdataHash method for pdata storage
Diffstat (limited to 'pkg/api/api0')
-rw-r--r-- | pkg/api/api0/api0testutil/storage.go | 58 | ||||
-rw-r--r-- | pkg/api/api0/storage.go | 11 |
2 files changed, 60 insertions, 9 deletions
diff --git a/pkg/api/api0/api0testutil/storage.go b/pkg/api/api0/api0testutil/storage.go index f88c27c..be3bd4a 100644 --- a/pkg/api/api0/api0testutil/storage.go +++ b/pkg/api/api0/api0testutil/storage.go @@ -25,6 +25,18 @@ func TestPdataStorage(t *testing.T, s api0.PdataStorage) { pdata1SHA := sha256.Sum256(pdata1) pdata2SHA := sha256.Sum256(pdata2) + t.Run("HashForNonexistentUser1", func(t *testing.T) { + hash, exists, err := s.GetPdataHash(user1) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if exists { + t.Fatalf("exists should be false") + } + if hash != zeroSHA { + t.Fatalf("should not return hash") + } + }) t.Run("GetForNonexistentUser1", func(t *testing.T) { for _, tc := range []struct { Name string @@ -52,6 +64,18 @@ func TestPdataStorage(t *testing.T, s api0.PdataStorage) { t.Fatalf("unexpected error: %v", err) } }) + t.Run("HashForExistingUser1Pdata1", func(t *testing.T) { + hash, exists, err := s.GetPdataHash(user1) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !exists { + t.Fatalf("exists should be true") + } + if hash != pdata1SHA { + t.Fatalf("should return correct hash") + } + }) t.Run("GetForExistingUser1", func(t *testing.T) { for _, tc := range []struct { Name string @@ -92,6 +116,18 @@ func TestPdataStorage(t *testing.T, s api0.PdataStorage) { t.Fatalf("unexpected error: %v", err) } }) + t.Run("HashForExistingUser1Pdata2", func(t *testing.T) { + hash, exists, err := s.GetPdataHash(user1) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !exists { + t.Fatalf("exists should be true") + } + if hash != pdata2SHA { + t.Fatalf("should return correct hash") + } + }) t.Run("GetForExistingUser2", func(t *testing.T) { for _, tc := range []struct { Name string @@ -170,36 +206,48 @@ func TestPdataStorage(t *testing.T, s api0.PdataStorage) { } randSched() - if buf, exists, err := s.GetPdataCached(uid, data1sha); err != nil || !exists || buf != nil { + if hash, exists, err := s.GetPdataHash(uid); err != nil || !exists || hash != data1sha { fail.Store(4) return } randSched() - if buf, exists, err := s.GetPdataCached(uid, data2sha); err != nil || !exists || !bytes.Equal(buf, data1) { + if buf, exists, err := s.GetPdataCached(uid, data1sha); err != nil || !exists || buf != nil { fail.Store(5) return } randSched() - if err := s.SetPdata(uid, data2); err != nil { + if buf, exists, err := s.GetPdataCached(uid, data2sha); err != nil || !exists || !bytes.Equal(buf, data1) { fail.Store(6) return } randSched() - if buf, exists, err := s.GetPdataCached(uid, data2sha); err != nil || !exists || buf != nil { + if err := s.SetPdata(uid, data2); err != nil { fail.Store(7) return } randSched() - if buf, exists, err := s.GetPdataCached(uid, data1sha); err != nil || !exists || !bytes.Equal(buf, data2) { + if hash, exists, err := s.GetPdataHash(uid); err != nil || !exists || hash != data2sha { fail.Store(8) return } randSched() + if buf, exists, err := s.GetPdataCached(uid, data2sha); err != nil || !exists || buf != nil { + fail.Store(9) + return + } + randSched() + + if buf, exists, err := s.GetPdataCached(uid, data1sha); err != nil || !exists || !bytes.Equal(buf, data2) { + fail.Store(10) + return + } + randSched() + }(uid) } if wg.Wait(); fail.Load() != 0 { diff --git a/pkg/api/api0/storage.go b/pkg/api/api0/storage.go index cf7b078..a17e8da 100644 --- a/pkg/api/api0/storage.go +++ b/pkg/api/api0/storage.go @@ -6,11 +6,14 @@ import "crypto/sha256" // on the contents of the stored blobs (including validity). It may compress the // stored data. It must be safe for concurrent use. type PdataStorage interface { + // GetPdataHash gets the current pdata hash for uid. If there is not any + // pdata for uid, exists is false. If another error occurs, err is non-nil. + GetPdataHash(uid uint64) (hash [sha256.Size]byte, exists bool, err error) + // GetPdataCached gets the pdata for uid. If there is not any pdata for uid, - // ok is false. If the provided hash is nonzero and the current pdata - // matches, buf is nil. If another error occurs, buf is nil, ok is false, - // and err is non-nil. - GetPdataCached(uid uint64, sha256 [sha256.Size]byte) (buf []byte, exists bool, err error) + // exists is false. If the provided hash is nonzero and the current pdata + // matches, buf is nil. If another error occurs, err is non-nil. + GetPdataCached(uid uint64, sha [sha256.Size]byte) (buf []byte, exists bool, err error) // SetPdata sets the raw pdata for uid. SetPdata(uid uint64, buf []byte) (err error) |