aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chrislusf@users.noreply.github.com>2021-11-11 01:20:21 -0800
committerGitHub <noreply@github.com>2021-11-11 01:20:21 -0800
commitcef2718ede4db2f749d0a3029f378b1355b07830 (patch)
tree1c001f32000c045a8b68a4cdf9d7e0e7af9b7107
parent835e2d2ddf959dc8dd234021ac3cde72bd9e9246 (diff)
parent9668b15f3868b5084961a27fb79588b01ae9a91e (diff)
downloadseaweedfs-cef2718ede4db2f749d0a3029f378b1355b07830.tar.xz
seaweedfs-cef2718ede4db2f749d0a3029f378b1355b07830.zip
Merge pull request #2438 from ekhvalov/volume_replication_collection
Volume configure replication by collection pattern
-rw-r--r--weed/shell/command_volume_configure_replication.go24
1 files changed, 21 insertions, 3 deletions
diff --git a/weed/shell/command_volume_configure_replication.go b/weed/shell/command_volume_configure_replication.go
index 5640e58bb..7e9627b40 100644
--- a/weed/shell/command_volume_configure_replication.go
+++ b/weed/shell/command_volume_configure_replication.go
@@ -7,6 +7,7 @@ import (
"fmt"
"github.com/chrislusf/seaweedfs/weed/pb"
"io"
+ "path/filepath"
"github.com/chrislusf/seaweedfs/weed/operation"
"github.com/chrislusf/seaweedfs/weed/pb/master_pb"
@@ -34,11 +35,12 @@ func (c *commandVolumeConfigureReplication) Help() string {
`
}
-func (c *commandVolumeConfigureReplication) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) {
+func (c *commandVolumeConfigureReplication) Do(args []string, commandEnv *CommandEnv, _ io.Writer) (err error) {
configureReplicationCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError)
volumeIdInt := configureReplicationCommand.Int("volumeId", 0, "the volume id")
replicationString := configureReplicationCommand.String("replication", "", "the intended replication value")
+ collectionPattern := configureReplicationCommand.String("collectionPattern", "", "match with wildcard characters '*' and '?'")
if err = configureReplicationCommand.Parse(args); err != nil {
return nil
}
@@ -55,7 +57,6 @@ func (c *commandVolumeConfigureReplication) Do(args []string, commandEnv *Comman
if err != nil {
return fmt.Errorf("replication format: %v", err)
}
- replicaPlacementInt32 := uint32(replicaPlacement.Byte())
// collect topology information
topologyInfo, _, err := collectTopologyInfo(commandEnv)
@@ -64,6 +65,7 @@ func (c *commandVolumeConfigureReplication) Do(args []string, commandEnv *Comman
}
vid := needle.VolumeId(*volumeIdInt)
+ volumeFilter := getVolumeFilter(replicaPlacement, uint32(vid), *collectionPattern)
// find all data nodes with volumes that needs replication change
var allLocations []location
@@ -71,7 +73,7 @@ func (c *commandVolumeConfigureReplication) Do(args []string, commandEnv *Comman
loc := newLocation(dc, string(rack), dn)
for _, diskInfo := range dn.DiskInfos {
for _, v := range diskInfo.VolumeInfos {
- if v.Id == uint32(vid) && v.ReplicaPlacement != replicaPlacementInt32 {
+ if volumeFilter(v) {
allLocations = append(allLocations, loc)
continue
}
@@ -106,3 +108,19 @@ func (c *commandVolumeConfigureReplication) Do(args []string, commandEnv *Comman
return nil
}
+
+func getVolumeFilter(replicaPlacement *super_block.ReplicaPlacement, volumeId uint32, collectionPattern string) func(message *master_pb.VolumeInformationMessage) bool {
+ replicaPlacementInt32 := uint32(replicaPlacement.Byte())
+ if volumeId > 0 {
+ return func(v *master_pb.VolumeInformationMessage) bool {
+ return v.Id == volumeId && v.ReplicaPlacement != replicaPlacementInt32
+ }
+ }
+ return func(v *master_pb.VolumeInformationMessage) bool {
+ matched, err := filepath.Match(collectionPattern, v.Collection)
+ if err != nil {
+ return false
+ }
+ return matched
+ }
+}