123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- package topology
- import (
- "testing"
- "github.com/seaweedfs/seaweedfs/weed/storage/needle"
- "github.com/seaweedfs/seaweedfs/weed/storage/super_block"
- )
- func TestVolumesBinaryState(t *testing.T) {
- vids := []needle.VolumeId{
- needle.VolumeId(1),
- needle.VolumeId(2),
- needle.VolumeId(3),
- needle.VolumeId(4),
- needle.VolumeId(5),
- }
- dns := []*DataNode{
- &DataNode{
- Ip: "127.0.0.1",
- Port: 8081,
- },
- &DataNode{
- Ip: "127.0.0.1",
- Port: 8082,
- },
- &DataNode{
- Ip: "127.0.0.1",
- Port: 8083,
- },
- }
- rp, _ := super_block.NewReplicaPlacementFromString("002")
- state_exist := NewVolumesBinaryState(readOnlyState, rp, ExistCopies())
- state_exist.Add(vids[0], dns[0])
- state_exist.Add(vids[0], dns[1])
- state_exist.Add(vids[1], dns[2])
- state_exist.Add(vids[2], dns[1])
- state_exist.Add(vids[4], dns[1])
- state_exist.Add(vids[4], dns[2])
- state_no := NewVolumesBinaryState(readOnlyState, rp, NoCopies())
- state_no.Add(vids[0], dns[0])
- state_no.Add(vids[0], dns[1])
- state_no.Add(vids[3], dns[1])
- tests := []struct {
- name string
- state *volumesBinaryState
- expectResult []bool
- update func()
- expectResultAfterUpdate []bool
- }{
- {
- name: "mark true when copies exist",
- state: state_exist,
- expectResult: []bool{true, true, true, false, true},
- update: func() {
- state_exist.Remove(vids[0], dns[2])
- state_exist.Remove(vids[1], dns[2])
- state_exist.Remove(vids[3], dns[2])
- state_exist.Remove(vids[4], dns[1])
- state_exist.Remove(vids[4], dns[2])
- },
- expectResultAfterUpdate: []bool{true, false, true, false, false},
- },
- {
- name: "mark true when no copies exist",
- state: state_no,
- expectResult: []bool{false, true, true, false, true},
- update: func() {
- state_no.Remove(vids[0], dns[2])
- state_no.Remove(vids[1], dns[2])
- state_no.Add(vids[2], dns[1])
- state_no.Remove(vids[3], dns[1])
- state_no.Remove(vids[4], dns[2])
- },
- expectResultAfterUpdate: []bool{false, true, false, true, true},
- },
- }
- for _, test := range tests {
- t.Run(test.name, func(t *testing.T) {
- var result []bool
- for index, _ := range vids {
- result = append(result, test.state.IsTrue(vids[index]))
- }
- if len(result) != len(test.expectResult) {
- t.Fatalf("len(result) != len(expectResult), got %d, expected %d\n",
- len(result), len(test.expectResult))
- }
- for index, val := range result {
- if val != test.expectResult[index] {
- t.Fatalf("result not matched, index %d, got %v, expected %v\n",
- index, val, test.expectResult[index])
- }
- }
- test.update()
- var updateResult []bool
- for index, _ := range vids {
- updateResult = append(updateResult, test.state.IsTrue(vids[index]))
- }
- if len(updateResult) != len(test.expectResultAfterUpdate) {
- t.Fatalf("len(updateResult) != len(expectResultAfterUpdate), got %d, expected %d\n",
- len(updateResult), len(test.expectResultAfterUpdate))
- }
- for index, val := range updateResult {
- if val != test.expectResultAfterUpdate[index] {
- t.Fatalf("update result not matched, index %d, got %v, expected %v\n",
- index, val, test.expectResultAfterUpdate[index])
- }
- }
- })
- }
- }
|