mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
MasterClient replicates all vid locations
This commit is contained in:
parent
01bcc89803
commit
1d779389cb
|
@ -18,13 +18,13 @@ import (
|
|||
type Filer struct {
|
||||
store FilerStore
|
||||
directoryCache *ccache.Cache
|
||||
masterClient *wdclient.MasterClient
|
||||
MasterClient *wdclient.MasterClient
|
||||
}
|
||||
|
||||
func NewFiler(masters []string) *Filer {
|
||||
return &Filer{
|
||||
directoryCache: ccache.New(ccache.Configure().MaxSize(1000).ItemsToPrune(100)),
|
||||
masterClient: wdclient.NewMasterClient(context.Background(), "filer", masters),
|
||||
MasterClient: wdclient.NewMasterClient(context.Background(), "filer", masters),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -37,11 +37,11 @@ func (f *Filer) DisableDirectoryCache() {
|
|||
}
|
||||
|
||||
func (fs *Filer) GetMaster() string {
|
||||
return fs.masterClient.GetMaster()
|
||||
return fs.MasterClient.GetMaster()
|
||||
}
|
||||
|
||||
func (fs *Filer) KeepConnectedToMaster() {
|
||||
fs.masterClient.KeepConnectedToMaster()
|
||||
fs.MasterClient.KeepConnectedToMaster()
|
||||
}
|
||||
|
||||
func (f *Filer) CreateEntry(entry *Entry) error {
|
||||
|
|
|
@ -99,24 +99,24 @@ func (fs *FilerServer) GetEntryAttributes(ctx context.Context, req *filer_pb.Get
|
|||
|
||||
func (fs *FilerServer) LookupVolume(ctx context.Context, req *filer_pb.LookupVolumeRequest) (*filer_pb.LookupVolumeResponse, error) {
|
||||
|
||||
lookupResult, err := operation.LookupVolumeIds(fs.filer.GetMaster(), req.VolumeIds)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp := &filer_pb.LookupVolumeResponse{
|
||||
LocationsMap: make(map[string]*filer_pb.Locations),
|
||||
}
|
||||
|
||||
for vid, locations := range lookupResult {
|
||||
for _, vidString := range req.VolumeIds {
|
||||
vid, err := strconv.Atoi(vidString)
|
||||
if err != nil {
|
||||
glog.V(1).Infof("Unknown volume id %s", vid)
|
||||
return nil, err
|
||||
}
|
||||
var locs []*filer_pb.Location
|
||||
for _, loc := range locations.Locations {
|
||||
for _, loc := range fs.filer.MasterClient.GetLocations(uint32(vid)) {
|
||||
locs = append(locs, &filer_pb.Location{
|
||||
Url: loc.Url,
|
||||
PublicUrl: loc.PublicUrl,
|
||||
})
|
||||
}
|
||||
resp.LocationsMap[vid] = &filer_pb.Locations{
|
||||
resp.LocationsMap[vidString] = &filer_pb.Locations{
|
||||
Locations: locs,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,6 +15,8 @@ type MasterClient struct {
|
|||
name string
|
||||
currentMaster string
|
||||
masters []string
|
||||
|
||||
VidMap
|
||||
}
|
||||
|
||||
func NewMasterClient(ctx context.Context, clientName string, masters []string) *MasterClient {
|
||||
|
@ -61,6 +63,16 @@ func (mc *MasterClient) tryAllMasters() {
|
|||
return err
|
||||
} else {
|
||||
glog.V(0).Infof("volume location: %+v", volumeLocation)
|
||||
loc := Location{
|
||||
Url: volumeLocation.Url,
|
||||
PublicUrl: volumeLocation.PublicUrl,
|
||||
}
|
||||
for _, newVid := range volumeLocation.NewVids {
|
||||
mc.AddLocation(newVid, loc)
|
||||
}
|
||||
for _, deletedVid := range volumeLocation.DeletedVids {
|
||||
mc.DeleteLocation(deletedVid, loc)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
59
weed/wdclient/vid_map.go
Normal file
59
weed/wdclient/vid_map.go
Normal file
|
@ -0,0 +1,59 @@
|
|||
package wdclient
|
||||
|
||||
import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Location struct {
|
||||
Url string `json:"url,omitempty"`
|
||||
PublicUrl string `json:"publicUrl,omitempty"`
|
||||
}
|
||||
|
||||
type VidMap struct {
|
||||
sync.RWMutex
|
||||
vid2Locations map[uint32][]Location
|
||||
}
|
||||
|
||||
func (vc *VidMap) GetLocations(vid uint32) (locations []Location) {
|
||||
vc.RLock()
|
||||
defer vc.RUnlock()
|
||||
|
||||
return vc.vid2Locations[vid]
|
||||
}
|
||||
|
||||
func (vc *VidMap) AddLocation(vid uint32, location Location) {
|
||||
vc.Lock()
|
||||
defer vc.Unlock()
|
||||
|
||||
locations, found := vc.vid2Locations[vid]
|
||||
if !found {
|
||||
vc.vid2Locations[vid] = []Location{location}
|
||||
return
|
||||
}
|
||||
|
||||
for _, loc := range locations {
|
||||
if loc.Url == location.Url {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
vc.vid2Locations[vid] = append(locations, location)
|
||||
|
||||
}
|
||||
|
||||
func (vc *VidMap) DeleteLocation(vid uint32, location Location) {
|
||||
vc.Lock()
|
||||
defer vc.Unlock()
|
||||
|
||||
locations, found := vc.vid2Locations[vid]
|
||||
if !found {
|
||||
return
|
||||
}
|
||||
|
||||
for i, loc := range locations {
|
||||
if loc.Url == location.Url {
|
||||
vc.vid2Locations[vid] = append(locations[0:i], locations[i+1:]...)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue