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/08/25 01:28:08 UTC

[1/2] accumulo git commit: ACCUMULO-3735 allow users to see the bulk imports in progress

Repository: accumulo
Updated Branches:
  refs/heads/master 5e1c0d1db -> 784bd05a0


http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/base/src/main/java/org/apache/accumulo/server/client/ClientServiceHandler.java
----------------------------------------------------------------------
diff --git a/server/base/src/main/java/org/apache/accumulo/server/client/ClientServiceHandler.java b/server/base/src/main/java/org/apache/accumulo/server/client/ClientServiceHandler.java
index 588e3e0..c306e85 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/client/ClientServiceHandler.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/client/ClientServiceHandler.java
@@ -50,6 +50,8 @@ import org.apache.accumulo.core.client.security.tokens.KerberosToken;
 import org.apache.accumulo.core.client.security.tokens.PasswordToken;
 import org.apache.accumulo.core.conf.AccumuloConfiguration;
 import org.apache.accumulo.core.conf.Property;
+import org.apache.accumulo.core.master.thrift.BulkImportState;
+import org.apache.accumulo.core.master.thrift.BulkImportStatus;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.accumulo.core.security.NamespacePermission;
 import org.apache.accumulo.core.security.SystemPermission;
@@ -61,6 +63,7 @@ import org.apache.accumulo.server.conf.ServerConfigurationFactory;
 import org.apache.accumulo.server.fs.VolumeManager;
 import org.apache.accumulo.server.security.AuditedSecurityOperation;
 import org.apache.accumulo.server.security.SecurityOperation;
+import org.apache.accumulo.server.util.ServerBulkImportStatus;
 import org.apache.accumulo.server.util.TableDiskUsage;
 import org.apache.accumulo.server.zookeeper.TransactionWatcher;
 import org.apache.accumulo.start.classloader.vfs.AccumuloVFSClassLoader;
