|
|
@ -114,21 +114,21 @@ func (vg *VolumeGrowth) findAndGrow(grpcDialOption grpc.DialOption, topo *Topolo |
|
|
|
func (vg *VolumeGrowth) findEmptySlotsForOneVolume(topo *Topology, option *VolumeGrowOption) (servers []*DataNode, err error) { |
|
|
|
//find main datacenter and other data centers
|
|
|
|
rp := option.ReplicaPlacement |
|
|
|
mainDataCenter, otherDataCenters, dc_err := topo.PickNodesByWeight(rp.DiffDataCenterCount+1, func(node Node) error { |
|
|
|
mainDataCenter, otherDataCenters, dc_err := topo.PickNodesByWeight(rp.DiffDataCenterCount+1, option, func(node Node) error { |
|
|
|
if option.DataCenter != "" && node.IsDataCenter() && node.Id() != NodeId(option.DataCenter) { |
|
|
|
return fmt.Errorf("Not matching preferred data center:%s", option.DataCenter) |
|
|
|
} |
|
|
|
if len(node.Children()) < rp.DiffRackCount+1 { |
|
|
|
return fmt.Errorf("Only has %d racks, not enough for %d.", len(node.Children()), rp.DiffRackCount+1) |
|
|
|
} |
|
|
|
if node.FreeSpace() < int64(rp.DiffRackCount+rp.SameRackCount+1) { |
|
|
|
return fmt.Errorf("Free:%d < Expected:%d", node.FreeSpace(), rp.DiffRackCount+rp.SameRackCount+1) |
|
|
|
if node.AvailableSpaceFor(option) < int64(rp.DiffRackCount+rp.SameRackCount+1) { |
|
|
|
return fmt.Errorf("Free:%d < Expected:%d", node.AvailableSpaceFor(option), rp.DiffRackCount+rp.SameRackCount+1) |
|
|
|
} |
|
|
|
possibleRacksCount := 0 |
|
|
|
for _, rack := range node.Children() { |
|
|
|
possibleDataNodesCount := 0 |
|
|
|
for _, n := range rack.Children() { |
|
|
|
if n.FreeSpace() >= 1 { |
|
|
|
if n.AvailableSpaceFor(option) >= 1 { |
|
|
|
possibleDataNodesCount++ |
|
|
|
} |
|
|
|
} |
|
|
@ -146,12 +146,12 @@ func (vg *VolumeGrowth) findEmptySlotsForOneVolume(topo *Topology, option *Volum |
|
|
|
} |
|
|
|
|
|
|
|
//find main rack and other racks
|
|
|
|
mainRack, otherRacks, rackErr := mainDataCenter.(*DataCenter).PickNodesByWeight(rp.DiffRackCount+1, func(node Node) error { |
|
|
|
mainRack, otherRacks, rackErr := mainDataCenter.(*DataCenter).PickNodesByWeight(rp.DiffRackCount+1, option, func(node Node) error { |
|
|
|
if option.Rack != "" && node.IsRack() && node.Id() != NodeId(option.Rack) { |
|
|
|
return fmt.Errorf("Not matching preferred rack:%s", option.Rack) |
|
|
|
} |
|
|
|
if node.FreeSpace() < int64(rp.SameRackCount+1) { |
|
|
|
return fmt.Errorf("Free:%d < Expected:%d", node.FreeSpace(), rp.SameRackCount+1) |
|
|
|
if node.AvailableSpaceFor(option) < int64(rp.SameRackCount+1) { |
|
|
|
return fmt.Errorf("Free:%d < Expected:%d", node.AvailableSpaceFor(option), rp.SameRackCount+1) |
|
|
|
} |
|
|
|
if len(node.Children()) < rp.SameRackCount+1 { |
|
|
|
// a bit faster way to test free racks
|
|
|
@ -159,7 +159,7 @@ func (vg *VolumeGrowth) findEmptySlotsForOneVolume(topo *Topology, option *Volum |
|
|
|
} |
|
|
|
possibleDataNodesCount := 0 |
|
|
|
for _, n := range node.Children() { |
|
|
|
if n.FreeSpace() >= 1 { |
|
|
|
if n.AvailableSpaceFor(option) >= 1 { |
|
|
|
possibleDataNodesCount++ |
|
|
|
} |
|
|
|
} |
|
|
@ -173,12 +173,12 @@ func (vg *VolumeGrowth) findEmptySlotsForOneVolume(topo *Topology, option *Volum |
|
|
|
} |
|
|
|
|
|
|
|
//find main rack and other racks
|
|
|
|
mainServer, otherServers, serverErr := mainRack.(*Rack).PickNodesByWeight(rp.SameRackCount+1, func(node Node) error { |
|
|
|
mainServer, otherServers, serverErr := mainRack.(*Rack).PickNodesByWeight(rp.SameRackCount+1, option, func(node Node) error { |
|
|
|
if option.DataNode != "" && node.IsDataNode() && node.Id() != NodeId(option.DataNode) { |
|
|
|
return fmt.Errorf("Not matching preferred data node:%s", option.DataNode) |
|
|
|
} |
|
|
|
if node.FreeSpace() < 1 { |
|
|
|
return fmt.Errorf("Free:%d < Expected:%d", node.FreeSpace(), 1) |
|
|
|
if node.AvailableSpaceFor(option) < 1 { |
|
|
|
return fmt.Errorf("Free:%d < Expected:%d", node.AvailableSpaceFor(option), 1) |
|
|
|
} |
|
|
|
return nil |
|
|
|
}) |
|
|
@ -191,16 +191,16 @@ func (vg *VolumeGrowth) findEmptySlotsForOneVolume(topo *Topology, option *Volum |
|
|
|
servers = append(servers, server.(*DataNode)) |
|
|
|
} |
|
|
|
for _, rack := range otherRacks { |
|
|
|
r := rand.Int63n(rack.FreeSpace()) |
|
|
|
if server, e := rack.ReserveOneVolume(r); e == nil { |
|
|
|
r := rand.Int63n(rack.AvailableSpaceFor(option)) |
|
|
|
if server, e := rack.ReserveOneVolume(r, option); e == nil { |
|
|
|
servers = append(servers, server) |
|
|
|
} else { |
|
|
|
return servers, e |
|
|
|
} |
|
|
|
} |
|
|
|
for _, datacenter := range otherDataCenters { |
|
|
|
r := rand.Int63n(datacenter.FreeSpace()) |
|
|
|
if server, e := datacenter.ReserveOneVolume(r); e == nil { |
|
|
|
r := rand.Int63n(datacenter.AvailableSpaceFor(option)) |
|
|
|
if server, e := datacenter.ReserveOneVolume(r, option); e == nil { |
|
|
|
servers = append(servers, server) |
|
|
|
} else { |
|
|
|
return servers, e |
|
|
|