aboutsummaryrefslogtreecommitdiff
path: root/weed/wdclient
diff options
context:
space:
mode:
Diffstat (limited to 'weed/wdclient')
-rw-r--r--weed/wdclient/masterclient.go8
-rw-r--r--weed/wdclient/vid_map.go66
2 files changed, 68 insertions, 6 deletions
diff --git a/weed/wdclient/masterclient.go b/weed/wdclient/masterclient.go
index 53236fc6d..b1b9d474e 100644
--- a/weed/wdclient/masterclient.go
+++ b/weed/wdclient/masterclient.go
@@ -159,6 +159,14 @@ func (mc *MasterClient) tryConnectToMaster(master pb.ServerAddress) (nextHintedL
glog.V(1).Infof("%s: %s masterClient removes volume %d", mc.clientType, loc.Url, deletedVid)
mc.deleteLocation(deletedVid, loc)
}
+ for _, newEcVid := range resp.VolumeLocation.NewEcVids {
+ glog.V(1).Infof("%s: %s masterClient adds ec volume %d", mc.clientType, loc.Url, newEcVid)
+ mc.addEcLocation(newEcVid, loc)
+ }
+ for _, deletedEcVid := range resp.VolumeLocation.DeletedEcVids {
+ glog.V(1).Infof("%s: %s masterClient removes ec volume %d", mc.clientType, loc.Url, deletedEcVid)
+ mc.deleteEcLocation(deletedEcVid, loc)
+ }
}
if resp.ClusterNodeUpdate != nil {
diff --git a/weed/wdclient/vid_map.go b/weed/wdclient/vid_map.go
index 0effa2262..cdd783d91 100644
--- a/weed/wdclient/vid_map.go
+++ b/weed/wdclient/vid_map.go
@@ -36,16 +36,18 @@ func (l Location) ServerAddress() pb.ServerAddress {
type vidMap struct {
sync.RWMutex
- vid2Locations map[uint32][]Location
- DataCenter string
- cursor int32
+ vid2Locations map[uint32][]Location
+ ecVid2Locations map[uint32][]Location
+ DataCenter string
+ cursor int32
}
func newVidMap(dataCenter string) vidMap {
return vidMap{
- vid2Locations: make(map[uint32][]Location),
- DataCenter: dataCenter,
- cursor: -1,
+ vid2Locations: make(map[uint32][]Location),
+ ecVid2Locations: make(map[uint32][]Location),
+ DataCenter: dataCenter,
+ cursor: -1,
}
}
@@ -124,7 +126,13 @@ func (vc *vidMap) GetLocations(vid uint32) (locations []Location, found bool) {
vc.RLock()
defer vc.RUnlock()
+ glog.V(4).Infof("~ lookup volume id %d: %+v ec:%+v", vid, vc.vid2Locations, vc.ecVid2Locations)
+
locations, found = vc.vid2Locations[vid]
+ if found && len(locations) > 0 {
+ return
+ }
+ locations, found = vc.ecVid2Locations[vid]
return
}
@@ -132,6 +140,8 @@ func (vc *vidMap) addLocation(vid uint32, location Location) {
vc.Lock()
defer vc.Unlock()
+ glog.V(4).Infof("+ volume id %d: %+v", vid, location)
+
locations, found := vc.vid2Locations[vid]
if !found {
vc.vid2Locations[vid] = []Location{location}
@@ -148,10 +158,34 @@ func (vc *vidMap) addLocation(vid uint32, location Location) {
}
+func (vc *vidMap) addEcLocation(vid uint32, location Location) {
+ vc.Lock()
+ defer vc.Unlock()
+
+ glog.V(4).Infof("+ ec volume id %d: %+v", vid, location)
+
+ locations, found := vc.ecVid2Locations[vid]
+ if !found {
+ vc.ecVid2Locations[vid] = []Location{location}
+ return
+ }
+
+ for _, loc := range locations {
+ if loc.Url == location.Url {
+ return
+ }
+ }
+
+ vc.ecVid2Locations[vid] = append(locations, location)
+
+}
+
func (vc *vidMap) deleteLocation(vid uint32, location Location) {
vc.Lock()
defer vc.Unlock()
+ glog.V(4).Infof("- volume id %d: %+v", vid, location)
+
locations, found := vc.vid2Locations[vid]
if !found {
return
@@ -165,3 +199,23 @@ func (vc *vidMap) deleteLocation(vid uint32, location Location) {
}
}
+
+func (vc *vidMap) deleteEcLocation(vid uint32, location Location) {
+ vc.Lock()
+ defer vc.Unlock()
+
+ glog.V(4).Infof("- ec volume id %d: %+v", vid, location)
+
+ locations, found := vc.ecVid2Locations[vid]
+ if !found {
+ return
+ }
+
+ for i, loc := range locations {
+ if loc.Url == location.Url {
+ vc.ecVid2Locations[vid] = append(locations[0:i], locations[i+1:]...)
+ break
+ }
+ }
+
+}