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 2015/02/25 18:53:38 UTC

accumulo git commit: ACCUMULO-3623 wait for stats to catch up to master state

Repository: accumulo
Updated Branches:
  refs/heads/master a45dbfbcf -> 77cd4cc7d


ACCUMULO-3623 wait for stats to catch up to master state


Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo
Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/77cd4cc7
Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/77cd4cc7
Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/77cd4cc7

Branch: refs/heads/master
Commit: 77cd4cc7dbd863c075eab006ce45a4e675258873
Parents: a45dbfb
Author: Eric C. Newton <er...@gmail.com>
Authored: Wed Feb 25 12:53:25 2015 -0500
Committer: Eric C. Newton <er...@gmail.com>
Committed: Wed Feb 25 12:53:25 2015 -0500

----------------------------------------------------------------------
 .../java/org/apache/accumulo/master/Master.java | 32 +++++++++++++++++---
 .../accumulo/master/TabletGroupWatcher.java     | 11 ++++++-
 .../accumulo/master/state/TableStats.java       |  9 +++++-
 3 files changed, 45 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/77cd4cc7/server/master/src/main/java/org/apache/accumulo/master/Master.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/Master.java b/server/master/src/main/java/org/apache/accumulo/master/Master.java
index 16cdd54..5e6dcfb 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/Master.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/Master.java
@@ -856,6 +856,28 @@ public class Master extends AccumuloServerContext implements LiveTServerSet.List
 
   private class StatusThread extends Daemon {
 
+    private boolean goodStats() {
+      int start;
+      switch (getMasterState()) {
+      case UNLOAD_METADATA_TABLETS:
+        start = 1;
+        break;
+      case UNLOAD_ROOT_TABLET:
+        start = 2;
+        break;
+      default:
+        start = 0;
+      }
+      for (int i = start; i < watchers.size(); i++) {
+        TabletGroupWatcher watcher = watchers.get(i);
+        if (watcher.stats.getLastMasterState() != getMasterState()) {
+          log.debug(watcher.getName() + ": " + watcher.stats.getLastMasterState() + " != " + getMasterState());
+          return false;
+        }
+      }
+      return true;
+    }
+
     @Override
     public void run() {
       setName("Status Thread");
@@ -883,27 +905,27 @@ public class Master extends AccumuloServerContext implements LiveTServerSet.List
                 case SAFE_MODE: {
                   int count = nonMetaDataTabletsAssignedOrHosted();
                   log.debug(String.format("There are %d non-metadata tablets assigned or hosted", count));
-                  if (count == 0)
+                  if (count == 0 && goodStats())
                     setMasterState(MasterState.UNLOAD_METADATA_TABLETS);
                 }
                   break;
                 case UNLOAD_METADATA_TABLETS: {
                   int count = assignedOrHosted(METADATA_TABLE_ID);
                   log.debug(String.format("There are %d metadata tablets assigned or hosted", count));
-                  if (count == 0)
+                  if (count == 0 && goodStats())
                     setMasterState(MasterState.UNLOAD_ROOT_TABLET);
                 }
                   break;
                 case UNLOAD_ROOT_TABLET: {
                   int count = assignedOrHosted(METADATA_TABLE_ID);
-                  if (count > 0) {
+                  if (count > 0 && goodStats()) {
                     log.debug(String.format("%d metadata tablets online", count));
                     setMasterState(MasterState.UNLOAD_ROOT_TABLET);
                   }
                   int root_count = assignedOrHosted(ROOT_TABLE_ID);
-                  if (root_count > 0)
+                  if (root_count > 0 && goodStats())
                     log.debug("The root tablet is still assigned or hosted");
-                  if (count + root_count == 0) {
+                  if (count + root_count == 0 && goodStats()) {
                     Set<TServerInstance> currentServers = tserverSet.getCurrentServers();
                     log.debug("stopping " + currentServers.size() + " tablet servers");
                     for (TServerInstance server : currentServers) {

http://git-wip-us.apache.org/repos/asf/accumulo/blob/77cd4cc7/server/master/src/main/java/org/apache/accumulo/master/TabletGroupWatcher.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/TabletGroupWatcher.java b/server/master/src/main/java/org/apache/accumulo/master/TabletGroupWatcher.java
index 35a2d10..755e322 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/TabletGroupWatcher.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/TabletGroupWatcher.java
@@ -46,6 +46,7 @@ import org.apache.accumulo.core.data.Mutation;
 import org.apache.accumulo.core.data.PartialKey;
 import org.apache.accumulo.core.data.Range;
 import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.master.thrift.MasterState;
 import org.apache.accumulo.core.master.thrift.TabletServerStatus;
 import org.apache.accumulo.core.metadata.MetadataTable;
 import org.apache.accumulo.core.metadata.RootTable;
@@ -94,6 +95,7 @@ class TabletGroupWatcher extends Daemon {
   private final Master master;
   final TabletStateStore store;
   final TabletGroupWatcher dependentWatcher;
+  private MasterState masterState;
 
   final TableStats stats = new TableStats();
 
@@ -107,6 +109,11 @@ class TabletGroupWatcher extends Daemon {
     return stats.getLast();
   }
 
+  // returns the master state under which stats were collected
+  MasterState statsState() {
+    return masterState;
+  }
+
   TableCounts getStats(Text tableId) {
     return stats.getLast(tableId);
   }
@@ -121,6 +128,7 @@ class TabletGroupWatcher extends Daemon {
     while (this.master.stillMaster()) {
       // slow things down a little, otherwise we spam the logs when there are many wake-up events
       UtilWaitThread.sleep(100);
+      masterState = master.getMasterState();
 
       int totalUnloaded = 0;
       int unloaded = 0;
@@ -154,6 +162,7 @@ class TabletGroupWatcher extends Daemon {
         List<TabletLocationState> assignedToDeadServers = new ArrayList<TabletLocationState>();
         Map<KeyExtent,TServerInstance> unassigned = new HashMap<KeyExtent,TServerInstance>();
 
+        MasterState masterState = master.getMasterState();
         int[] counts = new int[TabletState.values().length];
         stats.begin();
         // Walk through the tablets in our store, and work tablets
@@ -279,7 +288,7 @@ class TabletGroupWatcher extends Daemon {
         flushChanges(destinations, assignments, assigned, assignedToDeadServers, unassigned);
 
         // provide stats after flushing changes to avoid race conditions w/ delete table
-        stats.end();
+        stats.end(masterState);
 
         // Report changes
         for (TabletState state : TabletState.values()) {

http://git-wip-us.apache.org/repos/asf/accumulo/blob/77cd4cc7/server/master/src/main/java/org/apache/accumulo/master/state/TableStats.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/state/TableStats.java b/server/master/src/main/java/org/apache/accumulo/master/state/TableStats.java
index 127406c..8d87896 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/state/TableStats.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/state/TableStats.java
@@ -19,6 +19,7 @@ package org.apache.accumulo.master.state;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.accumulo.core.master.thrift.MasterState;
 import org.apache.accumulo.server.master.state.TabletState;
 import org.apache.hadoop.io.Text;
 
@@ -27,6 +28,7 @@ public class TableStats {
   private Map<Text,TableCounts> next;
   private long startScan = 0;
   private long endScan = 0;
+  private MasterState state;
 
   public synchronized void begin() {
     next = new HashMap<Text,TableCounts>();
@@ -42,16 +44,21 @@ public class TableStats {
     counts.counts[state.ordinal()]++;
   }
 
-  public synchronized void end() {
+  public synchronized void end(MasterState state) {
     last = next;
     next = null;
     endScan = System.currentTimeMillis();
+    this.state = state;
   }
 
   public synchronized Map<Text,TableCounts> getLast() {
     return last;
   }
 
+  public synchronized MasterState getLastMasterState() {
+    return state;
+  }
+
   public synchronized TableCounts getLast(Text tableId) {
     TableCounts result = last.get(tableId);
     if (result == null)