@@ -75,6 +78,7 @@ public class ClientServiceHandler implements ClientService.Iface {
   private final Instance instance;
   private final VolumeManager fs;
   private final SecurityOperation security;
+  private final ServerBulkImportStatus bulkImportStatus = new ServerBulkImportStatus();
 
   public ClientServiceHandler(AccumuloServerContext context, TransactionWatcher transactionWatcher, VolumeManager fs) {
     this.context = context;
@@ -294,11 +298,17 @@ public class ClientServiceHandler implements ClientService.Iface {
     try {
       if (!security.canPerformSystemActions(credentials))
         throw new AccumuloSecurityException(credentials.getPrincipal(), SecurityErrorCode.PERMISSION_DENIED);
+      bulkImportStatus.updateBulkImportStatus(files, BulkImportState.INITIAL);
       log.debug("Got request to bulk import files to table(" + tableId + "): " + files);
       return transactionWatcher.run(Constants.BULK_ARBITRATOR_TYPE, tid, new Callable<List<String>>() {
         @Override
         public List<String> call() throws Exception {
-          return BulkImporter.bulkLoad(context, tid, tableId, files, errorDir, setTime);
+          bulkImportStatus.updateBulkImportStatus(files, BulkImportState.PROCESSING);
+          try {
+            return BulkImporter.bulkLoad(context, tid, tableId, files, errorDir, setTime);
+          } finally {
+            bulkImportStatus.removeBulkImportStatus(files);
+          }
         }
       });
     } catch (AccumuloSecurityException e) {
@@ -452,4 +462,8 @@ public class ClientServiceHandler implements ClientService.Iface {
     AccumuloConfiguration config = context.getServerConfigurationFactory().getNamespaceConfiguration(namespaceId);
     return conf(credentials, config);
   }
+
+  public List<BulkImportStatus> getBulkLoadStatus() {
+    return bulkImportStatus.getBulkLoadStatus();
+  }
 }

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/base/src/main/java/org/apache/accumulo/server/util/ServerBulkImportStatus.java
----------------------------------------------------------------------
diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ServerBulkImportStatus.java b/server/base/src/main/java/org/apache/accumulo/server/util/ServerBulkImportStatus.java
new file mode 100644
index 0000000..21815f8
--- /dev/null
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/ServerBulkImportStatus.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.accumulo.server.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.accumulo.core.master.thrift.BulkImportState;
+import org.apache.accumulo.core.master.thrift.BulkImportStatus;
+
+// A little class to hold bulk import status information in the Master
+// and two places in the tablet server.
+public class ServerBulkImportStatus {
+  private final ConcurrentMap<String,BulkImportStatus> status = new ConcurrentHashMap<>();
+
+  public List<BulkImportStatus> getBulkLoadStatus() {
+    return new ArrayList<>(status.values());
+  }
+
+  public void updateBulkImportStatus(List<String> files, BulkImportState state) {
+    for (String file : files) {
+      BulkImportStatus initial = new BulkImportStatus(System.currentTimeMillis(), file, state);
+      status.putIfAbsent(file, initial);
+      initial = status.get(file);
+      if (initial != null) {
+        initial.state = state;
+      }
+    }
+  }
+
+  public void removeBulkImportStatus(List<String> files) {
+    status.keySet().removeAll(files);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java b/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java
index d50ce16..cda9548 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java
@@ -46,6 +46,7 @@ import org.apache.accumulo.core.client.impl.thrift.TableOperationExceptionType;
 import org.apache.accumulo.core.client.impl.thrift.ThriftSecurityException;
 import org.apache.accumulo.core.client.impl.thrift.ThriftTableOperationException;
 import org.apache.accumulo.core.iterators.IteratorUtil;
+import org.apache.accumulo.core.master.thrift.BulkImportState;
 import org.apache.accumulo.core.master.thrift.FateOperation;
 import org.apache.accumulo.core.master.thrift.FateService;
 import org.apache.accumulo.core.security.thrift.TCredentials;
@@ -363,6 +364,7 @@ class FateServiceHandler implements FateService.Iface {
         if (!canBulkImport)
           throw new ThriftSecurityException(c.getPrincipal(), SecurityErrorCode.PERMISSION_DENIED);
 
+        master.updateBulkImportStatus(dir, BulkImportState.INITIAL);
         master.fate.seedTransaction(opid, new TraceRepo<Master>(new BulkImport(tableId, dir, failDir, setTime)), autoCleanup);
         break;
       }

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/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 6f8bc55..ff4705e 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
@@ -16,6 +16,7 @@
  */
 package org.apache.accumulo.master;
 
+import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
 import static java.nio.charset.StandardCharsets.UTF_8;
 
 import java.io.IOException;
@@ -55,6 +56,7 @@ import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.data.impl.KeyExtent;
 import org.apache.accumulo.core.master.state.tables.TableState;
+import org.apache.accumulo.core.master.thrift.BulkImportState;
 import org.apache.accumulo.core.master.thrift.MasterClientService.Iface;
 import org.apache.accumulo.core.master.thrift.MasterClientService.Processor;
 import org.apache.accumulo.core.master.thrift.MasterGoalState;
@@ -135,6 +137,7 @@ import org.apache.accumulo.server.tables.TableObserver;
 import org.apache.accumulo.server.util.DefaultMap;
 import org.apache.accumulo.server.util.Halt;
 import org.apache.accumulo.server.util.MetadataTableUtil;
+import org.apache.accumulo.server.util.ServerBulkImportStatus;
 import org.apache.accumulo.server.util.TableInfoUtil;
 import org.apache.accumulo.server.util.time.SimpleTimer;
 import org.apache.accumulo.server.zookeeper.ZooLock;
@@ -158,7 +161,6 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Iterables;
-import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
 
 /**
  * The Master is responsible for assigning and balancing tablets to tablet servers.
@@ -210,6 +212,7 @@ public class Master extends AccumuloServerContext implements LiveTServerSet.List
   Fate<Master> fate;
 
   volatile SortedMap<TServerInstance,TabletServerStatus> tserverStatus = Collections.unmodifiableSortedMap(new TreeMap<TServerInstance,TabletServerStatus>());
+  final ServerBulkImportStatus bulkImportStatus = new ServerBulkImportStatus();
 
   @Override
   public synchronized MasterState getMasterState() {
@@ -1564,6 +1567,7 @@ public class Master extends AccumuloServerContext implements LiveTServerSet.List
     }
     DeadServerList obit = new DeadServerList(ZooUtil.getRoot(getInstance()) + Constants.ZDEADTSERVERS);
     result.deadTabletServers = obit.getList();
+    result.bulkImports = bulkImportStatus.getBulkLoadStatus();
     return result;
   }
 
@@ -1598,4 +1602,12 @@ public class Master extends AccumuloServerContext implements LiveTServerSet.List
       }
     }
   }
+
+  public void updateBulkImportStatus(String directory, BulkImportState state) {
+    bulkImportStatus.updateBulkImportStatus(Collections.singletonList(directory), state);
+  }
+
+  public void removeBulkImportStatus(String directory) {
+    bulkImportStatus.removeBulkImportStatus(Collections.singletonList(directory));
+  }
 }

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/master/src/main/java/org/apache/accumulo/master/tableOps/BulkImport.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/tableOps/BulkImport.java b/server/master/src/main/java/org/apache/accumulo/master/tableOps/BulkImport.java
index 5313964..4b53096 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/tableOps/BulkImport.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/tableOps/BulkImport.java
@@ -16,6 +16,8 @@
  */
 package org.apache.accumulo.master.tableOps;
 
+import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
+
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -32,6 +34,7 @@ import org.apache.accumulo.core.client.impl.thrift.TableOperationExceptionType;
 import org.apache.accumulo.core.conf.Property;
 import org.apache.accumulo.core.file.FileOperations;
 import org.apache.accumulo.core.master.state.tables.TableState;
+import org.apache.accumulo.core.master.thrift.BulkImportState;
 import org.apache.accumulo.core.util.SimpleThreadPool;
 import org.apache.accumulo.fate.Repo;
 import org.apache.accumulo.master.Master;
@@ -46,8 +49,6 @@ import org.apache.hadoop.io.MapFile;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
-
 /*
  * Bulk import makes requests of tablet servers, and those requests can take a
  * long time. Our communications to the tablet server may fail, so we won't know
@@ -131,7 +132,7 @@ public class BulkImport extends MasterRepo {
           errorDir + " is not empty");
 
     ZooArbitrator.start(Constants.BULK_ARBITRATOR_TYPE, tid);
-
+    master.updateBulkImportStatus(sourceDir, BulkImportState.MOVING);
     // move the files into the directory
     try {
       String bulkDir = prepareBulkImport(master, fs, sourceDir, tableId);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/master/src/main/java/org/apache/accumulo/master/tableOps/CleanUpBulkImport.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/tableOps/CleanUpBulkImport.java b/server/master/src/main/java/org/apache/accumulo/master/tableOps/CleanUpBulkImport.java
index 5ca325f..fef327d 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/tableOps/CleanUpBulkImport.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/tableOps/CleanUpBulkImport.java
@@ -18,6 +18,7 @@ package org.apache.accumulo.master.tableOps;
 
 import org.apache.accumulo.core.Constants;
 import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.master.thrift.BulkImportState;
 import org.apache.accumulo.fate.Repo;
 import org.apache.accumulo.master.Master;
 import org.apache.accumulo.server.util.MetadataTableUtil;
@@ -46,6 +47,7 @@ class CleanUpBulkImport extends MasterRepo {
 
   @Override
   public Repo<Master> call(long tid, Master master) throws Exception {
+    master.updateBulkImportStatus(source, BulkImportState.CLEANUP);
     log.debug("removing the bulk processing flag file in " + bulk);
     Path bulkDir = new Path(bulk);
     MetadataTableUtil.removeBulkLoadInProgressFlag(master, "/" + bulkDir.getParent().getName() + "/" + bulkDir.getName());
@@ -59,6 +61,7 @@ class CleanUpBulkImport extends MasterRepo {
     Utils.getReadLock(tableId, tid).unlock();
     log.debug("completing bulk import transaction " + tid);
     ZooArbitrator.cleanup(Constants.BULK_ARBITRATOR_TYPE, tid);
+    master.removeBulkImportStatus(source);
     return null;
   }
 }

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/master/src/main/java/org/apache/accumulo/master/tableOps/CopyFailed.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/tableOps/CopyFailed.java b/server/master/src/main/java/org/apache/accumulo/master/tableOps/CopyFailed.java
index 5f5b298..e57a678 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/tableOps/CopyFailed.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/tableOps/CopyFailed.java
@@ -32,6 +32,7 @@ import org.apache.accumulo.core.client.Scanner;
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.data.impl.KeyExtent;
+import org.apache.accumulo.core.master.thrift.BulkImportState;
 import org.apache.accumulo.core.metadata.MetadataTable;
 import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection;
 import org.apache.accumulo.core.security.Authorizations;
@@ -86,7 +87,7 @@ class CopyFailed extends MasterRepo {
   @Override
   public Repo<Master> call(long tid, Master master) throws Exception {
     // This needs to execute after the arbiter is stopped
-
+    master.updateBulkImportStatus(source, BulkImportState.COPY_FILES);
     VolumeManager fs = master.getFileSystem();
 
     if (!fs.exists(new Path(error, BulkImport.FAILURES_TXT)))

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/master/src/main/java/org/apache/accumulo/master/tableOps/LoadFiles.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/tableOps/LoadFiles.java b/server/master/src/main/java/org/apache/accumulo/master/tableOps/LoadFiles.java
index 0c0aad6..48cbaa5 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/tableOps/LoadFiles.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/tableOps/LoadFiles.java
@@ -16,6 +16,7 @@
  */
 package org.apache.accumulo.master.tableOps;
 
+import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
 import static java.nio.charset.StandardCharsets.UTF_8;
 
 import java.io.BufferedWriter;
@@ -40,6 +41,7 @@ import org.apache.accumulo.core.client.impl.thrift.TableOperation;
 import org.apache.accumulo.core.client.impl.thrift.TableOperationExceptionType;
 import org.apache.accumulo.core.conf.AccumuloConfiguration;
 import org.apache.accumulo.core.conf.Property;
+import org.apache.accumulo.core.master.thrift.BulkImportState;
 import org.apache.accumulo.core.trace.Tracer;
 import org.apache.accumulo.core.util.Pair;
 import org.apache.accumulo.core.util.SimpleThreadPool;
@@ -53,8 +55,6 @@ import org.apache.htrace.wrappers.TraceExecutorService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
-
 class LoadFiles extends MasterRepo {
 
   private static final long serialVersionUID = 1L;
@@ -95,6 +95,7 @@ class LoadFiles extends MasterRepo {
 
   @Override
   public Repo<Master> call(final long tid, final Master master) throws Exception {
+    master.updateBulkImportStatus(source, BulkImportState.LOADING);
     ExecutorService executor = getThreadPool(master);
     final AccumuloConfiguration conf = master.getConfiguration();
     VolumeManager fs = master.getFileSystem();

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/monitor/src/main/java/org/apache/accumulo/monitor/Monitor.java
----------------------------------------------------------------------
diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/Monitor.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/Monitor.java
index a8c5d79..d704b94 100644
--- a/server/monitor/src/main/java/org/apache/accumulo/monitor/Monitor.java
+++ b/server/monitor/src/main/java/org/apache/accumulo/monitor/Monitor.java
@@ -60,6 +60,7 @@ import org.apache.accumulo.fate.util.LoggingRunnable;
 import org.apache.accumulo.fate.zookeeper.ZooLock.LockLossReason;
 import org.apache.accumulo.fate.zookeeper.ZooUtil.NodeExistsPolicy;
 import org.apache.accumulo.fate.zookeeper.ZooUtil.NodeMissingPolicy;
+import org.apache.accumulo.monitor.servlets.BulkImportServlet;
 import org.apache.accumulo.monitor.servlets.DefaultServlet;
 import org.apache.accumulo.monitor.servlets.GcStatusServlet;
 import org.apache.accumulo.monitor.servlets.JSONServlet;
@@ -473,6 +474,7 @@ public class Monitor {
     server.addServlet(JSONServlet.class, "/json");
     server.addServlet(VisServlet.class, "/vis");
     server.addServlet(ScanServlet.class, "/scans");
+    server.addServlet(BulkImportServlet.class, "/bulkImports");
     server.addServlet(Summary.class, "/trace/summary");
     server.addServlet(ListType.class, "/trace/listType");
     server.addServlet(ShowTrace.class, "/trace/show");

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/BasicServlet.java
----------------------------------------------------------------------
diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/BasicServlet.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/BasicServlet.java
index fac18cd..fc329b8 100644
--- a/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/BasicServlet.java
+++ b/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/BasicServlet.java
@@ -168,6 +168,7 @@ abstract public class BasicServlet extends HttpServlet {
     sb.append("<a href='/master'>Master&nbsp;Server</a><br />\n");
     sb.append("<a href='/tservers'>Tablet&nbsp;Servers</a><br />\n");
     sb.append("<a href='/scans'>Active&nbsp;Scans</a><br />\n");
+    sb.append("<a href='/bulkImports'>Bulk&nbsp;Imports</a><br />\n");
     sb.append("<a href='/vis'>Server Activity</a><br />\n");
     sb.append("<a href='/gc'>Garbage&nbsp;Collector</a><br />\n");
     sb.append("<a href='/tables'>Tables</a><br />\n");

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/BulkImportServlet.java
----------------------------------------------------------------------
diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/BulkImportServlet.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/BulkImportServlet.java
new file mode 100644
index 0000000..4be67c6
--- /dev/null
+++ b/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/BulkImportServlet.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.accumulo.monitor.servlets;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.accumulo.core.master.thrift.BulkImportStatus;
+import org.apache.accumulo.core.master.thrift.TabletServerStatus;
+import org.apache.accumulo.monitor.Monitor;
+import org.apache.accumulo.monitor.util.Table;
+import org.apache.accumulo.monitor.util.TableRow;
+import org.apache.accumulo.monitor.util.celltypes.BulkImportStateType;
+import org.apache.accumulo.monitor.util.celltypes.DurationType;
+import org.apache.accumulo.monitor.util.celltypes.PreciseNumberType;
+import org.apache.accumulo.monitor.util.celltypes.TServerLinkType;
+
+public class BulkImportServlet extends BasicServlet {
+
+  private static final long serialVersionUID = 1L;
+
+  @Override
+  protected String getTitle(HttpServletRequest req) {
+    return "Bulk Imports";
+  }
+  
+  static private long duration(long start) {
+    return (System.currentTimeMillis() - start) / 1000L;
+  }
+
+  @Override
+  protected void pageBody(HttpServletRequest req, HttpServletResponse response, StringBuilder sb) throws IOException {
+	  Table table = new Table("masterBulkImportStatus", "Bulk&nbsp;Import&nbsp;Status");
+    table.addSortableColumn("Directory");
+	  table.addSortableColumn("Age", new DurationType(0l, 5 * 60 * 1000l), "The age the import.");
+	  table.addSortableColumn("State", new BulkImportStateType(), "The current state of the bulk import");
+	  for (BulkImportStatus bulk : Monitor.getMmi().bulkImports) {
+	    TableRow row = table.prepareRow();
+	    row.add(bulk.filename);
+	    row.add(duration(bulk.startTime));
+	    row.add(bulk.state);
+	    table.addRow(row);
+	  }
+	  table.generate(req, sb);
+	      
+    table = new Table("bulkImportStatus", "TabletServer&nbsp;Bulk&nbsp;Import&nbsp;Status");
+    table.addSortableColumn("Server", new TServerLinkType(), null);
+    table.addSortableColumn("#", new PreciseNumberType(0, 20, 0, 100), "Number of imports presently running");
+    table.addSortableColumn("Oldest&nbsp;Age", new DurationType(0l, 5 * 60 * 1000l), "The age of the oldest import running on this server.");
+    for (TabletServerStatus tserverInfo : Monitor.getMmi().getTServerInfo()) {
+      TableRow row = table.prepareRow();
+      row.add(tserverInfo);
+      List<BulkImportStatus> stats = tserverInfo.bulkImports;
+      if (stats != null) {
+        row.add(stats.size());
+        long oldest = Long.MAX_VALUE;
+        for (BulkImportStatus bulk : stats) {
+        	oldest = Math.min(oldest, bulk.startTime);
+        }
+        if (oldest != Long.MAX_VALUE) {
+        	row.add(duration(oldest));
+        } else {
+        	row.add(0L);
+        }
+      } else {
+    	row.add(0);
+    	row.add(0L);
+      }
+      table.addRow(row);
+    }
+    table.generate(req, sb);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/monitor/src/main/java/org/apache/accumulo/monitor/util/celltypes/BulkImportStateType.java
----------------------------------------------------------------------
diff --git a/server/monitor/src/main/java/org/apache/accumulo/monitor/util/celltypes/BulkImportStateType.java b/server/monitor/src/main/java/org/apache/accumulo/monitor/util/celltypes/BulkImportStateType.java
new file mode 100644
index 0000000..6b4ec52
--- /dev/null
+++ b/server/monitor/src/main/java/org/apache/accumulo/monitor/util/celltypes/BulkImportStateType.java
@@ -0,0 +1,29 @@
+package org.apache.accumulo.monitor.util.celltypes;
+
+import org.apache.accumulo.core.master.thrift.BulkImportState;
+
+public class BulkImportStateType extends CellType<BulkImportState> {
+
+  private static final long serialVersionUID = 1L;
+
+  @Override
+  public String alignment() {
+    return "left";
+  }
+
+  @Override
+  public String format(Object obj) {
+    BulkImportState state = (BulkImportState)obj;
+    return state.name();
+  }
+
+  @Override
+  public int compare(BulkImportState o1, BulkImportState o2) {
+    if (o1 == null && o2 == null)
+      return 0;
+    else if (o1 == null)
+      return -1;
+    return o1.compareTo(o2);
+  }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java
----------------------------------------------------------------------
diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java
index a39fbae..ac5d948 100644
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java
@@ -16,6 +16,7 @@
  */
 package org.apache.accumulo.tserver;
 
+import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.apache.accumulo.server.problems.ProblemType.TABLET_LOAD;
 
@@ -101,6 +102,7 @@ import org.apache.accumulo.core.data.thrift.TMutation;
 import org.apache.accumulo.core.data.thrift.TRange;
 import org.apache.accumulo.core.data.thrift.UpdateErrors;
 import org.apache.accumulo.core.iterators.IterationInterruptedException;
+import org.apache.accumulo.core.master.thrift.BulkImportState;
 import org.apache.accumulo.core.master.thrift.Compacting;
 import org.apache.accumulo.core.master.thrift.MasterClientService;
 import org.apache.accumulo.core.master.thrift.TableInfo;
@@ -188,6 +190,7 @@ import org.apache.accumulo.server.util.FileSystemMonitor;
 import org.apache.accumulo.server.util.Halt;
 import org.apache.accumulo.server.util.MasterMetadataUtil;
 import org.apache.accumulo.server.util.MetadataTableUtil;
+import org.apache.accumulo.server.util.ServerBulkImportStatus;
 import org.apache.accumulo.server.util.time.RelativeTime;
 import org.apache.accumulo.server.util.time.SimpleTimer;
 import org.apache.accumulo.server.zookeeper.DistributedWorkQueue;
@@ -250,7 +253,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.net.HostAndPort;
-import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
 
 public class TabletServer extends AccumuloServerContext implements Runnable {
   private static final Logger log = LoggerFactory.getLogger(TabletServer.class);
@@ -396,6 +398,8 @@ public class TabletServer extends AccumuloServerContext implements Runnable {
 
   private final AtomicLong totalQueuedMutationSize = new AtomicLong(0);
   private final ReentrantLock recoveryLock = new ReentrantLock(true);
+  private ThriftClientHandler clientHandler;
+  private final ServerBulkImportStatus bulkImportStatus = new ServerBulkImportStatus();
 
   private class ThriftClientHandler extends ClientServiceHandler implements TabletClientService.Iface {
 
@@ -2263,6 +2267,7 @@ public class TabletServer extends AccumuloServerContext implements Runnable {
 
   private HostAndPort startTabletClientService() throws UnknownHostException {
     // start listening for client connection last
+    clientHandler = new ThriftClientHandler();
     Iface rpcProxy = RpcWrapper.service(new ThriftClientHandler());
     final Processor<Iface> processor;
     if (ThriftServerType.SASL == getThriftServerType()) {
@@ -2907,6 +2912,9 @@ public class TabletServer extends AccumuloServerContext implements Runnable {
     result.logSorts = logSorter.getLogSorts();
     result.flushs = flushCounter.get();
     result.syncs = syncCounter.get();
+    result.bulkImports = new ArrayList<>();
+    result.bulkImports.addAll(clientHandler.getBulkLoadStatus());
+    result.bulkImports.addAll(bulkImportStatus.getBulkLoadStatus());
     return result;
   }
 
@@ -3084,4 +3092,12 @@ public class TabletServer extends AccumuloServerContext implements Runnable {
     walMarker.closeWal(getTabletSession(), currentLog.getPath());
   }
 
+  public void updateBulkImportState(List<String> files, BulkImportState state) {
+    bulkImportStatus.updateBulkImportStatus(files, state);
+  }
+
+  public void removeBulkImportState(List<String> files) {
+    bulkImportStatus.removeBulkImportStatus(files);
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
----------------------------------------------------------------------
diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
index ad3fb47..b8c260d 100644
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
@@ -16,6 +16,7 @@
  */
 package org.apache.accumulo.tserver.tablet;
 
+import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
 import static java.nio.charset.StandardCharsets.UTF_8;
 
 import java.io.ByteArrayInputStream;
@@ -73,6 +74,7 @@ import org.apache.accumulo.core.iterators.IterationInterruptedException;
 import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope;
 import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
 import org.apache.accumulo.core.iterators.system.SourceSwitchingIterator;
+import org.apache.accumulo.core.master.thrift.BulkImportState;
 import org.apache.accumulo.core.master.thrift.TabletLoadState;
 import org.apache.accumulo.core.metadata.MetadataTable;
 import org.apache.accumulo.core.metadata.RootTable;
@@ -149,7 +151,6 @@ import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
-import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
 
 /**
  *
@@ -2161,9 +2162,11 @@ public class Tablet implements TabletCommitter {
 
   public void importMapFiles(long tid, Map<FileRef,MapFileInfo> fileMap, boolean setTime) throws IOException {
     Map<FileRef,DataFileValue> entries = new HashMap<FileRef,DataFileValue>(fileMap.size());
+    List<String> files = new ArrayList<>();
 
     for (Entry<FileRef,MapFileInfo> entry : fileMap.entrySet()) {
       entries.put(entry.getKey(), new DataFileValue(entry.getValue().estimatedSize, 0l));
+      files.add(entry.getKey().path().toString());
     }
 
     // Clients timeout and will think that this operation failed.
@@ -2198,7 +2201,7 @@ public class Tablet implements TabletCommitter {
 
       writesInProgress++;
     }
-
+    tabletServer.updateBulkImportState(files, BulkImportState.LOADING);
     try {
       getDatafileManager().importMapFiles(tid, entries, setTime);
       lastMapFileImportTime = System.currentTimeMillis();
@@ -2227,6 +2230,7 @@ public class Tablet implements TabletCommitter {
         } catch (Exception ex) {
           log.info(ex.toString(), ex);
         }
+        tabletServer.removeBulkImportState(files);
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/test/src/main/java/org/apache/accumulo/test/BulkImportMonitoringIT.java
----------------------------------------------------------------------
diff --git a/test/src/main/java/org/apache/accumulo/test/BulkImportMonitoringIT.java b/test/src/main/java/org/apache/accumulo/test/BulkImportMonitoringIT.java
new file mode 100644
index 0000000..76e2903
--- /dev/null
+++ b/test/src/main/java/org/apache/accumulo/test/BulkImportMonitoringIT.java
@@ -0,0 +1,129 @@
+package org.apache.accumulo.test;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.conf.AccumuloConfiguration;
+import org.apache.accumulo.core.conf.Property;
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.file.FileOperations;
+import org.apache.accumulo.core.file.FileSKVWriter;
+import org.apache.accumulo.core.file.rfile.RFile;
+import org.apache.accumulo.core.master.thrift.MasterMonitorInfo;
+import org.apache.accumulo.core.util.CachedConfiguration;
+import org.apache.accumulo.core.util.Pair;
+import org.apache.accumulo.minicluster.ServerType;
+import org.apache.accumulo.minicluster.impl.MiniAccumuloConfigImpl;
+import org.apache.accumulo.test.functional.ConfigurableMacBase;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.io.Text;
+import org.junit.Test;
+
+public class BulkImportMonitoringIT extends ConfigurableMacBase {
+
+  @Override
+  protected void configure(MiniAccumuloConfigImpl cfg, Configuration hadoopCoreSite) {
+    cfg.setNumTservers(1);
+    cfg.useMiniDFS(true);
+    cfg.setProperty(Property.GC_FILE_ARCHIVE, "false");
+  }
+
+  @Test
+  public void test() throws Exception {
+	getCluster().getClusterControl().start(ServerType.MONITOR);
+    final Connector c = getConnector();
+    final String tableName = getUniqueNames(1)[0];
+    c.tableOperations().create(tableName);
+    c.tableOperations().setProperty(tableName, Property.TABLE_MAJC_RATIO.getKey(), "1");
+    // splits to slow down bulk import
+    SortedSet<Text> splits = new TreeSet<>();
+    for (int i = 1; i < 0xf; i++) {
+      splits.add(new Text(Integer.toHexString(i)));
+    }
+    c.tableOperations().addSplits(tableName, splits);
+
+    MasterMonitorInfo stats = getCluster().getMasterMonitorInfo();
+    assertEquals(1, stats.tServerInfo.size());
+    assertEquals(0, stats.bulkImports.size());
+    assertEquals(0, stats.tServerInfo.get(0).bulkImports.size());
+
+    log.info("Creating lots of bulk import files");
+    final FileSystem fs = getCluster().getFileSystem();
+    final Path basePath = getCluster().getTemporaryPath();
+    CachedConfiguration.setInstance(fs.getConf());
+
+    final Path base = new Path(basePath, "testBulkLoad" + tableName);
+    fs.delete(base, true);
+    fs.mkdirs(base);
+
+    ExecutorService es = Executors.newFixedThreadPool(5);
+    List<Future<Pair<String,String>>> futures = new ArrayList<>();
+    for (int i = 0; i < 10; i++) {
+      final int which = i;
+      futures.add(es.submit(new Callable<Pair<String,String>>() {
+        @Override
+        public Pair<String,String> call() throws Exception {
+          Path bulkFailures = new Path(base, "failures" + which);
+          Path files = new Path(base, "files" + which);
+          fs.mkdirs(bulkFailures);
+          fs.mkdirs(files);
+          for (int i = 0; i < 10; i++) {
+            FileSKVWriter writer = FileOperations.getInstance().openWriter(files.toString() + "/bulk_" + i + "." + RFile.EXTENSION, fs, fs.getConf(),
+                AccumuloConfiguration.getDefaultConfiguration());
+            writer.startDefaultLocalityGroup();
+            for (int j = 0x100; j < 0xfff; j += 3) {
+              writer.append(new Key(Integer.toHexString(j)), new Value(new byte[0]));
+            }
+            writer.close();
+          }
+          return new Pair<String,String>(files.toString(), bulkFailures.toString());
+        }
+      }));
+    }
+    List<Pair<String,String>> dirs = new ArrayList<>();
+    for (Future<Pair<String,String>> f : futures) {
+      dirs.add(f.get());
+    }
+    log.info("Importing");
+    long now = System.currentTimeMillis();
+    List<Future<Object>> errs = new ArrayList<>();
+    for (Pair<String,String> entry : dirs) {
+      final String dir = entry.getFirst();
+      final String err = entry.getSecond();
+      errs.add(es.submit(new Callable<Object>() {
+        @Override
+        public Object call() throws Exception {
+          c.tableOperations().importDirectory(tableName, dir, err, false);
+          return null;
+        }
+      }));
+    }
+    es.shutdown();
+    while (!es.isTerminated() && stats.bulkImports.size() + stats.tServerInfo.get(0).bulkImports.size() == 0) {
+      es.awaitTermination(10, TimeUnit.MILLISECONDS);
+      stats = getCluster().getMasterMonitorInfo();
+    }
+    log.info(stats.bulkImports.toString());
+    assertTrue(stats.bulkImports.size() > 0);
+    // look for exception
+    for (Future<Object> err : errs) {
+        err.get();
+    }
+    es.awaitTermination(2, TimeUnit.MINUTES);
+    assertTrue(es.isTerminated());
+    log.info(String.format("Completed in %.2f seconds", (System.currentTimeMillis() - now) / 1000.));
+  }
+}

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/test/src/main/java/org/apache/accumulo/test/GetFileInfoBulkIT.java
----------------------------------------------------------------------
diff --git a/test/src/main/java/org/apache/accumulo/test/GetFileInfoBulkIT.java b/test/src/main/java/org/apache/accumulo/test/GetFileInfoBulkIT.java
index e0a0832..259a19e 100644
--- a/test/src/main/java/org/apache/accumulo/test/GetFileInfoBulkIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/GetFileInfoBulkIT.java
@@ -55,7 +55,7 @@ import org.junit.Test;
 import com.google.common.util.concurrent.Uninterruptibles;
 import com.google.gson.Gson;
 
-// ACCUMULO-3949
+// ACCUMULO-3949, ACCUMULO-3953
 public class GetFileInfoBulkIT extends ConfigurableMacBase {
 
   @Override

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/test/src/main/java/org/apache/accumulo/test/GetMasterStats.java
----------------------------------------------------------------------
diff --git a/test/src/main/java/org/apache/accumulo/test/GetMasterStats.java b/test/src/main/java/org/apache/accumulo/test/GetMasterStats.java
index 5c2cbf3..0d0449e 100644
--- a/test/src/main/java/org/apache/accumulo/test/GetMasterStats.java
+++ b/test/src/main/java/org/apache/accumulo/test/GetMasterStats.java
@@ -21,6 +21,7 @@ import java.util.Date;
 import java.util.Map.Entry;
 
 import org.apache.accumulo.core.client.impl.MasterClient;
+import org.apache.accumulo.core.master.thrift.BulkImportStatus;
 import org.apache.accumulo.core.master.thrift.DeadServer;
 import org.apache.accumulo.core.master.thrift.MasterClientService;
 import org.apache.accumulo.core.master.thrift.MasterMonitorInfo;
@@ -67,6 +68,12 @@ public class GetMasterStats {
       out(2, "Last report: %s", new SimpleDateFormat().format(new Date(dead.lastStatus)));
       out(2, "Cause: %s", dead.status);
     }
+    out(0, "Bulk imports: %s", stats.bulkImports.size());
+    for (BulkImportStatus bulk : stats.bulkImports) {
+      out(1, "Import directory: %s", bulk.filename);
+      out(2, "Bulk state %s", bulk.state);
+      out(2, "Bulk start %s", bulk.startTime);
+    }
     if (stats.tableMap != null && stats.tableMap.size() > 0) {
       out(0, "Tables");
       for (Entry<String,TableInfo> entry : stats.tableMap.entrySet()) {
@@ -117,6 +124,13 @@ public class GetMasterStats {
           out(3, "Progress: %.2f%%", sort.progress * 100);
           out(3, "Time running: %s", sort.runtime / 1000.);
         }
+        out(3, "Bulk imports: %s", stats.bulkImports.size());
+        for (BulkImportStatus bulk : stats.bulkImports) {
+          out(4, "Import file: %s", bulk.filename);
+          out(5, "Bulk state %s", bulk.state);
+          out(5, "Bulk start %s", bulk.startTime);
+        }
+
       }
     }
   }


[2/2] accumulo git commit: ACCUMULO-3735 allow users to see the bulk imports in progress

Posted by ec...@apache.org.
ACCUMULO-3735 allow users to see the bulk imports in progress


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

Branch: refs/heads/master
Commit: 784bd05a0038f8bc7b55f886e71e0b5e06eac316
Parents: 5e1c0d1
Author: Eric C. Newton <er...@gmail.com>
Authored: Mon Aug 24 19:27:38 2015 -0400
Committer: Eric C. Newton <er...@gmail.com>
Committed: Mon Aug 24 19:27:38 2015 -0400

----------------------------------------------------------------------
 .../core/master/thrift/BulkImportState.java     |  76 +++
 .../core/master/thrift/BulkImportStatus.java    | 618 +++++++++++++++++++
 .../core/master/thrift/FateService.java         |  76 +--
 .../core/master/thrift/MasterClientService.java |  64 +-
 .../core/master/thrift/MasterMonitorInfo.java   | 358 ++++++++---
 .../core/master/thrift/TabletServerStatus.java  | 214 ++++++-
 .../core/master/thrift/TabletSplit.java         |  36 +-
 core/src/main/thrift/master.thrift              |  24 +
 .../server/client/ClientServiceHandler.java     |  16 +-
 .../server/util/ServerBulkImportStatus.java     |  51 ++
 .../accumulo/master/FateServiceHandler.java     |   2 +
 .../java/org/apache/accumulo/master/Master.java |  14 +-
 .../accumulo/master/tableOps/BulkImport.java    |   7 +-
 .../master/tableOps/CleanUpBulkImport.java      |   3 +
 .../accumulo/master/tableOps/CopyFailed.java    |   3 +-
 .../accumulo/master/tableOps/LoadFiles.java     |   5 +-
 .../org/apache/accumulo/monitor/Monitor.java    |   2 +
 .../accumulo/monitor/servlets/BasicServlet.java |   1 +
 .../monitor/servlets/BulkImportServlet.java     |  91 +++
 .../util/celltypes/BulkImportStateType.java     |  29 +
 .../apache/accumulo/tserver/TabletServer.java   |  18 +-
 .../apache/accumulo/tserver/tablet/Tablet.java  |   8 +-
 .../accumulo/test/BulkImportMonitoringIT.java   | 129 ++++
 .../apache/accumulo/test/GetFileInfoBulkIT.java |   2 +-
 .../apache/accumulo/test/GetMasterStats.java    |  14 +
 25 files changed, 1629 insertions(+), 232 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/core/src/main/java/org/apache/accumulo/core/master/thrift/BulkImportState.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/master/thrift/BulkImportState.java b/core/src/main/java/org/apache/accumulo/core/master/thrift/BulkImportState.java
new file mode 100644
index 0000000..861d3b9
--- /dev/null
+++ b/core/src/main/java/org/apache/accumulo/core/master/thrift/BulkImportState.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * Autogenerated by Thrift Compiler (0.9.1)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.accumulo.core.master.thrift;
+
+
+import java.util.Map;
+import java.util.HashMap;
+import org.apache.thrift.TEnum;
+
+@SuppressWarnings({"unused"}) public enum BulkImportState implements org.apache.thrift.TEnum {
+  INITIAL(0),
+  MOVING(1),
+  PROCESSING(2),
+  ASSIGNING(3),
+  LOADING(4),
+  COPY_FILES(5),
+  CLEANUP(6);
+
+  private final int value;
+
+  private BulkImportState(int value) {
+    this.value = value;
+  }
+
+  /**
+   * Get the integer value of this enum value, as defined in the Thrift IDL.
+   */
+  public int getValue() {
+    return value;
+  }
+
+  /**
+   * Find a the enum type by its integer value, as defined in the Thrift IDL.
+   * @return null if the value is not found.
+   */
+  public static BulkImportState findByValue(int value) { 
+    switch (value) {
+      case 0:
+        return INITIAL;
+      case 1:
+        return MOVING;
+      case 2:
+        return PROCESSING;
+      case 3:
+        return ASSIGNING;
+      case 4:
+        return LOADING;
+      case 5:
+        return COPY_FILES;
+      case 6:
+        return CLEANUP;
+      default:
+        return null;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/core/src/main/java/org/apache/accumulo/core/master/thrift/BulkImportStatus.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/master/thrift/BulkImportStatus.java b/core/src/main/java/org/apache/accumulo/core/master/thrift/BulkImportStatus.java
new file mode 100644
index 0000000..36b3d8e
--- /dev/null
+++ b/core/src/main/java/org/apache/accumulo/core/master/thrift/BulkImportStatus.java
@@ -0,0 +1,618 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * Autogenerated by Thrift Compiler (0.9.1)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.accumulo.core.master.thrift;
+
+import org.apache.thrift.scheme.IScheme;
+import org.apache.thrift.scheme.SchemeFactory;
+import org.apache.thrift.scheme.StandardScheme;
+
+import org.apache.thrift.scheme.TupleScheme;
+import org.apache.thrift.protocol.TTupleProtocol;
+import org.apache.thrift.protocol.TProtocolException;
+import org.apache.thrift.EncodingUtils;
+import org.apache.thrift.TException;
+import org.apache.thrift.async.AsyncMethodCallback;
+import org.apache.thrift.server.AbstractNonblockingServer.*;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.EnumMap;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.EnumSet;
+import java.util.Collections;
+import java.util.BitSet;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SuppressWarnings({"unchecked", "serial", "rawtypes", "unused"}) public class BulkImportStatus implements org.apache.thrift.TBase<BulkImportStatus, BulkImportStatus._Fields>, java.io.Serializable, Cloneable, Comparable<BulkImportStatus> {
+  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("BulkImportStatus");
+
+  private static final org.apache.thrift.protocol.TField START_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("startTime", org.apache.thrift.protocol.TType.I64, (short)1);
+  private static final org.apache.thrift.protocol.TField FILENAME_FIELD_DESC = new org.apache.thrift.protocol.TField("filename", org.apache.thrift.protocol.TType.STRING, (short)2);
+  private static final org.apache.thrift.protocol.TField STATE_FIELD_DESC = new org.apache.thrift.protocol.TField("state", org.apache.thrift.protocol.TType.I32, (short)3);
+
+  private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
+  static {
+    schemes.put(StandardScheme.class, new BulkImportStatusStandardSchemeFactory());
+    schemes.put(TupleScheme.class, new BulkImportStatusTupleSchemeFactory());
+  }
+
+  public long startTime; // required
+  public String filename; // required
+  /**
+   * 
+   * @see BulkImportState
+   */
+  public BulkImportState state; // required
+
+  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+    START_TIME((short)1, "startTime"),
+    FILENAME((short)2, "filename"),
+    /**
+     * 
+     * @see BulkImportState
+     */
+    STATE((short)3, "state");
+
+    private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+
+    static {
+      for (_Fields field : EnumSet.allOf(_Fields.class)) {
+        byName.put(field.getFieldName(), field);
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, or null if its not found.
+     */
+    public static _Fields findByThriftId(int fieldId) {
+      switch(fieldId) {
+        case 1: // START_TIME
+          return START_TIME;
+        case 2: // FILENAME
+          return FILENAME;
+        case 3: // STATE
+          return STATE;
+        default:
+          return null;
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, throwing an exception
+     * if it is not found.
+     */
+    public static _Fields findByThriftIdOrThrow(int fieldId) {
+      _Fields fields = findByThriftId(fieldId);
+      if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+      return fields;
+    }
+
+    /**
+     * Find the _Fields constant that matches name, or null if its not found.
+     */
+    public static _Fields findByName(String name) {
+      return byName.get(name);
+    }
+
+    private final short _thriftId;
+    private final String _fieldName;
+
+    _Fields(short thriftId, String fieldName) {
+      _thriftId = thriftId;
+      _fieldName = fieldName;
+    }
+
+    public short getThriftFieldId() {
+      return _thriftId;
+    }
+
+    public String getFieldName() {
+      return _fieldName;
+    }
+  }
+
+  // isset id assignments
+  private static final int __STARTTIME_ISSET_ID = 0;
+  private byte __isset_bitfield = 0;
+  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+  static {
+    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+    tmpMap.put(_Fields.START_TIME, new org.apache.thrift.meta_data.FieldMetaData("startTime", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+    tmpMap.put(_Fields.FILENAME, new org.apache.thrift.meta_data.FieldMetaData("filename", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.STATE, new org.apache.thrift.meta_data.FieldMetaData("state", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+        new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, BulkImportState.class)));
+    metaDataMap = Collections.unmodifiableMap(tmpMap);
+    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(BulkImportStatus.class, metaDataMap);
+  }
+
+  public BulkImportStatus() {
+  }
+
+  public BulkImportStatus(
+    long startTime,
+    String filename,
+    BulkImportState state)
+  {
+    this();
+    this.startTime = startTime;
+    setStartTimeIsSet(true);
+    this.filename = filename;
+    this.state = state;
+  }
+
+  /**
+   * Performs a deep copy on <i>other</i>.
+   */
+  public BulkImportStatus(BulkImportStatus other) {
+    __isset_bitfield = other.__isset_bitfield;
+    this.startTime = other.startTime;
+    if (other.isSetFilename()) {
+      this.filename = other.filename;
+    }
+    if (other.isSetState()) {
+      this.state = other.state;
+    }
+  }
+
+  public BulkImportStatus deepCopy() {
+    return new BulkImportStatus(this);
+  }
+
+  @Override
+  public void clear() {
+    setStartTimeIsSet(false);
+    this.startTime = 0;
+    this.filename = null;
+    this.state = null;
+  }
+
+  public long getStartTime() {
+    return this.startTime;
+  }
+
+  public BulkImportStatus setStartTime(long startTime) {
+    this.startTime = startTime;
+    setStartTimeIsSet(true);
+    return this;
+  }
+
+  public void unsetStartTime() {
+    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __STARTTIME_ISSET_ID);
+  }
+
+  /** Returns true if field startTime is set (has been assigned a value) and false otherwise */
+  public boolean isSetStartTime() {
+    return EncodingUtils.testBit(__isset_bitfield, __STARTTIME_ISSET_ID);
+  }
+
+  public void setStartTimeIsSet(boolean value) {
+    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __STARTTIME_ISSET_ID, value);
+  }
+
+  public String getFilename() {
+    return this.filename;
+  }
+
+  public BulkImportStatus setFilename(String filename) {
+    this.filename = filename;
+    return this;
+  }
+
+  public void unsetFilename() {
+    this.filename = null;
+  }
+
+  /** Returns true if field filename is set (has been assigned a value) and false otherwise */
+  public boolean isSetFilename() {
+    return this.filename != null;
+  }
+
+  public void setFilenameIsSet(boolean value) {
+    if (!value) {
+      this.filename = null;
+    }
+  }
+
+  /**
+   * 
+   * @see BulkImportState
+   */
+  public BulkImportState getState() {
+    return this.state;
+  }
+
+  /**
+   * 
+   * @see BulkImportState
+   */
+  public BulkImportStatus setState(BulkImportState state) {
+    this.state = state;
+    return this;
+  }
+
+  public void unsetState() {
+    this.state = null;
+  }
+
+  /** Returns true if field state is set (has been assigned a value) and false otherwise */
+  public boolean isSetState() {
+    return this.state != null;
+  }
+
+  public void setStateIsSet(boolean value) {
+    if (!value) {
+      this.state = null;
+    }
+  }
+
+  public void setFieldValue(_Fields field, Object value) {
+    switch (field) {
+    case START_TIME:
+      if (value == null) {
+        unsetStartTime();
+      } else {
+        setStartTime((Long)value);
+      }
+      break;
+
+    case FILENAME:
+      if (value == null) {
+        unsetFilename();
+      } else {
+        setFilename((String)value);
+      }
+      break;
+
+    case STATE:
+      if (value == null) {
+        unsetState();
+      } else {
+        setState((BulkImportState)value);
+      }
+      break;
+
+    }
+  }
+
+  public Object getFieldValue(_Fields field) {
+    switch (field) {
+    case START_TIME:
+      return Long.valueOf(getStartTime());
+
+    case FILENAME:
+      return getFilename();
+
+    case STATE:
+      return getState();
+
+    }
+    throw new IllegalStateException();
+  }
+
+  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+  public boolean isSet(_Fields field) {
+    if (field == null) {
+      throw new IllegalArgumentException();
+    }
+
+    switch (field) {
+    case START_TIME:
+      return isSetStartTime();
+    case FILENAME:
+      return isSetFilename();
+    case STATE:
+      return isSetState();
+    }
+    throw new IllegalStateException();
+  }
+
+  @Override
+  public boolean equals(Object that) {
+    if (that == null)
+      return false;
+    if (that instanceof BulkImportStatus)
+      return this.equals((BulkImportStatus)that);
+    return false;
+  }
+
+  public boolean equals(BulkImportStatus that) {
+    if (that == null)
+      return false;
+
+    boolean this_present_startTime = true;
+    boolean that_present_startTime = true;
+    if (this_present_startTime || that_present_startTime) {
+      if (!(this_present_startTime && that_present_startTime))
+        return false;
+      if (this.startTime != that.startTime)
+        return false;
+    }
+
+    boolean this_present_filename = true && this.isSetFilename();
+    boolean that_present_filename = true && that.isSetFilename();
+    if (this_present_filename || that_present_filename) {
+      if (!(this_present_filename && that_present_filename))
+        return false;
+      if (!this.filename.equals(that.filename))
+        return false;
+    }
+
+    boolean this_present_state = true && this.isSetState();
+    boolean that_present_state = true && that.isSetState();
+    if (this_present_state || that_present_state) {
+      if (!(this_present_state && that_present_state))
+        return false;
+      if (!this.state.equals(that.state))
+        return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return 0;
+  }
+
+  @Override
+  public int compareTo(BulkImportStatus other) {
+    if (!getClass().equals(other.getClass())) {
+      return getClass().getName().compareTo(other.getClass().getName());
+    }
+
+    int lastComparison = 0;
+
+    lastComparison = Boolean.valueOf(isSetStartTime()).compareTo(other.isSetStartTime());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetStartTime()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.startTime, other.startTime);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = Boolean.valueOf(isSetFilename()).compareTo(other.isSetFilename());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetFilename()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.filename, other.filename);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = Boolean.valueOf(isSetState()).compareTo(other.isSetState());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetState()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.state, other.state);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    return 0;
+  }
+
+  public _Fields fieldForId(int fieldId) {
+    return _Fields.findByThriftId(fieldId);
+  }
+
+  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+    schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
+  }
+
+  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+    schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder("BulkImportStatus(");
+    boolean first = true;
+
+    sb.append("startTime:");
+    sb.append(this.startTime);
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("filename:");
+    if (this.filename == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.filename);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("state:");
+    if (this.state == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.state);
+    }
+    first = false;
+    sb.append(")");
+    return sb.toString();
+  }
+
+  public void validate() throws org.apache.thrift.TException {
+    // check for required fields
+    // check for sub-struct validity
+  }
+
+  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+    try {
+      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+    } catch (org.apache.thrift.TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
+    try {
+      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
+      __isset_bitfield = 0;
+      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+    } catch (org.apache.thrift.TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private static class BulkImportStatusStandardSchemeFactory implements SchemeFactory {
+    public BulkImportStatusStandardScheme getScheme() {
+      return new BulkImportStatusStandardScheme();
+    }
+  }
+
+  private static class BulkImportStatusStandardScheme extends StandardScheme<BulkImportStatus> {
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot, BulkImportStatus struct) throws org.apache.thrift.TException {
+      org.apache.thrift.protocol.TField schemeField;
+      iprot.readStructBegin();
+      while (true)
+      {
+        schemeField = iprot.readFieldBegin();
+        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+          break;
+        }
+        switch (schemeField.id) {
+          case 1: // START_TIME
+            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
+              struct.startTime = iprot.readI64();
+              struct.setStartTimeIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 2: // FILENAME
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.filename = iprot.readString();
+              struct.setFilenameIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 3: // STATE
+            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
+              struct.state = BulkImportState.findByValue(iprot.readI32());
+              struct.setStateIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          default:
+            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+        }
+        iprot.readFieldEnd();
+      }
+      iprot.readStructEnd();
+
+      // check for required fields of primitive type, which can't be checked in the validate method
+      struct.validate();
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot, BulkImportStatus struct) throws org.apache.thrift.TException {
+      struct.validate();
+
+      oprot.writeStructBegin(STRUCT_DESC);
+      oprot.writeFieldBegin(START_TIME_FIELD_DESC);
+      oprot.writeI64(struct.startTime);
+      oprot.writeFieldEnd();
+      if (struct.filename != null) {
+        oprot.writeFieldBegin(FILENAME_FIELD_DESC);
+        oprot.writeString(struct.filename);
+        oprot.writeFieldEnd();
+      }
+      if (struct.state != null) {
+        oprot.writeFieldBegin(STATE_FIELD_DESC);
+        oprot.writeI32(struct.state.getValue());
+        oprot.writeFieldEnd();
+      }
+      oprot.writeFieldStop();
+      oprot.writeStructEnd();
+    }
+
+  }
+
+  private static class BulkImportStatusTupleSchemeFactory implements SchemeFactory {
+    public BulkImportStatusTupleScheme getScheme() {
+      return new BulkImportStatusTupleScheme();
+    }
+  }
+
+  private static class BulkImportStatusTupleScheme extends TupleScheme<BulkImportStatus> {
+
+    @Override
+    public void write(org.apache.thrift.protocol.TProtocol prot, BulkImportStatus struct) throws org.apache.thrift.TException {
+      TTupleProtocol oprot = (TTupleProtocol) prot;
+      BitSet optionals = new BitSet();
+      if (struct.isSetStartTime()) {
+        optionals.set(0);
+      }
+      if (struct.isSetFilename()) {
+        optionals.set(1);
+      }
+      if (struct.isSetState()) {
+        optionals.set(2);
+      }
+      oprot.writeBitSet(optionals, 3);
+      if (struct.isSetStartTime()) {
+        oprot.writeI64(struct.startTime);
+      }
+      if (struct.isSetFilename()) {
+        oprot.writeString(struct.filename);
+      }
+      if (struct.isSetState()) {
+        oprot.writeI32(struct.state.getValue());
+      }
+    }
+
+    @Override
+    public void read(org.apache.thrift.protocol.TProtocol prot, BulkImportStatus struct) throws org.apache.thrift.TException {
+      TTupleProtocol iprot = (TTupleProtocol) prot;
+      BitSet incoming = iprot.readBitSet(3);
+      if (incoming.get(0)) {
+        struct.startTime = iprot.readI64();
+        struct.setStartTimeIsSet(true);
+      }
+      if (incoming.get(1)) {
+        struct.filename = iprot.readString();
+        struct.setFilenameIsSet(true);
+      }
+      if (incoming.get(2)) {
+        struct.state = BulkImportState.findByValue(iprot.readI32());
+        struct.setStateIsSet(true);
+      }
+    }
+  }
+
+}
+

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/core/src/main/java/org/apache/accumulo/core/master/thrift/FateService.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/master/thrift/FateService.java b/core/src/main/java/org/apache/accumulo/core/master/thrift/FateService.java
index 27a9d0d..352d891 100644
--- a/core/src/main/java/org/apache/accumulo/core/master/thrift/FateService.java
+++ b/core/src/main/java/org/apache/accumulo/core/master/thrift/FateService.java
@@ -2522,13 +2522,13 @@ import org.slf4j.LoggerFactory;
             case 4: // ARGUMENTS
               if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
                 {
-                  org.apache.thrift.protocol.TList _list70 = iprot.readListBegin();
-                  struct.arguments = new ArrayList<ByteBuffer>(_list70.size);
-                  for (int _i71 = 0; _i71 < _list70.size; ++_i71)
+                  org.apache.thrift.protocol.TList _list86 = iprot.readListBegin();
+                  struct.arguments = new ArrayList<ByteBuffer>(_list86.size);
+                  for (int _i87 = 0; _i87 < _list86.size; ++_i87)
                   {
-                    ByteBuffer _elem72;
-                    _elem72 = iprot.readBinary();
-                    struct.arguments.add(_elem72);
+                    ByteBuffer _elem88;
+                    _elem88 = iprot.readBinary();
+                    struct.arguments.add(_elem88);
                   }
                   iprot.readListEnd();
                 }
@@ -2540,15 +2540,15 @@ import org.slf4j.LoggerFactory;
             case 5: // OPTIONS
               if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
                 {
-                  org.apache.thrift.protocol.TMap _map73 = iprot.readMapBegin();
-                  struct.options = new HashMap<String,String>(2*_map73.size);
-                  for (int _i74 = 0; _i74 < _map73.size; ++_i74)
+                  org.apache.thrift.protocol.TMap _map89 = iprot.readMapBegin();
+                  struct.options = new HashMap<String,String>(2*_map89.size);
+                  for (int _i90 = 0; _i90 < _map89.size; ++_i90)
                   {
-                    String _key75;
-                    String _val76;
-                    _key75 = iprot.readString();
-                    _val76 = iprot.readString();
-                    struct.options.put(_key75, _val76);
+                    String _key91;
+                    String _val92;
+                    _key91 = iprot.readString();
+                    _val92 = iprot.readString();
+                    struct.options.put(_key91, _val92);
                   }
                   iprot.readMapEnd();
                 }
@@ -2597,9 +2597,9 @@ import org.slf4j.LoggerFactory;
           oprot.writeFieldBegin(ARGUMENTS_FIELD_DESC);
           {
             oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.arguments.size()));
-            for (ByteBuffer _iter77 : struct.arguments)
+            for (ByteBuffer _iter93 : struct.arguments)
             {
-              oprot.writeBinary(_iter77);
+              oprot.writeBinary(_iter93);
             }
             oprot.writeListEnd();
           }
@@ -2609,10 +2609,10 @@ import org.slf4j.LoggerFactory;
           oprot.writeFieldBegin(OPTIONS_FIELD_DESC);
           {
             oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, struct.options.size()));
-            for (Map.Entry<String, String> _iter78 : struct.options.entrySet())
+            for (Map.Entry<String, String> _iter94 : struct.options.entrySet())
             {
-              oprot.writeString(_iter78.getKey());
-              oprot.writeString(_iter78.getValue());
+              oprot.writeString(_iter94.getKey());
+              oprot.writeString(_iter94.getValue());
             }
             oprot.writeMapEnd();
           }
@@ -2681,19 +2681,19 @@ import org.slf4j.LoggerFactory;
         if (struct.isSetArguments()) {
           {
             oprot.writeI32(struct.arguments.size());
-            for (ByteBuffer _iter79 : struct.arguments)
+            for (ByteBuffer _iter95 : struct.arguments)
             {
-              oprot.writeBinary(_iter79);
+              oprot.writeBinary(_iter95);
             }
           }
         }
         if (struct.isSetOptions()) {
           {
             oprot.writeI32(struct.options.size());
-            for (Map.Entry<String, String> _iter80 : struct.options.entrySet())
+            for (Map.Entry<String, String> _iter96 : struct.options.entrySet())
             {
-              oprot.writeString(_iter80.getKey());
-              oprot.writeString(_iter80.getValue());
+              oprot.writeString(_iter96.getKey());
+              oprot.writeString(_iter96.getValue());
             }
           }
         }
@@ -2726,28 +2726,28 @@ import org.slf4j.LoggerFactory;
         }
         if (incoming.get(4)) {
           {
-            org.apache.thrift.protocol.TList _list81 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-            struct.arguments = new ArrayList<ByteBuffer>(_list81.size);
-            for (int _i82 = 0; _i82 < _list81.size; ++_i82)
+            org.apache.thrift.protocol.TList _list97 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+            struct.arguments = new ArrayList<ByteBuffer>(_list97.size);
+            for (int _i98 = 0; _i98 < _list97.size; ++_i98)
             {
-              ByteBuffer _elem83;
-              _elem83 = iprot.readBinary();
-              struct.arguments.add(_elem83);
+              ByteBuffer _elem99;
+              _elem99 = iprot.readBinary();
+              struct.arguments.add(_elem99);
             }
           }
           struct.setArgumentsIsSet(true);
         }
         if (incoming.get(5)) {
           {
-            org.apache.thrift.protocol.TMap _map84 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-            struct.options = new HashMap<String,String>(2*_map84.size);
-            for (int _i85 = 0; _i85 < _map84.size; ++_i85)
+            org.apache.thrift.protocol.TMap _map100 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+            struct.options = new HashMap<String,String>(2*_map100.size);
+            for (int _i101 = 0; _i101 < _map100.size; ++_i101)
             {
-              String _key86;
-              String _val87;
-              _key86 = iprot.readString();
-              _val87 = iprot.readString();
-              struct.options.put(_key86, _val87);
+              String _key102;
+              String _val103;
+              _key102 = iprot.readString();
+              _val103 = iprot.readString();
+              struct.options.put(_key102, _val103);
             }
           }
           struct.setOptionsIsSet(true);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/core/src/main/java/org/apache/accumulo/core/master/thrift/MasterClientService.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/master/thrift/MasterClientService.java b/core/src/main/java/org/apache/accumulo/core/master/thrift/MasterClientService.java
index 63a2131..0885d4c 100644
--- a/core/src/main/java/org/apache/accumulo/core/master/thrift/MasterClientService.java
+++ b/core/src/main/java/org/apache/accumulo/core/master/thrift/MasterClientService.java
@@ -18717,13 +18717,13 @@ import org.slf4j.LoggerFactory;
             case 0: // SUCCESS
               if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
                 {
-                  org.apache.thrift.protocol.TList _list88 = iprot.readListBegin();
-                  struct.success = new ArrayList<String>(_list88.size);
-                  for (int _i89 = 0; _i89 < _list88.size; ++_i89)
+                  org.apache.thrift.protocol.TList _list104 = iprot.readListBegin();
+                  struct.success = new ArrayList<String>(_list104.size);
+                  for (int _i105 = 0; _i105 < _list104.size; ++_i105)
                   {
-                    String _elem90;
-                    _elem90 = iprot.readString();
-                    struct.success.add(_elem90);
+                    String _elem106;
+                    _elem106 = iprot.readString();
+                    struct.success.add(_elem106);
                   }
                   iprot.readListEnd();
                 }
@@ -18760,9 +18760,9 @@ import org.slf4j.LoggerFactory;
           oprot.writeFieldBegin(SUCCESS_FIELD_DESC);
           {
             oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.success.size()));
-            for (String _iter91 : struct.success)
+            for (String _iter107 : struct.success)
             {
-              oprot.writeString(_iter91);
+              oprot.writeString(_iter107);
             }
             oprot.writeListEnd();
           }
@@ -18801,9 +18801,9 @@ import org.slf4j.LoggerFactory;
         if (struct.isSetSuccess()) {
           {
             oprot.writeI32(struct.success.size());
-            for (String _iter92 : struct.success)
+            for (String _iter108 : struct.success)
             {
-              oprot.writeString(_iter92);
+              oprot.writeString(_iter108);
             }
           }
         }
@@ -18818,13 +18818,13 @@ import org.slf4j.LoggerFactory;
         BitSet incoming = iprot.readBitSet(2);
         if (incoming.get(0)) {
           {
-            org.apache.thrift.protocol.TList _list93 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-            struct.success = new ArrayList<String>(_list93.size);
-            for (int _i94 = 0; _i94 < _list93.size; ++_i94)
+            org.apache.thrift.protocol.TList _list109 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+            struct.success = new ArrayList<String>(_list109.size);
+            for (int _i110 = 0; _i110 < _list109.size; ++_i110)
             {
-              String _elem95;
-              _elem95 = iprot.readString();
-              struct.success.add(_elem95);
+              String _elem111;
+              _elem111 = iprot.readString();
+              struct.success.add(_elem111);
             }
           }
           struct.setSuccessIsSet(true);
@@ -20438,13 +20438,13 @@ import org.slf4j.LoggerFactory;
             case 4: // LOGS_TO_WATCH
               if (schemeField.type == org.apache.thrift.protocol.TType.SET) {
                 {
-                  org.apache.thrift.protocol.TSet _set96 = iprot.readSetBegin();
-                  struct.logsToWatch = new HashSet<String>(2*_set96.size);
-                  for (int _i97 = 0; _i97 < _set96.size; ++_i97)
+                  org.apache.thrift.protocol.TSet _set112 = iprot.readSetBegin();
+                  struct.logsToWatch = new HashSet<String>(2*_set112.size);
+                  for (int _i113 = 0; _i113 < _set112.size; ++_i113)
                   {
-                    String _elem98;
-                    _elem98 = iprot.readString();
-                    struct.logsToWatch.add(_elem98);
+                    String _elem114;
+                    _elem114 = iprot.readString();
+                    struct.logsToWatch.add(_elem114);
                   }
                   iprot.readSetEnd();
                 }
@@ -20487,9 +20487,9 @@ import org.slf4j.LoggerFactory;
           oprot.writeFieldBegin(LOGS_TO_WATCH_FIELD_DESC);
           {
             oprot.writeSetBegin(new org.apache.thrift.protocol.TSet(org.apache.thrift.protocol.TType.STRING, struct.logsToWatch.size()));
-            for (String _iter99 : struct.logsToWatch)
+            for (String _iter115 : struct.logsToWatch)
             {
-              oprot.writeString(_iter99);
+              oprot.writeString(_iter115);
             }
             oprot.writeSetEnd();
           }
@@ -20538,9 +20538,9 @@ import org.slf4j.LoggerFactory;
         if (struct.isSetLogsToWatch()) {
           {
             oprot.writeI32(struct.logsToWatch.size());
-            for (String _iter100 : struct.logsToWatch)
+            for (String _iter116 : struct.logsToWatch)
             {
-              oprot.writeString(_iter100);
+              oprot.writeString(_iter116);
             }
           }
         }
@@ -20566,13 +20566,13 @@ import org.slf4j.LoggerFactory;
         }
         if (incoming.get(3)) {
           {
-            org.apache.thrift.protocol.TSet _set101 = new org.apache.thrift.protocol.TSet(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-            struct.logsToWatch = new HashSet<String>(2*_set101.size);
-            for (int _i102 = 0; _i102 < _set101.size; ++_i102)
+            org.apache.thrift.protocol.TSet _set117 = new org.apache.thrift.protocol.TSet(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+            struct.logsToWatch = new HashSet<String>(2*_set117.size);
+            for (int _i118 = 0; _i118 < _set117.size; ++_i118)
             {
-              String _elem103;
-              _elem103 = iprot.readString();
-              struct.logsToWatch.add(_elem103);
+              String _elem119;
+              _elem119 = iprot.readString();
+              struct.logsToWatch.add(_elem119);
             }
           }
           struct.setLogsToWatchIsSet(true);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/core/src/main/java/org/apache/accumulo/core/master/thrift/MasterMonitorInfo.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/master/thrift/MasterMonitorInfo.java b/core/src/main/java/org/apache/accumulo/core/master/thrift/MasterMonitorInfo.java
index 990fc89..bf9befb 100644
--- a/core/src/main/java/org/apache/accumulo/core/master/thrift/MasterMonitorInfo.java
+++ b/core/src/main/java/org/apache/accumulo/core/master/thrift/MasterMonitorInfo.java
@@ -59,6 +59,7 @@ import org.slf4j.LoggerFactory;
   private static final org.apache.thrift.protocol.TField UNASSIGNED_TABLETS_FIELD_DESC = new org.apache.thrift.protocol.TField("unassignedTablets", org.apache.thrift.protocol.TType.I32, (short)7);
   private static final org.apache.thrift.protocol.TField SERVERS_SHUTTING_DOWN_FIELD_DESC = new org.apache.thrift.protocol.TField("serversShuttingDown", org.apache.thrift.protocol.TType.SET, (short)9);
   private static final org.apache.thrift.protocol.TField DEAD_TABLET_SERVERS_FIELD_DESC = new org.apache.thrift.protocol.TField("deadTabletServers", org.apache.thrift.protocol.TType.LIST, (short)10);
+  private static final org.apache.thrift.protocol.TField BULK_IMPORTS_FIELD_DESC = new org.apache.thrift.protocol.TField("bulkImports", org.apache.thrift.protocol.TType.LIST, (short)11);
 
   private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
   static {
@@ -82,6 +83,7 @@ import org.slf4j.LoggerFactory;
   public int unassignedTablets; // required
   public Set<String> serversShuttingDown; // required
   public List<DeadServer> deadTabletServers; // required
+  public List<BulkImportStatus> bulkImports; // required
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -100,7 +102,8 @@ import org.slf4j.LoggerFactory;
     GOAL_STATE((short)8, "goalState"),
     UNASSIGNED_TABLETS((short)7, "unassignedTablets"),
     SERVERS_SHUTTING_DOWN((short)9, "serversShuttingDown"),
-    DEAD_TABLET_SERVERS((short)10, "deadTabletServers");
+    DEAD_TABLET_SERVERS((short)10, "deadTabletServers"),
+    BULK_IMPORTS((short)11, "bulkImports");
 
     private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
 
@@ -131,6 +134,8 @@ import org.slf4j.LoggerFactory;
           return SERVERS_SHUTTING_DOWN;
         case 10: // DEAD_TABLET_SERVERS
           return DEAD_TABLET_SERVERS;
+        case 11: // BULK_IMPORTS
+          return BULK_IMPORTS;
         default:
           return null;
       }
@@ -199,6 +204,9 @@ import org.slf4j.LoggerFactory;
     tmpMap.put(_Fields.DEAD_TABLET_SERVERS, new org.apache.thrift.meta_data.FieldMetaData("deadTabletServers", org.apache.thrift.TFieldRequirementType.DEFAULT, 
         new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
             new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, DeadServer.class))));
+    tmpMap.put(_Fields.BULK_IMPORTS, new org.apache.thrift.meta_data.FieldMetaData("bulkImports", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
+            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, BulkImportStatus.class))));
     metaDataMap = Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(MasterMonitorInfo.class, metaDataMap);
   }
@@ -214,7 +222,8 @@ import org.slf4j.LoggerFactory;
     MasterGoalState goalState,
     int unassignedTablets,
     Set<String> serversShuttingDown,
-    List<DeadServer> deadTabletServers)
+    List<DeadServer> deadTabletServers,
+    List<BulkImportStatus> bulkImports)
   {
     this();
     this.tableMap = tableMap;
@@ -226,6 +235,7 @@ import org.slf4j.LoggerFactory;
     setUnassignedTabletsIsSet(true);
     this.serversShuttingDown = serversShuttingDown;
     this.deadTabletServers = deadTabletServers;
+    this.bulkImports = bulkImports;
   }
 
   /**
@@ -277,6 +287,13 @@ import org.slf4j.LoggerFactory;
       }
       this.deadTabletServers = __this__deadTabletServers;
     }
+    if (other.isSetBulkImports()) {
+      List<BulkImportStatus> __this__bulkImports = new ArrayList<BulkImportStatus>(other.bulkImports.size());
+      for (BulkImportStatus other_element : other.bulkImports) {
+        __this__bulkImports.add(new BulkImportStatus(other_element));
+      }
+      this.bulkImports = __this__bulkImports;
+    }
   }
 
   public MasterMonitorInfo deepCopy() {
@@ -294,6 +311,7 @@ import org.slf4j.LoggerFactory;
     this.unassignedTablets = 0;
     this.serversShuttingDown = null;
     this.deadTabletServers = null;
+    this.bulkImports = null;
   }
 
   public int getTableMapSize() {
@@ -570,6 +588,45 @@ import org.slf4j.LoggerFactory;
     }
   }
 
+  public int getBulkImportsSize() {
+    return (this.bulkImports == null) ? 0 : this.bulkImports.size();
+  }
+
+  public java.util.Iterator<BulkImportStatus> getBulkImportsIterator() {
+    return (this.bulkImports == null) ? null : this.bulkImports.iterator();
+  }
+
+  public void addToBulkImports(BulkImportStatus elem) {
+    if (this.bulkImports == null) {
+      this.bulkImports = new ArrayList<BulkImportStatus>();
+    }
+    this.bulkImports.add(elem);
+  }
+
+  public List<BulkImportStatus> getBulkImports() {
+    return this.bulkImports;
+  }
+
+  public MasterMonitorInfo setBulkImports(List<BulkImportStatus> bulkImports) {
+    this.bulkImports = bulkImports;
+    return this;
+  }
+
+  public void unsetBulkImports() {
+    this.bulkImports = null;
+  }
+
+  /** Returns true if field bulkImports is set (has been assigned a value) and false otherwise */
+  public boolean isSetBulkImports() {
+    return this.bulkImports != null;
+  }
+
+  public void setBulkImportsIsSet(boolean value) {
+    if (!value) {
+      this.bulkImports = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, Object value) {
     switch (field) {
     case TABLE_MAP:
@@ -636,6 +693,14 @@ import org.slf4j.LoggerFactory;
       }
       break;
 
+    case BULK_IMPORTS:
+      if (value == null) {
+        unsetBulkImports();
+      } else {
+        setBulkImports((List<BulkImportStatus>)value);
+      }
+      break;
+
     }
   }
 
@@ -665,6 +730,9 @@ import org.slf4j.LoggerFactory;
     case DEAD_TABLET_SERVERS:
       return getDeadTabletServers();
 
+    case BULK_IMPORTS:
+      return getBulkImports();
+
     }
     throw new IllegalStateException();
   }
@@ -692,6 +760,8 @@ import org.slf4j.LoggerFactory;
       return isSetServersShuttingDown();
     case DEAD_TABLET_SERVERS:
       return isSetDeadTabletServers();
+    case BULK_IMPORTS:
+      return isSetBulkImports();
     }
     throw new IllegalStateException();
   }
@@ -781,6 +851,15 @@ import org.slf4j.LoggerFactory;
         return false;
     }
 
+    boolean this_present_bulkImports = true && this.isSetBulkImports();
+    boolean that_present_bulkImports = true && that.isSetBulkImports();
+    if (this_present_bulkImports || that_present_bulkImports) {
+      if (!(this_present_bulkImports && that_present_bulkImports))
+        return false;
+      if (!this.bulkImports.equals(that.bulkImports))
+        return false;
+    }
+
     return true;
   }
 
@@ -877,6 +956,16 @@ import org.slf4j.LoggerFactory;
         return lastComparison;
       }
     }
+    lastComparison = Boolean.valueOf(isSetBulkImports()).compareTo(other.isSetBulkImports());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetBulkImports()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.bulkImports, other.bulkImports);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -956,6 +1045,14 @@ import org.slf4j.LoggerFactory;
       sb.append(this.deadTabletServers);
     }
     first = false;
+    if (!first) sb.append(", ");
+    sb.append("bulkImports:");
+    if (this.bulkImports == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.bulkImports);
+    }
+    first = false;
     sb.append(")");
     return sb.toString();
   }
