register reported topology

This commit is contained in:
Chris Lu
2012-09-14 01:17:13 -07:00
parent b5ac55f012
commit e7c4ee1c64
7 changed files with 109 additions and 18 deletions

View File

@@ -29,3 +29,19 @@ func AllocateVolume(dn *topology.DataNode, vid storage.VolumeId, repType storage
}
return nil
}
func SendVolumeLocationsList(t *topology.Topology, vid storage.VolumeId) error{
// values := make(url.Values)
// values.Add("volumeLocationsList", vid.String())
// volumeLocations:= []map[string]string{}
// list := t.GetVolumeLocations(vid)
// m := make(map[string]interface{})
// m["Vid"] = vid.String()
// for _, dn := range list {
// m["Locations"] = append(m["Locations"], dn)
// }
// for _, dn := range list {
// util.Post("http://"+dn.Ip+":"+strconv.Itoa(dn.Port)+"/admin/set_volume_locations_list", values)
// }
return nil
}

View File

@@ -1,16 +1,35 @@
package topology
import (
)
import ()
type DataCenter struct {
NodeImpl
ipRange IpRange
ipRange *IpRange
}
func NewDataCenter(id string) *DataCenter{
dc := &DataCenter{}
dc.id = NodeId(id)
dc.nodeType = "DataCenter"
dc.children = make(map[NodeId]Node)
return dc
func NewDataCenter(id string) *DataCenter {
dc := &DataCenter{}
dc.id = NodeId(id)
dc.nodeType = "DataCenter"
dc.children = make(map[NodeId]Node)
return dc
}
func (dc *DataCenter) MatchLocationRange(ip string) bool {
if dc.ipRange == nil {
return true
}
return dc.ipRange.Match(ip)
}
func (dc *DataCenter) GetOrCreateRack(ip string) *Rack {
for _, c := range dc.Children() {
rack := c.(*Rack)
if rack.MatchLocationRange(ip) {
return rack
}
}
rack := NewRack("DefaultRack")
dc.LinkChildNode(rack)
return rack
}

View File

@@ -22,14 +22,13 @@ func NewDataNode(id string) *DataNode {
return s
}
func (dn *DataNode) CreateOneVolume(r int, vid storage.VolumeId) storage.VolumeId {
dn.AddVolume(&storage.VolumeInfo{Id: vid, Size: 32 * 1024 * 1024 * 1024})
dn.AddVolume(&storage.VolumeInfo{Id: vid})
return vid
}
func (dn *DataNode) AddVolume(v *storage.VolumeInfo) {
dn.volumes[v.Id] = v
dn.UpAdjustActiveVolumeCountDelta(1)
dn.UpAdjustMaxVolumeId(v.Id)
dn.GetTopology().RegisterVolume(v,dn)
}
func (dn *DataNode) GetTopology() *Topology {
p := dn.parent
@@ -39,3 +38,6 @@ func (dn *DataNode) GetTopology() *Topology {
t := p.(*Topology)
return t
}
func (dn *DataNode) MatchLocation(ip string, port int) bool {
return dn.Ip == ip && dn.Port == port
}

View File

@@ -9,3 +9,13 @@ type IpRange struct {
inclusives []string
exclusives []string
}
func (r *IpRange) Match(ip string) bool {
// TODO
// for _, exc := range r.exclusives {
// if exc
// }
// for _, inc := range r.inclusives {
// }
return true
}

View File

@@ -1,11 +1,12 @@
package topology
import (
"strconv"
)
type Rack struct {
NodeImpl
ipRange IpRange
ipRange *IpRange
}
func NewRack(id string) *Rack {
@@ -15,3 +16,25 @@ func NewRack(id string) *Rack {
r.children = make(map[NodeId]Node)
return r
}
func (r *Rack) MatchLocationRange(ip string) bool{
if r.ipRange == nil {
return true
}
return r.ipRange.Match(ip)
}
func (r *Rack) GetOrCreateDataNode(ip string, port int, publicUrl string) *DataNode{
for _, c := range r.Children() {
dn := c.(*DataNode)
if dn.MatchLocation(ip,port) {
return dn
}
}
dn := NewDataNode("DataNode"+ip+":"+strconv.Itoa(port))
dn.Ip = ip
dn.Port = port
dn.PublicUrl = publicUrl
r.LinkChildNode(dn)
return dn
}

View File

@@ -52,10 +52,30 @@ func (t *Topology) NextVolumeId() storage.VolumeId {
return vid.Next()
}
func (t *Topology) RegisterVolume(v *storage.VolumeInfo, dn *DataNode) {
replicationTypeIndex := storage.GetReplicationLevelIndex(v)
if t.replicaType2VolumeLayout[replicationTypeIndex] == nil {
t.replicaType2VolumeLayout[replicationTypeIndex] = NewVolumeLayout(t.volumeSizeLimit, t.pulse)
}
t.replicaType2VolumeLayout[replicationTypeIndex].RegisterVolume(v, dn)
func (t *Topology) registerVolumeLayout(v *storage.VolumeInfo, dn *DataNode) {
replicationTypeIndex := storage.GetReplicationLevelIndex(v)
if t.replicaType2VolumeLayout[replicationTypeIndex] == nil {
t.replicaType2VolumeLayout[replicationTypeIndex] = NewVolumeLayout(t.volumeSizeLimit, t.pulse)
}
t.replicaType2VolumeLayout[replicationTypeIndex].RegisterVolume(v, dn)
}
func (t *Topology) RegisterVolume(v *storage.VolumeInfo, ip string, port int, publicUrl string) {
dc := t.GetOrCreateDataCenter(ip)
rack := dc.GetOrCreateRack(ip)
dn := rack.GetOrCreateDataNode(ip, port, publicUrl)
dn.AddVolume(v)
t.registerVolumeLayout(v,dn)
}
func (t *Topology) GetOrCreateDataCenter(ip string) *DataCenter{
for _, c := range t.Children() {
dc := c.(*DataCenter)
if dc.MatchLocationRange(ip) {
return dc
}
}
dc := NewDataCenter("DefaultDataCenter")
t.LinkChildNode(dc)
return dc
}