From d744f7f22ceb4647172116cfa9d44cdb0e4bbcd1 Mon Sep 17 00:00:00 2001 From: Yaroslav Emelyanov Date: Thu, 23 Mar 2023 01:55:51 +0400 Subject: [PATCH] =?UTF-8?q?CB-3048=20[Bug]:=20Lots=20of=20small=20files=20?= =?UTF-8?q?that=20leads=20to=20out=20of=20inodes=20on=20fil=E2=80=A6=20(#1?= =?UTF-8?q?515)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * CB-3048 [Bug]: Lots of small files that leads to out of inodes on filesystem Sets the MaxInactiveInterval to the SessionHandler * CB-3048 [Bug]: Lots of small files that leads to out of inodes on filesystem Implements the use of the current CBApplication instead of CBPlatform in CBJettyServer --------- Co-authored-by: Iaroslav Emelianov Co-authored-by: dariamarutkina <125263541+dariamarutkina@users.noreply.github.com> --- .../io/cloudbeaver/server/CBApplication.java | 2 +- .../server/jetty/CBJettyServer.java | 23 ++++++++++++++++--- .../service/session/WebSessionManager.java | 17 ++++++++++---- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java index 69aeba01f9..c9baba4e47 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java @@ -744,7 +744,7 @@ public class CBApplication extends BaseWebApplication implements WebAuthApplicat private void runWebServer() { log.debug("Starting Jetty server (" + serverPort + " on " + (CommonUtils.isEmpty(serverHost) ? "all interfaces" : serverHost) + ") "); - new CBJettyServer().runServer(); + new CBJettyServer(this).runServer(); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBJettyServer.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBJettyServer.java index 36f2e3669e..37cca77b4e 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBJettyServer.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/jetty/CBJettyServer.java @@ -34,6 +34,7 @@ import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletMapping; import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer; +import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.runtime.DBWorkbench; @@ -58,7 +59,10 @@ public class CBJettyServer { System.setProperty("org.eclipse.jetty.LEVEL", "WARN"); } - public CBJettyServer() { + private final CBApplication application; + + public CBJettyServer(@NotNull CBApplication application) { + this.application = application; } public void runServer() { @@ -104,7 +108,7 @@ public class CBJettyServer { } } - initSessionManager(server, servletContextHandler); + initSessionManager(this.application, servletContextHandler); server.setHandler(servletContextHandler); @@ -154,7 +158,10 @@ public class CBJettyServer { } } - private void initSessionManager(Server server, ServletContextHandler servletContextHandler) { + private void initSessionManager( + @NotNull CBApplication application, + @NotNull ServletContextHandler servletContextHandler + ) { // Init sessions persistence Path metadataFolder = GeneralUtils.getMetadataFolder(DBWorkbench.getPlatform().getWorkspace().getAbsolutePath()); Path sessionCacheFolder = metadataFolder.resolve(SESSION_CACHE_DIR); @@ -179,6 +186,16 @@ public class CBJettyServer { return 1; } }*/; + var maxIdleSeconds = application.getSessionManager().getMaxSessionIdleTime(); + int intMaxIdleSeconds; + if (maxIdleSeconds > Integer.MAX_VALUE) { + log.warn("Max session idle time value is greater than Integer.MAX_VALUE. Integer.MAX_VALUE will be used instead"); + intMaxIdleSeconds = Integer.MAX_VALUE; + } else { + intMaxIdleSeconds = (int) maxIdleSeconds; + } + sessionHandler.setMaxInactiveInterval(intMaxIdleSeconds); + DefaultSessionCache sessionCache = new DefaultSessionCache(sessionHandler); FileSessionDataStore sessionStore = new FileSessionDataStore(); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/WebSessionManager.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/WebSessionManager.java index 4aed6e13eb..d2b8887d1f 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/WebSessionManager.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/session/WebSessionManager.java @@ -50,6 +50,11 @@ public class WebSessionManager { private static final Log log = Log.getLog(WebSessionManager.class); + /** + * In configuration mode sessions expire after a week + */ + private static final long CONFIGURATION_MODE_SESSION_IDLE_TIME = 60 * 60 * 1000 * 24 * 7; + private final CBApplication application; private final Map sessionMap = new HashMap<>(); @@ -194,12 +199,14 @@ public class WebSessionManager { return null; } + public long getMaxSessionIdleTime() { + return CBApplication.getInstance().isConfigurationMode() + ? CONFIGURATION_MODE_SESSION_IDLE_TIME + : DBWorkbench.getPlatform(CBPlatform.class).getApplication().getMaxSessionIdleTime(); + } + public void expireIdleSessions() { - long maxSessionIdleTime = DBWorkbench.getPlatform(CBPlatform.class).getApplication().getMaxSessionIdleTime(); - if (CBApplication.getInstance().isConfigurationMode()) { - // In configuration mode sessions expire after a week - maxSessionIdleTime = 60 * 60 * 1000 * 24 * 7; - } + long maxSessionIdleTime = getMaxSessionIdleTime(); List expiredList = new ArrayList<>(); synchronized (sessionMap) {