Author: toad
Date: 2007-03-08 00:44:40 +0000 (Thu, 08 Mar 2007)
New Revision: 12027

Modified:
   trunk/freenet/src/freenet/node/Node.java
Log:
Automatically regenerate the stores database if the environment cannot be opened

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-03-08 00:29:39 UTC (rev 
12026)
+++ trunk/freenet/src/freenet/node/Node.java    2007-03-08 00:44:40 UTC (rev 
12027)
@@ -1240,17 +1240,41 @@
                File dbDir = new File(storeDir, "database-"+portNumber);
                dbDir.mkdirs();

+               Environment env = null;
+               EnvironmentMutableConfig mutableConfig;
                // This can take some time
                System.out.println("Starting database...");
                try {
-                       storeEnvironment = new Environment(dbDir, envConfig);
-                       envMutableConfig = storeEnvironment.getConfig();
+                       env = new Environment(dbDir, envConfig);
+                       mutableConfig = env.getConfig();
                } catch (DatabaseException e) {
-                       System.err.println("Could not open store: "+e);
-                       e.printStackTrace();
-                       throw new NodeInitException(EXIT_STORE_OTHER, 
e.getMessage());                  
+                       // The database is broken
+                       // We will have to recover from scratch
+                       if(env != null) {
+                               try {
+                                       env.close();
+                               } catch (Throwable t) {
+                                       System.err.println("Error closing 
database: "+t+" after "+e);
+                                       t.printStackTrace();
+                               }
+                       }
+                       File[] files = dbDir.listFiles();
+                       for(int i=0;i<files.length;i++) files[i].delete();
+                       dbDir.delete();
+                       try {
+                               env = new Environment(dbDir, envConfig);
+                               mutableConfig = env.getConfig();
+                       } catch (DatabaseException e1) {
+                               System.err.println("Could not open store: "+e1);
+                               e1.printStackTrace();
+                               System.err.println("Previous error was (tried 
deleting database and retrying): "+e);
+                               e.printStackTrace();
+                               throw new NodeInitException(EXIT_STORE_OTHER, 
e1.getMessage());
+                       }
                }
-
+               storeEnvironment = env;
+               envMutableConfig = mutableConfig;
+               
                statsConf = new StatsConfig();
                statsConf.setClear(true);



Reply via email to