adjusting maxVolumeCount if volume server changes it
This commit is contained in:
@@ -63,10 +63,12 @@ func (vg *VolumeGrowth) GrowByCountAndType(count int, repType storage.Replicatio
|
|||||||
if ret {
|
if ret {
|
||||||
var servers []*topology.DataNode
|
var servers []*topology.DataNode
|
||||||
for _, n := range picked {
|
for _, n := range picked {
|
||||||
|
if n.FreeSpace() > 0 {
|
||||||
if ok, server := n.ReserveOneVolume(rand.Intn(n.FreeSpace()), vid); ok {
|
if ok, server := n.ReserveOneVolume(rand.Intn(n.FreeSpace()), vid); ok {
|
||||||
servers = append(servers, server)
|
servers = append(servers, server)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if len(servers) == 2 {
|
if len(servers) == 2 {
|
||||||
vg.grow(topo, vid, repType, servers[0], servers[1])
|
vg.grow(topo, vid, repType, servers[0], servers[1])
|
||||||
}
|
}
|
||||||
@@ -80,10 +82,12 @@ func (vg *VolumeGrowth) GrowByCountAndType(count int, repType storage.Replicatio
|
|||||||
if ret {
|
if ret {
|
||||||
var servers []*topology.DataNode
|
var servers []*topology.DataNode
|
||||||
for _, n := range picked {
|
for _, n := range picked {
|
||||||
|
if n.FreeSpace() > 0 {
|
||||||
if ok, server := n.ReserveOneVolume(rand.Intn(n.FreeSpace()), vid); ok {
|
if ok, server := n.ReserveOneVolume(rand.Intn(n.FreeSpace()), vid); ok {
|
||||||
servers = append(servers, server)
|
servers = append(servers, server)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if len(servers) == 3 {
|
if len(servers) == 3 {
|
||||||
vg.grow(topo, vid, repType, servers[0], servers[1], servers[2])
|
vg.grow(topo, vid, repType, servers[0], servers[1], servers[2])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,21 +17,22 @@ func NewRack(id string) *Rack {
|
|||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Rack) MatchLocationRange(ip string) bool{
|
func (r *Rack) MatchLocationRange(ip string) bool {
|
||||||
if r.ipRange == nil {
|
if r.ipRange == nil {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return r.ipRange.Match(ip)
|
return r.ipRange.Match(ip)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Rack) GetOrCreateDataNode(ip string, port int, publicUrl string, maxVolumeCount int) *DataNode{
|
func (r *Rack) GetOrCreateDataNode(ip string, port int, publicUrl string, maxVolumeCount int) *DataNode {
|
||||||
for _, c := range r.Children() {
|
for _, c := range r.Children() {
|
||||||
dn := c.(*DataNode)
|
dn := c.(*DataNode)
|
||||||
if dn.MatchLocation(ip,port) {
|
if dn.MatchLocation(ip, port) {
|
||||||
|
dn.NodeImpl.UpAdjustMaxVolumeCountDelta(maxVolumeCount - dn.maxVolumeCount)
|
||||||
return dn
|
return dn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dn := NewDataNode("DataNode"+ip+":"+strconv.Itoa(port))
|
dn := NewDataNode("DataNode" + ip + ":" + strconv.Itoa(port))
|
||||||
dn.Ip = ip
|
dn.Ip = ip
|
||||||
dn.Port = port
|
dn.Port = port
|
||||||
dn.PublicUrl = publicUrl
|
dn.PublicUrl = publicUrl
|
||||||
@@ -40,7 +41,7 @@ func (r *Rack) GetOrCreateDataNode(ip string, port int, publicUrl string, maxVol
|
|||||||
return dn
|
return dn
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rack *Rack) ToMap() interface{}{
|
func (rack *Rack) ToMap() interface{} {
|
||||||
m := make(map[string]interface{})
|
m := make(map[string]interface{})
|
||||||
m["Free"] = rack.FreeSpace()
|
m["Free"] = rack.FreeSpace()
|
||||||
var dns []interface{}
|
var dns []interface{}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ func NewTopology(id string, dirname string, filename string, volumeSizeLimit uin
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *Topology) RandomlyReserveOneVolume() (bool, *DataNode, *storage.VolumeId) {
|
func (t *Topology) RandomlyReserveOneVolume() (bool, *DataNode, *storage.VolumeId) {
|
||||||
if t.FreeSpace()<=0 {
|
if t.FreeSpace() <= 0 {
|
||||||
return false, nil, nil
|
return false, nil, nil
|
||||||
}
|
}
|
||||||
vid := t.NextVolumeId()
|
vid := t.NextVolumeId()
|
||||||
@@ -42,14 +42,17 @@ func (t *Topology) RandomlyReserveOneVolume() (bool, *DataNode, *storage.VolumeI
|
|||||||
return ret, node, &vid
|
return ret, node, &vid
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Topology) RandomlyReserveOneVolumeExcept(except []Node) (bool, *DataNode, storage.VolumeId) {
|
func (t *Topology) RandomlyReserveOneVolumeExcept(except []Node) (bool, *DataNode, *storage.VolumeId) {
|
||||||
freeSpace := t.FreeSpace()
|
freeSpace := t.FreeSpace()
|
||||||
for _, node := range except {
|
for _, node := range except {
|
||||||
freeSpace -= node.FreeSpace()
|
freeSpace -= node.FreeSpace()
|
||||||
}
|
}
|
||||||
|
if freeSpace <= 0 {
|
||||||
|
return false, nil, nil
|
||||||
|
}
|
||||||
vid := t.NextVolumeId()
|
vid := t.NextVolumeId()
|
||||||
ret, node := t.ReserveOneVolume(rand.Intn(freeSpace), vid)
|
ret, node := t.ReserveOneVolume(rand.Intn(freeSpace), vid)
|
||||||
return ret, node, vid
|
return ret, node, &vid
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Topology) NextVolumeId() storage.VolumeId {
|
func (t *Topology) NextVolumeId() storage.VolumeId {
|
||||||
|
|||||||
Reference in New Issue
Block a user