mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
reduce duplicated code by using a tree of Node
This commit is contained in:
parent
97e4a1d6eb
commit
f7adf1687f
|
@ -1,8 +0,0 @@
|
||||||
package topology
|
|
||||||
|
|
||||||
import ()
|
|
||||||
|
|
||||||
type StorageCapacity struct {
|
|
||||||
countVolumeCount int
|
|
||||||
maxVolumeCount int
|
|
||||||
}
|
|
|
@ -1,54 +1,9 @@
|
||||||
package topology
|
package topology
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"pkg/storage"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type DataCenterId string
|
|
||||||
type DataCenter struct {
|
type DataCenter struct {
|
||||||
Id DataCenterId
|
Node
|
||||||
racks map[RackId]*Rack
|
|
||||||
ipRange IpRange
|
ipRange IpRange
|
||||||
|
|
||||||
//transient
|
|
||||||
allocation StorageCapacity
|
|
||||||
topology *Topology
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *DataCenter) CreateOneVolume(r int, vid storage.VolumeId) storage.VolumeId {
|
|
||||||
for _, rack := range d.racks {
|
|
||||||
freeSpace := rack.allocation.maxVolumeCount - rack.allocation.countVolumeCount
|
|
||||||
if r > freeSpace {
|
|
||||||
r -= freeSpace
|
|
||||||
} else {
|
|
||||||
rack.CreateOneVolume(r, vid)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return vid
|
|
||||||
}
|
|
||||||
func (d *DataCenter) AddVolume(rack *Rack, v *storage.VolumeInfo) {
|
|
||||||
d.allocation.countVolumeCount += 1
|
|
||||||
d.topology.AddVolume(d, v)
|
|
||||||
}
|
|
||||||
func (d *DataCenter) AddNode(rack *Rack, n *Node) {
|
|
||||||
d.allocation.countVolumeCount += len(n.volumes)
|
|
||||||
d.allocation.maxVolumeCount += n.maxVolumeCount
|
|
||||||
d.topology.AddNode(d, n)
|
|
||||||
}
|
|
||||||
func (d *DataCenter) RemoveNode(rack *Rack, n *Node) {
|
|
||||||
d.allocation.countVolumeCount -= len(n.volumes)
|
|
||||||
d.allocation.maxVolumeCount -= n.maxVolumeCount
|
|
||||||
d.topology.RemoveNode(d, n)
|
|
||||||
}
|
|
||||||
func (d *DataCenter) AddRack(rack *Rack) {
|
|
||||||
d.racks[rack.Id] = rack
|
|
||||||
d.allocation.countVolumeCount += rack.allocation.countVolumeCount
|
|
||||||
d.allocation.maxVolumeCount += rack.allocation.maxVolumeCount
|
|
||||||
d.topology.AddRack(d, rack)
|
|
||||||
}
|
|
||||||
func (d *DataCenter) RemoveRack(rack *Rack) {
|
|
||||||
delete(d.racks, rack.Id)
|
|
||||||
d.allocation.countVolumeCount -= rack.allocation.countVolumeCount
|
|
||||||
d.allocation.maxVolumeCount -= rack.allocation.maxVolumeCount
|
|
||||||
d.topology.AddRack(d, rack)
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,20 +6,56 @@ import (
|
||||||
|
|
||||||
type NodeId string
|
type NodeId string
|
||||||
type Node struct {
|
type Node struct {
|
||||||
volumes map[storage.VolumeId]*storage.VolumeInfo
|
id NodeId
|
||||||
|
countVolumeCount int
|
||||||
|
reservedVolumeCount int
|
||||||
maxVolumeCount int
|
maxVolumeCount int
|
||||||
Ip NodeId
|
parent *Node
|
||||||
Port int
|
children map[NodeId]*Node
|
||||||
PublicUrl string
|
isLeaf bool
|
||||||
|
}
|
||||||
|
|
||||||
//transient
|
func (n *Node) ReserveOneVolume(r int, vid storage.VolumeId) bool {
|
||||||
rack *Rack
|
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) CreateOneVolume(r int, vid storage.VolumeId) storage.VolumeId {
|
|
||||||
n.AddVolume(&storage.VolumeInfo{Id:vid, Size: 32*1024*1024*1024})
|
func (n *Node) AddVolume(v *storage.VolumeInfo) {
|
||||||
return vid
|
n.countVolumeCount++
|
||||||
|
if n.reservedVolumeCount > 0 { //if reserved
|
||||||
|
n.reservedVolumeCount--
|
||||||
|
}
|
||||||
|
if n.parent != nil {
|
||||||
|
n.parent.AddVolume(v)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
func (n *Node) AddVolume(v *storage.VolumeInfo){
|
|
||||||
n.volumes[v.Id] = v
|
func (n *Node) AddNode(node *Node) {
|
||||||
n.rack.AddVolume(n,v)
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,43 +1,9 @@
|
||||||
package topology
|
package topology
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"pkg/storage"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type RackId uint32
|
|
||||||
type Rack struct {
|
type Rack struct {
|
||||||
Id RackId
|
Node
|
||||||
nodes map[NodeId]*Node
|
|
||||||
ipRange IpRange
|
ipRange IpRange
|
||||||
|
|
||||||
//transient
|
|
||||||
allocation StorageCapacity
|
|
||||||
dataCenter *DataCenter
|
|
||||||
}
|
|
||||||
func (rack *Rack) CreateOneVolume(r int, vid storage.VolumeId) storage.VolumeId {
|
|
||||||
for _, node := range rack.nodes {
|
|
||||||
freeSpace := node.maxVolumeCount - len(node.volumes)
|
|
||||||
if r > freeSpace {
|
|
||||||
r -= freeSpace
|
|
||||||
} else {
|
|
||||||
node.CreateOneVolume(r, vid)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return vid
|
|
||||||
}
|
|
||||||
func (r *Rack) AddVolume(n *Node, v *storage.VolumeInfo){
|
|
||||||
r.allocation.countVolumeCount += 1
|
|
||||||
r.dataCenter.AddVolume(r,v)
|
|
||||||
}
|
|
||||||
func (r *Rack) AddNode(n *Node){
|
|
||||||
r.nodes[n.Ip] = n
|
|
||||||
r.allocation.countVolumeCount += len(n.volumes)
|
|
||||||
r.allocation.maxVolumeCount += n.maxVolumeCount
|
|
||||||
r.dataCenter.AddNode(r,n)
|
|
||||||
}
|
|
||||||
func (r *Rack) RemoveNode(n *Node){
|
|
||||||
delete(r.nodes,n.Ip)
|
|
||||||
r.allocation.countVolumeCount -= len(n.volumes)
|
|
||||||
r.allocation.maxVolumeCount -= n.maxVolumeCount
|
|
||||||
r.dataCenter.RemoveNode(r,n)
|
|
||||||
}
|
}
|
||||||
|
|
21
weed-fs/src/pkg/topology/server.go
Normal file
21
weed-fs/src/pkg/topology/server.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
package topology
|
||||||
|
|
||||||
|
import (
|
||||||
|
"pkg/storage"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Server struct {
|
||||||
|
Node
|
||||||
|
volumes map[storage.VolumeId]*storage.VolumeInfo
|
||||||
|
Ip NodeId
|
||||||
|
Port int
|
||||||
|
PublicUrl string
|
||||||
|
}
|
||||||
|
func (s *Server) CreateOneVolume(r int, vid storage.VolumeId) storage.VolumeId {
|
||||||
|
s.AddVolume(&storage.VolumeInfo{Id:vid, Size: 32*1024*1024*1024})
|
||||||
|
return vid
|
||||||
|
}
|
||||||
|
func (s *Server) AddVolume(v *storage.VolumeInfo){
|
||||||
|
s.volumes[v.Id] = v
|
||||||
|
s.Node.AddVolume(v)
|
||||||
|
}
|
|
@ -6,56 +6,15 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Topology struct {
|
type Topology struct {
|
||||||
datacenters map[DataCenterId]*DataCenter
|
Node
|
||||||
|
|
||||||
//transient
|
|
||||||
allocation StorageCapacity
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME
|
func (t *Topology) RandomlyCreateOneVolume() (bool,storage.VolumeId) {
|
||||||
func (t *Topology) RandomlyCreateOneVolume() storage.VolumeId {
|
r := rand.Intn(t.Node.maxVolumeCount-t.Node.countVolumeCount-t.Node.reservedVolumeCount)
|
||||||
r := rand.Intn(t.allocation.maxVolumeCount-t.allocation.countVolumeCount)
|
|
||||||
vid := t.nextVolumeId()
|
vid := t.nextVolumeId()
|
||||||
for _, d := range t.datacenters {
|
return t.Node.ReserveOneVolume(r,vid), vid
|
||||||
freeSpace := d.allocation.maxVolumeCount-d.allocation.countVolumeCount
|
|
||||||
if r>freeSpace{
|
|
||||||
r -= freeSpace
|
|
||||||
}else{
|
|
||||||
d.CreateOneVolume(r, vid)
|
|
||||||
return vid
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return storage.VolumeId(0) //FIXME
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Topology) nextVolumeId() storage.VolumeId {
|
func (t *Topology) nextVolumeId() storage.VolumeId {
|
||||||
return storage.VolumeId(0)
|
return storage.VolumeId(0)
|
||||||
}
|
}
|
||||||
func (t *Topology) AddVolume(d *DataCenter, v *storage.VolumeInfo) {
|
|
||||||
t.allocation.countVolumeCount += 1
|
|
||||||
}
|
|
||||||
func (t *Topology) AddNode(d *DataCenter, n *Node){
|
|
||||||
t.allocation.countVolumeCount += len(n.volumes)
|
|
||||||
t.allocation.maxVolumeCount += n.maxVolumeCount
|
|
||||||
}
|
|
||||||
func (t *Topology) RemoveNode(d *DataCenter, n *Node){
|
|
||||||
t.allocation.countVolumeCount -= len(n.volumes)
|
|
||||||
t.allocation.maxVolumeCount -= n.maxVolumeCount
|
|
||||||
}
|
|
||||||
func (t *Topology) AddRack(d *DataCenter, rack *Rack){
|
|
||||||
t.allocation.countVolumeCount += rack.allocation.countVolumeCount
|
|
||||||
t.allocation.maxVolumeCount += rack.allocation.maxVolumeCount
|
|
||||||
}
|
|
||||||
func (t *Topology) RemoveRack(d *DataCenter, rack *Rack){
|
|
||||||
t.allocation.countVolumeCount -= rack.allocation.countVolumeCount
|
|
||||||
t.allocation.maxVolumeCount -= rack.allocation.maxVolumeCount
|
|
||||||
}
|
|
||||||
func (t *Topology) AddDataCenter(d *DataCenter) {
|
|
||||||
t.datacenters[d.Id] = d
|
|
||||||
t.allocation.countVolumeCount += d.allocation.countVolumeCount
|
|
||||||
t.allocation.maxVolumeCount += d.allocation.maxVolumeCount
|
|
||||||
}
|
|
||||||
func (t *Topology) RemoveDataCenter(d *DataCenter) {
|
|
||||||
delete(t.datacenters,d.Id)
|
|
||||||
t.allocation.countVolumeCount -= d.allocation.countVolumeCount
|
|
||||||
t.allocation.maxVolumeCount -= d.allocation.maxVolumeCount
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue