diff options
| author | Chris Lu <chris.lu@gmail.com> | 2021-08-10 03:08:29 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2021-08-10 03:08:29 -0700 |
| commit | 48f448ee0930f2784e90662d3de92e0ed2454de9 (patch) | |
| tree | 375e46e390b18356130fd405c39dd9cfa91142de | |
| parent | 69a6da79696c1efe1e77f03c41f9c56c2bb90492 (diff) | |
| download | seaweedfs-48f448ee0930f2784e90662d3de92e0ed2454de9.tar.xz seaweedfs-48f448ee0930f2784e90662d3de92e0ed2454de9.zip | |
parallelize tier move
| -rw-r--r-- | weed/shell/command_volume_tier_move.go | 22 |
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) + } } |
