diff options
| author | Chris Lu <chris.lu@gmail.com> | 2018-07-09 23:18:20 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2018-07-09 23:18:20 -0700 |
| commit | 6c4fee85e3a369a43c7f595103ad4617063fc7f7 (patch) | |
| tree | 84a8383ab3e3332f94672314d5508798023791a4 /weed/operation/assign_file_id.go | |
| parent | e2849a36e5922767220b97e9e620edc58c9484ac (diff) | |
| download | seaweedfs-6c4fee85e3a369a43c7f595103ad4617063fc7f7.tar.xz seaweedfs-6c4fee85e3a369a43c7f595103ad4617063fc7f7.zip | |
add primary request and backup request when requesting volumes for a data center
Diffstat (limited to 'weed/operation/assign_file_id.go')
| -rw-r--r-- | weed/operation/assign_file_id.go | 81 |
1 files changed, 46 insertions, 35 deletions
diff --git a/weed/operation/assign_file_id.go b/weed/operation/assign_file_id.go index a3466bdd2..c2e1e4444 100644 --- a/weed/operation/assign_file_id.go +++ b/weed/operation/assign_file_id.go @@ -2,7 +2,6 @@ package operation import ( "encoding/json" - "errors" "fmt" "net/url" "strconv" @@ -29,40 +28,52 @@ type AssignResult struct { Error string `json:"error,omitempty"` } -func Assign(server string, r *VolumeAssignRequest) (*AssignResult, error) { - values := make(url.Values) - values.Add("count", strconv.FormatUint(r.Count, 10)) - if r.Replication != "" { - 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) - } +func Assign(server string, primaryRequest *VolumeAssignRequest, alternativeRequests ...*VolumeAssignRequest) (*AssignResult, error) { + var requests []*VolumeAssignRequest + requests = append(requests, primaryRequest) + requests = append(requests, alternativeRequests...) - 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 { - return nil, errors.New(ret.Error) + var lastError error + for i, request := range requests { + if request == nil { + 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 } - return &ret, nil + return nil, lastError } |
