diff --git a/cmd/rmr.go b/cmd/rmr.go index 91240b07e9f6..2ad1090e03b6 100644 --- a/cmd/rmr.go +++ b/cmd/rmr.go @@ -47,7 +47,7 @@ $ juicefs rmr /mnt/jfs/foo`, Name: "threads", Aliases: []string{"p"}, Value: 50, - Usage: "number of threads for delete jobs (appropriate value)", + Usage: "number of threads for delete jobs (value from 2 to 255)", }, }, } @@ -71,15 +71,12 @@ func openController(dpath string) (*os.File, error) { func rmr(ctx *cli.Context) error { setup(ctx, 1) var flag uint8 - var numThreads int + var numThreads uint8 - numThreads = ctx.Int("threads") + numThreads = uint8(ctx.Int("threads")) if numThreads < 2 { numThreads = 2 } - if numThreads > 127 { - numThreads = 127 - } if ctx.Bool("skip-trash") { if os.Getuid() != 0 { logger.Fatalf("Only root can remove files directly") @@ -112,7 +109,8 @@ func rmr(ctx *cli.Context) error { wb.Put64(inode) wb.Put8(uint8(len(name))) wb.Put([]byte(name)) - wb.Put8(flag + uint8(numThreads * 2)) + wb.Put8(flag) + wb.Put8(numThreads) _, err = f.Write(wb.Bytes()) if err != nil { logger.Fatalf("write message: %s", err) diff --git a/pkg/meta/utils.go b/pkg/meta/utils.go index 1353d59077df..49f8d33d2e23 100644 --- a/pkg/meta/utils.go +++ b/pkg/meta/utils.go @@ -352,6 +352,10 @@ func (m *baseMeta) RemoveEx(ctx Context, parent Ino, name string, skipTrash bool } if numThreads <= 0 { numThreads = 50 + } else if numThreads < 2 { + numThreads = 2 + } else if numThreads > 255 { + numThreads = 255 } concurrent := make(chan int, numThreads) return m.emptyEntry(ctx, parent, name, inode, skipTrash, count, concurrent) diff --git a/pkg/vfs/internal.go b/pkg/vfs/internal.go index e0dfb7f1b54c..87e86b791bcf 100644 --- a/pkg/vfs/internal.go +++ b/pkg/vfs/internal.go @@ -298,22 +298,17 @@ func (v *VFS) handleInternalMsg(ctx meta.Context, cmd uint32, r *utils.Buffer, o inode := Ino(r.Get64()) name := string(r.Get(int(r.Get8()))) var skipTrash bool - var numThreads int = 50 + var numThreads uint8 = 50 if r.HasMore() { - numThreads = int(r.Get8()) - skipTrash = numThreads&1 != 0 - numThreads = numThreads / 2 - if numThreads == 0 { - numThreads = 50 - } - if numThreads < 2 { - numThreads = 2 + skipTrash = r.Get8()&1 != 0 + if r.HasMore() { + numThreads = r.Get8() } } var count uint64 var st syscall.Errno go func() { - st = v.Meta.RemoveEx(ctx, inode, name, skipTrash, numThreads, &count) + st = v.Meta.RemoveEx(ctx, inode, name, skipTrash, int(numThreads), &count) if st != 0 { logger.Errorf("remove %d/%s: %s", inode, name, st) }