@@ -1004,16 +1101,16 @@ import org.slf4j.LoggerFactory;
           case 1: // TABLE_MAP
             if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
               {
-                org.apache.thrift.protocol.TMap _map18 = iprot.readMapBegin();
-                struct.tableMap = new HashMap<String,TableInfo>(2*_map18.size);
-                for (int _i19 = 0; _i19 < _map18.size; ++_i19)
+                org.apache.thrift.protocol.TMap _map26 = iprot.readMapBegin();
+                struct.tableMap = new HashMap<String,TableInfo>(2*_map26.size);
+                for (int _i27 = 0; _i27 < _map26.size; ++_i27)
                 {
-                  String _key20;
-                  TableInfo _val21;
-                  _key20 = iprot.readString();
-                  _val21 = new TableInfo();
-                  _val21.read(iprot);
-                  struct.tableMap.put(_key20, _val21);
+                  String _key28;
+                  TableInfo _val29;
+                  _key28 = iprot.readString();
+                  _val29 = new TableInfo();
+                  _val29.read(iprot);
+                  struct.tableMap.put(_key28, _val29);
                 }
                 iprot.readMapEnd();
               }
@@ -1025,14 +1122,14 @@ import org.slf4j.LoggerFactory;
           case 2: // T_SERVER_INFO
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list22 = iprot.readListBegin();
-                struct.tServerInfo = new ArrayList<TabletServerStatus>(_list22.size);
-                for (int _i23 = 0; _i23 < _list22.size; ++_i23)
+                org.apache.thrift.protocol.TList _list30 = iprot.readListBegin();
+                struct.tServerInfo = new ArrayList<TabletServerStatus>(_list30.size);
+                for (int _i31 = 0; _i31 < _list30.size; ++_i31)
                 {
-                  TabletServerStatus _elem24;
-                  _elem24 = new TabletServerStatus();
-                  _elem24.read(iprot);
-                  struct.tServerInfo.add(_elem24);
+                  TabletServerStatus _elem32;
+                  _elem32 = new TabletServerStatus();
+                  _elem32.read(iprot);
+                  struct.tServerInfo.add(_elem32);
                 }
                 iprot.readListEnd();
               }
