You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2012/09/15 00:40:42 UTC

svn commit: r1384958 - in /lucene/dev/trunk/solr/core/src: java/org/apache/solr/update/TransactionLog.java java/org/apache/solr/update/UpdateLog.java test/org/apache/solr/search/TestRecovery.java

Author: yonik
Date: Fri Sep 14 22:40:41 2012
New Revision: 1384958

URL: http://svn.apache.org/viewvc?rev=1384958&view=rev
Log:
tlog: ensure tlog so corrupted that constructor can't complete is closed so windows can remove the file after

Modified:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/TransactionLog.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/UpdateLog.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestRecovery.java

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/TransactionLog.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/TransactionLog.java?rev=1384958&r1=1384957&r2=1384958&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/TransactionLog.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/TransactionLog.java Fri Sep 14 22:40:41 2012
@@ -141,6 +141,7 @@ public class TransactionLog {
   }
 
   TransactionLog(File tlogFile, Collection<String> globalStrings, boolean openExisting) {
+    boolean success = false;
     try {
       if (debug) {
         log.debug("New TransactionLog file=" + tlogFile + ", exists=" + tlogFile.exists() + ", size=" + tlogFile.length() + ", openExisting=" + openExisting);
@@ -175,8 +176,18 @@ public class TransactionLog {
         addGlobalStrings(globalStrings);
       }
 
+      success = true;
+
     } catch (IOException e) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
+    } finally {
+      if (!success && raf != null) {
+        try {
+          raf.close();
+        } catch (Exception e) {
+          log.error("Error closing tlog file (after error opening)", e);
+        }
+      }
     }
   }
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/UpdateLog.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/UpdateLog.java?rev=1384958&r1=1384957&r2=1384958&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/UpdateLog.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/UpdateLog.java Fri Sep 14 22:40:41 2012
@@ -205,7 +205,7 @@ public class UpdateLog implements Plugin
         addOldLog(oldLog, false);  // don't remove old logs on startup since more than one may be uncapped.
       } catch (Exception e) {
         SolrException.log(log, "Failure to open existing log file (non fatal) " + f, e);
-        f.delete();
+        deleteFile(f);
       }
     }
 
@@ -1346,6 +1346,26 @@ public class UpdateLog implements Plugin
       Integer.MAX_VALUE, 1, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(),
       new DefaultSolrThreadFactory("recoveryExecutor"));
 
+
+  public static void deleteFile(File file) {
+    boolean success = false;
+    try {
+      success = file.delete();
+      if (!success) {
+        log.error("Error deleting file: " + file);
+      }
+    } catch (Exception e) {
+      log.error("Error deleting file: " + file, e);
+    }
+
+    if (!success) {
+      try {
+        file.deleteOnExit();
+      } catch (Exception e) {
+        log.error("Error deleting file on exit: " + file, e);
+      }
+    }
+  }
 }
 
 

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestRecovery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestRecovery.java?rev=1384958&r1=1384957&r2=1384958&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestRecovery.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestRecovery.java Fri Sep 14 22:40:41 2012
@@ -870,7 +870,6 @@ public class TestRecovery extends SolrTe
   // test that a corrupt tlog doesn't stop us from coming up
   //
   @Test
-  @Ignore // I have reproduced the failure on windows and am looking into fixes -yonik
   public void testCorruptLog() throws Exception {
     try {
       DirectUpdateHandler2.commitOnClose = false;
@@ -885,6 +884,8 @@ public class TestRecovery extends SolrTe
       assertU(adoc("id","G3"));
 
       h.close();
+
+
       String[] files = UpdateLog.getLogList(logDir);
       Arrays.sort(files);
       RandomAccessFile raf = new RandomAccessFile(new File(logDir, files[files.length-1]), "rw");
@@ -1040,13 +1041,19 @@ public class TestRecovery extends SolrTe
 
     h.close();
 
-    String[] files = UpdateLog.getLogList(logDir);
-    for (String file : files) {
-      new File(logDir, file).delete();
-    }
+    try {
+      String[] files = UpdateLog.getLogList(logDir);
+      for (String file : files) {
+        new File(logDir, file).delete();
+      }
 
-    assertEquals(0, UpdateLog.getLogList(logDir).length);
-    createCore();
+      assertEquals(0, UpdateLog.getLogList(logDir).length);
+    } finally {
+      // make sure we create the core again, even if the assert fails so it won't mess
+      // up the next test.
+      createCore();
+      assertJQ(req("q","*:*") ,"/response/numFound==");   // ensure it works
+    }
   }
 
   private static Long getVer(SolrQueryRequest req) throws Exception {