aboutsummaryrefslogtreecommitdiff
path: root/weed/operation/assign_file_id.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2018-07-09 23:18:20 -0700
committerChris Lu <chris.lu@gmail.com>2018-07-09 23:18:20 -0700
commit6c4fee85e3a369a43c7f595103ad4617063fc7f7 (patch)
tree84a8383ab3e3332f94672314d5508798023791a4 /weed/operation/assign_file_id.go
parente2849a36e5922767220b97e9e620edc58c9484ac (diff)
downloadseaweedfs-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.go81
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
}