@@ -1044,15 +1141,15 @@ import org.slf4j.LoggerFactory;
           case 3: // BAD_TSERVERS
             if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
               {
-                org.apache.thrift.protocol.TMap _map25 = iprot.readMapBegin();
-                struct.badTServers = new HashMap<String,Byte>(2*_map25.size);
-                for (int _i26 = 0; _i26 < _map25.size; ++_i26)
+                org.apache.thrift.protocol.TMap _map33 = iprot.readMapBegin();
+                struct.badTServers = new HashMap<String,Byte>(2*_map33.size);
+                for (int _i34 = 0; _i34 < _map33.size; ++_i34)
                 {
-                  String _key27;
-                  byte _val28;
-                  _key27 = iprot.readString();
-                  _val28 = iprot.readByte();
-                  struct.badTServers.put(_key27, _val28);
+                  String _key35;
+                  byte _val36;
+                  _key35 = iprot.readString();
+                  _val36 = iprot.readByte();
+                  struct.badTServers.put(_key35, _val36);
                 }
                 iprot.readMapEnd();
               }
@@ -1088,13 +1185,13 @@ import org.slf4j.LoggerFactory;
           case 9: // SERVERS_SHUTTING_DOWN
             if (schemeField.type == org.apache.thrift.protocol.TType.SET) {
               {
-                org.apache.thrift.protocol.TSet _set29 = iprot.readSetBegin();
-                struct.serversShuttingDown = new HashSet<String>(2*_set29.size);
-                for (int _i30 = 0; _i30 < _set29.size; ++_i30)
+                org.apache.thrift.protocol.TSet _set37 = iprot.readSetBegin();
+                struct.serversShuttingDown = new HashSet<String>(2*_set37.size);
+                for (int _i38 = 0; _i38 < _set37.size; ++_i38)
                 {
-                  String _elem31;
-                  _elem31 = iprot.readString();
-                  struct.serversShuttingDown.add(_elem31);
+                  String _elem39;
+                  _elem39 = iprot.readString();
+                  struct.serversShuttingDown.add(_elem39);
                 }
                 iprot.readSetEnd();
               }
@@ -1106,14 +1203,14 @@ import org.slf4j.LoggerFactory;
           case 10: // DEAD_TABLET_SERVERS
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list32 = iprot.readListBegin();
-                struct.deadTabletServers = new ArrayList<DeadServer>(_list32.size);
-                for (int _i33 = 0; _i33 < _list32.size; ++_i33)
+                org.apache.thrift.protocol.TList _list40 = iprot.readListBegin();
+                struct.deadTabletServers = new ArrayList<DeadServer>(_list40.size);
+                for (int _i41 = 0; _i41 < _list40.size; ++_i41)
                 {
-                  DeadServer _elem34;
-                  _elem34 = new DeadServer();
-                  _elem34.read(iprot);
-                  struct.deadTabletServers.add(_elem34);
+                  DeadServer _elem42;
+                  _elem42 = new DeadServer();
+                  _elem42.read(iprot);
+                  struct.deadTabletServers.add(_elem42);
                 }
                 iprot.readListEnd();
               }
