Chris Lu
4 years ago
3 changed files with 207 additions and 24 deletions
-
63weed/shell/command_volume_balance.go
-
139weed/shell/command_volume_balance_test.go
-
29weed/shell/command_volume_fix_replication.go
@ -0,0 +1,139 @@ |
|||||
|
package shell |
||||
|
|
||||
|
import ( |
||||
|
"testing" |
||||
|
|
||||
|
"github.com/chrislusf/seaweedfs/weed/pb/master_pb" |
||||
|
"github.com/chrislusf/seaweedfs/weed/storage/super_block" |
||||
|
) |
||||
|
|
||||
|
type testMoveCase struct { |
||||
|
name string |
||||
|
replication string |
||||
|
replicas []*VolumeReplica |
||||
|
sourceLocation location |
||||
|
targetLocation location |
||||
|
expected bool |
||||
|
} |
||||
|
|
||||
|
func TestIsGoodMove(t *testing.T) { |
||||
|
|
||||
|
var tests = []testMoveCase{ |
||||
|
{ |
||||
|
name: "test move to the same node", |
||||
|
replication: "001", |
||||
|
replicas: []*VolumeReplica{ |
||||
|
{ |
||||
|
location: &location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn1"}}, |
||||
|
}, |
||||
|
{ |
||||
|
location: &location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
}, |
||||
|
}, |
||||
|
sourceLocation: location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
targetLocation: location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
expected: false, |
||||
|
}, |
||||
|
|
||||
|
{ |
||||
|
name: "test move to the same rack, but existing node", |
||||
|
replication: "001", |
||||
|
replicas: []*VolumeReplica{ |
||||
|
{ |
||||
|
location: &location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn1"}}, |
||||
|
}, |
||||
|
{ |
||||
|
location: &location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
}, |
||||
|
}, |
||||
|
sourceLocation: location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
targetLocation: location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn1"}}, |
||||
|
expected: false, |
||||
|
}, |
||||
|
|
||||
|
{ |
||||
|
name: "test move to the same rack, a new node", |
||||
|
replication: "001", |
||||
|
replicas: []*VolumeReplica{ |
||||
|
{ |
||||
|
location: &location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn1"}}, |
||||
|
}, |
||||
|
{ |
||||
|
location: &location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
}, |
||||
|
}, |
||||
|
sourceLocation: location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
targetLocation: location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn3"}}, |
||||
|
expected: true, |
||||
|
}, |
||||
|
|
||||
|
{ |
||||
|
name: "test 010 move all to the same rack", |
||||
|
replication: "010", |
||||
|
replicas: []*VolumeReplica{ |
||||
|
{ |
||||
|
location: &location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn1"}}, |
||||
|
}, |
||||
|
{ |
||||
|
location: &location{"dc1", "r2", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
}, |
||||
|
}, |
||||
|
sourceLocation: location{"dc1", "r2", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
targetLocation: location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn3"}}, |
||||
|
expected: false, |
||||
|
}, |
||||
|
|
||||
|
{ |
||||
|
name: "test 010 move to spread racks", |
||||
|
replication: "010", |
||||
|
replicas: []*VolumeReplica{ |
||||
|
{ |
||||
|
location: &location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn1"}}, |
||||
|
}, |
||||
|
{ |
||||
|
location: &location{"dc1", "r2", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
}, |
||||
|
}, |
||||
|
sourceLocation: location{"dc1", "r2", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
targetLocation: location{"dc1", "r3", &master_pb.DataNodeInfo{Id: "dn3"}}, |
||||
|
expected: true, |
||||
|
}, |
||||
|
|
||||
|
{ |
||||
|
name: "test 010 move to spread racks", |
||||
|
replication: "010", |
||||
|
replicas: []*VolumeReplica{ |
||||
|
{ |
||||
|
location: &location{"dc1", "r1", &master_pb.DataNodeInfo{Id: "dn1"}}, |
||||
|
}, |
||||
|
{ |
||||
|
location: &location{"dc1", "r2", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
}, |
||||
|
}, |
||||
|
sourceLocation: location{"dc1", "r2", &master_pb.DataNodeInfo{Id: "dn2"}}, |
||||
|
targetLocation: location{"dc1", "r2", &master_pb.DataNodeInfo{Id: "dn3"}}, |
||||
|
expected: true, |
||||
|
}, |
||||
|
|
||||
|
} |
||||
|
|
||||
|
for _, tt := range tests { |
||||
|
replicaPlacement, _ := super_block.NewReplicaPlacementFromString(tt.replication) |
||||
|
println("replication:", tt.replication, "expected", tt.expected, "name:", tt.name) |
||||
|
sourceNode := &Node{ |
||||
|
info: tt.sourceLocation.dataNode, |
||||
|
dc: tt.sourceLocation.dc, |
||||
|
rack: tt.sourceLocation.rack, |
||||
|
} |
||||
|
targetNode := &Node{ |
||||
|
info: tt.targetLocation.dataNode, |
||||
|
dc: tt.targetLocation.dc, |
||||
|
rack: tt.targetLocation.rack, |
||||
|
} |
||||
|
if isGoodMove(replicaPlacement, tt.replicas, sourceNode, targetNode) != tt.expected { |
||||
|
t.Errorf("%s: expect %v move from %v to %s, replication:%v", |
||||
|
tt.name, tt.expected, tt.sourceLocation, tt.targetLocation, tt.replication) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue