Browse Source

just refactoring

pull/302/head
Chris Lu 9 years ago
parent
commit
1d86ac8761
  1. 31
      go/storage/disk_location.go
  2. 21
      go/storage/store.go

31
go/storage/disk_location.go

@ -13,10 +13,14 @@ type DiskLocation struct {
volumes map[VolumeId]*Volume
}
func (mn *DiskLocation) reset() {
func NewDiskLocation(dir string, maxVolumeCount int) *DiskLocation {
location := &DiskLocation{Directory: dir, MaxVolumeCount: maxVolumeCount}
location.volumes = make(map[VolumeId]*Volume)
return location
}
func (l *DiskLocation) loadExistingVolumes(needleMapKind NeedleMapType) {
if dirs, err := ioutil.ReadDir(l.Directory); err == nil {
for _, dir := range dirs {
name := dir.Name()
@ -42,3 +46,28 @@ func (l *DiskLocation) loadExistingVolumes(needleMapKind NeedleMapType) {
}
glog.V(0).Infoln("Store started on dir:", l.Directory, "with", len(l.volumes), "volumes", "max", l.MaxVolumeCount)
}
func (l *DiskLocation) DeleteCollectionFromDiskLocation(collection string) (e error) {
for k, v := range l.volumes {
if v.Collection == collection {
e = l.deleteVolumeById(k)
if e != nil {
return
}
}
}
return
}
func (l *DiskLocation) deleteVolumeById(vid VolumeId) (e error) {
v, ok := l.volumes[vid]
if !ok {
return
}
e = v.Destroy()
if e != nil {
return
}
delete(l.volumes, vid)
return
}

21
go/storage/store.go

@ -89,8 +89,7 @@ func NewStore(port int, ip, publicUrl string, dirnames []string, maxVolumeCounts
s = &Store{Port: port, Ip: ip, PublicUrl: publicUrl}
s.Locations = make([]*DiskLocation, 0)
for i := 0; i < len(dirnames); i++ {
location := &DiskLocation{Directory: dirnames[i], MaxVolumeCount: maxVolumeCounts[i]}
location.volumes = make(map[VolumeId]*Volume)
location := NewDiskLocation(dirnames[i], maxVolumeCounts[i])
location.loadExistingVolumes(needleMapKind)
s.Locations = append(s.Locations, location)
}
@ -134,26 +133,14 @@ func (s *Store) AddVolume(volumeListString string, collection string, needleMapK
}
func (s *Store) DeleteCollection(collection string) (e error) {
for _, location := range s.Locations {
for k, v := range location.volumes {
if v.Collection == collection {
e = v.Destroy()
e = location.DeleteCollectionFromDiskLocation(collection)
if e != nil {
return
}
delete(location.volumes, k)
}
}
}
return
}
func (s *Store) DeleteVolume(volumes map[VolumeId]*Volume, v *Volume) (e error) {
e = v.Destroy()
if e != nil {
return
}
delete(volumes, v.Id)
return
}
func (s *Store) findVolume(vid VolumeId) *Volume {
for _, location := range s.Locations {
if v, found := location.volumes[vid]; found {
@ -252,7 +239,7 @@ func (s *Store) SendHeartbeatToMaster() (masterNode string, secretKey security.S
volumeMessages = append(volumeMessages, volumeMessage)
} else {
if v.exiredLongEnough(MAX_TTL_VOLUME_REMOVAL_DELAY) {
s.DeleteVolume(location.volumes, v)
location.deleteVolumeById(v.Id)
glog.V(0).Infoln("volume", v.Id, "is deleted.")
} else {
glog.V(0).Infoln("volume", v.Id, "is expired.")

Loading…
Cancel
Save