@@ -1122,6 +1219,25 @@ import org.slf4j.LoggerFactory;
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 11: // BULK_IMPORTS
+            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
+              {
+                org.apache.thrift.protocol.TList _list43 = iprot.readListBegin();
+                struct.bulkImports = new ArrayList<BulkImportStatus>(_list43.size);
+                for (int _i44 = 0; _i44 < _list43.size; ++_i44)
+                {
+                  BulkImportStatus _elem45;
+                  _elem45 = new BulkImportStatus();
+                  _elem45.read(iprot);
+                  struct.bulkImports.add(_elem45);
+                }
+                iprot.readListEnd();
+              }
+              struct.setBulkImportsIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -1141,10 +1257,10 @@ import org.slf4j.LoggerFactory;
         oprot.writeFieldBegin(TABLE_MAP_FIELD_DESC);
         {
           oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRUCT, struct.tableMap.size()));
-          for (Map.Entry<String, TableInfo> _iter35 : struct.tableMap.entrySet())
+          for (Map.Entry<String, TableInfo> _iter46 : struct.tableMap.entrySet())
           {
-            oprot.writeString(_iter35.getKey());
-            _iter35.getValue().write(oprot);
+            oprot.writeString(_iter46.getKey());
+            _iter46.getValue().write(oprot);
           }
           oprot.writeMapEnd();
         }
