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


Reply via email to