aboutsummaryrefslogtreecommitdiff
path: root/weed-fs/src/pkg
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2012-09-14 01:17:13 -0700
committerChris Lu <chris.lu@gmail.com>2012-09-14 01:17:13 -0700
commite7c4ee1c64a0b523d7fcfd9f1620c85bf3b642f4 (patch)
tree9115ddb4ed2920880af84310faee42a2cf375105 /weed-fs/src/pkg
parentb5ac55f0124465c2e73ef6386e3d0cf08076b459 (diff)
downloadseaweedfs-e7c4ee1c64a0b523d7fcfd9f1620c85bf3b642f4.tar.xz
seaweedfs-e7c4ee1c64a0b523d7fcfd9f1620c85bf3b642f4.zip
register reported topology
Diffstat (limited to 'weed-fs/src/pkg')
-rw-r--r--weed-fs/src/pkg/admin/storage.go16
-rw-r--r--weed-fs/src/pkg/topology/data_center.go37
-rw-r--r--weed-fs/src/pkg/topology/data_node.go6
-rw-r--r--weed-fs/src/pkg/topology/ip_range.go10
-rw-r--r--weed-fs/src/pkg/topology/rack.go25
-rw-r--r--weed-fs/src/pkg/topology/topology.go32
6 files changed, 108 insertions, 18 deletions
diff --git a/weed-fs/src/pkg/admin/storage.go b/weed-fs/src/pkg/admin/storage.go
index ca4de3095..8e78b8697 100644
--- a/weed-fs/src/pkg/admin/storage.go
+++ b/weed-fs/src/pkg/admin/storage.go
@@ -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
+}
diff --git a/weed-fs/src/pkg/topology/data_center.go b/weed-fs/src/pkg/topology/data_center.go
index 8dced9c44..48466e258 100644
--- a/weed-fs/src/pkg/topology/data_center.go
+++ b/weed-fs/src/pkg/topology/data_center.go
@@ -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
}
diff --git a/weed-fs/src/pkg/topology/data_node.go b/weed-fs/src/pkg/topology/data_node.go
index 4d6f18bea..254754ccd 100644
--- a/weed-fs/src/pkg/topology/data_node.go
+++ b/weed-fs/src/pkg/topology/data_node.go
@@ -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
+}
diff --git a/weed-fs/src/pkg/topology/ip_range.go b/weed-fs/src/pkg/topology/ip_range.go
index e7bd5a0fe..06dab74ef 100644
--- a/weed-fs/src/pkg/topology/ip_range.go
+++ b/weed-fs/src/pkg/topology/ip_range.go
@@ -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
+} \ No newline at end of file
diff --git a/weed-fs/src/pkg/topology/rack.go b/weed-fs/src/pkg/topology/rack.go
index 46e7780dc..a52223887 100644
--- a/weed-fs/src/pkg/topology/rack.go
+++ b/weed-fs/src/pkg/topology/rack.go
@@ -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
+}
diff --git a/weed-fs/src/pkg/topology/topology.go b/weed-fs/src/pkg/topology/topology.go
index 2e617c927..2366c29d0 100644
--- a/weed-fs/src/pkg/topology/topology.go
+++ b/weed-fs/src/pkg/topology/topology.go
@@ -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
}