mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
Merge branch 'master' into add_remote_storage
This commit is contained in:
commit
42969c9c62
1
go.mod
1
go.mod
|
@ -90,6 +90,7 @@ require (
|
||||||
gopkg.in/jcmturner/goidentity.v3 v3.0.0 // indirect
|
gopkg.in/jcmturner/goidentity.v3 v3.0.0 // indirect
|
||||||
gopkg.in/jcmturner/gokrb5.v7 v7.3.0 // indirect
|
gopkg.in/jcmturner/gokrb5.v7 v7.3.0 // indirect
|
||||||
modernc.org/sqlite v1.10.7
|
modernc.org/sqlite v1.10.7
|
||||||
|
github.com/posener/complete v1.2.3
|
||||||
)
|
)
|
||||||
|
|
||||||
// replace github.com/seaweedfs/fuse => /Users/chris/go/src/github.com/seaweedfs/fuse
|
// replace github.com/seaweedfs/fuse => /Users/chris/go/src/github.com/seaweedfs/fuse
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -364,10 +364,12 @@ github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc
|
||||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
||||||
github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
|
github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
|
||||||
github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||||
|
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||||
|
github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=
|
||||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
||||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
||||||
|
@ -571,6 +573,8 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||||
|
github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo=
|
||||||
|
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
|
||||||
github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc=
|
github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc=
|
||||||
github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI=
|
github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI=
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
description: SeaweedFS
|
description: SeaweedFS
|
||||||
name: seaweedfs
|
name: seaweedfs
|
||||||
appVersion: "2.60"
|
appVersion: "2.61"
|
||||||
version: "2.60"
|
version: "2.61"
|
||||||
|
|
|
@ -4,7 +4,6 @@ global:
|
||||||
registry: ""
|
registry: ""
|
||||||
repository: ""
|
repository: ""
|
||||||
imageName: chrislusf/seaweedfs
|
imageName: chrislusf/seaweedfs
|
||||||
# imageTag: "2.60" - started using {.Chart.appVersion}
|
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
imagePullSecrets: imagepullsecret
|
imagePullSecrets: imagepullsecret
|
||||||
restartPolicy: Always
|
restartPolicy: Always
|
||||||
|
|
109
weed/command/autocomplete.go
Normal file
109
weed/command/autocomplete.go
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
package command
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
flag "github.com/chrislusf/seaweedfs/weed/util/fla9"
|
||||||
|
"github.com/posener/complete"
|
||||||
|
completeinstall "github.com/posener/complete/cmd/install"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func AutocompleteMain(commands []*Command) bool {
|
||||||
|
subCommands := make(map[string]complete.Command)
|
||||||
|
helpSubCommands := make(map[string]complete.Command)
|
||||||
|
for _, cmd := range commands {
|
||||||
|
flags := make(map[string]complete.Predictor)
|
||||||
|
cmd.Flag.VisitAll(func(flag *flag.Flag) {
|
||||||
|
flags["-"+flag.Name] = complete.PredictAnything
|
||||||
|
})
|
||||||
|
|
||||||
|
subCommands[cmd.Name()] = complete.Command{
|
||||||
|
Flags: flags,
|
||||||
|
}
|
||||||
|
helpSubCommands[cmd.Name()] = complete.Command{}
|
||||||
|
}
|
||||||
|
subCommands["help"] = complete.Command{Sub: helpSubCommands}
|
||||||
|
|
||||||
|
globalFlags := make(map[string]complete.Predictor)
|
||||||
|
flag.VisitAll(func(flag *flag.Flag) {
|
||||||
|
globalFlags["-"+flag.Name] = complete.PredictAnything
|
||||||
|
})
|
||||||
|
|
||||||
|
weedCmd := complete.Command{
|
||||||
|
Sub: subCommands,
|
||||||
|
Flags: globalFlags,
|
||||||
|
GlobalFlags: complete.Flags{"-h": complete.PredictNothing},
|
||||||
|
}
|
||||||
|
cmp := complete.New("weed", weedCmd)
|
||||||
|
|
||||||
|
return cmp.Complete()
|
||||||
|
}
|
||||||
|
|
||||||
|
func installAutoCompletion() bool {
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
fmt.Println("windows is not supported")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
err := completeinstall.Install("weed")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("install failed! %s\n", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
fmt.Printf("autocompletion is enabled. Please restart your shell.\n")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func uninstallAutoCompletion() bool {
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
fmt.Println("windows is not supported")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
err := completeinstall.Uninstall("weed")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("uninstall failed! %s\n", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
fmt.Printf("autocompletion is disable. Please restart your shell.\n")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
var cmdAutocomplete = &Command{
|
||||||
|
Run: runAutocomplete,
|
||||||
|
UsageLine: "autocomplete",
|
||||||
|
Short: "install autocomplete",
|
||||||
|
Long: `weed autocomplete is installed in the shell.
|
||||||
|
|
||||||
|
Supported shells are bash, zsh, and fish.
|
||||||
|
Windows is not supported.
|
||||||
|
|
||||||
|
`,
|
||||||
|
}
|
||||||
|
|
||||||
|
func runAutocomplete(cmd *Command, args []string) bool {
|
||||||
|
if len(args) != 0 {
|
||||||
|
cmd.Usage()
|
||||||
|
}
|
||||||
|
|
||||||
|
return installAutoCompletion()
|
||||||
|
}
|
||||||
|
|
||||||
|
var cmdUnautocomplete = &Command{
|
||||||
|
Run: runUnautocomplete,
|
||||||
|
UsageLine: "autocomplete.uninstall",
|
||||||
|
Short: "uninstall autocomplete",
|
||||||
|
Long: `weed autocomplete is uninstalled in the shell.
|
||||||
|
|
||||||
|
Windows is not supported.
|
||||||
|
|
||||||
|
`,
|
||||||
|
}
|
||||||
|
|
||||||
|
func runUnautocomplete(cmd *Command, args []string) bool {
|
||||||
|
if len(args) != 0 {
|
||||||
|
cmd.Usage()
|
||||||
|
}
|
||||||
|
|
||||||
|
return uninstallAutoCompletion()
|
||||||
|
}
|
|
@ -8,6 +8,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var Commands = []*Command{
|
var Commands = []*Command{
|
||||||
|
cmdAutocomplete,
|
||||||
|
cmdUnautocomplete,
|
||||||
cmdBackup,
|
cmdBackup,
|
||||||
cmdBenchmark,
|
cmdBenchmark,
|
||||||
cmdCompact,
|
cmdCompact,
|
||||||
|
|
|
@ -52,11 +52,11 @@ var cmdFilerBackup = &Command{
|
||||||
|
|
||||||
func runFilerBackup(cmd *Command, args []string) bool {
|
func runFilerBackup(cmd *Command, args []string) bool {
|
||||||
|
|
||||||
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client")
|
|
||||||
|
|
||||||
util.LoadConfiguration("security", false)
|
util.LoadConfiguration("security", false)
|
||||||
util.LoadConfiguration("replication", true)
|
util.LoadConfiguration("replication", true)
|
||||||
|
|
||||||
|
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client")
|
||||||
|
|
||||||
for {
|
for {
|
||||||
err := doFilerBackup(grpcDialOption, &filerBackupOptions)
|
err := doFilerBackup(grpcDialOption, &filerBackupOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -53,6 +53,7 @@ The backup writes to another filer store specified in a backup_filer.toml.
|
||||||
|
|
||||||
func runFilerMetaBackup(cmd *Command, args []string) bool {
|
func runFilerMetaBackup(cmd *Command, args []string) bool {
|
||||||
|
|
||||||
|
util.LoadConfiguration("security", false)
|
||||||
metaBackup.grpcDialOption = security.LoadClientTLS(util.GetViper(), "grpc.client")
|
metaBackup.grpcDialOption = security.LoadClientTLS(util.GetViper(), "grpc.client")
|
||||||
|
|
||||||
// load backup_filer.toml
|
// load backup_filer.toml
|
||||||
|
|
|
@ -45,6 +45,7 @@ var (
|
||||||
|
|
||||||
func runFilerMetaTail(cmd *Command, args []string) bool {
|
func runFilerMetaTail(cmd *Command, args []string) bool {
|
||||||
|
|
||||||
|
util.LoadConfiguration("security", false)
|
||||||
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client")
|
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client")
|
||||||
|
|
||||||
var filterFunc func(dir, fname string) bool
|
var filterFunc func(dir, fname string) bool
|
||||||
|
|
|
@ -89,6 +89,7 @@ var cmdFilerSynchronize = &Command{
|
||||||
|
|
||||||
func runFilerSynchronize(cmd *Command, args []string) bool {
|
func runFilerSynchronize(cmd *Command, args []string) bool {
|
||||||
|
|
||||||
|
util.LoadConfiguration("security", false)
|
||||||
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client")
|
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client")
|
||||||
|
|
||||||
grace.SetupProfiling(*syncCpuProfile, *syncMemProfile)
|
grace.SetupProfiling(*syncCpuProfile, *syncMemProfile)
|
||||||
|
|
|
@ -49,6 +49,7 @@ func (iamopt *IamOptions) startIamServer() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
util.LoadConfiguration("security", false)
|
||||||
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client")
|
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client")
|
||||||
for {
|
for {
|
||||||
err = pb.WithGrpcFilerClient(filerGrpcAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error {
|
err = pb.WithGrpcFilerClient(filerGrpcAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error {
|
||||||
|
|
|
@ -11,7 +11,7 @@ scripts = """
|
||||||
ec.encode -fullPercent=95 -quietFor=1h
|
ec.encode -fullPercent=95 -quietFor=1h
|
||||||
ec.rebuild -force
|
ec.rebuild -force
|
||||||
ec.balance -force
|
ec.balance -force
|
||||||
volume.deleteEmpty -quietFor=24h
|
volume.deleteEmpty -quietFor=24h -force
|
||||||
volume.balance -force
|
volume.balance -force
|
||||||
volume.fix.replication
|
volume.fix.replication
|
||||||
unlock
|
unlock
|
||||||
|
|
|
@ -71,13 +71,13 @@ func runUpload(cmd *Command, args []string) bool {
|
||||||
util.LoadConfiguration("security", false)
|
util.LoadConfiguration("security", false)
|
||||||
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client")
|
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client")
|
||||||
|
|
||||||
defaultCollection, err := readMasterConfiguration(grpcDialOption, *upload.master)
|
defaultReplication, err := readMasterConfiguration(grpcDialOption, *upload.master)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("upload: %v", err)
|
fmt.Printf("upload: %v", err)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if *upload.replication == "" {
|
if *upload.replication == "" {
|
||||||
*upload.replication = defaultCollection
|
*upload.replication = defaultReplication
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
|
|
|
@ -120,6 +120,21 @@ func balanceVolumeServers(commandEnv *CommandEnv, diskTypes []types.DiskType, vo
|
||||||
|
|
||||||
func balanceVolumeServersByDiskType(commandEnv *CommandEnv, diskType types.DiskType, volumeReplicas map[uint32][]*VolumeReplica, nodes []*Node, volumeSizeLimit uint64, collection string, applyBalancing bool) error {
|
func balanceVolumeServersByDiskType(commandEnv *CommandEnv, diskType types.DiskType, volumeReplicas map[uint32][]*VolumeReplica, nodes []*Node, volumeSizeLimit uint64, collection string, applyBalancing bool) error {
|
||||||
|
|
||||||
|
// balance read only volumes
|
||||||
|
for _, n := range nodes {
|
||||||
|
n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool {
|
||||||
|
if collection != "ALL_COLLECTIONS" {
|
||||||
|
if v.Collection != collection {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return v.DiskType == string(diskType) && (v.ReadOnly || v.Size >= volumeSizeLimit)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if err := balanceSelectedVolume(commandEnv, volumeReplicas, nodes, capacityByMaxVolumeCount(diskType), sortReadOnlyVolumes, applyBalancing); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// balance writable volumes
|
// balance writable volumes
|
||||||
for _, n := range nodes {
|
for _, n := range nodes {
|
||||||
n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool {
|
n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool {
|
||||||
|
@ -135,21 +150,6 @@ func balanceVolumeServersByDiskType(commandEnv *CommandEnv, diskType types.DiskT
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// balance readable volumes
|
|
||||||
for _, n := range nodes {
|
|
||||||
n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool {
|
|
||||||
if collection != "ALL_COLLECTIONS" {
|
|
||||||
if v.Collection != collection {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return v.DiskType == string(diskType) && (v.ReadOnly || v.Size >= volumeSizeLimit)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
if err := balanceSelectedVolume(commandEnv, volumeReplicas, nodes, capacityByMaxVolumeCount(diskType), sortReadOnlyVolumes, applyBalancing); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,10 @@ package shell
|
||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
"github.com/chrislusf/seaweedfs/weed/pb/master_pb"
|
"github.com/chrislusf/seaweedfs/weed/pb/master_pb"
|
||||||
|
"github.com/chrislusf/seaweedfs/weed/storage/needle"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/chrislusf/seaweedfs/weed/storage/needle"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -24,7 +23,7 @@ func (c *commandVolumeDeleteEmpty) Name() string {
|
||||||
func (c *commandVolumeDeleteEmpty) Help() string {
|
func (c *commandVolumeDeleteEmpty) Help() string {
|
||||||
return `delete empty volumes from all volume servers
|
return `delete empty volumes from all volume servers
|
||||||
|
|
||||||
volume.deleteEmpty -quietFor=24h
|
volume.deleteEmpty -quietFor=24h -force
|
||||||
|
|
||||||
This command deletes all empty volumes from one volume server.
|
This command deletes all empty volumes from one volume server.
|
||||||
|
|
||||||
|
@ -39,6 +38,7 @@ func (c *commandVolumeDeleteEmpty) Do(args []string, commandEnv *CommandEnv, wri
|
||||||
|
|
||||||
volDeleteCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError)
|
volDeleteCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError)
|
||||||
quietPeriod := volDeleteCommand.Duration("quietFor", 24*time.Hour, "select empty volumes with no recent writes, avoid newly created ones")
|
quietPeriod := volDeleteCommand.Duration("quietFor", 24*time.Hour, "select empty volumes with no recent writes, avoid newly created ones")
|
||||||
|
applyBalancing := volDeleteCommand.Bool("force", false, "apply to delete empty volumes")
|
||||||
if err = volDeleteCommand.Parse(args); err != nil {
|
if err = volDeleteCommand.Parse(args); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -55,11 +55,16 @@ func (c *commandVolumeDeleteEmpty) Do(args []string, commandEnv *CommandEnv, wri
|
||||||
eachDataNode(topologyInfo, func(dc string, rack RackId, dn *master_pb.DataNodeInfo) {
|
eachDataNode(topologyInfo, func(dc string, rack RackId, dn *master_pb.DataNodeInfo) {
|
||||||
for _, diskInfo := range dn.DiskInfos {
|
for _, diskInfo := range dn.DiskInfos {
|
||||||
for _, v := range diskInfo.VolumeInfos {
|
for _, v := range diskInfo.VolumeInfos {
|
||||||
if v.Size <= 8 && v.ModifiedAtSecond + quietSeconds < nowUnixSeconds {
|
if v.Size <= 8 && v.ModifiedAtSecond+quietSeconds < nowUnixSeconds {
|
||||||
|
if *applyBalancing {
|
||||||
log.Printf("deleting empty volume %d from %s", v.Id, dn.Id)
|
log.Printf("deleting empty volume %d from %s", v.Id, dn.Id)
|
||||||
if deleteErr := deleteVolume(commandEnv.option.GrpcDialOption, needle.VolumeId(v.Id), dn.Id); deleteErr != nil {
|
if deleteErr := deleteVolume(commandEnv.option.GrpcDialOption, needle.VolumeId(v.Id), dn.Id); deleteErr != nil {
|
||||||
err = deleteErr
|
err = deleteErr
|
||||||
}
|
}
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
log.Printf("empty volume %d from %s", v.Id, dn.Id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,7 +160,7 @@ func (c *commandVolumeFixReplication) fixUnderReplicatedVolumes(commandEnv *Comm
|
||||||
for _, vid := range underReplicatedVolumeIds {
|
for _, vid := range underReplicatedVolumeIds {
|
||||||
for i := 0; i < retryCount+1; i++ {
|
for i := 0; i < retryCount+1; i++ {
|
||||||
if err = c.fixOneUnderReplicatedVolume(commandEnv, writer, takeAction, volumeReplicas, vid, allLocations); err == nil {
|
if err = c.fixOneUnderReplicatedVolume(commandEnv, writer, takeAction, volumeReplicas, vid, allLocations); err == nil {
|
||||||
continue
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 60)
|
VERSION = fmt.Sprintf("%s %.02f", sizeLimit, 2.61)
|
||||||
COMMIT = ""
|
COMMIT = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,11 @@ func main() {
|
||||||
glog.MaxSize = 1024 * 1024 * 32
|
glog.MaxSize = 1024 * 1024 * 32
|
||||||
rand.Seed(time.Now().UnixNano())
|
rand.Seed(time.Now().UnixNano())
|
||||||
flag.Usage = usage
|
flag.Usage = usage
|
||||||
|
|
||||||
|
if command.AutocompleteMain(commands) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
args := flag.Args()
|
args := flag.Args()
|
||||||
|
|
Loading…
Reference in a new issue