diff --git a/.github/scripts/pysdk/pysdk_test.py b/.github/scripts/pysdk/pysdk_test.py index d141611eafbd..d59b31cb6f5c 100644 --- a/.github/scripts/pysdk/pysdk_test.py +++ b/.github/scripts/pysdk/pysdk_test.py @@ -82,7 +82,7 @@ def test_makedir(self): v.makedirs(path) # Should work path = os.path.join(base, 'dir1', 'dir2', 'dir3', 'dir4') v.makedirs(path) - # self.assertRaises(OSError, v.makedirs, os.curdir) + self.assertRaises(OSError, v.makedirs, os.curdir) path = os.path.join(base, 'dir1', 'dir2', 'dir3', 'dir4', 'dir5', os.curdir) path = os.path.join(base, 'dir1', os.curdir, 'dir2', 'dir3', 'dir4', 'dir5', 'dir6') diff --git a/pkg/fs/fs.go b/pkg/fs/fs.go index 1a0448d7a3db..dfebde420e1f 100644 --- a/pkg/fs/fs.go +++ b/pkg/fs/fs.go @@ -462,14 +462,18 @@ func (fs *FileSystem) Mkdir(ctx meta.Context, p string, mode uint16, umask uint1 } func (fs *FileSystem) MkdirAll(ctx meta.Context, p string, mode uint16, umask uint16) (err syscall.Errno) { + return fs.MkdirAll0(ctx, p, mode, umask, true) +} + +func (fs *FileSystem) MkdirAll0(ctx meta.Context, p string, mode uint16, umask uint16, existOK bool) (err syscall.Errno) { err = fs.Mkdir(ctx, p, mode, umask) if err == syscall.ENOENT { - err = fs.MkdirAll(ctx, parentDir(p), mode, umask) - if err == 0 || err == syscall.EEXIST { + err = fs.MkdirAll0(ctx, parentDir(p), mode, umask, existOK) + if err == 0 { err = fs.Mkdir(ctx, p, mode, umask) } } - if err == syscall.EEXIST { + if existOK && err == syscall.EEXIST { err = 0 } return err diff --git a/sdk/java/libjfs/main.go b/sdk/java/libjfs/main.go index bb1ea6dd1019..1ff09ad2d225 100644 --- a/sdk/java/libjfs/main.go +++ b/sdk/java/libjfs/main.go @@ -834,7 +834,7 @@ func jfs_mkdir(pid int64, h int64, cpath *C.char, mode uint16, umask uint16) int } //export jfs_mkdirAll -func jfs_mkdirAll(pid int64, h int64, cpath *C.char, mode, umask uint16) int32 { +func jfs_mkdirAll(pid int64, h int64, cpath *C.char, mode, umask uint16, existOK bool) int32 { w := F(h) if w == nil { return EINVAL diff --git a/sdk/python/juicefs/juicefs/juicefs.py b/sdk/python/juicefs/juicefs/juicefs.py index a82c7f1431dc..beb6203e4471 100644 --- a/sdk/python/juicefs/juicefs/juicefs.py +++ b/sdk/python/juicefs/juicefs/juicefs.py @@ -223,9 +223,9 @@ def mkdir(self, path, mode=0o777): """Create a directory.""" self.lib.jfs_mkdir(c_int64(_tid()), c_int64(self.h), _bin(path), c_uint16(mode&0o777), c_uint16(self.umask)) - def makedirs(self, path, mode=0o777): + def makedirs(self, path, mode=0o777, exist_ok=False): """Create a directory and all its parent components if they do not exist.""" - self.lib.jfs_mkdirAll(c_int64(_tid()), c_int64(self.h), _bin(path), c_uint16(mode&0o777), c_uint16(self.umask)) + self.lib.jfs_mkdirAll(c_int64(_tid()), c_int64(self.h), _bin(path), c_uint16(mode&0o777), c_uint16(self.umask), c_bool(exist_ok)) def rmdir(self, path): """Remove a directory. The directory must be empty."""