Chris Lu
13 years ago
7 changed files with 149 additions and 25 deletions
-
1weed-fs/bin/.gitignore
-
1weed-fs/pkg/linux_amd64/.gitignore
-
8weed-fs/src/pkg/topology/capacity.go
-
46weed-fs/src/pkg/topology/data_center.go
-
26weed-fs/src/pkg/topology/node.go
-
35weed-fs/src/pkg/topology/rack.go
-
57weed-fs/src/pkg/topology/topology.go
@ -1 +0,0 @@ |
|||||
/weed |
|
@ -1 +0,0 @@ |
|||||
/pkg |
|
@ -0,0 +1,8 @@ |
|||||
|
package topology |
||||
|
|
||||
|
import () |
||||
|
|
||||
|
type StorageCapacity struct { |
||||
|
countVolumeCount int |
||||
|
maxVolumeCount int |
||||
|
} |
@ -1,10 +1,54 @@ |
|||||
package topology |
package topology |
||||
|
|
||||
import () |
|
||||
|
import ( |
||||
|
"pkg/storage" |
||||
|
) |
||||
|
|
||||
type DataCenterId string |
type DataCenterId string |
||||
type DataCenter struct { |
type DataCenter struct { |
||||
Id DataCenterId |
Id DataCenterId |
||||
racks map[RackId]*Rack |
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) |
||||
} |
} |
@ -1,10 +1,43 @@ |
|||||
package topology |
package topology |
||||
|
|
||||
import () |
|
||||
|
import ( |
||||
|
"pkg/storage" |
||||
|
) |
||||
|
|
||||
type RackId uint32 |
type RackId uint32 |
||||
type Rack struct { |
type Rack struct { |
||||
Id RackId |
Id RackId |
||||
nodes map[NodeId]*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) |
||||
} |
} |
@ -1,16 +1,61 @@ |
|||||
package topology |
package topology |
||||
|
|
||||
import ( |
import ( |
||||
"pkg/storage" |
|
||||
|
"math/rand" |
||||
|
"pkg/storage" |
||||
) |
) |
||||
|
|
||||
type Topology struct { |
type Topology struct { |
||||
datacenters map[DataCenterId]*DataCenter |
|
||||
|
datacenters map[DataCenterId]*DataCenter |
||||
|
|
||||
|
//transient
|
||||
|
allocation StorageCapacity |
||||
} |
} |
||||
|
|
||||
//FIXME
|
//FIXME
|
||||
func (t *Topology) RandomlyCreateOneVolume() storage.VolumeId{ |
|
||||
return t.findMaxVolumeId() |
|
||||
|
func (t *Topology) RandomlyCreateOneVolume() storage.VolumeId { |
||||
|
r := rand.Intn(t.allocation.maxVolumeCount-t.allocation.countVolumeCount) |
||||
|
vid := t.nextVolumeId() |
||||
|
for _, d := range t.datacenters { |
||||
|
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 { |
||||
|
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) findMaxVolumeId() storage.VolumeId{ |
|
||||
return storage.VolumeId(0); |
|
||||
|
func (t *Topology) RemoveDataCenter(d *DataCenter) { |
||||
|
delete(t.datacenters,d.Id) |
||||
|
t.allocation.countVolumeCount -= d.allocation.countVolumeCount |
||||
|
t.allocation.maxVolumeCount -= d.allocation.maxVolumeCount |
||||
} |
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue