From 6f35897f10386475497cdca7a019ff819bd4ef14 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Fri, 14 Jun 2024 16:24:31 +0200 Subject: [PATCH] implement some other fs operations --- .../files/service/DhfsFileService.java | 4 ++ .../files/service/DhfsFileServiceImpl.java | 63 +++++++++++++++++++ .../usatiuk/dhfs/storage/fuse/DhfsFuse.java | 43 ++++++++++++- 3 files changed, 109 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileService.java b/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileService.java index 9c596cf2..a13af68a 100644 --- a/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileService.java +++ b/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileService.java @@ -11,6 +11,10 @@ public interface DhfsFileService { Uni> getDirEntry(String name); Uni> open(String name); Uni> create(String name); + Uni> mkdir(String name); + Uni rmdir(String name); + Uni unlink(String name); + Uni rename(String from, String to); Uni> readDir(String name); Uni size(File f); diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileServiceImpl.java b/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileServiceImpl.java index 10293b45..c7b52b6a 100644 --- a/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileServiceImpl.java +++ b/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileServiceImpl.java @@ -113,6 +113,69 @@ public class DhfsFileServiceImpl implements DhfsFileService { return Uni.createFrom().item(Optional.of(f)); } + @Override + public Uni> mkdir(String name) { + // FIXME: + var root = getRoot().await().indefinitely(); + var found = traverse(root, Path.of(name).getParent()).await().indefinitely(); + if (found.isEmpty()) return Uni.createFrom().item(Optional.empty()); + + if (!(found.get() instanceof Directory dir)) return Uni.createFrom().item(Optional.empty()); + + var duuid = UUID.randomUUID(); + Directory d = new Directory(duuid); + + jObjectRepository.writeJObject(namespace, d).await().indefinitely(); + dir.getChildren().add(Pair.of(Path.of(name).getFileName().toString(), duuid)); + jObjectRepository.writeJObject(namespace, dir).await().indefinitely(); + + return Uni.createFrom().item(Optional.of(d)); + } + + private Uni rmdent(String name) { + // FIXME: + var root = getRoot().await().indefinitely(); + var found = traverse(root, Path.of(name).getParent()).await().indefinitely(); + if (found.isEmpty()) return Uni.createFrom().item(false); + + if (!(found.get() instanceof Directory dir)) return Uni.createFrom().item(false); + + boolean removed = dir.getChildren().removeIf(p -> p.getLeft().equals(Path.of(name).getFileName().toString())); + if (removed) jObjectRepository.writeJObject(namespace, dir).await().indefinitely(); + + return Uni.createFrom().item(removed); + } + + @Override + public Uni rmdir(String name) { + return rmdent(name); + } + + @Override + public Uni unlink(String name) { + return rmdent(name); + } + + @Override + public Uni rename(String from, String to) { + var dent = getDirEntry(from).await().indefinitely(); + if (dent.isEmpty()) return Uni.createFrom().item(false); + if (!rmdent(from).await().indefinitely()) return Uni.createFrom().item(false); + + // FIXME: + var root = getRoot().await().indefinitely(); + var found = traverse(root, Path.of(to).getParent()).await().indefinitely(); + if (found.isEmpty()) return Uni.createFrom().item(false); + + if (!(found.get() instanceof Directory dir)) return Uni.createFrom().item(false); + + + dir.getChildren().add(Pair.of(Path.of(to).getFileName().toString(), dent.get().getUuid())); + jObjectRepository.writeJObject(namespace, dir).await().indefinitely(); + + return Uni.createFrom().item(true); + } + @Override public Uni> readDir(String name) { var root = getRoot().await().indefinitely(); diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/fuse/DhfsFuse.java b/server/src/main/java/com/usatiuk/dhfs/storage/fuse/DhfsFuse.java index b0da55fa..ad9c0718 100644 --- a/server/src/main/java/com/usatiuk/dhfs/storage/fuse/DhfsFuse.java +++ b/server/src/main/java/com/usatiuk/dhfs/storage/fuse/DhfsFuse.java @@ -18,6 +18,7 @@ import ru.serce.jnrfuse.FuseFillDir; import ru.serce.jnrfuse.FuseStubFS; import ru.serce.jnrfuse.struct.FileStat; import ru.serce.jnrfuse.struct.FuseFileInfo; +import ru.serce.jnrfuse.struct.Statvfs; import java.nio.file.Paths; import java.util.Optional; @@ -37,7 +38,19 @@ public class DhfsFuse extends FuseStubFS { Paths.get(root).toFile().mkdirs(); Log.info("Mounting with root " + root); - mount(Paths.get(root)); + mount(Paths.get(root), false, true); + } + + @Override + public int statfs(String path, Statvfs stbuf) { + //FIXME: + if ("/".equals(path)) { + stbuf.f_blocks.set(1024 * 1024); // total data blocks in file system + stbuf.f_frsize.set(1024); // fs block size + stbuf.f_bfree.set(1024 * 1024); // free blocks in fs + stbuf.f_bavail.set(1024 * 1024); // avail blocks in fs + } + return super.statfs(path, stbuf); } @Override @@ -98,6 +111,34 @@ public class DhfsFuse extends FuseStubFS { else return 0; } + @Override + public int mkdir(String path, long mode) { + var ret = fileService.mkdir(path).await().indefinitely(); + if (ret.isEmpty()) return -ErrorCodes.ENOSPC(); + else return 0; + } + + @Override + public int rmdir(String path) { + var ret = fileService.rmdir(path).await().indefinitely(); + if (!ret) return -ErrorCodes.ENOENT(); + else return 0; + } + + @Override + public int rename(String path, String newName) { + var ret = fileService.rename(path, newName).await().indefinitely(); + if (!ret) return -ErrorCodes.ENOENT(); + else return 0; + } + + @Override + public int unlink(String path) { + var ret = fileService.unlink(path).await().indefinitely(); + if (!ret) return -ErrorCodes.ENOENT(); + else return 0; + } + @Override public int truncate(String path, long size) { var fileOpt = fileService.open(path).await().indefinitely();