func (vg *VolumeGrowth) grow(topo *topology.Topology, vid storage.VolumeId, repType storage.ReplicationType, servers ...*topology.DataNode) error { for _, server := range servers { if err := operation.AllocateVolume(server, vid, repType); err == nil { vi := storage.VolumeInfo{Id: vid, Size: 0, RepType: repType} server.AddOrUpdateVolume(vi) topo.RegisterVolumeLayout(&vi, server) fmt.Println("Created Volume", vid, "on", server) } else { fmt.Println("Failed to assign", vid, "to", servers) return errors.New("Failed to assign " + vid.String()) } } return nil }
func vacuumVolume_Commit(urlLocation string, vid storage.VolumeId) error { values := make(url.Values) values.Add("volume", vid.String()) jsonBlob, err := util.Post("http://"+urlLocation+"/admin/vacuum_volume_commit", values) if err != nil { return err } var ret VacuumVolumeResult if err := json.Unmarshal(jsonBlob, &ret); err != nil { return err } if ret.Error != "" { return errors.New(ret.Error) } return nil }
//TODO: Add a caching for vid here func Lookup(server string, vid storage.VolumeId) (*LookupResult, error) { values := make(url.Values) values.Add("volumeId", vid.String()) jsonBlob, err := util.Post("http://"+server+"/dir/lookup", values) if err != nil { return nil, err } var ret LookupResult err = json.Unmarshal(jsonBlob, &ret) if err != nil { return nil, err } if ret.Error != "" { return nil, errors.New(ret.Error) } return &ret, nil }
func AllocateVolume(dn *topology.DataNode, vid storage.VolumeId, repType storage.ReplicationType) error { values := make(url.Values) values.Add("volume", vid.String()) values.Add("replicationType", repType.String()) jsonBlob, err := util.Post("http://"+dn.Url()+"/admin/assign_volume", values) if err != nil { return err } var ret AllocateVolumeResult if err := json.Unmarshal(jsonBlob, &ret); err != nil { return err } if ret.Error != "" { return errors.New(ret.Error) } return nil }