Browse Source

volume: Don't unmount before deleting volume in copy

If we unmount first and then delete, the delete fails because the volume
was unmounted. Delete ends up doing the same thing as the unmount anyways.
pull/1444/head
James Hartig 4 years ago
parent
commit
8e54e34576
  1. 9
      weed/server/volume_grpc_copy.go
  2. 3
      weed/storage/disk_location.go
  3. 2
      weed/storage/store.go

9
weed/server/volume_grpc_copy.go

@ -27,17 +27,12 @@ func (vs *VolumeServer) VolumeCopy(ctx context.Context, req *volume_server_pb.Vo
glog.V(0).Infof("volume %d already exists. deleted before copying...", req.VolumeId) glog.V(0).Infof("volume %d already exists. deleted before copying...", req.VolumeId)
err := vs.store.UnmountVolume(needle.VolumeId(req.VolumeId))
if err != nil {
return nil, fmt.Errorf("failed to mount existing volume %d: %v", req.VolumeId, err)
}
err = vs.store.DeleteVolume(needle.VolumeId(req.VolumeId))
err := vs.store.DeleteVolume(needle.VolumeId(req.VolumeId))
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to delete existing volume %d: %v", req.VolumeId, err) return nil, fmt.Errorf("failed to delete existing volume %d: %v", req.VolumeId, err)
} }
glog.V(0).Infof("deleted exisitng volume %d before copying.", req.VolumeId)
glog.V(0).Infof("deleted existing volume %d before copying.", req.VolumeId)
} }
location := vs.store.FindFreeLocation() location := vs.store.FindFreeLocation()

3
weed/storage/disk_location.go

@ -174,6 +174,9 @@ func (l *DiskLocation) DeleteCollectionFromDiskLocation(collection string) (e er
} }
func (l *DiskLocation) deleteVolumeById(vid needle.VolumeId) (found bool, e error) { func (l *DiskLocation) deleteVolumeById(vid needle.VolumeId) (found bool, e error) {
l.volumesLock.Lock()
defer l.volumesLock.Unlock()
v, ok := l.volumes[vid] v, ok := l.volumes[vid]
if !ok { if !ok {
return return

2
weed/storage/store.go

@ -380,7 +380,7 @@ func (s *Store) DeleteVolume(i needle.VolumeId) error {
Ttl: v.Ttl.ToUint32(), Ttl: v.Ttl.ToUint32(),
} }
for _, location := range s.Locations { for _, location := range s.Locations {
if found, error := location.deleteVolumeById(i); found && error == nil {
if found, err := location.deleteVolumeById(i); found && err == nil {
glog.V(0).Infof("DeleteVolume %d", i) glog.V(0).Infof("DeleteVolume %d", i)
s.DeletedVolumesChan <- message s.DeletedVolumesChan <- message
return nil return nil

Loading…
Cancel
Save