From 8f03c6e0dbe7809c662e1769f2e1c9ed23c66046 Mon Sep 17 00:00:00 2001 From: Anis Eleuch Date: Fri, 1 Mar 2024 17:01:28 +0100 Subject: [PATCH] xl: Avoid called getdents for folders in listing (#19100) --- cmd/is-dir-empty_linux.go | 32 ++++++++++++++++++++++++++++++++ cmd/is-dir-empty_other.go | 30 ++++++++++++++++++++++++++++++ cmd/xl-storage.go | 9 --------- 3 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 cmd/is-dir-empty_linux.go create mode 100644 cmd/is-dir-empty_other.go diff --git a/cmd/is-dir-empty_linux.go b/cmd/is-dir-empty_linux.go new file mode 100644 index 000000000..f7ad4f74f --- /dev/null +++ b/cmd/is-dir-empty_linux.go @@ -0,0 +1,32 @@ +//go:build linux && !appengine +// +build linux,!appengine + +// Copyright (c) 2015-2024 MinIO, Inc. +// +// This file is part of MinIO Object Storage stack +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package cmd + +import "syscall" + +// Returns true if no error and there is no object or prefix inside this directory +func isDirEmpty(dirname string) bool { + var stat syscall.Stat_t + if err := syscall.Stat(dirname, &stat); err != nil { + return false + } + return stat.Mode&syscall.S_IFMT == syscall.S_IFDIR && stat.Nlink < 3 +} diff --git a/cmd/is-dir-empty_other.go b/cmd/is-dir-empty_other.go new file mode 100644 index 000000000..e9ccdc021 --- /dev/null +++ b/cmd/is-dir-empty_other.go @@ -0,0 +1,30 @@ +//go:build !linux +// +build !linux + +// Copyright (c) 2015-2021 MinIO, Inc. +// +// This file is part of MinIO Object Storage stack +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package cmd + +// isDirEmpty - returns true if there is no error and no object and prefix inside this directory +func isDirEmpty(dirname string) bool { + entries, err := readDirN(dirname, 1) + if err != nil { + return false + } + return len(entries) == 0 +} diff --git a/cmd/xl-storage.go b/cmd/xl-storage.go index dc62f08d3..8883a6c04 100644 --- a/cmd/xl-storage.go +++ b/cmd/xl-storage.go @@ -195,15 +195,6 @@ func getValidPath(path string) (string, error) { return path, nil } -// isDirEmpty - returns whether given directory is empty or not. -func isDirEmpty(dirname string) bool { - entries, err := readDirN(dirname, 1) - if err != nil { - return false - } - return len(entries) == 0 -} - // Initialize a new storage disk. func newLocalXLStorage(path string) (*xlStorage, error) { u := url.URL{Path: path}