@@ -1154,9 +1270,9 @@ import org.slf4j.LoggerFactory;
         oprot.writeFieldBegin(T_SERVER_INFO_FIELD_DESC);
         {
           oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.tServerInfo.size()));
-          for (TabletServerStatus _iter36 : struct.tServerInfo)
+          for (TabletServerStatus _iter47 : struct.tServerInfo)
           {
-            _iter36.write(oprot);
+            _iter47.write(oprot);
           }
           oprot.writeListEnd();
         }
@@ -1166,10 +1282,10 @@ import org.slf4j.LoggerFactory;
         oprot.writeFieldBegin(BAD_TSERVERS_FIELD_DESC);
         {
           oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.BYTE, struct.badTServers.size()));
-          for (Map.Entry<String, Byte> _iter37 : struct.badTServers.entrySet())
+          for (Map.Entry<String, Byte> _iter48 : struct.badTServers.entrySet())
           {
-            oprot.writeString(_iter37.getKey());
-            oprot.writeByte(_iter37.getValue());
+            oprot.writeString(_iter48.getKey());
+            oprot.writeByte(_iter48.getValue());
           }
           oprot.writeMapEnd();
         }
@@ -1192,9 +1308,9 @@ import org.slf4j.LoggerFactory;
         oprot.writeFieldBegin(SERVERS_SHUTTING_DOWN_FIELD_DESC);
         {
           oprot.writeSetBegin(new org.apache.thrift.protocol.TSet(org.apache.thrift.protocol.TType.STRING, struct.serversShuttingDown.size()));
-          for (String _iter38 : struct.serversShuttingDown)
+          for (String _iter49 : struct.serversShuttingDown)
           {
-            oprot.writeString(_iter38);
+            oprot.writeString(_iter49);
           }
           oprot.writeSetEnd();
         }
@@ -1204,9 +1320,21 @@ import org.slf4j.LoggerFactory;
         oprot.writeFieldBegin(DEAD_TABLET_SERVERS_FIELD_DESC);
         {
           oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.deadTabletServers.size()));
-          for (DeadServer _iter39 : struct.deadTabletServers)
+          for (DeadServer _iter50 : struct.deadTabletServers)
           {
-            _iter39.write(oprot);
+            _iter50.write(oprot);
+          }
+          oprot.writeListEnd();
+        }
+        oprot.writeFieldEnd();
+      }
+      if (struct.bulkImports != null) {
+        oprot.writeFieldBegin(BULK_IMPORTS_FIELD_DESC);
+        {
+          oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.bulkImports.size()));
+          for (BulkImportStatus _iter51 : struct.bulkImports)
+          {
+            _iter51.write(oprot);
           }
           oprot.writeListEnd();
         }
@@ -1254,33 +1382,36 @@ import org.slf4j.LoggerFactory;
       if (struct.isSetDeadTabletServers()) {
         optionals.set(7);
       }
