aboutsummaryrefslogtreecommitdiff
path: root/weed/wdclient/vid_map_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/wdclient/vid_map_test.go')
-rw-r--r--weed/wdclient/vid_map_test.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/weed/wdclient/vid_map_test.go b/weed/wdclient/vid_map_test.go
index 0cea698ac..b1cd24490 100644
--- a/weed/wdclient/vid_map_test.go
+++ b/weed/wdclient/vid_map_test.go
@@ -2,6 +2,9 @@ package wdclient
import (
"fmt"
+ "google.golang.org/grpc"
+ "strconv"
+ "sync"
"testing"
)
@@ -59,6 +62,76 @@ func TestLocationIndex(t *testing.T) {
}
}
+func TestLookupFileId(t *testing.T) {
+ mc := NewMasterClient(grpc.EmptyDialOption{}, "", "", "", "", nil)
+ length := 5
+
+ //Construct a cache linked list of length 5
+ for i := 0; i < length; i++ {
+ mc.addLocation(uint32(i), Location{Url: strconv.FormatInt(int64(i), 10)})
+ mc.resetVidMap()
+ }
+ for i := 0; i < length; i++ {
+ locations, found := mc.GetLocations(uint32(i))
+ if !found || len(locations) != 1 || locations[0].Url != strconv.FormatInt(int64(i), 10) {
+ t.Fatalf("urls of vid=%d is not valid.", i)
+ }
+ }
+
+ //When continue to add nodes to the linked list, the previous node will be deleted, and the cache of the response will be gone.
+ for i := length; i < length+5; i++ {
+ mc.addLocation(uint32(i), Location{Url: strconv.FormatInt(int64(i), 10)})
+ mc.resetVidMap()
+ }
+ for i := 0; i < length; i++ {
+ locations, found := mc.GetLocations(uint32(i))
+ if found {
+ t.Fatalf("urls of vid[%d] should not exists, but found: %v", i, locations)
+ }
+ }
+
+ //The delete operation will be applied to all cache nodes
+ _, found := mc.GetLocations(uint32(length))
+ if !found {
+ t.Fatalf("urls of vid[%d] not found", length)
+ }
+
+ //If the locations of the current node exist, return directly
+ newUrl := "abc"
+ mc.addLocation(uint32(length), Location{Url: newUrl})
+ locations, found := mc.GetLocations(uint32(length))
+ if !found || locations[0].Url != newUrl {
+ t.Fatalf("urls of vid[%d] not found", length)
+ }
+
+ //After delete `abc`, cache nodes are searched
+ deleteLoc := Location{Url: newUrl}
+ mc.deleteLocation(uint32(length), deleteLoc)
+ locations, found = mc.GetLocations(uint32(length))
+ if found && locations[0].Url != strconv.FormatInt(int64(length), 10) {
+ t.Fatalf("urls of vid[%d] not expected", length)
+ }
+
+ //lock: concurrent test
+ var wg sync.WaitGroup
+ for i := 0; i < 20; i++ {
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ for i := 0; i < 100; i++ {
+ for i := 0; i < 20; i++ {
+ _, _ = mc.GetLocations(uint32(i))
+ }
+ }
+ }()
+ }
+
+ for i := 0; i < 100; i++ {
+ mc.addLocation(uint32(i), Location{})
+ }
+ wg.Wait()
+}
+
func BenchmarkLocationIndex(b *testing.B) {
b.SetParallelism(8)
vm := vidMap{