1
0
Fork 0
mirror of https://github.com/chrislusf/seaweedfs synced 2024-07-03 15:46:44 +02:00

add primary request and backup request when requesting volumes for a data center

This commit is contained in:
Chris Lu 2018-07-09 23:18:20 -07:00
parent e2849a36e5
commit 6c4fee85e3
2 changed files with 60 additions and 37 deletions

View file

@ -2,7 +2,6 @@ package operation
import ( import (
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"net/url" "net/url"
"strconv" "strconv"
@ -29,40 +28,52 @@ type AssignResult struct {
Error string `json:"error,omitempty"` Error string `json:"error,omitempty"`
} }
func Assign(server string, r *VolumeAssignRequest) (*AssignResult, error) { func Assign(server string, primaryRequest *VolumeAssignRequest, alternativeRequests ...*VolumeAssignRequest) (*AssignResult, error) {
values := make(url.Values) var requests []*VolumeAssignRequest
values.Add("count", strconv.FormatUint(r.Count, 10)) requests = append(requests, primaryRequest)
if r.Replication != "" { requests = append(requests, alternativeRequests...)
values.Add("replication", r.Replication)
}
if r.Collection != "" {
values.Add("collection", r.Collection)
}
if r.Ttl != "" {
values.Add("ttl", r.Ttl)
}
if r.DataCenter != "" {
values.Add("dataCenter", r.DataCenter)
}
if r.Rack != "" {
values.Add("rack", r.Rack)
}
if r.DataNode != "" {
values.Add("dataNode", r.DataNode)
}
jsonBlob, err := util.Post("http://"+server+"/dir/assign", values) var lastError error
glog.V(2).Infof("assign result from %s : %s", server, string(jsonBlob)) for i, request := range requests {
if err != nil { if request == nil {
return nil, err continue
}
values := make(url.Values)
values.Add("count", strconv.FormatUint(request.Count, 10))
if request.Replication != "" {
values.Add("replication", request.Replication)
}
if request.Collection != "" {
values.Add("collection", request.Collection)
}
if request.Ttl != "" {
values.Add("ttl", request.Ttl)
}
if request.DataCenter != "" {
values.Add("dataCenter", request.DataCenter)
}
if request.Rack != "" {
values.Add("rack", request.Rack)
}
if request.DataNode != "" {
values.Add("dataNode", request.DataNode)
}
jsonBlob, err := util.Post("http://"+server+"/dir/assign", values)
glog.V(2).Infof("assign result from %s : %s", server, string(jsonBlob))
if err != nil {
return nil, err
}
var ret AssignResult
err = json.Unmarshal(jsonBlob, &ret)
if err != nil {
return nil, fmt.Errorf("/dir/assign result JSON unmarshal error:%v, json:%s", err, string(jsonBlob))
}
if ret.Count <= 0 {
lastError = fmt.Errorf("assign failure %d: %v", i+1, ret.Error)
continue
}
return &ret, nil
} }
var ret AssignResult return nil, lastError
err = json.Unmarshal(jsonBlob, &ret)
if err != nil {
return nil, fmt.Errorf("/dir/assign result JSON unmarshal error:%v, json:%s", err, string(jsonBlob))
}
if ret.Count <= 0 {
return nil, errors.New(ret.Error)
}
return &ret, nil
} }

View file

@ -173,13 +173,25 @@ func (fs *FilerServer) AssignVolume(ctx context.Context, req *filer_pb.AssignVol
ttlStr = strconv.Itoa(int(req.TtlSec)) ttlStr = strconv.Itoa(int(req.TtlSec))
} }
assignResult, err := operation.Assign(fs.filer.GetMaster(), &operation.VolumeAssignRequest{ var backupRequest *operation.VolumeAssignRequest
assignRequest := &operation.VolumeAssignRequest{
Count: uint64(req.Count), Count: uint64(req.Count),
Replication: req.Replication, Replication: req.Replication,
Collection: req.Collection, Collection: req.Collection,
Ttl: ttlStr, Ttl: ttlStr,
DataCenter: fs.option.DataCenter, DataCenter: fs.option.DataCenter,
}) }
if fs.option.DataCenter != "" {
backupRequest = &operation.VolumeAssignRequest{
Count: uint64(req.Count),
Replication: req.Replication,
Collection: req.Collection,
Ttl: ttlStr,
DataCenter: "",
}
}
assignResult, err := operation.Assign(fs.filer.GetMaster(), assignRequest, backupRequest)
if err != nil { if err != nil {
return nil, fmt.Errorf("assign volume: %v", err) return nil, fmt.Errorf("assign volume: %v", err)
} }