You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by kt...@apache.org on 2013/04/23 00:12:54 UTC

svn commit: r1470734 - in /accumulo/branches/1.5: server/src/main/java/org/apache/accumulo/server/tabletserver/TabletServer.java test/src/test/resources/log4j.properties

Author: kturner
Date: Mon Apr 22 22:12:54 2013
New Revision: 1470734

URL: http://svn.apache.org/r1470734
Log:
ACCUMULO-1243 made accumulo more responsive to failed splits

Modified:
    accumulo/branches/1.5/server/src/main/java/org/apache/accumulo/server/tabletserver/TabletServer.java
    accumulo/branches/1.5/test/src/test/resources/log4j.properties

Modified: accumulo/branches/1.5/server/src/main/java/org/apache/accumulo/server/tabletserver/TabletServer.java
URL: http://svn.apache.org/viewvc/accumulo/branches/1.5/server/src/main/java/org/apache/accumulo/server/tabletserver/TabletServer.java?rev=1470734&r1=1470733&r2=1470734&view=diff
==============================================================================
--- accumulo/branches/1.5/server/src/main/java/org/apache/accumulo/server/tabletserver/TabletServer.java (original)
+++ accumulo/branches/1.5/server/src/main/java/org/apache/accumulo/server/tabletserver/TabletServer.java Mon Apr 22 22:12:54 2013
@@ -124,6 +124,7 @@ import org.apache.accumulo.core.util.Cac
 import org.apache.accumulo.core.util.ColumnFQ;
 import org.apache.accumulo.core.util.Daemon;
 import org.apache.accumulo.core.util.LoggingRunnable;
+import org.apache.accumulo.core.util.Pair;
 import org.apache.accumulo.core.util.ServerServices;
 import org.apache.accumulo.core.util.ServerServices.Service;
 import org.apache.accumulo.core.util.SimpleThreadPool;
@@ -2446,24 +2447,39 @@ public class TabletServer extends Abstra
       Text locationToOpen = null;
       SortedMap<Key,Value> tabletsKeyValues = new TreeMap<Key,Value>();
       try {
-        locationToOpen = verifyTabletInformation(extent, TabletServer.this.getTabletSession(), tabletsKeyValues, getClientAddressString(), getLock());
+        Pair<Text,KeyExtent> pair = verifyTabletInformation(extent, TabletServer.this.getTabletSession(), tabletsKeyValues, getClientAddressString(), getLock());
+        locationToOpen = pair.getFirst();
+        if (pair.getSecond() != null) {
+          synchronized (openingTablets) {
+            openingTablets.remove(extent);
+            openingTablets.notifyAll();
+            // it expected that the new extent will overlap the old one... if it does not, it should not be added to unopenedTablets
+            if (!KeyExtent.findOverlapping(extent, new TreeSet<KeyExtent>(Arrays.asList(pair.getSecond()))).contains(pair.getSecond())) {
+              throw new IllegalStateException("Fixed split does not overlap " + extent + " " + pair.getSecond());
+            }
+            unopenedTablets.add(pair.getSecond());
+          }
+          // split was rolled back... try again
+          new AssignmentHandler(pair.getSecond()).run();
+          return;
+        }
       } catch (Exception e) {
         synchronized (openingTablets) {
           openingTablets.remove(extent);
           openingTablets.notifyAll();
         }
         log.warn("Failed to verify tablet " + extent, e);
+        enqueueMasterMessage(new TabletStatusMessage(TabletLoadState.LOAD_FAILURE, extent));
         throw new RuntimeException(e);
       }
 
       if (locationToOpen == null) {
         log.debug("Reporting tablet " + extent + " assignment failure: unable to verify Tablet Information");
-        enqueueMasterMessage(new TabletStatusMessage(TabletLoadState.LOAD_FAILURE, extent));
         synchronized (openingTablets) {
           openingTablets.remove(extent);
           openingTablets.notifyAll();
         }
-        
+        enqueueMasterMessage(new TabletStatusMessage(TabletLoadState.LOAD_FAILURE, extent));
         return;
       }
 
@@ -2852,7 +2868,7 @@ public class TabletServer extends Abstra
   
   private long totalMinorCompactions;
   
-  private static Text verifyRootTablet(KeyExtent extent, TServerInstance instance) throws DistributedStoreException, AccumuloException {
+  private static Pair<Text,KeyExtent> verifyRootTablet(KeyExtent extent, TServerInstance instance) throws DistributedStoreException, AccumuloException {
     ZooTabletStateStore store = new ZooTabletStateStore();
     if (!store.iterator().hasNext()) {
       throw new AccumuloException("Illegal state: location is not set in zookeeper");
@@ -2866,10 +2882,11 @@ public class TabletServer extends Abstra
       throw new AccumuloException("Root tablet already has a location set");
     }
     
-    return new Text(Constants.ZROOT_TABLET);
+    return new Pair<Text,KeyExtent>(new Text(Constants.ZROOT_TABLET), null);
   }
   
-  public static Text verifyTabletInformation(KeyExtent extent, TServerInstance instance, SortedMap<Key,Value> tabletsKeyValues, String clientAddress,
+  public static Pair<Text,KeyExtent> verifyTabletInformation(KeyExtent extent, TServerInstance instance, SortedMap<Key,Value> tabletsKeyValues,
+      String clientAddress,
       ZooLock lock) throws AccumuloSecurityException, DistributedStoreException, AccumuloException {
     
     log.debug("verifying extent " + extent);
@@ -2916,7 +2933,7 @@ public class TabletServer extends Abstra
       KeyExtent fke = MetadataTable.fixSplit(metadataEntry, tabletEntries.get(metadataEntry), instance, SecurityConstants.getSystemCredentials(), lock);
       
       if (!fke.equals(extent)) {
-        return null;
+        return new Pair<Text,KeyExtent>(null, fke);
       }
       
       // reread and reverify metadata entries now that metadata entries were fixed
@@ -2924,7 +2941,7 @@ public class TabletServer extends Abstra
       return verifyTabletInformation(fke, instance, tabletsKeyValues, clientAddress, lock);
     }
     
-    return new Text(dir.get());
+    return new Pair<Text,KeyExtent>(new Text(dir.get()), null);
   }
   
   static Value checkTabletMetadata(KeyExtent extent, TServerInstance instance, SortedMap<Key,Value> tabletsKeyValues, Text metadataEntry)

Modified: accumulo/branches/1.5/test/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/accumulo/branches/1.5/test/src/test/resources/log4j.properties?rev=1470734&r1=1470733&r2=1470734&view=diff
==============================================================================
--- accumulo/branches/1.5/test/src/test/resources/log4j.properties (original)
+++ accumulo/branches/1.5/test/src/test/resources/log4j.properties Mon Apr 22 22:12:54 2013
@@ -16,7 +16,7 @@
 log4j.rootLogger=INFO, CA
 log4j.appender.CA=org.apache.log4j.ConsoleAppender
 log4j.appender.CA.layout=org.apache.log4j.PatternLayout
-log4j.appender.CA.layout.ConversionPattern=[%t} %-5p %c %x - %m%n
+log4j.appender.CA.layout.ConversionPattern=%d{ISO8601} [%-8c{2}] %-5p: %m%n
 
 log4j.logger.org.apache.accumulo.core.client.impl.ServerClient=ERROR
 log4j.logger.org.apache.accumulo.core.util.shell.Shell.audit=off