aboutsummaryrefslogtreecommitdiff
path: root/weed/shell/command_volume_tier_move.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2021-08-10 03:08:29 -0700
committerChris Lu <chris.lu@gmail.com>2021-08-10 03:08:29 -0700
commit48f448ee0930f2784e90662d3de92e0ed2454de9 (patch)
tree375e46e390b18356130fd405c39dd9cfa91142de /weed/shell/command_volume_tier_move.go
parent69a6da79696c1efe1e77f03c41f9c56c2bb90492 (diff)
downloadseaweedfs-48f448ee0930f2784e90662d3de92e0ed2454de9.tar.xz
seaweedfs-48f448ee0930f2784e90662d3de92e0ed2454de9.zip
parallelize tier move
Diffstat (limited to 'weed/shell/command_volume_tier_move.go')
-rw-r--r--weed/shell/command_volume_tier_move.go22
1 files changed, 20 insertions, 2 deletions
diff --git a/weed/shell/command_volume_tier_move.go b/weed/shell/command_volume_tier_move.go
index bf623b899..6a28b7970 100644
--- a/weed/shell/command_volume_tier_move.go
+++ b/weed/shell/command_volume_tier_move.go
@@ -133,9 +133,27 @@ func (c *commandVolumeTierMove) doVolumeTierMove(commandEnv *CommandEnv, writer
break
}
- if err := c.doMoveOneVolume(commandEnv, writer, vid, toDiskType, locations, sourceVolumeServer, dst); err != nil {
- return err
+ c.activeServersCond.L.Lock()
+ _, isSourceActive := c.activeServers[sourceVolumeServer]
+ _, isDestActive := c.activeServers[dst.dataNode.Id]
+ for isSourceActive || isDestActive {
+ c.activeServersCond.Wait()
+ _, isSourceActive = c.activeServers[sourceVolumeServer]
+ _, isDestActive = c.activeServers[dst.dataNode.Id]
}
+ c.activeServers[sourceVolumeServer] = struct{}{}
+ c.activeServers[dst.dataNode.Id] = struct{}{}
+ c.activeServersCond.L.Unlock()
+
+ go func(dst location) {
+ if err := c.doMoveOneVolume(commandEnv, writer, vid, toDiskType, locations, sourceVolumeServer, dst); err != nil {
+ fmt.Fprintf(writer, "move volume %d %s => %s: %v", vid, sourceVolumeServer, dst.dataNode.Id, err)
+ }
+ delete(c.activeServers, sourceVolumeServer)
+ delete(c.activeServers, dst.dataNode.Id)
+ c.activeServersCond.Signal()
+ }(dst)
+
}
}