aboutsummaryrefslogtreecommitdiff
path: root/weed/storage/volume_read_test.go
diff options
context:
space:
mode:
authorEric Yang <lanqingy@usc.edu>2022-09-06 23:51:27 -0700
committerGitHub <noreply@github.com>2022-09-06 23:51:27 -0700
commitb324a6536c07ff57340ff62b5d5318d05ff5666c (patch)
tree076b2eeabdcd1c677b623327dc8791460abe215a /weed/storage/volume_read_test.go
parentc07ab9c060eafe26cc0b4246d507d5b33f32f317 (diff)
downloadseaweedfs-b324a6536c07ff57340ff62b5d5318d05ff5666c.tar.xz
seaweedfs-b324a6536c07ff57340ff62b5d5318d05ff5666c.zip
ADHOC: add read needle meta grpc (#3581)
* ADHOC: add read needle meta grpc * add test * nit Co-authored-by: root <root@HQ-10MSTD3EY.roblox.local>
Diffstat (limited to 'weed/storage/volume_read_test.go')
-rw-r--r--weed/storage/volume_read_test.go91
1 files changed, 91 insertions, 0 deletions
diff --git a/weed/storage/volume_read_test.go b/weed/storage/volume_read_test.go
new file mode 100644
index 000000000..f1d0aa2fc
--- /dev/null
+++ b/weed/storage/volume_read_test.go
@@ -0,0 +1,91 @@
+package storage
+
+import (
+ "github.com/seaweedfs/seaweedfs/weed/storage/needle"
+ "github.com/seaweedfs/seaweedfs/weed/storage/super_block"
+ "github.com/seaweedfs/seaweedfs/weed/storage/types"
+ "github.com/stretchr/testify/assert"
+ "testing"
+)
+
+func TestReadNeedMetaWithWritesAndUpdates(t *testing.T) {
+ dir := t.TempDir()
+
+ v, err := NewVolume(dir, dir, "", 1, NeedleMapInMemory, &super_block.ReplicaPlacement{}, &needle.TTL{}, 0, 0)
+ if err != nil {
+ t.Fatalf("volume creation: %v", err)
+ }
+ type WriteInfo struct {
+ offset int64
+ size int32
+ }
+ writeInfos := make([]WriteInfo, 30)
+ mockLastUpdateTime := uint64(1000000000000)
+ // initialize 20 needles then update first 10 needles
+ for i := 1; i <= 30; i++ {
+ n := newRandomNeedle(uint64(i % 20))
+ n.Flags = 0x08
+ n.LastModified = mockLastUpdateTime
+ mockLastUpdateTime += 2000
+ offset, _, _, err := v.writeNeedle2(n, true, false)
+ if err != nil {
+ t.Fatalf("write needle %d: %v", i, err)
+ }
+ writeInfos[i-1] = WriteInfo{offset: int64(offset), size: int32(n.Size)}
+ }
+ expectedLastUpdateTime := uint64(1000000000000)
+ for i := 0; i < 30; i++ {
+ testNeedle := new(needle.Needle)
+ testNeedle.Id = types.Uint64ToNeedleId(uint64(i + 1%20))
+ testNeedle.Flags = 0x08
+ v.readNeedleMetaAt(testNeedle, writeInfos[i].offset, writeInfos[i].size)
+ actualLastModifiedTime := testNeedle.LastModified
+ assert.Equal(t, expectedLastUpdateTime, actualLastModifiedTime, "The two words should be the same.")
+ expectedLastUpdateTime += 2000
+ }
+}
+
+func TestReadNeedMetaWithDeletesThenWrites(t *testing.T) {
+ dir := t.TempDir()
+
+ v, err := NewVolume(dir, dir, "", 1, NeedleMapInMemory, &super_block.ReplicaPlacement{}, &needle.TTL{}, 0, 0)
+ if err != nil {
+ t.Fatalf("volume creation: %v", err)
+ }
+ type WriteInfo struct {
+ offset int64
+ size int32
+ }
+ writeInfos := make([]WriteInfo, 10)
+ mockLastUpdateTime := uint64(1000000000000)
+ for i := 1; i <= 10; i++ {
+ n := newRandomNeedle(uint64(i % 5))
+ n.Flags = 0x08
+ n.LastModified = mockLastUpdateTime
+ mockLastUpdateTime += 2000
+ offset, _, _, err := v.writeNeedle2(n, true, false)
+ if err != nil {
+ t.Fatalf("write needle %d: %v", i, err)
+ }
+ if i < 5 {
+ size, err := v.deleteNeedle2(n)
+ if err != nil {
+ t.Fatalf("delete needle %d: %v", i, err)
+ }
+ writeInfos[i-1] = WriteInfo{offset: int64(offset), size: int32(size)}
+ } else {
+ writeInfos[i-1] = WriteInfo{offset: int64(offset), size: int32(n.Size)}
+ }
+ }
+
+ expectedLastUpdateTime := uint64(1000000000000)
+ for i := 0; i < 10; i++ {
+ testNeedle := new(needle.Needle)
+ testNeedle.Id = types.Uint64ToNeedleId(uint64(i + 1%5))
+ testNeedle.Flags = 0x08
+ v.readNeedleMetaAt(testNeedle, writeInfos[i].offset, writeInfos[i].size)
+ actualLastModifiedTime := testNeedle.LastModified
+ assert.Equal(t, expectedLastUpdateTime, actualLastModifiedTime, "The two words should be the same.")
+ expectedLastUpdateTime += 2000
+ }
+}