-      oprot.writeBitSet(optionals, 8);
+      if (struct.isSetBulkImports()) {
+        optionals.set(8);
+      }
+      oprot.writeBitSet(optionals, 9);
       if (struct.isSetTableMap()) {
         {
           oprot.writeI32(struct.tableMap.size());
-          for (Map.Entry<String, TableInfo> _iter40 : struct.tableMap.entrySet())
+          for (Map.Entry<String, TableInfo> _iter52 : struct.tableMap.entrySet())
           {
-            oprot.writeString(_iter40.getKey());
-            _iter40.getValue().write(oprot);
+            oprot.writeString(_iter52.getKey());
+            _iter52.getValue().write(oprot);
           }
         }
       }
       if (struct.isSetTServerInfo()) {
         {
           oprot.writeI32(struct.tServerInfo.size());
-          for (TabletServerStatus _iter41 : struct.tServerInfo)
+          for (TabletServerStatus _iter53 : struct.tServerInfo)
           {
-            _iter41.write(oprot);
+            _iter53.write(oprot);
           }
         }
       }
       if (struct.isSetBadTServers()) {
         {
           oprot.writeI32(struct.badTServers.size());
-          for (Map.Entry<String, Byte> _iter42 : struct.badTServers.entrySet())
+          for (Map.Entry<String, Byte> _iter54 : struct.badTServers.entrySet())
           {
-            oprot.writeString(_iter42.getKey());
-            oprot.writeByte(_iter42.getValue());
+            oprot.writeString(_iter54.getKey());
+            oprot.writeByte(_iter54.getValue());
           }
         }
       }
@@ -1296,18 +1427,27 @@ import org.slf4j.LoggerFactory;
       if (struct.isSetServersShuttingDown()) {
         {
           oprot.writeI32(struct.serversShuttingDown.size());
-          for (String _iter43 : struct.serversShuttingDown)
+          for (String _iter55 : struct.serversShuttingDown)
           {
-            oprot.writeString(_iter43);
+            oprot.writeString(_iter55);
           }
         }
       }
       if (struct.isSetDeadTabletServers()) {
         {
           oprot.writeI32(struct.deadTabletServers.size());
-          for (DeadServer _iter44 : struct.deadTabletServers)
+          for (DeadServer _iter56 : struct.deadTabletServers)
+          {
+            _iter56.write(oprot);
+          }
+        }
+      }
+      if (struct.isSetBulkImports()) {
+        {
+          oprot.writeI32(struct.bulkImports.size());
+          for (BulkImportStatus _iter57 : struct.bulkImports)
           {
-            _iter44.write(oprot);
+            _iter57.write(oprot);
           }
         }
       }
@@ -1316,48 +1456,48 @@ import org.slf4j.LoggerFactory;
     @Override
     public void read(org.apache.thrift.protocol.TProtocol prot, MasterMonitorInfo struct) throws org.apache.thrift.TException {
       TTupleProtocol iprot = (TTupleProtocol) prot;
-      BitSet incoming = iprot.readBitSet(8);
+      BitSet incoming = iprot.readBitSet(9);
       if (incoming.get(0)) {
         {
-          org.apache.thrift.protocol.TMap _map45 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.tableMap = new HashMap<String,TableInfo>(2*_map45.size);
-          for (int _i46 = 0; _i46 < _map45.size; ++_i46)
+          org.apache.thrift.protocol.TMap _map58 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.tableMap = new HashMap<String,TableInfo>(2*_map58.size);
+          for (int _i59 = 0; _i59 < _map58.size; ++_i59)
           {
-            String _key47;
-            TableInfo _val48;
-            _key47 = iprot.readString();
-            _val48 = new TableInfo();
-            _val48.read(iprot);
-            struct.tableMap.put(_key47, _val48);
+            String _key60;
+            TableInfo _val61;
+            _key60 = iprot.readString();
+            _val61 = new TableInfo();
+            _val61.read(iprot);
+            struct.tableMap.put(_key60, _val61);
           }
         }
         struct.setTableMapIsSet(true);
       }
       if (incoming.get(1)) {
         {
-          org.apache.thrift.protocol.TList _list49 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.tServerInfo = new ArrayList<TabletServerStatus>(_list49.size);
-          for (int _i50 = 0; _i50 < _list49.size; ++_i50)
+          org.apache.thrift.protocol.TList _list62 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.tServerInfo = new ArrayList<TabletServerStatus>(_list62.size);
+          for (int _i63 = 0; _i63 < _list62.size; ++_i63)
           {
-            TabletServerStatus _elem51;
-            _elem51 = new TabletServerStatus();
-            _elem51.read(iprot);
-            struct.tServerInfo.add(_elem51);
+            TabletServerStatus _elem64;
+            _elem64 = new TabletServerStatus();
+            _elem64.read(iprot);
+            struct.tServerInfo.add(_elem64);
           }
         }
         struct.setTServerInfoIsSet(true);
       }
       if (incoming.get(2)) {
         {
-          org.apache.thrift.protocol.TMap _map52 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.BYTE, iprot.readI32());
-          struct.badTServers = new HashMap<String,Byte>(2*_map52.size);
-          for (int _i53 = 0; _i53 < _map52.size; ++_i53)
+          org.apache.thrift.protocol.TMap _map65 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.BYTE, iprot.readI32());
+          struct.badTServers = new HashMap<String,Byte>(2*_map65.size);
+          for (int _i66 = 0; _i66 < _map65.size; ++_i66)
           {
-            String _key54;
-            byte _val55;
-            _key54 = iprot.readString();
-            _val55 = iprot.readByte();
-            struct.badTServers.put(_key54, _val55);
+            String _key67;
+            byte _val68;
+            _key67 = iprot.readString();
+            _val68 = iprot.readByte();
+            struct.badTServers.put(_key67, _val68);
           }
         }
         struct.setBadTServersIsSet(true);
@@ -1376,31 +1516,45 @@ import org.slf4j.LoggerFactory;
       }
       if (incoming.get(6)) {
         {
-          org.apache.thrift.protocol.TSet _set56 = new org.apache.thrift.protocol.TSet(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-          struct.serversShuttingDown = new HashSet<String>(2*_set56.size);
-          for (int _i57 = 0; _i57 < _set56.size; ++_i57)
+          org.apache.thrift.protocol.TSet _set69 = new org.apache.thrift.protocol.TSet(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+          struct.serversShuttingDown = new HashSet<String>(2*_set69.size);
+          for (int _i70 = 0; _i70 < _set69.size; ++_i70)
           {
-            String _elem58;
-            _elem58 = iprot.readString();
-            struct.serversShuttingDown.add(_elem58);
+            String _elem71;
+            _elem71 = iprot.readString();
+            struct.serversShuttingDown.add(_elem71);
           }
         }
         struct.setServersShuttingDownIsSet(true);
       }
       if (incoming.get(7)) {
         {
-          org.apache.thrift.protocol.TList _list59 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.deadTabletServers = new ArrayList<DeadServer>(_list59.size);
-          for (int _i60 = 0; _i60 < _list59.size; ++_i60)
+          org.apache.thrift.protocol.TList _list72 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.deadTabletServers = new ArrayList<DeadServer>(_list72.size);
+          for (int _i73 = 0; _i73 < _list72.size; ++_i73)
           {
-            DeadServer _elem61;
-            _elem61 = new DeadServer();
-            _elem61.read(iprot);
-            struct.deadTabletServers.add(_elem61);
+            DeadServer _elem74;
+            _elem74 = new DeadServer();
+            _elem74.read(iprot);
+            struct.deadTabletServers.add(_elem74);
           }
         }
         struct.setDeadTabletServersIsSet(true);
       }
+      if (incoming.get(8)) {
+        {
+          org.apache.thrift.protocol.TList _list75 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.bulkImports = new ArrayList<BulkImportStatus>(_list75.size);
+          for (int _i76 = 0; _i76 < _list75.size; ++_i76)
+          {
+            BulkImportStatus _elem77;
+            _elem77 = new BulkImportStatus();
+            _elem77.read(iprot);
+            struct.bulkImports.add(_elem77);
+          }
+        }
+        struct.setBulkImportsIsSet(true);
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/core/src/main/java/org/apache/accumulo/core/master/thrift/TabletServerStatus.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/master/thrift/TabletServerStatus.java b/core/src/main/java/org/apache/accumulo/core/master/thrift/TabletServerStatus.java
index 1967a70..0c7416f 100644
--- a/core/src/main/java/org/apache/accumulo/core/master/thrift/TabletServerStatus.java
+++ b/core/src/main/java/org/apache/accumulo/core/master/thrift/TabletServerStatus.java
@@ -64,6 +64,7 @@ import org.slf4j.LoggerFactory;
   private static final org.apache.thrift.protocol.TField LOG_SORTS_FIELD_DESC = new org.apache.thrift.protocol.TField("logSorts", org.apache.thrift.protocol.TType.LIST, (short)14);
   private static final org.apache.thrift.protocol.TField FLUSHS_FIELD_DESC = new org.apache.thrift.protocol.TField("flushs", org.apache.thrift.protocol.TType.I64, (short)15);
   private static final org.apache.thrift.protocol.TField SYNCS_FIELD_DESC = new org.apache.thrift.protocol.TField("syncs", org.apache.thrift.protocol.TType.I64, (short)16);
+  private static final org.apache.thrift.protocol.TField BULK_IMPORTS_FIELD_DESC = new org.apache.thrift.protocol.TField("bulkImports", org.apache.thrift.protocol.TType.LIST, (short)17);
 
   private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
   static {
@@ -84,6 +85,7 @@ import org.slf4j.LoggerFactory;
   public List<RecoveryStatus> logSorts; // required
   public long flushs; // required
   public long syncs; // required
+  public List<BulkImportStatus> bulkImports; // required
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -99,7 +101,8 @@ import org.slf4j.LoggerFactory;
     DATA_CACHE_REQUEST((short)13, "dataCacheRequest"),
     LOG_SORTS((short)14, "logSorts"),
     FLUSHS((short)15, "flushs"),
-    SYNCS((short)16, "syncs");
+    SYNCS((short)16, "syncs"),
+    BULK_IMPORTS((short)17, "bulkImports");
 
     private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
 
@@ -140,6 +143,8 @@ import org.slf4j.LoggerFactory;
           return FLUSHS;
         case 16: // SYNCS
           return SYNCS;
+        case 17: // BULK_IMPORTS
+          return BULK_IMPORTS;
         default:
           return null;
       }
@@ -223,6 +228,9 @@ import org.slf4j.LoggerFactory;
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     tmpMap.put(_Fields.SYNCS, new org.apache.thrift.meta_data.FieldMetaData("syncs", org.apache.thrift.TFieldRequirementType.DEFAULT, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+    tmpMap.put(_Fields.BULK_IMPORTS, new org.apache.thrift.meta_data.FieldMetaData("bulkImports", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
+            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, BulkImportStatus.class))));
     metaDataMap = Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(TabletServerStatus.class, metaDataMap);
   }
@@ -243,7 +251,8 @@ import org.slf4j.LoggerFactory;
     long dataCacheRequest,
     List<RecoveryStatus> logSorts,
     long flushs,
-    long syncs)
+    long syncs,
+    List<BulkImportStatus> bulkImports)
   {
     this();
     this.tableMap = tableMap;
@@ -269,6 +278,7 @@ import org.slf4j.LoggerFactory;
     setFlushsIsSet(true);
     this.syncs = syncs;
     setSyncsIsSet(true);
+    this.bulkImports = bulkImports;
   }
 
   /**
@@ -311,6 +321,13 @@ import org.slf4j.LoggerFactory;
     }
     this.flushs = other.flushs;
     this.syncs = other.syncs;
+    if (other.isSetBulkImports()) {
+      List<BulkImportStatus> __this__bulkImports = new ArrayList<BulkImportStatus>(other.bulkImports.size());
+      for (BulkImportStatus other_element : other.bulkImports) {
+        __this__bulkImports.add(new BulkImportStatus(other_element));
+      }
+      this.bulkImports = __this__bulkImports;
+    }
   }
 
   public TabletServerStatus deepCopy() {
@@ -342,6 +359,7 @@ import org.slf4j.LoggerFactory;
     this.flushs = 0;
     setSyncsIsSet(false);
     this.syncs = 0;
+    this.bulkImports = null;
   }
 
   public int getTableMapSize() {
@@ -672,6 +690,45 @@ import org.slf4j.LoggerFactory;
     __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __SYNCS_ISSET_ID, value);
   }
 
+  public int getBulkImportsSize() {
+    return (this.bulkImports == null) ? 0 : this.bulkImports.size();
+  }
+
+  public java.util.Iterator<BulkImportStatus> getBulkImportsIterator() {
+    return (this.bulkImports == null) ? null : this.bulkImports.iterator();
+  }
+
+  public void addToBulkImports(BulkImportStatus elem) {
+    if (this.bulkImports == null) {
+      this.bulkImports = new ArrayList<BulkImportStatus>();
+    }
+    this.bulkImports.add(elem);
+  }
+
+  public List<BulkImportStatus> getBulkImports() {
+    return this.bulkImports;
+  }
+
+  public TabletServerStatus setBulkImports(List<BulkImportStatus> bulkImports) {
+    this.bulkImports = bulkImports;
+    return this;
+  }
+
+  public void unsetBulkImports() {
+    this.bulkImports = null;
+  }
+
+  /** Returns true if field bulkImports is set (has been assigned a value) and false otherwise */
+  public boolean isSetBulkImports() {
+    return this.bulkImports != null;
+  }
+
+  public void setBulkImportsIsSet(boolean value) {
+    if (!value) {
+      this.bulkImports = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, Object value) {
     switch (field) {
     case TABLE_MAP:
@@ -778,6 +835,14 @@ import org.slf4j.LoggerFactory;
       }
       break;
 
+    case BULK_IMPORTS:
+      if (value == null) {
+        unsetBulkImports();
+      } else {
+        setBulkImports((List<BulkImportStatus>)value);
+      }
+      break;
+
     }
   }
 
@@ -822,6 +887,9 @@ import org.slf4j.LoggerFactory;
     case SYNCS:
       return Long.valueOf(getSyncs());
 
