diff options
Diffstat (limited to 'weed/wdclient/vid_map_test.go')
| -rw-r--r-- | weed/wdclient/vid_map_test.go | 73 |
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{ |
