1
0
Fork 0
mirror of https://github.com/chrislusf/seaweedfs synced 2024-07-06 09:07:08 +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,26 +28,35 @@ 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) {
var requests []*VolumeAssignRequest
requests = append(requests, primaryRequest)
requests = append(requests, alternativeRequests...)
var lastError error
for i, request := range requests {
if request == nil {
continue
}
values := make(url.Values) values := make(url.Values)
values.Add("count", strconv.FormatUint(r.Count, 10)) values.Add("count", strconv.FormatUint(request.Count, 10))
if r.Replication != "" { if request.Replication != "" {
values.Add("replication", r.Replication) values.Add("replication", request.Replication)
} }
if r.Collection != "" { if request.Collection != "" {
values.Add("collection", r.Collection) values.Add("collection", request.Collection)
} }
if r.Ttl != "" { if request.Ttl != "" {
values.Add("ttl", r.Ttl) values.Add("ttl", request.Ttl)
} }
if r.DataCenter != "" { if request.DataCenter != "" {
values.Add("dataCenter", r.DataCenter) values.Add("dataCenter", request.DataCenter)
} }
if r.Rack != "" { if request.Rack != "" {
values.Add("rack", r.Rack) values.Add("rack", request.Rack)
} }
if r.DataNode != "" { if request.DataNode != "" {
values.Add("dataNode", r.DataNode) values.Add("dataNode", request.DataNode)
} }
jsonBlob, err := util.Post("http://"+server+"/dir/assign", values) jsonBlob, err := util.Post("http://"+server+"/dir/assign", values)
@ -62,7 +70,10 @@ func Assign(server string, r *VolumeAssignRequest) (*AssignResult, error) {
return nil, fmt.Errorf("/dir/assign result JSON unmarshal error:%v, json:%s", err, string(jsonBlob)) return nil, fmt.Errorf("/dir/assign result JSON unmarshal error:%v, json:%s", err, string(jsonBlob))
} }
if ret.Count <= 0 { if ret.Count <= 0 {
return nil, errors.New(ret.Error) lastError = fmt.Errorf("assign failure %d: %v", i+1, ret.Error)
continue
} }
return &ret, nil return &ret, nil
} }
return nil, lastError
}

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)
} }