+    case BULK_IMPORTS:
+      return getBulkImports();
+
     }
     throw new IllegalStateException();
   }
@@ -859,6 +927,8 @@ import org.slf4j.LoggerFactory;
       return isSetFlushs();
     case SYNCS:
       return isSetSyncs();
+    case BULK_IMPORTS:
+      return isSetBulkImports();
     }
     throw new IllegalStateException();
   }
@@ -993,6 +1063,15 @@ import org.slf4j.LoggerFactory;
         return false;
     }
 
+    boolean this_present_bulkImports = true && this.isSetBulkImports();
+    boolean that_present_bulkImports = true && that.isSetBulkImports();
+    if (this_present_bulkImports || that_present_bulkImports) {
+      if (!(this_present_bulkImports && that_present_bulkImports))
+        return false;
+      if (!this.bulkImports.equals(that.bulkImports))
+        return false;
+    }
+
     return true;
   }
 
@@ -1139,6 +1218,16 @@ import org.slf4j.LoggerFactory;
         return lastComparison;
       }
     }
+    lastComparison = Boolean.valueOf(isSetBulkImports()).compareTo(other.isSetBulkImports());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetBulkImports()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.bulkImports, other.bulkImports);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -1222,6 +1311,14 @@ import org.slf4j.LoggerFactory;
     sb.append("syncs:");
     sb.append(this.syncs);
     first = false;
+    if (!first) sb.append(", ");
+    sb.append("bulkImports:");
+    if (this.bulkImports == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.bulkImports);
+    }
+    first = false;
     sb.append(")");
     return sb.toString();
   }
@@ -1395,6 +1492,25 @@ import org.slf4j.LoggerFactory;
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 17: // BULK_IMPORTS
+            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
+              {
+                org.apache.thrift.protocol.TList _list7 = iprot.readListBegin();
+                struct.bulkImports = new ArrayList<BulkImportStatus>(_list7.size);
+                for (int _i8 = 0; _i8 < _list7.size; ++_i8)
+                {
+                  BulkImportStatus _elem9;
+                  _elem9 = new BulkImportStatus();
+                  _elem9.read(iprot);
+                  struct.bulkImports.add(_elem9);
+                }
+                iprot.readListEnd();
+              }
+              struct.setBulkImportsIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -1414,10 +1530,10 @@ import org.slf4j.LoggerFactory;
         oprot.writeFieldBegin(TABLE_MAP_FIELD_DESC);
         {
           oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRUCT, struct.tableMap.size()));
-          for (Map.Entry<String, TableInfo> _iter7 : struct.tableMap.entrySet())
+          for (Map.Entry<String, TableInfo> _iter10 : struct.tableMap.entrySet())
           {
-            oprot.writeString(_iter7.getKey());
-            _iter7.getValue().write(oprot);
+            oprot.writeString(_iter10.getKey());
+            _iter10.getValue().write(oprot);
           }
           oprot.writeMapEnd();
         }
@@ -1456,9 +1572,9 @@ import org.slf4j.LoggerFactory;
         oprot.writeFieldBegin(LOG_SORTS_FIELD_DESC);
         {
           oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.logSorts.size()));
-          for (RecoveryStatus _iter8 : struct.logSorts)
+          for (RecoveryStatus _iter11 : struct.logSorts)
           {
-            _iter8.write(oprot);
+            _iter11.write(oprot);
           }
           oprot.writeListEnd();
         }
@@ -1470,6 +1586,18 @@ import org.slf4j.LoggerFactory;
       oprot.writeFieldBegin(SYNCS_FIELD_DESC);
       oprot.writeI64(struct.syncs);
       oprot.writeFieldEnd();
+      if (struct.bulkImports != null) {
+        oprot.writeFieldBegin(BULK_IMPORTS_FIELD_DESC);
+        {
+          oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.bulkImports.size()));
+          for (BulkImportStatus _iter12 : struct.bulkImports)
+          {
+            _iter12.write(oprot);
+          }
+          oprot.writeListEnd();
+        }
+        oprot.writeFieldEnd();
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -1527,14 +1655,17 @@ import org.slf4j.LoggerFactory;
       if (struct.isSetSyncs()) {
         optionals.set(12);
       }
-      oprot.writeBitSet(optionals, 13);
+      if (struct.isSetBulkImports()) {
+        optionals.set(13);
+      }
+      oprot.writeBitSet(optionals, 14);
       if (struct.isSetTableMap()) {
         {
           oprot.writeI32(struct.tableMap.size());
-          for (Map.Entry<String, TableInfo> _iter9 : struct.tableMap.entrySet())
+          for (Map.Entry<String, TableInfo> _iter13 : struct.tableMap.entrySet())
           {
-            oprot.writeString(_iter9.getKey());
-            _iter9.getValue().write(oprot);
+            oprot.writeString(_iter13.getKey());
+            _iter13.getValue().write(oprot);
           }
         }
       }
@@ -1568,9 +1699,9 @@ import org.slf4j.LoggerFactory;
       if (struct.isSetLogSorts()) {
         {
           oprot.writeI32(struct.logSorts.size());
-          for (RecoveryStatus _iter10 : struct.logSorts)
+          for (RecoveryStatus _iter14 : struct.logSorts)
           {
-            _iter10.write(oprot);
+            _iter14.write(oprot);
           }
         }
       }
@@ -1580,24 +1711,33 @@ import org.slf4j.LoggerFactory;
       if (struct.isSetSyncs()) {
         oprot.writeI64(struct.syncs);
       }
+      if (struct.isSetBulkImports()) {
+        {
+          oprot.writeI32(struct.bulkImports.size());
+          for (BulkImportStatus _iter15 : struct.bulkImports)
+          {
+            _iter15.write(oprot);
+          }
+        }
+      }
     }
 
     @Override
     public void read(org.apache.thrift.protocol.TProtocol prot, TabletServerStatus struct) throws org.apache.thrift.TException {
       TTupleProtocol iprot = (TTupleProtocol) prot;
-      BitSet incoming = iprot.readBitSet(13);
+      BitSet incoming = iprot.readBitSet(14);
       if (incoming.get(0)) {
         {
-          org.apache.thrift.protocol.TMap _map11 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.tableMap = new HashMap<String,TableInfo>(2*_map11.size);
-          for (int _i12 = 0; _i12 < _map11.size; ++_i12)
+          org.apache.thrift.protocol.TMap _map16 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.tableMap = new HashMap<String,TableInfo>(2*_map16.size);
+          for (int _i17 = 0; _i17 < _map16.size; ++_i17)
           {
-            String _key13;
-            TableInfo _val14;
-            _key13 = iprot.readString();
-            _val14 = new TableInfo();
-            _val14.read(iprot);
-            struct.tableMap.put(_key13, _val14);
+            String _key18;
+            TableInfo _val19;
+            _key18 = iprot.readString();
+            _val19 = new TableInfo();
+            _val19.read(iprot);
+            struct.tableMap.put(_key18, _val19);
           }
         }
         struct.setTableMapIsSet(true);
@@ -1640,14 +1780,14 @@ import org.slf4j.LoggerFactory;
       }
       if (incoming.get(10)) {
         {
-          org.apache.thrift.protocol.TList _list15 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.logSorts = new ArrayList<RecoveryStatus>(_list15.size);
-          for (int _i16 = 0; _i16 < _list15.size; ++_i16)
+          org.apache.thrift.protocol.TList _list20 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.logSorts = new ArrayList<RecoveryStatus>(_list20.size);
+          for (int _i21 = 0; _i21 < _list20.size; ++_i21)
           {
-            RecoveryStatus _elem17;
-            _elem17 = new RecoveryStatus();
-            _elem17.read(iprot);
-            struct.logSorts.add(_elem17);
+            RecoveryStatus _elem22;
+            _elem22 = new RecoveryStatus();
+            _elem22.read(iprot);
+            struct.logSorts.add(_elem22);
           }
         }
         struct.setLogSortsIsSet(true);
@@ -1660,6 +1800,20 @@ import org.slf4j.LoggerFactory;
         struct.syncs = iprot.readI64();
         struct.setSyncsIsSet(true);
       }
+      if (incoming.get(13)) {
+        {
+          org.apache.thrift.protocol.TList _list23 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.bulkImports = new ArrayList<BulkImportStatus>(_list23.size);
+          for (int _i24 = 0; _i24 < _list23.size; ++_i24)
+          {
+            BulkImportStatus _elem25;
+            _elem25 = new BulkImportStatus();
+            _elem25.read(iprot);
+            struct.bulkImports.add(_elem25);
+          }
+        }
+        struct.setBulkImportsIsSet(true);
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/core/src/main/java/org/apache/accumulo/core/master/thrift/TabletSplit.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/master/thrift/TabletSplit.java b/core/src/main/java/org/apache/accumulo/core/master/thrift/TabletSplit.java
index bd529b9..6c26129 100644
--- a/core/src/main/java/org/apache/accumulo/core/master/thrift/TabletSplit.java
+++ b/core/src/main/java/org/apache/accumulo/core/master/thrift/TabletSplit.java
@@ -446,14 +446,14 @@ import org.slf4j.LoggerFactory;
           case 2: // NEW_TABLETS
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list62 = iprot.readListBegin();
-                struct.newTablets = new ArrayList<org.apache.accumulo.core.data.thrift.TKeyExtent>(_list62.size);
-                for (int _i63 = 0; _i63 < _list62.size; ++_i63)
+                org.apache.thrift.protocol.TList _list78 = iprot.readListBegin();
+                struct.newTablets = new ArrayList<org.apache.accumulo.core.data.thrift.TKeyExtent>(_list78.size);
+                for (int _i79 = 0; _i79 < _list78.size; ++_i79)
                 {
-                  org.apache.accumulo.core.data.thrift.TKeyExtent _elem64;
-                  _elem64 = new org.apache.accumulo.core.data.thrift.TKeyExtent();
-                  _elem64.read(iprot);
-                  struct.newTablets.add(_elem64);
+                  org.apache.accumulo.core.data.thrift.TKeyExtent _elem80;
+                  _elem80 = new org.apache.accumulo.core.data.thrift.TKeyExtent();
+                  _elem80.read(iprot);
+                  struct.newTablets.add(_elem80);
                 }
                 iprot.readListEnd();
               }
@@ -486,9 +486,9 @@ import org.slf4j.LoggerFactory;
         oprot.writeFieldBegin(NEW_TABLETS_FIELD_DESC);
         {
           oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.newTablets.size()));
-          for (org.apache.accumulo.core.data.thrift.TKeyExtent _iter65 : struct.newTablets)
+          for (org.apache.accumulo.core.data.thrift.TKeyExtent _iter81 : struct.newTablets)
           {
-            _iter65.write(oprot);
+            _iter81.write(oprot);
           }
           oprot.writeListEnd();
         }
@@ -525,9 +525,9 @@ import org.slf4j.LoggerFactory;
       if (struct.isSetNewTablets()) {
         {
           oprot.writeI32(struct.newTablets.size());
-          for (org.apache.accumulo.core.data.thrift.TKeyExtent _iter66 : struct.newTablets)
+          for (org.apache.accumulo.core.data.thrift.TKeyExtent _iter82 : struct.newTablets)
           {
-            _iter66.write(oprot);
+            _iter82.write(oprot);
           }
         }
       }
@@ -544,14 +544,14 @@ import org.slf4j.LoggerFactory;
       }
       if (incoming.get(1)) {
         {
-          org.apache.thrift.protocol.TList _list67 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.newTablets = new ArrayList<org.apache.accumulo.core.data.thrift.TKeyExtent>(_list67.size);
-          for (int _i68 = 0; _i68 < _list67.size; ++_i68)
+          org.apache.thrift.protocol.TList _list83 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.newTablets = new ArrayList<org.apache.accumulo.core.data.thrift.TKeyExtent>(_list83.size);
+          for (int _i84 = 0; _i84 < _list83.size; ++_i84)
           {
-            org.apache.accumulo.core.data.thrift.TKeyExtent _elem69;
-            _elem69 = new org.apache.accumulo.core.data.thrift.TKeyExtent();
-            _elem69.read(iprot);
-            struct.newTablets.add(_elem69);
+            org.apache.accumulo.core.data.thrift.TKeyExtent _elem85;
+            _elem85 = new org.apache.accumulo.core.data.thrift.TKeyExtent();
+            _elem85.read(iprot);
+            struct.newTablets.add(_elem85);
           }
         }
         struct.setNewTabletsIsSet(true);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/784bd05a/core/src/main/thrift/master.thrift
----------------------------------------------------------------------
diff --git a/core/src/main/thrift/master.thrift b/core/src/main/thrift/master.thrift
index f7a1dc9..6104fea 100644
--- a/core/src/main/thrift/master.thrift
+++ b/core/src/main/thrift/master.thrift
@@ -48,6 +48,28 @@ struct RecoveryStatus {
   6:double progress
 }
 
+enum BulkImportState {
+   INITIAL
+   # master moves the files into the accumulo area
+   MOVING
+   # slave tserver examines the index of the file
+   PROCESSING
+   # slave tserver assigns the file to tablets
+   ASSIGNING
+   # tserver incorporates file into tablet
+   LOADING
+   # master moves error files into the error directory
+   COPY_FILES
+   # flags and locks removed
+   CLEANUP
+}
+
+struct BulkImportStatus {
+  1:i64 startTime
+  2:string filename
+  3:BulkImportState state
+}
+
 struct TabletServerStatus {
   1:map<string, TableInfo> tableMap
   2:i64 lastContact
@@ -62,6 +84,7 @@ struct TabletServerStatus {
   14:list<RecoveryStatus> logSorts
   15:i64 flushs
   16:i64 syncs
+  17:list<BulkImportStatus> bulkImports
 }
 
 enum MasterState {
@@ -95,6 +118,7 @@ struct MasterMonitorInfo {
   7:i32 unassignedTablets
   9:set<string> serversShuttingDown
   10:list<DeadServer> deadTabletServers
+  11:list<BulkImportStatus> bulkImports
 }
 
 struct TabletSplit {