From 9fb1954f4b0186684f09771838d6e1bf7ee629a3 Mon Sep 17 00:00:00 2001 From: tnextday Date: Mon, 4 Jan 2016 22:00:39 +0800 Subject: [PATCH] volume growth: update --- go/topology/volume_growth.go | 46 +++++++++++++++---------------- go/topology/volume_growth_test.go | 6 ++-- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/go/topology/volume_growth.go b/go/topology/volume_growth.go index 820c89026..f7f4e8187 100644 --- a/go/topology/volume_growth.go +++ b/go/topology/volume_growth.go @@ -76,7 +76,7 @@ func (vg *VolumeGrowth) GrowByCountAndType(targetCount int, option *VolumeGrowOp } func (vg *VolumeGrowth) findAndGrow(topo *Topology, option *VolumeGrowOption) (int, error) { - servers, e := vg.findEmptySlotsForOneVolume(topo, option, nil) + servers, e := FindEmptySlotsForOneVolume(topo, option, nil) if e != nil { return 0, e } @@ -85,6 +85,27 @@ func (vg *VolumeGrowth) findAndGrow(topo *Topology, option *VolumeGrowOption) (i return len(servers), err } +func (vg *VolumeGrowth) grow(topo *Topology, vid storage.VolumeId, option *VolumeGrowOption, servers ...*DataNode) error { + for _, server := range servers { + if err := AllocateVolume(server, vid, option); err == nil { + vi := storage.VolumeInfo{ + Id: vid, + Size: 0, + Collection: option.Collection, + Ttl: option.Ttl, + Version: storage.CurrentVersion, + } + server.AddOrUpdateVolume(vi) + topo.RegisterVolumeLayout(vi, server) + glog.V(0).Infoln("Created Volume", vid, "on", server.NodeImpl.String()) + } else { + glog.V(0).Infoln("Failed to assign volume", vid, "to", servers, "error", err) + return fmt.Errorf("Failed to assign %d: %v", vid, err) + } + } + return nil +} + func filterMainDataCenter(option *VolumeGrowOption, node Node) error { if option.DataCenter != "" && node.IsDataCenter() && node.Id() != NodeId(option.DataCenter) { return fmt.Errorf("Not matching preferred data center:%s", option.DataCenter) @@ -159,7 +180,7 @@ func makeExceptNodeFilter(nodes []Node) FilterNodeFn { // 2.2 collect all racks that have rp.SameRackCount+1 // 2.2 collect all data centers that have DiffRackCount+rp.SameRackCount+1 // 2. find rest data nodes -func (vg *VolumeGrowth) findEmptySlotsForOneVolume(topo *Topology, option *VolumeGrowOption, existsServers *VolumeLocationList) (additionServers []*DataNode, err error) { +func FindEmptySlotsForOneVolume(topo *Topology, option *VolumeGrowOption, existsServers *VolumeLocationList) (additionServers []*DataNode, err error) { //find main datacenter and other data centers pickNodesFn := PickLowUsageNodeFn rp := option.ReplicaPlacement @@ -268,24 +289,3 @@ func (vg *VolumeGrowth) findEmptySlotsForOneVolume(topo *Topology, option *Volum } return } - -func (vg *VolumeGrowth) grow(topo *Topology, vid storage.VolumeId, option *VolumeGrowOption, servers ...*DataNode) error { - for _, server := range servers { - if err := AllocateVolume(server, vid, option); err == nil { - vi := storage.VolumeInfo{ - Id: vid, - Size: 0, - Collection: option.Collection, - Ttl: option.Ttl, - Version: storage.CurrentVersion, - } - server.AddOrUpdateVolume(vi) - topo.RegisterVolumeLayout(vi, server) - glog.V(0).Infoln("Created Volume", vid, "on", server.NodeImpl.String()) - } else { - glog.V(0).Infoln("Failed to assign volume", vid, "to", servers, "error", err) - return fmt.Errorf("Failed to assign %d: %v", vid, err) - } - } - return nil -} diff --git a/go/topology/volume_growth_test.go b/go/topology/volume_growth_test.go index 4861b1a88..04125e7f2 100644 --- a/go/topology/volume_growth_test.go +++ b/go/topology/volume_growth_test.go @@ -157,7 +157,6 @@ func setup(topologyLayout string) *Topology { func TestFindEmptySlotsForOneVolume(t *testing.T) { topo := setup(topologyLayout) - vg := NewDefaultVolumeGrowth() rp, _ := storage.NewReplicaPlacementFromString("111") volumeGrowOption := &VolumeGrowOption{ Collection: "", @@ -166,7 +165,7 @@ func TestFindEmptySlotsForOneVolume(t *testing.T) { Rack: "", DataNode: "", } - servers, err := vg.findEmptySlotsForOneVolume(topo, volumeGrowOption, nil) + servers, err := FindEmptySlotsForOneVolume(topo, volumeGrowOption, nil) if err != nil { fmt.Println("finding empty slots error :", err) t.Fail() @@ -213,7 +212,6 @@ func joinNodeId(dns []*DataNode) string { func TestFindEmptySlotsWithExistsNodes(t *testing.T) { topo := setup(topologyLayout) - vg := NewDefaultVolumeGrowth() rp, _ := storage.NewReplicaPlacementFromString("112") volumeGrowOption := &VolumeGrowOption{ Collection: "", @@ -227,7 +225,7 @@ func TestFindEmptySlotsWithExistsNodes(t *testing.T) { lrp := locationList.CalcReplicaPlacement() t.Logf("location list: [%s], replica placement = %s\n", joinNodeId(locationList.list), lrp.String()) if lrp.Compare(rp) < 0 { - servers, err := vg.findEmptySlotsForOneVolume(topo, volumeGrowOption, locationList) + servers, err := FindEmptySlotsForOneVolume(topo, volumeGrowOption, locationList) if err != nil { t.Log("finding empty slots error :", err) t.Fail()