You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by ec...@apache.org on 2012/03/22 16:37:19 UTC

svn commit: r1303841 - in /incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/tabletserver: Tablet.java TabletServer.java

Author: ecn
Date: Thu Mar 22 15:37:19 2012
New Revision: 1303841

URL: http://svn.apache.org/viewvc?rev=1303841&view=rev
Log:
ACCUMULO-484 use the tablet load thread to perform the minor compaction after recovery

Modified:
    incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/tabletserver/Tablet.java
    incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/tabletserver/TabletServer.java

Modified: incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/tabletserver/Tablet.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/tabletserver/Tablet.java?rev=1303841&r1=1303840&r2=1303841&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/tabletserver/Tablet.java (original)
+++ incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/tabletserver/Tablet.java Thu Mar 22 15:37:19 2012
@@ -2302,8 +2302,30 @@ public class Tablet {
     return initiateMinorCompaction(flushId);
   }
   
+  boolean minorCompactNow() {
+    long flushId;
+    try {
+      flushId = getFlushID();
+    } catch (NoNodeException e) {
+      log.info("Asked to initiate MinC when there was no flush id " + getExtent() + " " + e.getMessage());
+      return false;
+    }
+    MinorCompactionTask mct = createMinorCompactionTask(flushId);
+    if (mct == null)
+      return false;
+    mct.run();
+    return true;
+  }
+
   boolean initiateMinorCompaction(long flushId) {
-    
+    MinorCompactionTask mct = createMinorCompactionTask(flushId);
+    if (mct == null)
+      return false;
+    tabletResources.executeMinorCompaction(mct);
+    return true;
+  }
+  
+  private MinorCompactionTask createMinorCompactionTask(long flushId) {
     MinorCompactionTask mct;
     long t1, t2;
     
@@ -2328,14 +2350,14 @@ public class Tablet {
             logMessage.append(" tabletMemory.getMemTable().getNumEntries() " + tabletMemory.getMemTable().getNumEntries());
           logMessage.append(" updatingFlushID " + updatingFlushID);
           
-          return false;
+          return null;
         }
         // We're still recovering log entries
         if (datafileManager == null) {
           logMessage = new StringBuilder();
           logMessage.append(extent.toString());
           logMessage.append(" datafileManager " + datafileManager);
-          return false;
+          return null;
         }
         
         mct = prepareForMinC(flushId);
@@ -2347,11 +2369,8 @@ public class Tablet {
         log.debug(logMessage);
     }
     
-    tabletResources.executeMinorCompaction(mct);
-    
     log.debug(String.format("MinC initiate lock %.2f secs", (t2 - t1) / 1000.0));
-    
-    return true;
+    return mct;
   }
   
   long getFlushID() throws NoNodeException {

Modified: incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/tabletserver/TabletServer.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/tabletserver/TabletServer.java?rev=1303841&r1=1303840&r2=1303841&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/tabletserver/TabletServer.java (original)
+++ incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/tabletserver/TabletServer.java Thu Mar 22 15:37:19 2012
@@ -2409,21 +2409,18 @@ public class TabletServer extends Abstra
           // this opens the tablet file and fills in the endKey in the
           // extent
           tablet = new Tablet(TabletServer.this, locationToOpen, extentToOpen, trm, tabletsKeyValues);
-          if (tablet.initiateMinorCompaction()) {
-            /*
-             * If a minor compaction starts after a tablet opens, this indicates a log recovery occurred. This recovered data must be minor compacted.
-             * 
-             * There are three reasons to wait for this minor compaction to finish before placing the tablet in online tablets.
-             * 
-             * 1) The log recovery code does not handle data written to the tablet on multiple tablet servers. 2) The log recovery code does not block if memory
-             * is full. Therefore recovering lots of tablets that use a lot of memory could run out of memory. 3) The minor compaction finish event did not make
-             * it to the logs (the file will be in !METADATA, preventing replay of compacted data)... but do not want a majc to wipe the file out from !METADATA
-             * and then have another process failure... this could cause duplicate data to replay
-             */
-
-            tablet.waitForMinC();
-          } else if (tablet.getNumEntriesInMemory() > 0) {
-            log.warn("Minor compaction after recovery fails for " + extentToOpen);
+          /*
+           * If a minor compaction starts after a tablet opens, this indicates a log recovery occurred. This recovered data must be minor compacted.
+           * 
+           * There are three reasons to wait for this minor compaction to finish before placing the tablet in online tablets.
+           * 
+           * 1) The log recovery code does not handle data written to the tablet on multiple tablet servers. 2) The log recovery code does not block if memory
+           * is full. Therefore recovering lots of tablets that use a lot of memory could run out of memory. 3) The minor compaction finish event did not make
+           * it to the logs (the file will be in !METADATA, preventing replay of compacted data)... but do not want a majc to wipe the file out from !METADATA
+           * and then have another process failure... this could cause duplicate data to replay
+           */
+          if (tablet.getNumEntriesInMemory() > 0 && !tablet.minorCompactNow()) {
+            throw new RuntimeException("Minor compaction after recovery fails for " + extentToOpen);
           }
           
           Assignment assignment = new Assignment(extentToOpen, getTabletSession());