Author: toad
Date: 2006-04-13 15:41:27 +0000 (Thu, 13 Apr 2006)
New Revision: 8537
Modified:
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/Version.java
trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
Log:
642: Attempt automatic recovery on a secondary store error (create flag file,
exit, when we are restarted the secondary database will be recreated and the
flag file deleted).
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-04-13 15:28:24 UTC (rev
8536)
+++ trunk/freenet/src/freenet/node/Node.java 2006-04-13 15:41:27 UTC (rev
8537)
@@ -279,6 +279,8 @@
static final int EXIT_COULD_NOT_START_FCP = 17;
static final int EXIT_COULD_NOT_START_FPROXY = 18;
static final int EXIT_COULD_NOT_START_TMCI = 19;
+ public static final int EXIT_DATABASE_REQUIRES_RESTART = 20;
+
public final long bootID;
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-04-13 15:28:24 UTC (rev
8536)
+++ trunk/freenet/src/freenet/node/Version.java 2006-04-13 15:41:27 UTC (rev
8537)
@@ -20,7 +20,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 641;
+ private static final int buildNumber = 642;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 591;
Modified: trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2006-04-13
15:28:24 UTC (rev 8536)
+++ trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2006-04-13
15:41:27 UTC (rev 8537)
@@ -52,6 +52,7 @@
private final Environment environment;
private final TupleBinding storeBlockTupleBinding;
private final TupleBinding longTupleBinding;
+ private final File fixSecondaryFile;
private long chkBlocksInStore;
private long maxChkBlocks;
@@ -103,9 +104,14 @@
dbConfig.setTransactional(true);
chkDB = environment.openDatabase(null,"CHK",dbConfig);
- File fixSecondary = new File(storeDir, "recreate_secondary_db");
- if(fixSecondary.exists()) {
- fixSecondary.delete();
+ fixSecondaryFile = new File(storeDir, "recreate_secondary_db");
+
+ if(fixSecondaryFile.exists()) {
+ fixSecondaryFile.delete();
+ Logger.error(this, "Recreating secondary database for
"+storeDir);
+ Logger.error(this, "This may take some time...");
+ System.err.println("Recreating secondary database for
"+storeDir);
+ System.err.println("This may take some time...");
environment.truncateDatabase(null, "CHK_accessTime",
false);
}
@@ -219,6 +225,7 @@
}
if(t!=null)
try{t.abort();}catch(DatabaseException ex2){}
+ checkSecondaryDatabaseError(ex);
Logger.error(this, "Caught "+ex, ex);
ex.printStackTrace();
throw new IOException(ex.getMessage());
@@ -303,6 +310,7 @@
if(t!=null) {
try{t.abort();}catch(DatabaseException ex2){}
}
+ checkSecondaryDatabaseError(ex);
Logger.error(this, "Caught "+ex, ex);
ex.printStackTrace();
throw new IOException(ex.getMessage());
@@ -394,6 +402,7 @@
if(t!=null) {
try{t.abort();}catch(DatabaseException ex2){}
}
+ checkSecondaryDatabaseError(ex);
Logger.error(this, "Caught "+ex, ex);
ex.printStackTrace();
throw new IOException(ex.getMessage());
@@ -470,13 +479,29 @@
if(t!=null){
try{t.abort();}catch(DatabaseException ex2){};
}
+ checkSecondaryDatabaseError(ex);
Logger.error(this, "Caught "+ex, ex);
ex.printStackTrace();
throw new IOException(ex.getMessage());
}
}
- /**
+ private void checkSecondaryDatabaseError(Throwable ex) {
+ if(ex instanceof DatabaseException && ex.getMessage().contains("missing
key in the primary database")) {
+ try {
+ fixSecondaryFile.createNewFile();
+ } catch (IOException e) {
+ Logger.error(this, "Corrupt secondary database
but could not create flag file "+fixSecondaryFile);
+ System.err.println("Corrupt secondary database
but could not create flag file "+fixSecondaryFile);
+ return; // Not sure what else we can do
+ }
+ Logger.error(this, "Corrupt secondary database. Should be
cleaned up on restart.");
+ System.err.println("Corrupt secondary database. Should be
cleaned up on restart.");
+ System.exit(freenet.node.Node.EXIT_DATABASE_REQUIRES_RESTART);
+ }
+ }
+
+ /**
* Store a block.
*/
public void put(byte[] hash, DSAPublicKey key) throws IOException
@@ -536,6 +561,7 @@
if(t!=null){
try{t.abort();}catch(DatabaseException ex2){};
}
+ checkSecondaryDatabaseError(ex);
Logger.error(this, "Caught "+ex, ex);
ex.printStackTrace();
throw new IOException(ex.getMessage());