From 9d852864cb2970955a157ad39c451ee09f89baa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Alvergnat?= Date: Fri, 28 Dec 2018 13:20:02 +0100 Subject: [PATCH] Add permission-db cleanup on startup --- src/main/java/world/gfi/nfs4j/api/Api.java | 8 ++++++-- .../gfi/nfs4j/fs/permission/PermissionsMapDb.java | 15 +++++++++++++-- .../nfs4j/fs/permission/WindowsFileIdReader.java | 6 +++++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/world/gfi/nfs4j/api/Api.java b/src/main/java/world/gfi/nfs4j/api/Api.java index 162a09b..c0ea4d5 100644 --- a/src/main/java/world/gfi/nfs4j/api/Api.java +++ b/src/main/java/world/gfi/nfs4j/api/Api.java @@ -1,7 +1,8 @@ package world.gfi.nfs4j.api; -import com.google.gson.JsonParseException; import com.google.gson.JsonSyntaxException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import world.gfi.nfs4j.Daemon; import world.gfi.nfs4j.config.ApiConfig; import world.gfi.nfs4j.config.ShareConfig; @@ -23,6 +24,8 @@ public class Api { private final Daemon daemon; private final ApiConfig config; + private static final Logger logger = LoggerFactory.getLogger(Api.class); + public Api(ApiConfig config, Daemon daemon) { this.config = config; this.daemon = daemon; @@ -48,10 +51,11 @@ public void start() { } }); } - + exception(Exception.class, (exception, req, res) -> { res.status(500); res.type("application/json"); + logger.error(exception.getMessage(), exception); Error error = new Error(exception.getMessage()); res.body(new JsonTransformer().render(error)); }); diff --git a/src/main/java/world/gfi/nfs4j/fs/permission/PermissionsMapDb.java b/src/main/java/world/gfi/nfs4j/fs/permission/PermissionsMapDb.java index 785711a..381c834 100644 --- a/src/main/java/world/gfi/nfs4j/fs/permission/PermissionsMapDb.java +++ b/src/main/java/world/gfi/nfs4j/fs/permission/PermissionsMapDb.java @@ -24,6 +24,7 @@ public class PermissionsMapDb implements Permissi private final ConcurrentMap gidMap; private final PermissionsReader defaultPermissions; private final FileIdReader idReader; + private final ShareConfig share; public static String getFilename(String alias) { if (alias == null) { @@ -45,12 +46,13 @@ public static String getFilename(String alias) { } public PermissionsMapDb(ShareConfig share, String alias, PermissionsReader defaultPermissions, FileIdReader idReader) throws IOException { + this.share = share; this.defaultPermissions = defaultPermissions; this.idReader = idReader; File dbFile; - if (share.isLocalMetadata()) { - String basePath = share.getPath().toString(); + if (this.share.isLocalMetadata()) { + String basePath = this.share.getPath().toString(); Path directory = Paths.get(basePath, ".nfs4j").normalize(); Files.createDirectories(directory); dbFile = Paths.get(directory.toString(), getFilename(alias)).normalize().toFile(); @@ -70,6 +72,15 @@ public PermissionsMapDb(ShareConfig share, String alias, PermissionsReader de this.maskMap = db.hashMap("mask", Serializer.STRING, Serializer.INTEGER).createOrOpen(); this.uidMap = db.hashMap("uid", Serializer.STRING, Serializer.INTEGER).createOrOpen(); this.gidMap = db.hashMap("gid", Serializer.STRING, Serializer.INTEGER).createOrOpen(); + + this.cleanup(); + } + + public void cleanup() { + this.id.keySet().removeIf(p -> !new File(p).exists()); + this.maskMap.keySet().removeIf(p -> !new File(p).exists()); + this.uidMap.keySet().removeIf(p -> !new File(p).exists()); + this.gidMap.keySet().removeIf(p -> !new File(p).exists()); } diff --git a/src/main/java/world/gfi/nfs4j/fs/permission/WindowsFileIdReader.java b/src/main/java/world/gfi/nfs4j/fs/permission/WindowsFileIdReader.java index c198314..fa33450 100644 --- a/src/main/java/world/gfi/nfs4j/fs/permission/WindowsFileIdReader.java +++ b/src/main/java/world/gfi/nfs4j/fs/permission/WindowsFileIdReader.java @@ -16,7 +16,11 @@ public long getFileId(Path path, A attrs) { try { return JnaWindowsUtils.getFileId(path); } catch (LastErrorException e) { - LOG.warn("Can't read File id with JNA. Falling back to creation time.", e); + if (e.getErrorCode() == 5 || e.getErrorCode() == 32) { + LOG.debug("Can't read File id with JNA on " + path.normalize().toString() + ". Falling back to creation time. (Error Code: " + e.getErrorCode() + ")"); + } else { + LOG.warn("Can't read File id with JNA on " + path.normalize().toString() + ". Falling back to creation time. (Error Code: " + e.getErrorCode() + ")"); + } return super.getFileId(path, attrs); } }