]> source.dussan.org Git - gitblit.git/commitdiff
Workaround 1 sec resolution of File.lastModified on Linux (issue-55)
authorJames Moger <james.moger@gitblit.com>
Mon, 20 Feb 2012 17:33:57 +0000 (12:33 -0500)
committerJames Moger <james.moger@gitblit.com>
Mon, 20 Feb 2012 17:33:57 +0000 (12:33 -0500)
Shockingly, File.lastModified() does not always support millisecond
resolution on all platforms even if the underlying filesystem supports
it.  Added a forceReload flag (in addition to last modified checks) to
ensure that user backends and configuration properties are properly
reloaded.

src/com/gitblit/ConfigUserService.java
src/com/gitblit/FileSettings.java
src/com/gitblit/FileUserService.java

index 681efd5360f01516077e22e21e23b19be9a169b4..8f47f7a0a261cc89331a0b653e0376e900ebb73f 100644 (file)
@@ -82,6 +82,8 @@ public class ConfigUserService implements IUserService {
        private final Map<String, TeamModel> teams = new ConcurrentHashMap<String, TeamModel>();\r
 \r
        private volatile long lastModified;\r
+       \r
+       private volatile boolean forceReload;\r
 \r
        public ConfigUserService(File realmFile) {\r
                this.realmFile = realmFile;\r
@@ -711,6 +713,9 @@ public class ConfigUserService implements IUserService {
                }\r
 \r
                config.save();\r
+               // manually set the forceReload flag because not all JVMs support real\r
+               // millisecond resolution of lastModified. (issue-55)\r
+               forceReload = true;\r
 \r
                // If the write is successful, delete the current file and rename\r
                // the temporary copy to the original filename.\r
@@ -735,7 +740,8 @@ public class ConfigUserService implements IUserService {
         * Reads the realm file and rebuilds the in-memory lookup tables.\r
         */\r
        protected synchronized void read() {\r
-               if (realmFile.exists() && (realmFile.lastModified() > lastModified)) {\r
+               if (realmFile.exists() && (forceReload || (realmFile.lastModified() != lastModified))) {\r
+                       forceReload = false;\r
                        lastModified = realmFile.lastModified();\r
                        users.clear();\r
                        cookies.clear();\r
index 8ac99f6d562dadff65c6bd0ee275ab89645ba285..666bda05f53ef887f6ecdfe87e0625f07517cc72 100644 (file)
@@ -37,6 +37,8 @@ public class FileSettings extends IStoredSettings {
        private final Properties properties = new Properties();\r
 \r
        private volatile long lastModified;\r
+       \r
+       private volatile boolean forceReload;\r
 \r
        public FileSettings(String file) {\r
                super(FileSettings.class);\r
@@ -49,7 +51,7 @@ public class FileSettings extends IStoredSettings {
         */\r
        @Override\r
        protected synchronized Properties read() {\r
-               if (propertiesFile.exists() && (propertiesFile.lastModified() > lastModified)) {\r
+               if (propertiesFile.exists() && (forceReload || (propertiesFile.lastModified() > lastModified))) {\r
                        FileInputStream is = null;\r
                        try {\r
                                Properties props = new Properties();\r
@@ -60,6 +62,7 @@ public class FileSettings extends IStoredSettings {
                                properties.clear();\r
                                properties.putAll(props);\r
                                lastModified = propertiesFile.lastModified();\r
+                               forceReload = false;\r
                        } catch (FileNotFoundException f) {\r
                                // IGNORE - won't happen because file.exists() check above\r
                        } catch (Throwable t) {\r
@@ -88,6 +91,9 @@ public class FileSettings extends IStoredSettings {
                        content = content.replaceAll(regex, setting.getKey() + " = " + setting.getValue());\r
                }\r
                FileUtils.writeContent(propertiesFile, content);\r
+               // manually set the forceReload flag because not all JVMs support real\r
+               // millisecond resolution of lastModified. (issue-55)           \r
+               forceReload = true;\r
                return true;\r
        }\r
        \r
@@ -102,6 +108,13 @@ public class FileSettings extends IStoredSettings {
                return lastModified;\r
        }\r
 \r
+       /**\r
+        * @return the state of the force reload flag\r
+        */\r
+       protected boolean forceReload() {\r
+               return forceReload;\r
+       }\r
+\r
        @Override\r
        public String toString() {\r
                return propertiesFile.getAbsolutePath();\r
index dfc4da8ac6dbfd7c210860629807cdf932aba0f2..7842c31d41ec07bd985de2493f1704997fdedadd 100644 (file)
@@ -624,8 +624,9 @@ public class FileUserService extends FileSettings implements IUserService {
        @Override\r
        protected synchronized Properties read() {\r
                long lastRead = lastModified();\r
+               boolean reload = forceReload();\r
                Properties allUsers = super.read();\r
-               if (lastRead != lastModified()) {\r
+               if (reload || (lastRead != lastModified())) {\r
                        // reload hash cache\r
                        cookies.clear();\r
                        teams.clear();\r