Author: j16sdiz
Date: 2008-04-12 15:27:30 +0000 (Sat, 12 Apr 2008)
New Revision: 19241

Modified:
   trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
Log:
flush all data files before crash


Modified: trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-04-12 
15:18:49 UTC (rev 19240)
+++ trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-04-12 
15:27:30 UTC (rev 19241)
@@ -1428,6 +1428,15 @@
                                }
                                Logger.error(this, "Corrupt secondary database 
("+getName()+"). Should be cleaned up on restart.");
                                System.err.println("Corrupt secondary database 
("+getName()+"). Should be cleaned up on restart.");
+                               
+                               System.err.println("Flusing data store files (" 
+ getName() + ")");
+                               flushAndCloseRAF(storeRAF);
+                               storeRAF = null;
+                               flushAndCloseRAF(lruRAF);
+                               lruRAF = null;
+                               flushAndCloseRAF(keysRAF);
+                               keysRAF = null;
+                               
                                WrapperManager.restart();
                                
System.exit(freenet.node.NodeInitException.EXIT_DATABASE_REQUIRES_RESTART);
                        } else if(ex instanceof DbChecksumException || ex 
instanceof RunRecoveryException || ex instanceof LogFileNotFoundException ||
@@ -1444,13 +1453,22 @@
                                        System.err.println("Corrupt database 
("+getName()+") but could not create flag file "+reconstructFile);
                                        return; // Not sure what else we can do
                                }
+                               
+                               System.err.println("Flusing data store files (" 
+ getName() + ")");
+                               flushAndCloseRAF(storeRAF);
+                               storeRAF = null;
+                               flushAndCloseRAF(lruRAF);
+                               lruRAF = null;
+                               flushAndCloseRAF(keysRAF);
+                               keysRAF = null;
+                               
                                System.err.println("Restarting to fix corrupt 
store database...");
                                Logger.error(this, "Restarting to fix corrupt 
store database...");
                                WrapperManager.restart();
                        } else {
                                if(ex.getCause() != null)
                                        
checkSecondaryDatabaseError(ex.getCause());
-                       }
+                       } 
                }
        }

@@ -1597,7 +1615,17 @@

        private final Object closeLock = new Object();

-       private void closeRAF(RandomAccessFile file, boolean logError) {
+       private static void flushAndCloseRAF(RandomAccessFile file) {
+               try {
+                       if (file != null)
+                               file.getFD().sync();
+               } catch (IOException e) {
+                       // ignore
+               }
+               closeRAF(file, false);
+       }
+
+       private static void closeRAF(RandomAccessFile file, boolean logError) {
                        try {
                                                if (file != null)
                                                                file.close();
@@ -1609,7 +1637,7 @@
                                }
                }

-       private void closeDB(Database db, boolean logError) {
+       private static void closeDB(Database db, boolean logError) {
                                try {
                                                if (db != null)
                                                                db.close();


Reply via email to