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();