2012-08-24 03:56:09 +00:00
|
|
|
package topology
|
|
|
|
|
2012-08-24 05:56:14 +00:00
|
|
|
import (
|
2012-08-29 07:58:03 +00:00
|
|
|
"pkg/storage"
|
2012-08-24 05:56:14 +00:00
|
|
|
)
|
2012-08-24 03:56:09 +00:00
|
|
|
|
2012-08-28 08:04:39 +00:00
|
|
|
type NodeId string
|
2012-08-24 03:56:09 +00:00
|
|
|
type Node struct {
|
2012-08-29 07:58:03 +00:00
|
|
|
id NodeId
|
|
|
|
countVolumeCount int
|
|
|
|
reservedVolumeCount int
|
|
|
|
maxVolumeCount int
|
|
|
|
parent *Node
|
|
|
|
children map[NodeId]*Node
|
|
|
|
isLeaf bool
|
2012-08-24 03:56:09 +00:00
|
|
|
}
|
2012-08-29 07:58:03 +00:00
|
|
|
|
|
|
|
func (n *Node) ReserveOneVolume(r int, vid storage.VolumeId) bool {
|
|
|
|
for _, node := range n.children {
|
|
|
|
freeSpace := node.maxVolumeCount - node.countVolumeCount - node.reservedVolumeCount
|
|
|
|
if r > freeSpace {
|
|
|
|
r -= freeSpace
|
|
|
|
} else {
|
|
|
|
if node.ReserveOneVolume(r, vid) {
|
|
|
|
node.reservedVolumeCount++
|
|
|
|
return true
|
|
|
|
} else {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (n *Node) AddVolume(v *storage.VolumeInfo) {
|
|
|
|
n.countVolumeCount++
|
|
|
|
if n.reservedVolumeCount > 0 { //if reserved
|
|
|
|
n.reservedVolumeCount--
|
|
|
|
}
|
|
|
|
if n.parent != nil {
|
|
|
|
n.parent.AddVolume(v)
|
|
|
|
}
|
2012-08-27 20:52:02 +00:00
|
|
|
}
|
2012-08-29 07:58:03 +00:00
|
|
|
|
|
|
|
func (n *Node) AddNode(node *Node) {
|
|
|
|
n.children[node.id] = node
|
|
|
|
n.countVolumeCount += node.countVolumeCount
|
|
|
|
n.maxVolumeCount += node.maxVolumeCount
|
|
|
|
if n.parent != nil {
|
|
|
|
n.parent.AddNode(node)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (n *Node) RemoveNode(node *Node) {
|
|
|
|
delete(n.children, node.id)
|
|
|
|
n.countVolumeCount -= node.countVolumeCount
|
|
|
|
n.maxVolumeCount -= node.maxVolumeCount
|
|
|
|
if n.parent != nil {
|
|
|
|
n.parent.RemoveNode(node)
|
|
|
|
}
|
2012-08-27 20:52:02 +00:00
|
|
|
}
|