This is an automated email from the ASF dual-hosted git repository.

kturner pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/2.1 by this push:
     new 1984a6571e Parallelizes bulk v2 import calls to tablet servers (#5375)
1984a6571e is described below

commit 1984a6571e4d17ae9906faa7f107de8a8e74e263
Author: Keith Turner <ktur...@apache.org>
AuthorDate: Fri Mar 28 16:54:57 2025 -0400

    Parallelizes bulk v2 import calls to tablet servers (#5375)
    
    Changes the bulkv2 manager code that asks tablets servers to load files to 
allow parallel loading for each tablet server.  The tablet servers will write 
to the metadata table, these changes allows more parallelism for those metadata 
writes.  Prior to this change for each tablet server it would serially write 
all of it tablet metadata updates.  After this change each tablet server can be 
working on writing metadata updates for multiple tablet concurrently.
    
    A new RPC was added for these changes.  The manager code was modified to 
wait if a tablet server w/o the new RPC is involved in the bulk import.  This 
will allow a 2.1.4 manager to tolerate a 2.1.3. tablet server for a short 
period during upgrade.
    
    
    Co-authored-by: Daniel Roberts <ddani...@gmail.com>
---
 .../org/apache/accumulo/core/conf/Property.java    |    5 +
 .../tabletserver/thrift/TabletClientService.java   | 2146 ++++++++++++++++----
 core/src/main/thrift/tabletserver.thrift           |    9 +
 .../manager/tableOps/bulkVer2/LoadFiles.java       |  145 +-
 .../accumulo/tserver/TabletClientHandler.java      |    7 +
 .../apache/accumulo/test/functional/BulkNewIT.java |   42 +
 .../accumulo/test/performance/NullTserver.java     |    4 +
 7 files changed, 1989 insertions(+), 369 deletions(-)

diff --git a/core/src/main/java/org/apache/accumulo/core/conf/Property.java 
b/core/src/main/java/org/apache/accumulo/core/conf/Property.java
index 39955d0998..49baeb08a6 100644
--- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java
+++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java
@@ -374,6 +374,11 @@ public enum Property {
       "2.1.0"),
   MANAGER_BULK_TIMEOUT("manager.bulk.timeout", "5m", PropertyType.TIMEDURATION,
       "The time to wait for a tablet server to process a bulk import 
request.", "1.4.3"),
+  MANAGER_BULK_MAX_CONNECTIONS("manager.bulk.connections.max", "8", 
PropertyType.COUNT,
+      "The maximum number of connections the manager can make to a single 
tablet server for bulkv2 "
+          + "load request.  For the case where a single tablet server has a 
lot of tablets for a bulk import "
+          + "increasing this may help lower the time it takes to load those 
tablets.",
+      "2.1.4"),
   MANAGER_RENAME_THREADS("manager.rename.threadpool.size", "20", 
PropertyType.COUNT,
       "The number of threads to use when renaming user files during table 
import or bulk ingest.",
       "2.1.0"),
diff --git 
a/core/src/main/thrift-gen-java/org/apache/accumulo/core/tabletserver/thrift/TabletClientService.java
 
b/core/src/main/thrift-gen-java/org/apache/accumulo/core/tabletserver/thrift/TabletClientService.java
index 8f734f2eff..b5446c41f3 100644
--- 
a/core/src/main/thrift-gen-java/org/apache/accumulo/core/tabletserver/thrift/TabletClientService.java
+++ 
b/core/src/main/thrift-gen-java/org/apache/accumulo/core/tabletserver/thrift/TabletClientService.java
@@ -51,6 +51,8 @@ public class TabletClientService {
 
     public void loadFiles(org.apache.accumulo.core.trace.thrift.TInfo tinfo, 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, long 
tid, java.lang.String dir, 
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 files, boolean setTime) throws org.apache.thrift.TException;
 
+    public void loadFilesV2(org.apache.accumulo.core.trace.thrift.TInfo tinfo, 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, long 
tid, java.lang.String dir, 
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 files, boolean setTime) throws org.apache.thrift.TException;
+
     public void splitTablet(org.apache.accumulo.core.trace.thrift.TInfo tinfo, 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent extent, java.nio.ByteBuffer 
splitPoint) throws 
org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException, 
NotServingTabletException, org.apache.thrift.TException;
 
     public void loadTablet(org.apache.accumulo.core.trace.thrift.TInfo tinfo, 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, 
java.lang.String lock, org.apache.accumulo.core.dataImpl.thrift.TKeyExtent 
extent) throws org.apache.thrift.TException;
@@ -123,6 +125,8 @@ public class TabletClientService {
 
     public void loadFiles(org.apache.accumulo.core.trace.thrift.TInfo tinfo, 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, long 
tid, java.lang.String dir, 
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 files, boolean setTime, org.apache.thrift.async.AsyncMethodCallback<Void> 
resultHandler) throws org.apache.thrift.TException;
 
+    public void loadFilesV2(org.apache.accumulo.core.trace.thrift.TInfo tinfo, 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, long 
tid, java.lang.String dir, 
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 files, boolean setTime, org.apache.thrift.async.AsyncMethodCallback<Void> 
resultHandler) throws org.apache.thrift.TException;
+
     public void splitTablet(org.apache.accumulo.core.trace.thrift.TInfo tinfo, 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent extent, java.nio.ByteBuffer 
splitPoint, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) 
throws org.apache.thrift.TException;
 
     public void loadTablet(org.apache.accumulo.core.trace.thrift.TInfo tinfo, 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, 
java.lang.String lock, org.apache.accumulo.core.dataImpl.thrift.TKeyExtent 
extent, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException;
@@ -472,6 +476,32 @@ public class TabletClientService {
       sendBaseOneway("loadFiles", args);
     }
 
+    @Override
+    public void loadFilesV2(org.apache.accumulo.core.trace.thrift.TInfo tinfo, 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, long 
tid, java.lang.String dir, 
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 files, boolean setTime) throws org.apache.thrift.TException
+    {
+      send_loadFilesV2(tinfo, credentials, tid, dir, files, setTime);
+      recv_loadFilesV2();
+    }
+
+    public void send_loadFilesV2(org.apache.accumulo.core.trace.thrift.TInfo 
tinfo, org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, 
long tid, java.lang.String dir, 
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 files, boolean setTime) throws org.apache.thrift.TException
+    {
+      loadFilesV2_args args = new loadFilesV2_args();
+      args.setTinfo(tinfo);
+      args.setCredentials(credentials);
+      args.setTid(tid);
+      args.setDir(dir);
+      args.setFiles(files);
+      args.setSetTime(setTime);
+      sendBase("loadFilesV2", args);
+    }
+
+    public void recv_loadFilesV2() throws org.apache.thrift.TException
+    {
+      loadFilesV2_result result = new loadFilesV2_result();
+      receiveBase(result, "loadFilesV2");
+      return;
+    }
+
     @Override
     public void splitTablet(org.apache.accumulo.core.trace.thrift.TInfo tinfo, 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent extent, java.nio.ByteBuffer 
splitPoint) throws 
org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException, 
NotServingTabletException, org.apache.thrift.TException
     {
@@ -1509,6 +1539,57 @@ public class TabletClientService {
       }
     }
 
+    @Override
+    public void loadFilesV2(org.apache.accumulo.core.trace.thrift.TInfo tinfo, 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, long 
tid, java.lang.String dir, 
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 files, boolean setTime, org.apache.thrift.async.AsyncMethodCallback<Void> 
resultHandler) throws org.apache.thrift.TException {
+      checkReady();
+      loadFilesV2_call method_call = new loadFilesV2_call(tinfo, credentials, 
tid, dir, files, setTime, resultHandler, this, ___protocolFactory, 
___transport);
+      this.___currentMethod = method_call;
+      ___manager.call(method_call);
+    }
+
+    public static class loadFilesV2_call extends 
org.apache.thrift.async.TAsyncMethodCall<Void> {
+      private org.apache.accumulo.core.trace.thrift.TInfo tinfo;
+      private org.apache.accumulo.core.securityImpl.thrift.TCredentials 
credentials;
+      private long tid;
+      private java.lang.String dir;
+      private 
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 files;
+      private boolean setTime;
+      public loadFilesV2_call(org.apache.accumulo.core.trace.thrift.TInfo 
tinfo, org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, 
long tid, java.lang.String dir, 
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 files, boolean setTime, org.apache.thrift.async.AsyncMethodCallback<Void> 
resultHandler, org.apache.thrift.async.TAsyncClient client, 
org.apache.thrift.prot [...]
+        super(client, protocolFactory, transport, resultHandler, false);
+        this.tinfo = tinfo;
+        this.credentials = credentials;
+        this.tid = tid;
+        this.dir = dir;
+        this.files = files;
+        this.setTime = setTime;
+      }
+
+      @Override
+      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws 
org.apache.thrift.TException {
+        prot.writeMessageBegin(new 
org.apache.thrift.protocol.TMessage("loadFilesV2", 
org.apache.thrift.protocol.TMessageType.CALL, 0));
+        loadFilesV2_args args = new loadFilesV2_args();
+        args.setTinfo(tinfo);
+        args.setCredentials(credentials);
+        args.setTid(tid);
+        args.setDir(dir);
+        args.setFiles(files);
+        args.setSetTime(setTime);
+        args.write(prot);
+        prot.writeMessageEnd();
+      }
+
+      @Override
+      public Void getResult() throws org.apache.thrift.TException {
+        if (getState() != 
org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {
+          throw new java.lang.IllegalStateException("Method call not 
finished!");
+        }
+        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = 
new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());
+        org.apache.thrift.protocol.TProtocol prot = 
client.getProtocolFactory().getProtocol(memoryTransport);
+        (new Client(prot)).recv_loadFilesV2();
+        return null;
+      }
+    }
+
     @Override
     public void splitTablet(org.apache.accumulo.core.trace.thrift.TInfo tinfo, 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials, 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent extent, java.nio.ByteBuffer 
splitPoint, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) 
throws org.apache.thrift.TException {
       checkReady();
@@ -2529,6 +2610,7 @@ public class TabletClientService {
       processMap.put("closeConditionalUpdate", new closeConditionalUpdate());
       processMap.put("bulkImport", new bulkImport());
       processMap.put("loadFiles", new loadFiles());
+      processMap.put("loadFilesV2", new loadFilesV2());
       processMap.put("splitTablet", new splitTablet());
       processMap.put("loadTablet", new loadTablet());
       processMap.put("unloadTablet", new unloadTablet());
@@ -2890,6 +2972,34 @@ public class TabletClientService {
       }
     }
 
+    public static class loadFilesV2<I extends Iface> extends 
org.apache.thrift.ProcessFunction<I, loadFilesV2_args> {
+      public loadFilesV2() {
+        super("loadFilesV2");
+      }
+
+      @Override
+      public loadFilesV2_args getEmptyArgsInstance() {
+        return new loadFilesV2_args();
+      }
+
+      @Override
+      protected boolean isOneway() {
+        return false;
+      }
+
+      @Override
+      protected boolean rethrowUnhandledExceptions() {
+        return false;
+      }
+
+      @Override
+      public loadFilesV2_result getResult(I iface, loadFilesV2_args args) 
throws org.apache.thrift.TException {
+        loadFilesV2_result result = new loadFilesV2_result();
+        iface.loadFilesV2(args.tinfo, args.credentials, args.tid, args.dir, 
args.files, args.setTime);
+        return result;
+      }
+    }
+
     public static class splitTablet<I extends Iface> extends 
org.apache.thrift.ProcessFunction<I, splitTablet_args> {
       public splitTablet() {
         super("splitTablet");
@@ -3600,6 +3710,7 @@ public class TabletClientService {
       processMap.put("closeConditionalUpdate", new closeConditionalUpdate());
       processMap.put("bulkImport", new bulkImport());
       processMap.put("loadFiles", new loadFiles());
+      processMap.put("loadFilesV2", new loadFilesV2());
       processMap.put("splitTablet", new splitTablet());
       processMap.put("loadTablet", new loadTablet());
       processMap.put("unloadTablet", new unloadTablet());
@@ -4314,14 +4425,14 @@ public class TabletClientService {
       }
     }
 
-    public static class splitTablet<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, splitTablet_args, Void> {
-      public splitTablet() {
-        super("splitTablet");
+    public static class loadFilesV2<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, loadFilesV2_args, Void> {
+      public loadFilesV2() {
+        super("loadFilesV2");
       }
 
       @Override
-      public splitTablet_args getEmptyArgsInstance() {
-        return new splitTablet_args();
+      public loadFilesV2_args getEmptyArgsInstance() {
+        return new loadFilesV2_args();
       }
 
       @Override
@@ -4330,7 +4441,7 @@ public class TabletClientService {
         return new org.apache.thrift.async.AsyncMethodCallback<Void>() { 
           @Override
           public void onComplete(Void o) {
-            splitTablet_result result = new splitTablet_result();
+            loadFilesV2_result result = new loadFilesV2_result();
             try {
               fcall.sendResponse(fb, result, 
org.apache.thrift.protocol.TMessageType.REPLY,seqid);
             } catch (org.apache.thrift.transport.TTransportException e) {
@@ -4345,16 +4456,8 @@ public class TabletClientService {
           public void onError(java.lang.Exception e) {
             byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;
             org.apache.thrift.TSerializable msg;
-            splitTablet_result result = new splitTablet_result();
-            if (e instanceof 
org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException) {
-              result.sec = 
(org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException) e;
-              result.setSecIsSet(true);
-              msg = result;
-            } else if (e instanceof NotServingTabletException) {
-              result.nste = (NotServingTabletException) e;
-              result.setNsteIsSet(true);
-              msg = result;
-            } else if (e instanceof 
org.apache.thrift.transport.TTransportException) {
+            loadFilesV2_result result = new loadFilesV2_result();
+            if (e instanceof org.apache.thrift.transport.TTransportException) {
               _LOGGER.error("TTransportException inside handler", e);
               fb.close();
               return;
@@ -4383,59 +4486,19 @@ public class TabletClientService {
       }
 
       @Override
-      public void start(I iface, splitTablet_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
-        iface.splitTablet(args.tinfo, args.credentials, args.extent, 
args.splitPoint,resultHandler);
+      public void start(I iface, loadFilesV2_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
+        iface.loadFilesV2(args.tinfo, args.credentials, args.tid, args.dir, 
args.files, args.setTime,resultHandler);
       }
     }
 
-    public static class loadTablet<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, loadTablet_args, Void> {
-      public loadTablet() {
-        super("loadTablet");
-      }
-
-      @Override
-      public loadTablet_args getEmptyArgsInstance() {
-        return new loadTablet_args();
-      }
-
-      @Override
-      public org.apache.thrift.async.AsyncMethodCallback<Void> 
getResultHandler(final 
org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final 
int seqid) {
-        final org.apache.thrift.AsyncProcessFunction fcall = this;
-        return new org.apache.thrift.async.AsyncMethodCallback<Void>() { 
-          @Override
-          public void onComplete(Void o) {
-          }
-          @Override
-          public void onError(java.lang.Exception e) {
-            if (e instanceof org.apache.thrift.transport.TTransportException) {
-              _LOGGER.error("TTransportException inside handler", e);
-              fb.close();
-            } else {
-              _LOGGER.error("Exception inside oneway handler", e);
-            }
-          }
-        };
-      }
-
-      @Override
-      protected boolean isOneway() {
-        return true;
-      }
-
-      @Override
-      public void start(I iface, loadTablet_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
-        iface.loadTablet(args.tinfo, args.credentials, args.lock, 
args.extent,resultHandler);
-      }
-    }
-
-    public static class unloadTablet<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, unloadTablet_args, Void> {
-      public unloadTablet() {
-        super("unloadTablet");
+    public static class splitTablet<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, splitTablet_args, Void> {
+      public splitTablet() {
+        super("splitTablet");
       }
 
       @Override
-      public unloadTablet_args getEmptyArgsInstance() {
-        return new unloadTablet_args();
+      public splitTablet_args getEmptyArgsInstance() {
+        return new splitTablet_args();
       }
 
       @Override
@@ -4444,94 +4507,48 @@ public class TabletClientService {
         return new org.apache.thrift.async.AsyncMethodCallback<Void>() { 
           @Override
           public void onComplete(Void o) {
-          }
-          @Override
-          public void onError(java.lang.Exception e) {
-            if (e instanceof org.apache.thrift.transport.TTransportException) {
-              _LOGGER.error("TTransportException inside handler", e);
+            splitTablet_result result = new splitTablet_result();
+            try {
+              fcall.sendResponse(fb, result, 
org.apache.thrift.protocol.TMessageType.REPLY,seqid);
+            } catch (org.apache.thrift.transport.TTransportException e) {
+              _LOGGER.error("TTransportException writing to internal frame 
buffer", e);
               fb.close();
-            } else {
-              _LOGGER.error("Exception inside oneway handler", e);
+            } catch (java.lang.Exception e) {
+              _LOGGER.error("Exception writing to internal frame buffer", e);
+              onError(e);
             }
           }
-        };
-      }
-
-      @Override
-      protected boolean isOneway() {
-        return true;
-      }
-
-      @Override
-      public void start(I iface, unloadTablet_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
-        iface.unloadTablet(args.tinfo, args.credentials, args.lock, 
args.extent, args.goal, args.requestTime,resultHandler);
-      }
-    }
-
-    public static class flush<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, flush_args, Void> {
-      public flush() {
-        super("flush");
-      }
-
-      @Override
-      public flush_args getEmptyArgsInstance() {
-        return new flush_args();
-      }
-
-      @Override
-      public org.apache.thrift.async.AsyncMethodCallback<Void> 
getResultHandler(final 
org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final 
int seqid) {
-        final org.apache.thrift.AsyncProcessFunction fcall = this;
-        return new org.apache.thrift.async.AsyncMethodCallback<Void>() { 
-          @Override
-          public void onComplete(Void o) {
-          }
           @Override
           public void onError(java.lang.Exception e) {
-            if (e instanceof org.apache.thrift.transport.TTransportException) {
+            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;
+            org.apache.thrift.TSerializable msg;
+            splitTablet_result result = new splitTablet_result();
+            if (e instanceof 
org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException) {
+              result.sec = 
(org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException) e;
+              result.setSecIsSet(true);
+              msg = result;
+            } else if (e instanceof NotServingTabletException) {
+              result.nste = (NotServingTabletException) e;
+              result.setNsteIsSet(true);
+              msg = result;
+            } else if (e instanceof 
org.apache.thrift.transport.TTransportException) {
               _LOGGER.error("TTransportException inside handler", e);
               fb.close();
+              return;
+            } else if (e instanceof org.apache.thrift.TApplicationException) {
+              _LOGGER.error("TApplicationException inside handler", e);
+              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;
+              msg = (org.apache.thrift.TApplicationException)e;
             } else {
-              _LOGGER.error("Exception inside oneway handler", e);
+              _LOGGER.error("Exception inside handler", e);
+              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;
+              msg = new 
org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR,
 e.getMessage());
             }
-          }
-        };
-      }
-
-      @Override
-      protected boolean isOneway() {
-        return true;
-      }
-
-      @Override
-      public void start(I iface, flush_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
-        iface.flush(args.tinfo, args.credentials, args.lock, args.tableId, 
args.startRow, args.endRow,resultHandler);
-      }
-    }
-
-    public static class flushTablet<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, flushTablet_args, Void> {
-      public flushTablet() {
-        super("flushTablet");
-      }
-
-      @Override
-      public flushTablet_args getEmptyArgsInstance() {
-        return new flushTablet_args();
-      }
-
-      @Override
-      public org.apache.thrift.async.AsyncMethodCallback<Void> 
getResultHandler(final 
org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final 
int seqid) {
-        final org.apache.thrift.AsyncProcessFunction fcall = this;
-        return new org.apache.thrift.async.AsyncMethodCallback<Void>() { 
-          @Override
-          public void onComplete(Void o) {
-          }
-          @Override
-          public void onError(java.lang.Exception e) {
-            if (e instanceof org.apache.thrift.transport.TTransportException) {
-              _LOGGER.error("TTransportException inside handler", e);
+            try {
+              fcall.sendResponse(fb,msg,msgType,seqid);
+            } catch (java.lang.Exception ex) {
+              _LOGGER.error("Exception writing to internal frame buffer", ex);
               fb.close();
-            } else {
-              _LOGGER.error("Exception inside oneway handler", e);
             }
           }
         };
@@ -4539,23 +4556,23 @@ public class TabletClientService {
 
       @Override
       protected boolean isOneway() {
-        return true;
+        return false;
       }
 
       @Override
-      public void start(I iface, flushTablet_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
-        iface.flushTablet(args.tinfo, args.credentials, args.lock, 
args.extent,resultHandler);
+      public void start(I iface, splitTablet_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
+        iface.splitTablet(args.tinfo, args.credentials, args.extent, 
args.splitPoint,resultHandler);
       }
     }
 
-    public static class chop<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, chop_args, Void> {
-      public chop() {
-        super("chop");
+    public static class loadTablet<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, loadTablet_args, Void> {
+      public loadTablet() {
+        super("loadTablet");
       }
 
       @Override
-      public chop_args getEmptyArgsInstance() {
-        return new chop_args();
+      public loadTablet_args getEmptyArgsInstance() {
+        return new loadTablet_args();
       }
 
       @Override
@@ -4583,19 +4600,179 @@ public class TabletClientService {
       }
 
       @Override
-      public void start(I iface, chop_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
-        iface.chop(args.tinfo, args.credentials, args.lock, 
args.extent,resultHandler);
+      public void start(I iface, loadTablet_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
+        iface.loadTablet(args.tinfo, args.credentials, args.lock, 
args.extent,resultHandler);
       }
     }
 
-    public static class compact<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, compact_args, Void> {
-      public compact() {
-        super("compact");
+    public static class unloadTablet<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, unloadTablet_args, Void> {
+      public unloadTablet() {
+        super("unloadTablet");
       }
 
       @Override
-      public compact_args getEmptyArgsInstance() {
-        return new compact_args();
+      public unloadTablet_args getEmptyArgsInstance() {
+        return new unloadTablet_args();
+      }
+
+      @Override
+      public org.apache.thrift.async.AsyncMethodCallback<Void> 
getResultHandler(final 
org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final 
int seqid) {
+        final org.apache.thrift.AsyncProcessFunction fcall = this;
+        return new org.apache.thrift.async.AsyncMethodCallback<Void>() { 
+          @Override
+          public void onComplete(Void o) {
+          }
+          @Override
+          public void onError(java.lang.Exception e) {
+            if (e instanceof org.apache.thrift.transport.TTransportException) {
+              _LOGGER.error("TTransportException inside handler", e);
+              fb.close();
+            } else {
+              _LOGGER.error("Exception inside oneway handler", e);
+            }
+          }
+        };
+      }
+
+      @Override
+      protected boolean isOneway() {
+        return true;
+      }
+
+      @Override
+      public void start(I iface, unloadTablet_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
+        iface.unloadTablet(args.tinfo, args.credentials, args.lock, 
args.extent, args.goal, args.requestTime,resultHandler);
+      }
+    }
+
+    public static class flush<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, flush_args, Void> {
+      public flush() {
+        super("flush");
+      }
+
+      @Override
+      public flush_args getEmptyArgsInstance() {
+        return new flush_args();
+      }
+
+      @Override
+      public org.apache.thrift.async.AsyncMethodCallback<Void> 
getResultHandler(final 
org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final 
int seqid) {
+        final org.apache.thrift.AsyncProcessFunction fcall = this;
+        return new org.apache.thrift.async.AsyncMethodCallback<Void>() { 
+          @Override
+          public void onComplete(Void o) {
+          }
+          @Override
+          public void onError(java.lang.Exception e) {
+            if (e instanceof org.apache.thrift.transport.TTransportException) {
+              _LOGGER.error("TTransportException inside handler", e);
+              fb.close();
+            } else {
+              _LOGGER.error("Exception inside oneway handler", e);
+            }
+          }
+        };
+      }
+
+      @Override
+      protected boolean isOneway() {
+        return true;
+      }
+
+      @Override
+      public void start(I iface, flush_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
+        iface.flush(args.tinfo, args.credentials, args.lock, args.tableId, 
args.startRow, args.endRow,resultHandler);
+      }
+    }
+
+    public static class flushTablet<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, flushTablet_args, Void> {
+      public flushTablet() {
+        super("flushTablet");
+      }
+
+      @Override
+      public flushTablet_args getEmptyArgsInstance() {
+        return new flushTablet_args();
+      }
+
+      @Override
+      public org.apache.thrift.async.AsyncMethodCallback<Void> 
getResultHandler(final 
org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final 
int seqid) {
+        final org.apache.thrift.AsyncProcessFunction fcall = this;
+        return new org.apache.thrift.async.AsyncMethodCallback<Void>() { 
+          @Override
+          public void onComplete(Void o) {
+          }
+          @Override
+          public void onError(java.lang.Exception e) {
+            if (e instanceof org.apache.thrift.transport.TTransportException) {
+              _LOGGER.error("TTransportException inside handler", e);
+              fb.close();
+            } else {
+              _LOGGER.error("Exception inside oneway handler", e);
+            }
+          }
+        };
+      }
+
+      @Override
+      protected boolean isOneway() {
+        return true;
+      }
+
+      @Override
+      public void start(I iface, flushTablet_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
+        iface.flushTablet(args.tinfo, args.credentials, args.lock, 
args.extent,resultHandler);
+      }
+    }
+
+    public static class chop<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, chop_args, Void> {
+      public chop() {
+        super("chop");
+      }
+
+      @Override
+      public chop_args getEmptyArgsInstance() {
+        return new chop_args();
+      }
+
+      @Override
+      public org.apache.thrift.async.AsyncMethodCallback<Void> 
getResultHandler(final 
org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final 
int seqid) {
+        final org.apache.thrift.AsyncProcessFunction fcall = this;
+        return new org.apache.thrift.async.AsyncMethodCallback<Void>() { 
+          @Override
+          public void onComplete(Void o) {
+          }
+          @Override
+          public void onError(java.lang.Exception e) {
+            if (e instanceof org.apache.thrift.transport.TTransportException) {
+              _LOGGER.error("TTransportException inside handler", e);
+              fb.close();
+            } else {
+              _LOGGER.error("Exception inside oneway handler", e);
+            }
+          }
+        };
+      }
+
+      @Override
+      protected boolean isOneway() {
+        return true;
+      }
+
+      @Override
+      public void start(I iface, chop_args args, 
org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws 
org.apache.thrift.TException {
+        iface.chop(args.tinfo, args.credentials, args.lock, 
args.extent,resultHandler);
+      }
+    }
+
+    public static class compact<I extends AsyncIface> extends 
org.apache.thrift.AsyncProcessFunction<I, compact_args, Void> {
+      public compact() {
+        super("compact");
+      }
+
+      @Override
+      public compact_args getEmptyArgsInstance() {
+        return new compact_args();
       }
 
       @Override
@@ -16761,12 +16938,1030 @@ public class TabletClientService {
 
     @Override
     public boolean equals(java.lang.Object that) {
-      if (that instanceof loadFiles_args)
-        return this.equals((loadFiles_args)that);
+      if (that instanceof loadFiles_args)
+        return this.equals((loadFiles_args)that);
+      return false;
+    }
+
+    public boolean equals(loadFiles_args that) {
+      if (that == null)
+        return false;
+      if (this == that)
+        return true;
+
+      boolean this_present_tinfo = true && this.isSetTinfo();
+      boolean that_present_tinfo = true && that.isSetTinfo();
+      if (this_present_tinfo || that_present_tinfo) {
+        if (!(this_present_tinfo && that_present_tinfo))
+          return false;
+        if (!this.tinfo.equals(that.tinfo))
+          return false;
+      }
+
+      boolean this_present_credentials = true && this.isSetCredentials();
+      boolean that_present_credentials = true && that.isSetCredentials();
+      if (this_present_credentials || that_present_credentials) {
+        if (!(this_present_credentials && that_present_credentials))
+          return false;
+        if (!this.credentials.equals(that.credentials))
+          return false;
+      }
+
+      boolean this_present_tid = true;
+      boolean that_present_tid = true;
+      if (this_present_tid || that_present_tid) {
+        if (!(this_present_tid && that_present_tid))
+          return false;
+        if (this.tid != that.tid)
+          return false;
+      }
+
+      boolean this_present_dir = true && this.isSetDir();
+      boolean that_present_dir = true && that.isSetDir();
+      if (this_present_dir || that_present_dir) {
+        if (!(this_present_dir && that_present_dir))
+          return false;
+        if (!this.dir.equals(that.dir))
+          return false;
+      }
+
+      boolean this_present_files = true && this.isSetFiles();
+      boolean that_present_files = true && that.isSetFiles();
+      if (this_present_files || that_present_files) {
+        if (!(this_present_files && that_present_files))
+          return false;
+        if (!this.files.equals(that.files))
+          return false;
+      }
+
+      boolean this_present_setTime = true;
+      boolean that_present_setTime = true;
+      if (this_present_setTime || that_present_setTime) {
+        if (!(this_present_setTime && that_present_setTime))
+          return false;
+        if (this.setTime != that.setTime)
+          return false;
+      }
+
+      return true;
+    }
+
+    @Override
+    public int hashCode() {
+      int hashCode = 1;
+
+      hashCode = hashCode * 8191 + ((isSetTinfo()) ? 131071 : 524287);
+      if (isSetTinfo())
+        hashCode = hashCode * 8191 + tinfo.hashCode();
+
+      hashCode = hashCode * 8191 + ((isSetCredentials()) ? 131071 : 524287);
+      if (isSetCredentials())
+        hashCode = hashCode * 8191 + credentials.hashCode();
+
+      hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(tid);
+
+      hashCode = hashCode * 8191 + ((isSetDir()) ? 131071 : 524287);
+      if (isSetDir())
+        hashCode = hashCode * 8191 + dir.hashCode();
+
+      hashCode = hashCode * 8191 + ((isSetFiles()) ? 131071 : 524287);
+      if (isSetFiles())
+        hashCode = hashCode * 8191 + files.hashCode();
+
+      hashCode = hashCode * 8191 + ((setTime) ? 131071 : 524287);
+
+      return hashCode;
+    }
+
+    @Override
+    public int compareTo(loadFiles_args other) {
+      if (!getClass().equals(other.getClass())) {
+        return getClass().getName().compareTo(other.getClass().getName());
+      }
+
+      int lastComparison = 0;
+
+      lastComparison = java.lang.Boolean.compare(isSetTinfo(), 
other.isSetTinfo());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetTinfo()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tinfo, 
other.tinfo);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = java.lang.Boolean.compare(isSetCredentials(), 
other.isSetCredentials());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetCredentials()) {
+        lastComparison = 
org.apache.thrift.TBaseHelper.compareTo(this.credentials, other.credentials);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = java.lang.Boolean.compare(isSetTid(), other.isSetTid());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetTid()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tid, 
other.tid);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = java.lang.Boolean.compare(isSetDir(), other.isSetDir());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetDir()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.dir, 
other.dir);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = java.lang.Boolean.compare(isSetFiles(), 
other.isSetFiles());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetFiles()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.files, 
other.files);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = java.lang.Boolean.compare(isSetSetTime(), 
other.isSetSetTime());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetSetTime()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.setTime, 
other.setTime);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      return 0;
+    }
+
+    @org.apache.thrift.annotation.Nullable
+    @Override
+    public _Fields fieldForId(int fieldId) {
+      return _Fields.findByThriftId(fieldId);
+    }
+
+    @Override
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws 
org.apache.thrift.TException {
+      scheme(iprot).read(iprot, this);
+    }
+
+    @Override
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws 
org.apache.thrift.TException {
+      scheme(oprot).write(oprot, this);
+    }
+
+    @Override
+    public java.lang.String toString() {
+      java.lang.StringBuilder sb = new 
java.lang.StringBuilder("loadFiles_args(");
+      boolean first = true;
+
+      sb.append("tinfo:");
+      if (this.tinfo == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.tinfo);
+      }
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("credentials:");
+      if (this.credentials == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.credentials);
+      }
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("tid:");
+      sb.append(this.tid);
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("dir:");
+      if (this.dir == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.dir);
+      }
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("files:");
+      if (this.files == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.files);
+      }
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("setTime:");
+      sb.append(this.setTime);
+      first = false;
+      sb.append(")");
+      return sb.toString();
+    }
+
+    public void validate() throws org.apache.thrift.TException {
+      // check for required fields
+      // check for sub-struct validity
+      if (tinfo != null) {
+        tinfo.validate();
+      }
+      if (credentials != null) {
+        credentials.validate();
+      }
+    }
+
+    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, java.lang.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 loadFiles_argsStandardSchemeFactory implements 
org.apache.thrift.scheme.SchemeFactory {
+      @Override
+      public loadFiles_argsStandardScheme getScheme() {
+        return new loadFiles_argsStandardScheme();
+      }
+    }
+
+    private static class loadFiles_argsStandardScheme extends 
org.apache.thrift.scheme.StandardScheme<loadFiles_args> {
+
+      @Override
+      public void read(org.apache.thrift.protocol.TProtocol iprot, 
loadFiles_args 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: // TINFO
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) 
{
+                struct.tinfo = new 
org.apache.accumulo.core.trace.thrift.TInfo();
+                struct.tinfo.read(iprot);
+                struct.setTinfoIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+              }
+              break;
+            case 2: // CREDENTIALS
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) 
{
+                struct.credentials = new 
org.apache.accumulo.core.securityImpl.thrift.TCredentials();
+                struct.credentials.read(iprot);
+                struct.setCredentialsIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+              }
+              break;
+            case 3: // TID
+              if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
+                struct.tid = iprot.readI64();
+                struct.setTidIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+              }
+              break;
+            case 4: // DIR
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) 
{
+                struct.dir = iprot.readString();
+                struct.setDirIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+              }
+              break;
+            case 5: // FILES
+              if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
+                {
+                  org.apache.thrift.protocol.TMap _map346 = 
iprot.readMapBegin();
+                  struct.files = new 
java.util.HashMap<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>(2*_map346.size);
+                  @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _key347;
+                  @org.apache.thrift.annotation.Nullable 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>
 _val348;
+                  for (int _i349 = 0; _i349 < _map346.size; ++_i349)
+                  {
+                    _key347 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
+                    _key347.read(iprot);
+                    {
+                      org.apache.thrift.protocol.TMap _map350 = 
iprot.readMapBegin();
+                      _val348 = new 
java.util.HashMap<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>(2*_map350.size);
+                      @org.apache.thrift.annotation.Nullable java.lang.String 
_key351;
+                      @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo _val352;
+                      for (int _i353 = 0; _i353 < _map350.size; ++_i353)
+                      {
+                        _key351 = iprot.readString();
+                        _val352 = new 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo();
+                        _val352.read(iprot);
+                        _val348.put(_key351, _val352);
+                      }
+                      iprot.readMapEnd();
+                    }
+                    struct.files.put(_key347, _val348);
+                  }
+                  iprot.readMapEnd();
+                }
+                struct.setFilesIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+              }
+              break;
+            case 6: // SET_TIME
+              if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
+                struct.setTime = iprot.readBool();
+                struct.setSetTimeIsSet(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();
+      }
+
+      @Override
+      public void write(org.apache.thrift.protocol.TProtocol oprot, 
loadFiles_args struct) throws org.apache.thrift.TException {
+        struct.validate();
+
+        oprot.writeStructBegin(STRUCT_DESC);
+        if (struct.tinfo != null) {
+          oprot.writeFieldBegin(TINFO_FIELD_DESC);
+          struct.tinfo.write(oprot);
+          oprot.writeFieldEnd();
+        }
+        if (struct.credentials != null) {
+          oprot.writeFieldBegin(CREDENTIALS_FIELD_DESC);
+          struct.credentials.write(oprot);
+          oprot.writeFieldEnd();
+        }
+        oprot.writeFieldBegin(TID_FIELD_DESC);
+        oprot.writeI64(struct.tid);
+        oprot.writeFieldEnd();
+        if (struct.dir != null) {
+          oprot.writeFieldBegin(DIR_FIELD_DESC);
+          oprot.writeString(struct.dir);
+          oprot.writeFieldEnd();
+        }
+        if (struct.files != null) {
+          oprot.writeFieldBegin(FILES_FIELD_DESC);
+          {
+            oprot.writeMapBegin(new 
org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRUCT, 
org.apache.thrift.protocol.TType.MAP, struct.files.size()));
+            for 
(java.util.Map.Entry<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent, 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 _iter354 : struct.files.entrySet())
+            {
+              _iter354.getKey().write(oprot);
+              {
+                oprot.writeMapBegin(new 
org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.STRUCT, _iter354.getValue().size()));
+                for (java.util.Map.Entry<java.lang.String, 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo> _iter355 : 
_iter354.getValue().entrySet())
+                {
+                  oprot.writeString(_iter355.getKey());
+                  _iter355.getValue().write(oprot);
+                }
+                oprot.writeMapEnd();
+              }
+            }
+            oprot.writeMapEnd();
+          }
+          oprot.writeFieldEnd();
+        }
+        oprot.writeFieldBegin(SET_TIME_FIELD_DESC);
+        oprot.writeBool(struct.setTime);
+        oprot.writeFieldEnd();
+        oprot.writeFieldStop();
+        oprot.writeStructEnd();
+      }
+
+    }
+
+    private static class loadFiles_argsTupleSchemeFactory implements 
org.apache.thrift.scheme.SchemeFactory {
+      @Override
+      public loadFiles_argsTupleScheme getScheme() {
+        return new loadFiles_argsTupleScheme();
+      }
+    }
+
+    private static class loadFiles_argsTupleScheme extends 
org.apache.thrift.scheme.TupleScheme<loadFiles_args> {
+
+      @Override
+      public void write(org.apache.thrift.protocol.TProtocol prot, 
loadFiles_args struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TTupleProtocol oprot = 
(org.apache.thrift.protocol.TTupleProtocol) prot;
+        java.util.BitSet optionals = new java.util.BitSet();
+        if (struct.isSetTinfo()) {
+          optionals.set(0);
+        }
+        if (struct.isSetCredentials()) {
+          optionals.set(1);
+        }
+        if (struct.isSetTid()) {
+          optionals.set(2);
+        }
+        if (struct.isSetDir()) {
+          optionals.set(3);
+        }
+        if (struct.isSetFiles()) {
+          optionals.set(4);
+        }
+        if (struct.isSetSetTime()) {
+          optionals.set(5);
+        }
+        oprot.writeBitSet(optionals, 6);
+        if (struct.isSetTinfo()) {
+          struct.tinfo.write(oprot);
+        }
+        if (struct.isSetCredentials()) {
+          struct.credentials.write(oprot);
+        }
+        if (struct.isSetTid()) {
+          oprot.writeI64(struct.tid);
+        }
+        if (struct.isSetDir()) {
+          oprot.writeString(struct.dir);
+        }
+        if (struct.isSetFiles()) {
+          {
+            oprot.writeI32(struct.files.size());
+            for 
(java.util.Map.Entry<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent, 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 _iter356 : struct.files.entrySet())
+            {
+              _iter356.getKey().write(oprot);
+              {
+                oprot.writeI32(_iter356.getValue().size());
+                for (java.util.Map.Entry<java.lang.String, 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo> _iter357 : 
_iter356.getValue().entrySet())
+                {
+                  oprot.writeString(_iter357.getKey());
+                  _iter357.getValue().write(oprot);
+                }
+              }
+            }
+          }
+        }
+        if (struct.isSetSetTime()) {
+          oprot.writeBool(struct.setTime);
+        }
+      }
+
+      @Override
+      public void read(org.apache.thrift.protocol.TProtocol prot, 
loadFiles_args struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TTupleProtocol iprot = 
(org.apache.thrift.protocol.TTupleProtocol) prot;
+        java.util.BitSet incoming = iprot.readBitSet(6);
+        if (incoming.get(0)) {
+          struct.tinfo = new org.apache.accumulo.core.trace.thrift.TInfo();
+          struct.tinfo.read(iprot);
+          struct.setTinfoIsSet(true);
+        }
+        if (incoming.get(1)) {
+          struct.credentials = new 
org.apache.accumulo.core.securityImpl.thrift.TCredentials();
+          struct.credentials.read(iprot);
+          struct.setCredentialsIsSet(true);
+        }
+        if (incoming.get(2)) {
+          struct.tid = iprot.readI64();
+          struct.setTidIsSet(true);
+        }
+        if (incoming.get(3)) {
+          struct.dir = iprot.readString();
+          struct.setDirIsSet(true);
+        }
+        if (incoming.get(4)) {
+          {
+            org.apache.thrift.protocol.TMap _map358 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRUCT, 
org.apache.thrift.protocol.TType.MAP); 
+            struct.files = new 
java.util.HashMap<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>(2*_map358.size);
+            @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _key359;
+            @org.apache.thrift.annotation.Nullable 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>
 _val360;
+            for (int _i361 = 0; _i361 < _map358.size; ++_i361)
+            {
+              _key359 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
+              _key359.read(iprot);
+              {
+                org.apache.thrift.protocol.TMap _map362 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.STRUCT); 
+                _val360 = new 
java.util.HashMap<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>(2*_map362.size);
+                @org.apache.thrift.annotation.Nullable java.lang.String 
_key363;
+                @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo _val364;
+                for (int _i365 = 0; _i365 < _map362.size; ++_i365)
+                {
+                  _key363 = iprot.readString();
+                  _val364 = new 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo();
+                  _val364.read(iprot);
+                  _val360.put(_key363, _val364);
+                }
+              }
+              struct.files.put(_key359, _val360);
+            }
+          }
+          struct.setFilesIsSet(true);
+        }
+        if (incoming.get(5)) {
+          struct.setTime = iprot.readBool();
+          struct.setSetTimeIsSet(true);
+        }
+      }
+    }
+
+    private static <S extends org.apache.thrift.scheme.IScheme> S 
scheme(org.apache.thrift.protocol.TProtocol proto) {
+      return 
(org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? 
STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();
+    }
+  }
+
+  @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
+  public static class loadFilesV2_args implements 
org.apache.thrift.TBase<loadFilesV2_args, loadFilesV2_args._Fields>, 
java.io.Serializable, Cloneable, Comparable<loadFilesV2_args>   {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new 
org.apache.thrift.protocol.TStruct("loadFilesV2_args");
+
+    private static final org.apache.thrift.protocol.TField TINFO_FIELD_DESC = 
new org.apache.thrift.protocol.TField("tinfo", 
org.apache.thrift.protocol.TType.STRUCT, (short)1);
+    private static final org.apache.thrift.protocol.TField 
CREDENTIALS_FIELD_DESC = new org.apache.thrift.protocol.TField("credentials", 
org.apache.thrift.protocol.TType.STRUCT, (short)2);
+    private static final org.apache.thrift.protocol.TField TID_FIELD_DESC = 
new org.apache.thrift.protocol.TField("tid", 
org.apache.thrift.protocol.TType.I64, (short)3);
+    private static final org.apache.thrift.protocol.TField DIR_FIELD_DESC = 
new org.apache.thrift.protocol.TField("dir", 
org.apache.thrift.protocol.TType.STRING, (short)4);
+    private static final org.apache.thrift.protocol.TField FILES_FIELD_DESC = 
new org.apache.thrift.protocol.TField("files", 
org.apache.thrift.protocol.TType.MAP, (short)5);
+    private static final org.apache.thrift.protocol.TField SET_TIME_FIELD_DESC 
= new org.apache.thrift.protocol.TField("setTime", 
org.apache.thrift.protocol.TType.BOOL, (short)6);
+
+    private static final org.apache.thrift.scheme.SchemeFactory 
STANDARD_SCHEME_FACTORY = new loadFilesV2_argsStandardSchemeFactory();
+    private static final org.apache.thrift.scheme.SchemeFactory 
TUPLE_SCHEME_FACTORY = new loadFilesV2_argsTupleSchemeFactory();
+
+    public @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.trace.thrift.TInfo tinfo; // required
+    public @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials; // 
required
+    public long tid; // required
+    public @org.apache.thrift.annotation.Nullable java.lang.String dir; // 
required
+    public @org.apache.thrift.annotation.Nullable 
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 files; // required
+    public boolean setTime; // 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 {
+      TINFO((short)1, "tinfo"),
+      CREDENTIALS((short)2, "credentials"),
+      TID((short)3, "tid"),
+      DIR((short)4, "dir"),
+      FILES((short)5, "files"),
+      SET_TIME((short)6, "setTime");
+
+      private static final java.util.Map<java.lang.String, _Fields> byName = 
new java.util.HashMap<java.lang.String, _Fields>();
+
+      static {
+        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {
+          byName.put(field.getFieldName(), field);
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, or null if its not 
found.
+       */
+      @org.apache.thrift.annotation.Nullable
+      public static _Fields findByThriftId(int fieldId) {
+        switch(fieldId) {
+          case 1: // TINFO
+            return TINFO;
+          case 2: // CREDENTIALS
+            return CREDENTIALS;
+          case 3: // TID
+            return TID;
+          case 4: // DIR
+            return DIR;
+          case 5: // FILES
+            return FILES;
+          case 6: // SET_TIME
+            return SET_TIME;
+          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 
java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+        return fields;
+      }
+
+      /**
+       * Find the _Fields constant that matches name, or null if its not found.
+       */
+      @org.apache.thrift.annotation.Nullable
+      public static _Fields findByName(java.lang.String name) {
+        return byName.get(name);
+      }
+
+      private final short _thriftId;
+      private final java.lang.String _fieldName;
+
+      _Fields(short thriftId, java.lang.String fieldName) {
+        _thriftId = thriftId;
+        _fieldName = fieldName;
+      }
+
+      @Override
+      public short getThriftFieldId() {
+        return _thriftId;
+      }
+
+      @Override
+      public java.lang.String getFieldName() {
+        return _fieldName;
+      }
+    }
+
+    // isset id assignments
+    private static final int __TID_ISSET_ID = 0;
+    private static final int __SETTIME_ISSET_ID = 1;
+    private byte __isset_bitfield = 0;
+    public static final java.util.Map<_Fields, 
org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+    static {
+      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap 
= new java.util.EnumMap<_Fields, 
org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+      tmpMap.put(_Fields.TINFO, new 
org.apache.thrift.meta_data.FieldMetaData("tinfo", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new 
org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT,
 org.apache.accumulo.core.trace.thrift.TInfo.class)));
+      tmpMap.put(_Fields.CREDENTIALS, new 
org.apache.thrift.meta_data.FieldMetaData("credentials", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new 
org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT,
 org.apache.accumulo.core.securityImpl.thrift.TCredentials.class)));
+      tmpMap.put(_Fields.TID, new 
org.apache.thrift.meta_data.FieldMetaData("tid", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+      tmpMap.put(_Fields.DIR, new 
org.apache.thrift.meta_data.FieldMetaData("dir", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.FILES, new 
org.apache.thrift.meta_data.FieldMetaData("files", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new 
org.apache.thrift.meta_data.MapMetaData(org.apache.thrift.protocol.TType.MAP, 
+              new 
org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT,
 org.apache.accumulo.core.dataImpl.thrift.TKeyExtent.class), 
+              new 
org.apache.thrift.meta_data.MapMetaData(org.apache.thrift.protocol.TType.MAP, 
+                  new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING),
 
+                  new 
org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT,
 org.apache.accumulo.core.dataImpl.thrift.MapFileInfo.class)))));
+      tmpMap.put(_Fields.SET_TIME, new 
org.apache.thrift.meta_data.FieldMetaData("setTime", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
+      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
+      
org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(loadFilesV2_args.class,
 metaDataMap);
+    }
+
+    public loadFilesV2_args() {
+    }
+
+    public loadFilesV2_args(
+      org.apache.accumulo.core.trace.thrift.TInfo tinfo,
+      org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials,
+      long tid,
+      java.lang.String dir,
+      
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 files,
+      boolean setTime)
+    {
+      this();
+      this.tinfo = tinfo;
+      this.credentials = credentials;
+      this.tid = tid;
+      setTidIsSet(true);
+      this.dir = dir;
+      this.files = files;
+      this.setTime = setTime;
+      setSetTimeIsSet(true);
+    }
+
+    /**
+     * Performs a deep copy on <i>other</i>.
+     */
+    public loadFilesV2_args(loadFilesV2_args other) {
+      __isset_bitfield = other.__isset_bitfield;
+      if (other.isSetTinfo()) {
+        this.tinfo = new 
org.apache.accumulo.core.trace.thrift.TInfo(other.tinfo);
+      }
+      if (other.isSetCredentials()) {
+        this.credentials = new 
org.apache.accumulo.core.securityImpl.thrift.TCredentials(other.credentials);
+      }
+      this.tid = other.tid;
+      if (other.isSetDir()) {
+        this.dir = other.dir;
+      }
+      if (other.isSetFiles()) {
+        
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 __this__files = new 
java.util.HashMap<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>(other.files.size());
+        for 
(java.util.Map.Entry<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent, 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 other_element : other.files.entrySet()) {
+
+          org.apache.accumulo.core.dataImpl.thrift.TKeyExtent 
other_element_key = other_element.getKey();
+          
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>
 other_element_value = other_element.getValue();
+
+          org.apache.accumulo.core.dataImpl.thrift.TKeyExtent 
__this__files_copy_key = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent(other_element_key);
+
+          
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>
 __this__files_copy_value = new 
java.util.HashMap<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>(other_element_value.size());
+          for (java.util.Map.Entry<java.lang.String, 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo> 
other_element_value_element : other_element_value.entrySet()) {
+
+            java.lang.String other_element_value_element_key = 
other_element_value_element.getKey();
+            org.apache.accumulo.core.dataImpl.thrift.MapFileInfo 
other_element_value_element_value = other_element_value_element.getValue();
+
+            java.lang.String __this__files_copy_value_copy_key = 
other_element_value_element_key;
+
+            org.apache.accumulo.core.dataImpl.thrift.MapFileInfo 
__this__files_copy_value_copy_value = new 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo(other_element_value_element_value);
+
+            __this__files_copy_value.put(__this__files_copy_value_copy_key, 
__this__files_copy_value_copy_value);
+          }
+
+          __this__files.put(__this__files_copy_key, __this__files_copy_value);
+        }
+        this.files = __this__files;
+      }
+      this.setTime = other.setTime;
+    }
+
+    @Override
+    public loadFilesV2_args deepCopy() {
+      return new loadFilesV2_args(this);
+    }
+
+    @Override
+    public void clear() {
+      this.tinfo = null;
+      this.credentials = null;
+      setTidIsSet(false);
+      this.tid = 0;
+      this.dir = null;
+      this.files = null;
+      setSetTimeIsSet(false);
+      this.setTime = false;
+    }
+
+    @org.apache.thrift.annotation.Nullable
+    public org.apache.accumulo.core.trace.thrift.TInfo getTinfo() {
+      return this.tinfo;
+    }
+
+    public loadFilesV2_args setTinfo(@org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.trace.thrift.TInfo tinfo) {
+      this.tinfo = tinfo;
+      return this;
+    }
+
+    public void unsetTinfo() {
+      this.tinfo = null;
+    }
+
+    /** Returns true if field tinfo is set (has been assigned a value) and 
false otherwise */
+    public boolean isSetTinfo() {
+      return this.tinfo != null;
+    }
+
+    public void setTinfoIsSet(boolean value) {
+      if (!value) {
+        this.tinfo = null;
+      }
+    }
+
+    @org.apache.thrift.annotation.Nullable
+    public org.apache.accumulo.core.securityImpl.thrift.TCredentials 
getCredentials() {
+      return this.credentials;
+    }
+
+    public loadFilesV2_args 
setCredentials(@org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.securityImpl.thrift.TCredentials credentials) {
+      this.credentials = credentials;
+      return this;
+    }
+
+    public void unsetCredentials() {
+      this.credentials = null;
+    }
+
+    /** Returns true if field credentials is set (has been assigned a value) 
and false otherwise */
+    public boolean isSetCredentials() {
+      return this.credentials != null;
+    }
+
+    public void setCredentialsIsSet(boolean value) {
+      if (!value) {
+        this.credentials = null;
+      }
+    }
+
+    public long getTid() {
+      return this.tid;
+    }
+
+    public loadFilesV2_args setTid(long tid) {
+      this.tid = tid;
+      setTidIsSet(true);
+      return this;
+    }
+
+    public void unsetTid() {
+      __isset_bitfield = 
org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __TID_ISSET_ID);
+    }
+
+    /** Returns true if field tid is set (has been assigned a value) and false 
otherwise */
+    public boolean isSetTid() {
+      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, 
__TID_ISSET_ID);
+    }
+
+    public void setTidIsSet(boolean value) {
+      __isset_bitfield = 
org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __TID_ISSET_ID, value);
+    }
+
+    @org.apache.thrift.annotation.Nullable
+    public java.lang.String getDir() {
+      return this.dir;
+    }
+
+    public loadFilesV2_args setDir(@org.apache.thrift.annotation.Nullable 
java.lang.String dir) {
+      this.dir = dir;
+      return this;
+    }
+
+    public void unsetDir() {
+      this.dir = null;
+    }
+
+    /** Returns true if field dir is set (has been assigned a value) and false 
otherwise */
+    public boolean isSetDir() {
+      return this.dir != null;
+    }
+
+    public void setDirIsSet(boolean value) {
+      if (!value) {
+        this.dir = null;
+      }
+    }
+
+    public int getFilesSize() {
+      return (this.files == null) ? 0 : this.files.size();
+    }
+
+    public void putToFiles(org.apache.accumulo.core.dataImpl.thrift.TKeyExtent 
key, 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>
 val) {
+      if (this.files == null) {
+        this.files = new 
java.util.HashMap<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>();
+      }
+      this.files.put(key, val);
+    }
+
+    @org.apache.thrift.annotation.Nullable
+    public 
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 getFiles() {
+      return this.files;
+    }
+
+    public loadFilesV2_args setFiles(@org.apache.thrift.annotation.Nullable 
java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 files) {
+      this.files = files;
+      return this;
+    }
+
+    public void unsetFiles() {
+      this.files = null;
+    }
+
+    /** Returns true if field files is set (has been assigned a value) and 
false otherwise */
+    public boolean isSetFiles() {
+      return this.files != null;
+    }
+
+    public void setFilesIsSet(boolean value) {
+      if (!value) {
+        this.files = null;
+      }
+    }
+
+    public boolean isSetTime() {
+      return this.setTime;
+    }
+
+    public loadFilesV2_args setSetTime(boolean setTime) {
+      this.setTime = setTime;
+      setSetTimeIsSet(true);
+      return this;
+    }
+
+    public void unsetSetTime() {
+      __isset_bitfield = 
org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __SETTIME_ISSET_ID);
+    }
+
+    /** Returns true if field setTime is set (has been assigned a value) and 
false otherwise */
+    public boolean isSetSetTime() {
+      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, 
__SETTIME_ISSET_ID);
+    }
+
+    public void setSetTimeIsSet(boolean value) {
+      __isset_bitfield = 
org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __SETTIME_ISSET_ID, 
value);
+    }
+
+    @Override
+    public void setFieldValue(_Fields field, 
@org.apache.thrift.annotation.Nullable java.lang.Object value) {
+      switch (field) {
+      case TINFO:
+        if (value == null) {
+          unsetTinfo();
+        } else {
+          setTinfo((org.apache.accumulo.core.trace.thrift.TInfo)value);
+        }
+        break;
+
+      case CREDENTIALS:
+        if (value == null) {
+          unsetCredentials();
+        } else {
+          
setCredentials((org.apache.accumulo.core.securityImpl.thrift.TCredentials)value);
+        }
+        break;
+
+      case TID:
+        if (value == null) {
+          unsetTid();
+        } else {
+          setTid((java.lang.Long)value);
+        }
+        break;
+
+      case DIR:
+        if (value == null) {
+          unsetDir();
+        } else {
+          setDir((java.lang.String)value);
+        }
+        break;
+
+      case FILES:
+        if (value == null) {
+          unsetFiles();
+        } else {
+          
setFiles((java.util.Map<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>)value);
+        }
+        break;
+
+      case SET_TIME:
+        if (value == null) {
+          unsetSetTime();
+        } else {
+          setSetTime((java.lang.Boolean)value);
+        }
+        break;
+
+      }
+    }
+
+    @org.apache.thrift.annotation.Nullable
+    @Override
+    public java.lang.Object getFieldValue(_Fields field) {
+      switch (field) {
+      case TINFO:
+        return getTinfo();
+
+      case CREDENTIALS:
+        return getCredentials();
+
+      case TID:
+        return getTid();
+
+      case DIR:
+        return getDir();
+
+      case FILES:
+        return getFiles();
+
+      case SET_TIME:
+        return isSetTime();
+
+      }
+      throw new java.lang.IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been 
assigned a value) and false otherwise */
+    @Override
+    public boolean isSet(_Fields field) {
+      if (field == null) {
+        throw new java.lang.IllegalArgumentException();
+      }
+
+      switch (field) {
+      case TINFO:
+        return isSetTinfo();
+      case CREDENTIALS:
+        return isSetCredentials();
+      case TID:
+        return isSetTid();
+      case DIR:
+        return isSetDir();
+      case FILES:
+        return isSetFiles();
+      case SET_TIME:
+        return isSetSetTime();
+      }
+      throw new java.lang.IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(java.lang.Object that) {
+      if (that instanceof loadFilesV2_args)
+        return this.equals((loadFilesV2_args)that);
       return false;
     }
 
-    public boolean equals(loadFiles_args that) {
+    public boolean equals(loadFilesV2_args that) {
       if (that == null)
         return false;
       if (this == that)
@@ -16857,7 +18052,7 @@ public class TabletClientService {
     }
 
     @Override
-    public int compareTo(loadFiles_args other) {
+    public int compareTo(loadFilesV2_args other) {
       if (!getClass().equals(other.getClass())) {
         return getClass().getName().compareTo(other.getClass().getName());
       }
@@ -16945,7 +18140,7 @@ public class TabletClientService {
 
     @Override
     public java.lang.String toString() {
-      java.lang.StringBuilder sb = new 
java.lang.StringBuilder("loadFiles_args(");
+      java.lang.StringBuilder sb = new 
java.lang.StringBuilder("loadFilesV2_args(");
       boolean first = true;
 
       sb.append("tinfo:");
@@ -17020,17 +18215,17 @@ public class TabletClientService {
       }
     }
 
-    private static class loadFiles_argsStandardSchemeFactory implements 
org.apache.thrift.scheme.SchemeFactory {
+    private static class loadFilesV2_argsStandardSchemeFactory implements 
org.apache.thrift.scheme.SchemeFactory {
       @Override
-      public loadFiles_argsStandardScheme getScheme() {
-        return new loadFiles_argsStandardScheme();
+      public loadFilesV2_argsStandardScheme getScheme() {
+        return new loadFilesV2_argsStandardScheme();
       }
     }
 
-    private static class loadFiles_argsStandardScheme extends 
org.apache.thrift.scheme.StandardScheme<loadFiles_args> {
+    private static class loadFilesV2_argsStandardScheme extends 
org.apache.thrift.scheme.StandardScheme<loadFilesV2_args> {
 
       @Override
-      public void read(org.apache.thrift.protocol.TProtocol iprot, 
loadFiles_args struct) throws org.apache.thrift.TException {
+      public void read(org.apache.thrift.protocol.TProtocol iprot, 
loadFilesV2_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TField schemeField;
         iprot.readStructBegin();
         while (true)
@@ -17077,29 +18272,29 @@ public class TabletClientService {
             case 5: // FILES
               if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
                 {
-                  org.apache.thrift.protocol.TMap _map346 = 
iprot.readMapBegin();
-                  struct.files = new 
java.util.HashMap<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>(2*_map346.size);
-                  @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _key347;
-                  @org.apache.thrift.annotation.Nullable 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>
 _val348;
-                  for (int _i349 = 0; _i349 < _map346.size; ++_i349)
+                  org.apache.thrift.protocol.TMap _map366 = 
iprot.readMapBegin();
+                  struct.files = new 
java.util.HashMap<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>(2*_map366.size);
+                  @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _key367;
+                  @org.apache.thrift.annotation.Nullable 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>
 _val368;
+                  for (int _i369 = 0; _i369 < _map366.size; ++_i369)
                   {
-                    _key347 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
-                    _key347.read(iprot);
+                    _key367 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
+                    _key367.read(iprot);
                     {
-                      org.apache.thrift.protocol.TMap _map350 = 
iprot.readMapBegin();
-                      _val348 = new 
java.util.HashMap<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>(2*_map350.size);
-                      @org.apache.thrift.annotation.Nullable java.lang.String 
_key351;
-                      @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo _val352;
-                      for (int _i353 = 0; _i353 < _map350.size; ++_i353)
+                      org.apache.thrift.protocol.TMap _map370 = 
iprot.readMapBegin();
+                      _val368 = new 
java.util.HashMap<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>(2*_map370.size);
+                      @org.apache.thrift.annotation.Nullable java.lang.String 
_key371;
+                      @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo _val372;
+                      for (int _i373 = 0; _i373 < _map370.size; ++_i373)
                       {
-                        _key351 = iprot.readString();
-                        _val352 = new 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo();
-                        _val352.read(iprot);
-                        _val348.put(_key351, _val352);
+                        _key371 = iprot.readString();
+                        _val372 = new 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo();
+                        _val372.read(iprot);
+                        _val368.put(_key371, _val372);
                       }
                       iprot.readMapEnd();
                     }
-                    struct.files.put(_key347, _val348);
+                    struct.files.put(_key367, _val368);
                   }
                   iprot.readMapEnd();
                 }
@@ -17128,7 +18323,7 @@ public class TabletClientService {
       }
 
       @Override
-      public void write(org.apache.thrift.protocol.TProtocol oprot, 
loadFiles_args struct) throws org.apache.thrift.TException {
+      public void write(org.apache.thrift.protocol.TProtocol oprot, 
loadFilesV2_args struct) throws org.apache.thrift.TException {
         struct.validate();
 
         oprot.writeStructBegin(STRUCT_DESC);
@@ -17154,15 +18349,15 @@ public class TabletClientService {
           oprot.writeFieldBegin(FILES_FIELD_DESC);
           {
             oprot.writeMapBegin(new 
org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRUCT, 
org.apache.thrift.protocol.TType.MAP, struct.files.size()));
-            for 
(java.util.Map.Entry<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent, 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 _iter354 : struct.files.entrySet())
+            for 
(java.util.Map.Entry<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent, 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 _iter374 : struct.files.entrySet())
             {
-              _iter354.getKey().write(oprot);
+              _iter374.getKey().write(oprot);
               {
-                oprot.writeMapBegin(new 
org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.STRUCT, _iter354.getValue().size()));
-                for (java.util.Map.Entry<java.lang.String, 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo> _iter355 : 
_iter354.getValue().entrySet())
+                oprot.writeMapBegin(new 
org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.STRUCT, _iter374.getValue().size()));
+                for (java.util.Map.Entry<java.lang.String, 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo> _iter375 : 
_iter374.getValue().entrySet())
                 {
-                  oprot.writeString(_iter355.getKey());
-                  _iter355.getValue().write(oprot);
+                  oprot.writeString(_iter375.getKey());
+                  _iter375.getValue().write(oprot);
                 }
                 oprot.writeMapEnd();
               }
@@ -17180,17 +18375,17 @@ public class TabletClientService {
 
     }
 
-    private static class loadFiles_argsTupleSchemeFactory implements 
org.apache.thrift.scheme.SchemeFactory {
+    private static class loadFilesV2_argsTupleSchemeFactory implements 
org.apache.thrift.scheme.SchemeFactory {
       @Override
-      public loadFiles_argsTupleScheme getScheme() {
-        return new loadFiles_argsTupleScheme();
+      public loadFilesV2_argsTupleScheme getScheme() {
+        return new loadFilesV2_argsTupleScheme();
       }
     }
 
-    private static class loadFiles_argsTupleScheme extends 
org.apache.thrift.scheme.TupleScheme<loadFiles_args> {
+    private static class loadFilesV2_argsTupleScheme extends 
org.apache.thrift.scheme.TupleScheme<loadFilesV2_args> {
 
       @Override
-      public void write(org.apache.thrift.protocol.TProtocol prot, 
loadFiles_args struct) throws org.apache.thrift.TException {
+      public void write(org.apache.thrift.protocol.TProtocol prot, 
loadFilesV2_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol oprot = 
(org.apache.thrift.protocol.TTupleProtocol) prot;
         java.util.BitSet optionals = new java.util.BitSet();
         if (struct.isSetTinfo()) {
@@ -17227,15 +18422,15 @@ public class TabletClientService {
         if (struct.isSetFiles()) {
           {
             oprot.writeI32(struct.files.size());
-            for 
(java.util.Map.Entry<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent, 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 _iter356 : struct.files.entrySet())
+            for 
(java.util.Map.Entry<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent, 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>
 _iter376 : struct.files.entrySet())
             {
-              _iter356.getKey().write(oprot);
+              _iter376.getKey().write(oprot);
               {
-                oprot.writeI32(_iter356.getValue().size());
-                for (java.util.Map.Entry<java.lang.String, 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo> _iter357 : 
_iter356.getValue().entrySet())
+                oprot.writeI32(_iter376.getValue().size());
+                for (java.util.Map.Entry<java.lang.String, 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo> _iter377 : 
_iter376.getValue().entrySet())
                 {
-                  oprot.writeString(_iter357.getKey());
-                  _iter357.getValue().write(oprot);
+                  oprot.writeString(_iter377.getKey());
+                  _iter377.getValue().write(oprot);
                 }
               }
             }
@@ -17247,7 +18442,7 @@ public class TabletClientService {
       }
 
       @Override
-      public void read(org.apache.thrift.protocol.TProtocol prot, 
loadFiles_args struct) throws org.apache.thrift.TException {
+      public void read(org.apache.thrift.protocol.TProtocol prot, 
loadFilesV2_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol iprot = 
(org.apache.thrift.protocol.TTupleProtocol) prot;
         java.util.BitSet incoming = iprot.readBitSet(6);
         if (incoming.get(0)) {
@@ -17270,28 +18465,28 @@ public class TabletClientService {
         }
         if (incoming.get(4)) {
           {
-            org.apache.thrift.protocol.TMap _map358 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRUCT, 
org.apache.thrift.protocol.TType.MAP); 
-            struct.files = new 
java.util.HashMap<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>(2*_map358.size);
-            @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _key359;
-            @org.apache.thrift.annotation.Nullable 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>
 _val360;
-            for (int _i361 = 0; _i361 < _map358.size; ++_i361)
+            org.apache.thrift.protocol.TMap _map378 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRUCT, 
org.apache.thrift.protocol.TType.MAP); 
+            struct.files = new 
java.util.HashMap<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>>(2*_map378.size);
+            @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _key379;
+            @org.apache.thrift.annotation.Nullable 
java.util.Map<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>
 _val380;
+            for (int _i381 = 0; _i381 < _map378.size; ++_i381)
             {
-              _key359 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
-              _key359.read(iprot);
+              _key379 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
+              _key379.read(iprot);
               {
-                org.apache.thrift.protocol.TMap _map362 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.STRUCT); 
-                _val360 = new 
java.util.HashMap<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>(2*_map362.size);
-                @org.apache.thrift.annotation.Nullable java.lang.String 
_key363;
-                @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo _val364;
-                for (int _i365 = 0; _i365 < _map362.size; ++_i365)
+                org.apache.thrift.protocol.TMap _map382 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.STRUCT); 
+                _val380 = new 
java.util.HashMap<java.lang.String,org.apache.accumulo.core.dataImpl.thrift.MapFileInfo>(2*_map382.size);
+                @org.apache.thrift.annotation.Nullable java.lang.String 
_key383;
+                @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo _val384;
+                for (int _i385 = 0; _i385 < _map382.size; ++_i385)
                 {
-                  _key363 = iprot.readString();
-                  _val364 = new 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo();
-                  _val364.read(iprot);
-                  _val360.put(_key363, _val364);
+                  _key383 = iprot.readString();
+                  _val384 = new 
org.apache.accumulo.core.dataImpl.thrift.MapFileInfo();
+                  _val384.read(iprot);
+                  _val380.put(_key383, _val384);
                 }
               }
-              struct.files.put(_key359, _val360);
+              struct.files.put(_key379, _val380);
             }
           }
           struct.setFilesIsSet(true);
@@ -17308,6 +18503,271 @@ public class TabletClientService {
     }
   }
 
+  @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
+  public static class loadFilesV2_result implements 
org.apache.thrift.TBase<loadFilesV2_result, loadFilesV2_result._Fields>, 
java.io.Serializable, Cloneable, Comparable<loadFilesV2_result>   {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new 
org.apache.thrift.protocol.TStruct("loadFilesV2_result");
+
+
+    private static final org.apache.thrift.scheme.SchemeFactory 
STANDARD_SCHEME_FACTORY = new loadFilesV2_resultStandardSchemeFactory();
+    private static final org.apache.thrift.scheme.SchemeFactory 
TUPLE_SCHEME_FACTORY = new loadFilesV2_resultTupleSchemeFactory();
+
+
+    /** The set of fields this struct contains, along with convenience methods 
for finding and manipulating them. */
+    public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+;
+
+      private static final java.util.Map<java.lang.String, _Fields> byName = 
new java.util.HashMap<java.lang.String, _Fields>();
+
+      static {
+        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {
+          byName.put(field.getFieldName(), field);
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, or null if its not 
found.
+       */
+      @org.apache.thrift.annotation.Nullable
+      public static _Fields findByThriftId(int fieldId) {
+        switch(fieldId) {
+          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 
java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+        return fields;
+      }
+
+      /**
+       * Find the _Fields constant that matches name, or null if its not found.
+       */
+      @org.apache.thrift.annotation.Nullable
+      public static _Fields findByName(java.lang.String name) {
+        return byName.get(name);
+      }
+
+      private final short _thriftId;
+      private final java.lang.String _fieldName;
+
+      _Fields(short thriftId, java.lang.String fieldName) {
+        _thriftId = thriftId;
+        _fieldName = fieldName;
+      }
+
+      @Override
+      public short getThriftFieldId() {
+        return _thriftId;
+      }
+
+      @Override
+      public java.lang.String getFieldName() {
+        return _fieldName;
+      }
+    }
+    public static final java.util.Map<_Fields, 
org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+    static {
+      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap 
= new java.util.EnumMap<_Fields, 
org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
+      
org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(loadFilesV2_result.class,
 metaDataMap);
+    }
+
+    public loadFilesV2_result() {
+    }
+
+    /**
+     * Performs a deep copy on <i>other</i>.
+     */
+    public loadFilesV2_result(loadFilesV2_result other) {
+    }
+
+    @Override
+    public loadFilesV2_result deepCopy() {
+      return new loadFilesV2_result(this);
+    }
+
+    @Override
+    public void clear() {
+    }
+
+    @Override
+    public void setFieldValue(_Fields field, 
@org.apache.thrift.annotation.Nullable java.lang.Object value) {
+      switch (field) {
+      }
+    }
+
+    @org.apache.thrift.annotation.Nullable
+    @Override
+    public java.lang.Object getFieldValue(_Fields field) {
+      switch (field) {
+      }
+      throw new java.lang.IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been 
assigned a value) and false otherwise */
+    @Override
+    public boolean isSet(_Fields field) {
+      if (field == null) {
+        throw new java.lang.IllegalArgumentException();
+      }
+
+      switch (field) {
+      }
+      throw new java.lang.IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(java.lang.Object that) {
+      if (that instanceof loadFilesV2_result)
+        return this.equals((loadFilesV2_result)that);
+      return false;
+    }
+
+    public boolean equals(loadFilesV2_result that) {
+      if (that == null)
+        return false;
+      if (this == that)
+        return true;
+
+      return true;
+    }
+
+    @Override
+    public int hashCode() {
+      int hashCode = 1;
+
+      return hashCode;
+    }
+
+    @Override
+    public int compareTo(loadFilesV2_result other) {
+      if (!getClass().equals(other.getClass())) {
+        return getClass().getName().compareTo(other.getClass().getName());
+      }
+
+      int lastComparison = 0;
+
+      return 0;
+    }
+
+    @org.apache.thrift.annotation.Nullable
+    @Override
+    public _Fields fieldForId(int fieldId) {
+      return _Fields.findByThriftId(fieldId);
+    }
+
+    @Override
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws 
org.apache.thrift.TException {
+      scheme(iprot).read(iprot, this);
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws 
org.apache.thrift.TException {
+      scheme(oprot).write(oprot, this);
+      }
+
+    @Override
+    public java.lang.String toString() {
+      java.lang.StringBuilder sb = new 
java.lang.StringBuilder("loadFilesV2_result(");
+      boolean first = true;
+
+      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, java.lang.ClassNotFoundException {
+      try {
+        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 loadFilesV2_resultStandardSchemeFactory implements 
org.apache.thrift.scheme.SchemeFactory {
+      @Override
+      public loadFilesV2_resultStandardScheme getScheme() {
+        return new loadFilesV2_resultStandardScheme();
+      }
+    }
+
+    private static class loadFilesV2_resultStandardScheme extends 
org.apache.thrift.scheme.StandardScheme<loadFilesV2_result> {
+
+      @Override
+      public void read(org.apache.thrift.protocol.TProtocol iprot, 
loadFilesV2_result 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) {
+            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();
+      }
+
+      @Override
+      public void write(org.apache.thrift.protocol.TProtocol oprot, 
loadFilesV2_result struct) throws org.apache.thrift.TException {
+        struct.validate();
+
+        oprot.writeStructBegin(STRUCT_DESC);
+        oprot.writeFieldStop();
+        oprot.writeStructEnd();
+      }
+
+    }
+
+    private static class loadFilesV2_resultTupleSchemeFactory implements 
org.apache.thrift.scheme.SchemeFactory {
+      @Override
+      public loadFilesV2_resultTupleScheme getScheme() {
+        return new loadFilesV2_resultTupleScheme();
+      }
+    }
+
+    private static class loadFilesV2_resultTupleScheme extends 
org.apache.thrift.scheme.TupleScheme<loadFilesV2_result> {
+
+      @Override
+      public void write(org.apache.thrift.protocol.TProtocol prot, 
loadFilesV2_result struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TTupleProtocol oprot = 
(org.apache.thrift.protocol.TTupleProtocol) prot;
+      }
+
+      @Override
+      public void read(org.apache.thrift.protocol.TProtocol prot, 
loadFilesV2_result struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TTupleProtocol iprot = 
(org.apache.thrift.protocol.TTupleProtocol) prot;
+      }
+    }
+
+    private static <S extends org.apache.thrift.scheme.IScheme> S 
scheme(org.apache.thrift.protocol.TProtocol proto) {
+      return 
(org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? 
STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();
+    }
+  }
+
   @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
   public static class splitTablet_args implements 
org.apache.thrift.TBase<splitTablet_args, splitTablet_args._Fields>, 
java.io.Serializable, Cloneable, Comparable<splitTablet_args>   {
     private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new 
org.apache.thrift.protocol.TStruct("splitTablet_args");
@@ -25448,14 +26908,14 @@ public class TabletClientService {
             case 0: // SUCCESS
               if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
                 {
-                  org.apache.thrift.protocol.TList _list366 = 
iprot.readListBegin();
-                  struct.success = new 
java.util.ArrayList<TabletStats>(_list366.size);
-                  @org.apache.thrift.annotation.Nullable TabletStats _elem367;
-                  for (int _i368 = 0; _i368 < _list366.size; ++_i368)
+                  org.apache.thrift.protocol.TList _list386 = 
iprot.readListBegin();
+                  struct.success = new 
java.util.ArrayList<TabletStats>(_list386.size);
+                  @org.apache.thrift.annotation.Nullable TabletStats _elem387;
+                  for (int _i388 = 0; _i388 < _list386.size; ++_i388)
                   {
-                    _elem367 = new TabletStats();
-                    _elem367.read(iprot);
-                    struct.success.add(_elem367);
+                    _elem387 = new TabletStats();
+                    _elem387.read(iprot);
+                    struct.success.add(_elem387);
                   }
                   iprot.readListEnd();
                 }
@@ -25493,9 +26953,9 @@ public class TabletClientService {
           oprot.writeFieldBegin(SUCCESS_FIELD_DESC);
           {
             oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
struct.success.size()));
-            for (TabletStats _iter369 : struct.success)
+            for (TabletStats _iter389 : struct.success)
             {
-              _iter369.write(oprot);
+              _iter389.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -25535,9 +26995,9 @@ public class TabletClientService {
         if (struct.isSetSuccess()) {
           {
             oprot.writeI32(struct.success.size());
-            for (TabletStats _iter370 : struct.success)
+            for (TabletStats _iter390 : struct.success)
             {
-              _iter370.write(oprot);
+              _iter390.write(oprot);
             }
           }
         }
@@ -25552,14 +27012,14 @@ public class TabletClientService {
         java.util.BitSet incoming = iprot.readBitSet(2);
         if (incoming.get(0)) {
           {
-            org.apache.thrift.protocol.TList _list371 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
-            struct.success = new 
java.util.ArrayList<TabletStats>(_list371.size);
-            @org.apache.thrift.annotation.Nullable TabletStats _elem372;
-            for (int _i373 = 0; _i373 < _list371.size; ++_i373)
+            org.apache.thrift.protocol.TList _list391 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
+            struct.success = new 
java.util.ArrayList<TabletStats>(_list391.size);
+            @org.apache.thrift.annotation.Nullable TabletStats _elem392;
+            for (int _i393 = 0; _i393 < _list391.size; ++_i393)
             {
-              _elem372 = new TabletStats();
-              _elem372.read(iprot);
-              struct.success.add(_elem372);
+              _elem392 = new TabletStats();
+              _elem392.read(iprot);
+              struct.success.add(_elem392);
             }
           }
           struct.setSuccessIsSet(true);
@@ -29044,14 +30504,14 @@ public class TabletClientService {
             case 0: // SUCCESS
               if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
                 {
-                  org.apache.thrift.protocol.TList _list374 = 
iprot.readListBegin();
-                  struct.success = new 
java.util.ArrayList<ActiveCompaction>(_list374.size);
-                  @org.apache.thrift.annotation.Nullable ActiveCompaction 
_elem375;
-                  for (int _i376 = 0; _i376 < _list374.size; ++_i376)
+                  org.apache.thrift.protocol.TList _list394 = 
iprot.readListBegin();
+                  struct.success = new 
java.util.ArrayList<ActiveCompaction>(_list394.size);
+                  @org.apache.thrift.annotation.Nullable ActiveCompaction 
_elem395;
+                  for (int _i396 = 0; _i396 < _list394.size; ++_i396)
                   {
-                    _elem375 = new ActiveCompaction();
-                    _elem375.read(iprot);
-                    struct.success.add(_elem375);
+                    _elem395 = new ActiveCompaction();
+                    _elem395.read(iprot);
+                    struct.success.add(_elem395);
                   }
                   iprot.readListEnd();
                 }
@@ -29089,9 +30549,9 @@ public class TabletClientService {
           oprot.writeFieldBegin(SUCCESS_FIELD_DESC);
           {
             oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
struct.success.size()));
-            for (ActiveCompaction _iter377 : struct.success)
+            for (ActiveCompaction _iter397 : struct.success)
             {
-              _iter377.write(oprot);
+              _iter397.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -29131,9 +30591,9 @@ public class TabletClientService {
         if (struct.isSetSuccess()) {
           {
             oprot.writeI32(struct.success.size());
-            for (ActiveCompaction _iter378 : struct.success)
+            for (ActiveCompaction _iter398 : struct.success)
             {
-              _iter378.write(oprot);
+              _iter398.write(oprot);
             }
           }
         }
@@ -29148,14 +30608,14 @@ public class TabletClientService {
         java.util.BitSet incoming = iprot.readBitSet(2);
         if (incoming.get(0)) {
           {
-            org.apache.thrift.protocol.TList _list379 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
-            struct.success = new 
java.util.ArrayList<ActiveCompaction>(_list379.size);
-            @org.apache.thrift.annotation.Nullable ActiveCompaction _elem380;
-            for (int _i381 = 0; _i381 < _list379.size; ++_i381)
+            org.apache.thrift.protocol.TList _list399 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
+            struct.success = new 
java.util.ArrayList<ActiveCompaction>(_list399.size);
+            @org.apache.thrift.annotation.Nullable ActiveCompaction _elem400;
+            for (int _i401 = 0; _i401 < _list399.size; ++_i401)
             {
-              _elem380 = new ActiveCompaction();
-              _elem380.read(iprot);
-              struct.success.add(_elem380);
+              _elem400 = new ActiveCompaction();
+              _elem400.read(iprot);
+              struct.success.add(_elem400);
             }
           }
           struct.setSuccessIsSet(true);
@@ -29688,13 +31148,13 @@ public class TabletClientService {
             case 3: // FILENAMES
               if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
                 {
-                  org.apache.thrift.protocol.TList _list382 = 
iprot.readListBegin();
-                  struct.filenames = new 
java.util.ArrayList<java.lang.String>(_list382.size);
-                  @org.apache.thrift.annotation.Nullable java.lang.String 
_elem383;
-                  for (int _i384 = 0; _i384 < _list382.size; ++_i384)
+                  org.apache.thrift.protocol.TList _list402 = 
iprot.readListBegin();
+                  struct.filenames = new 
java.util.ArrayList<java.lang.String>(_list402.size);
+                  @org.apache.thrift.annotation.Nullable java.lang.String 
_elem403;
+                  for (int _i404 = 0; _i404 < _list402.size; ++_i404)
                   {
-                    _elem383 = iprot.readString();
-                    struct.filenames.add(_elem383);
+                    _elem403 = iprot.readString();
+                    struct.filenames.add(_elem403);
                   }
                   iprot.readListEnd();
                 }
@@ -29733,9 +31193,9 @@ public class TabletClientService {
           oprot.writeFieldBegin(FILENAMES_FIELD_DESC);
           {
             oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, 
struct.filenames.size()));
-            for (java.lang.String _iter385 : struct.filenames)
+            for (java.lang.String _iter405 : struct.filenames)
             {
-              oprot.writeString(_iter385);
+              oprot.writeString(_iter405);
             }
             oprot.writeListEnd();
           }
@@ -29779,9 +31239,9 @@ public class TabletClientService {
         if (struct.isSetFilenames()) {
           {
             oprot.writeI32(struct.filenames.size());
-            for (java.lang.String _iter386 : struct.filenames)
+            for (java.lang.String _iter406 : struct.filenames)
             {
-              oprot.writeString(_iter386);
+              oprot.writeString(_iter406);
             }
           }
         }
@@ -29803,13 +31263,13 @@ public class TabletClientService {
         }
         if (incoming.get(2)) {
           {
-            org.apache.thrift.protocol.TList _list387 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRING);
-            struct.filenames = new 
java.util.ArrayList<java.lang.String>(_list387.size);
-            @org.apache.thrift.annotation.Nullable java.lang.String _elem388;
-            for (int _i389 = 0; _i389 < _list387.size; ++_i389)
+            org.apache.thrift.protocol.TList _list407 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRING);
+            struct.filenames = new 
java.util.ArrayList<java.lang.String>(_list407.size);
+            @org.apache.thrift.annotation.Nullable java.lang.String _elem408;
+            for (int _i409 = 0; _i409 < _list407.size; ++_i409)
             {
-              _elem388 = iprot.readString();
-              struct.filenames.add(_elem388);
+              _elem408 = iprot.readString();
+              struct.filenames.add(_elem408);
             }
           }
           struct.setFilenamesIsSet(true);
@@ -30642,13 +32102,13 @@ public class TabletClientService {
             case 0: // SUCCESS
               if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
                 {
-                  org.apache.thrift.protocol.TList _list390 = 
iprot.readListBegin();
-                  struct.success = new 
java.util.ArrayList<java.lang.String>(_list390.size);
-                  @org.apache.thrift.annotation.Nullable java.lang.String 
_elem391;
-                  for (int _i392 = 0; _i392 < _list390.size; ++_i392)
+                  org.apache.thrift.protocol.TList _list410 = 
iprot.readListBegin();
+                  struct.success = new 
java.util.ArrayList<java.lang.String>(_list410.size);
+                  @org.apache.thrift.annotation.Nullable java.lang.String 
_elem411;
+                  for (int _i412 = 0; _i412 < _list410.size; ++_i412)
                   {
-                    _elem391 = iprot.readString();
-                    struct.success.add(_elem391);
+                    _elem411 = iprot.readString();
+                    struct.success.add(_elem411);
                   }
                   iprot.readListEnd();
                 }
@@ -30677,9 +32137,9 @@ public class TabletClientService {
           oprot.writeFieldBegin(SUCCESS_FIELD_DESC);
           {
             oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, 
struct.success.size()));
-            for (java.lang.String _iter393 : struct.success)
+            for (java.lang.String _iter413 : struct.success)
             {
-              oprot.writeString(_iter393);
+              oprot.writeString(_iter413);
             }
             oprot.writeListEnd();
           }
@@ -30711,9 +32171,9 @@ public class TabletClientService {
         if (struct.isSetSuccess()) {
           {
             oprot.writeI32(struct.success.size());
-            for (java.lang.String _iter394 : struct.success)
+            for (java.lang.String _iter414 : struct.success)
             {
-              oprot.writeString(_iter394);
+              oprot.writeString(_iter414);
             }
           }
         }
@@ -30725,13 +32185,13 @@ public class TabletClientService {
         java.util.BitSet incoming = iprot.readBitSet(1);
         if (incoming.get(0)) {
           {
-            org.apache.thrift.protocol.TList _list395 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRING);
-            struct.success = new 
java.util.ArrayList<java.lang.String>(_list395.size);
-            @org.apache.thrift.annotation.Nullable java.lang.String _elem396;
-            for (int _i397 = 0; _i397 < _list395.size; ++_i397)
+            org.apache.thrift.protocol.TList _list415 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRING);
+            struct.success = new 
java.util.ArrayList<java.lang.String>(_list415.size);
+            @org.apache.thrift.annotation.Nullable java.lang.String _elem416;
+            for (int _i417 = 0; _i417 < _list415.size; ++_i417)
             {
-              _elem396 = iprot.readString();
-              struct.success.add(_elem396);
+              _elem416 = iprot.readString();
+              struct.success.add(_elem416);
             }
           }
           struct.setSuccessIsSet(true);
@@ -33855,26 +35315,26 @@ public class TabletClientService {
             case 4: // FILES
               if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
                 {
-                  org.apache.thrift.protocol.TMap _map398 = 
iprot.readMapBegin();
-                  struct.files = new 
java.util.HashMap<java.lang.String,java.util.List<org.apache.accumulo.core.dataImpl.thrift.TRowRange>>(2*_map398.size);
-                  @org.apache.thrift.annotation.Nullable java.lang.String 
_key399;
-                  @org.apache.thrift.annotation.Nullable 
java.util.List<org.apache.accumulo.core.dataImpl.thrift.TRowRange> _val400;
-                  for (int _i401 = 0; _i401 < _map398.size; ++_i401)
+                  org.apache.thrift.protocol.TMap _map418 = 
iprot.readMapBegin();
+                  struct.files = new 
java.util.HashMap<java.lang.String,java.util.List<org.apache.accumulo.core.dataImpl.thrift.TRowRange>>(2*_map418.size);
+                  @org.apache.thrift.annotation.Nullable java.lang.String 
_key419;
+                  @org.apache.thrift.annotation.Nullable 
java.util.List<org.apache.accumulo.core.dataImpl.thrift.TRowRange> _val420;
+                  for (int _i421 = 0; _i421 < _map418.size; ++_i421)
                   {
-                    _key399 = iprot.readString();
+                    _key419 = iprot.readString();
                     {
-                      org.apache.thrift.protocol.TList _list402 = 
iprot.readListBegin();
-                      _val400 = new 
java.util.ArrayList<org.apache.accumulo.core.dataImpl.thrift.TRowRange>(_list402.size);
-                      @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TRowRange _elem403;
-                      for (int _i404 = 0; _i404 < _list402.size; ++_i404)
+                      org.apache.thrift.protocol.TList _list422 = 
iprot.readListBegin();
+                      _val420 = new 
java.util.ArrayList<org.apache.accumulo.core.dataImpl.thrift.TRowRange>(_list422.size);
+                      @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TRowRange _elem423;
+                      for (int _i424 = 0; _i424 < _list422.size; ++_i424)
                       {
-                        _elem403 = new 
org.apache.accumulo.core.dataImpl.thrift.TRowRange();
-                        _elem403.read(iprot);
-                        _val400.add(_elem403);
+                        _elem423 = new 
org.apache.accumulo.core.dataImpl.thrift.TRowRange();
+                        _elem423.read(iprot);
+                        _val420.add(_elem423);
                       }
                       iprot.readListEnd();
                     }
-                    struct.files.put(_key399, _val400);
+                    struct.files.put(_key419, _val420);
                   }
                   iprot.readMapEnd();
                 }
@@ -33918,14 +35378,14 @@ public class TabletClientService {
           oprot.writeFieldBegin(FILES_FIELD_DESC);
           {
             oprot.writeMapBegin(new 
org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.LIST, struct.files.size()));
-            for (java.util.Map.Entry<java.lang.String, 
java.util.List<org.apache.accumulo.core.dataImpl.thrift.TRowRange>> _iter405 : 
struct.files.entrySet())
+            for (java.util.Map.Entry<java.lang.String, 
java.util.List<org.apache.accumulo.core.dataImpl.thrift.TRowRange>> _iter425 : 
struct.files.entrySet())
             {
-              oprot.writeString(_iter405.getKey());
+              oprot.writeString(_iter425.getKey());
               {
-                oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
_iter405.getValue().size()));
-                for (org.apache.accumulo.core.dataImpl.thrift.TRowRange 
_iter406 : _iter405.getValue())
+                oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
_iter425.getValue().size()));
+                for (org.apache.accumulo.core.dataImpl.thrift.TRowRange 
_iter426 : _iter425.getValue())
                 {
-                  _iter406.write(oprot);
+                  _iter426.write(oprot);
                 }
                 oprot.writeListEnd();
               }
@@ -33978,14 +35438,14 @@ public class TabletClientService {
         if (struct.isSetFiles()) {
           {
             oprot.writeI32(struct.files.size());
-            for (java.util.Map.Entry<java.lang.String, 
java.util.List<org.apache.accumulo.core.dataImpl.thrift.TRowRange>> _iter407 : 
struct.files.entrySet())
+            for (java.util.Map.Entry<java.lang.String, 
java.util.List<org.apache.accumulo.core.dataImpl.thrift.TRowRange>> _iter427 : 
struct.files.entrySet())
             {
-              oprot.writeString(_iter407.getKey());
+              oprot.writeString(_iter427.getKey());
               {
-                oprot.writeI32(_iter407.getValue().size());
-                for (org.apache.accumulo.core.dataImpl.thrift.TRowRange 
_iter408 : _iter407.getValue())
+                oprot.writeI32(_iter427.getValue().size());
+                for (org.apache.accumulo.core.dataImpl.thrift.TRowRange 
_iter428 : _iter427.getValue())
                 {
-                  _iter408.write(oprot);
+                  _iter428.write(oprot);
                 }
               }
             }
@@ -34014,25 +35474,25 @@ public class TabletClientService {
         }
         if (incoming.get(3)) {
           {
-            org.apache.thrift.protocol.TMap _map409 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.LIST); 
-            struct.files = new 
java.util.HashMap<java.lang.String,java.util.List<org.apache.accumulo.core.dataImpl.thrift.TRowRange>>(2*_map409.size);
-            @org.apache.thrift.annotation.Nullable java.lang.String _key410;
-            @org.apache.thrift.annotation.Nullable 
java.util.List<org.apache.accumulo.core.dataImpl.thrift.TRowRange> _val411;
-            for (int _i412 = 0; _i412 < _map409.size; ++_i412)
+            org.apache.thrift.protocol.TMap _map429 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.LIST); 
+            struct.files = new 
java.util.HashMap<java.lang.String,java.util.List<org.apache.accumulo.core.dataImpl.thrift.TRowRange>>(2*_map429.size);
+            @org.apache.thrift.annotation.Nullable java.lang.String _key430;
+            @org.apache.thrift.annotation.Nullable 
java.util.List<org.apache.accumulo.core.dataImpl.thrift.TRowRange> _val431;
+            for (int _i432 = 0; _i432 < _map429.size; ++_i432)
             {
-              _key410 = iprot.readString();
+              _key430 = iprot.readString();
               {
-                org.apache.thrift.protocol.TList _list413 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
-                _val411 = new 
java.util.ArrayList<org.apache.accumulo.core.dataImpl.thrift.TRowRange>(_list413.size);
-                @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TRowRange _elem414;
-                for (int _i415 = 0; _i415 < _list413.size; ++_i415)
+                org.apache.thrift.protocol.TList _list433 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
+                _val431 = new 
java.util.ArrayList<org.apache.accumulo.core.dataImpl.thrift.TRowRange>(_list433.size);
+                @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TRowRange _elem434;
+                for (int _i435 = 0; _i435 < _list433.size; ++_i435)
                 {
-                  _elem414 = new 
org.apache.accumulo.core.dataImpl.thrift.TRowRange();
-                  _elem414.read(iprot);
-                  _val411.add(_elem414);
+                  _elem434 = new 
org.apache.accumulo.core.dataImpl.thrift.TRowRange();
+                  _elem434.read(iprot);
+                  _val431.add(_elem434);
                 }
               }
-              struct.files.put(_key410, _val411);
+              struct.files.put(_key430, _val431);
             }
           }
           struct.setFilesIsSet(true);
@@ -36414,14 +37874,14 @@ public class TabletClientService {
             case 0: // SUCCESS
               if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
                 {
-                  org.apache.thrift.protocol.TList _list416 = 
iprot.readListBegin();
-                  struct.success = new 
java.util.ArrayList<TCompactionQueueSummary>(_list416.size);
-                  @org.apache.thrift.annotation.Nullable 
TCompactionQueueSummary _elem417;
-                  for (int _i418 = 0; _i418 < _list416.size; ++_i418)
+                  org.apache.thrift.protocol.TList _list436 = 
iprot.readListBegin();
+                  struct.success = new 
java.util.ArrayList<TCompactionQueueSummary>(_list436.size);
+                  @org.apache.thrift.annotation.Nullable 
TCompactionQueueSummary _elem437;
+                  for (int _i438 = 0; _i438 < _list436.size; ++_i438)
                   {
-                    _elem417 = new TCompactionQueueSummary();
-                    _elem417.read(iprot);
-                    struct.success.add(_elem417);
+                    _elem437 = new TCompactionQueueSummary();
+                    _elem437.read(iprot);
+                    struct.success.add(_elem437);
                   }
                   iprot.readListEnd();
                 }
@@ -36459,9 +37919,9 @@ public class TabletClientService {
           oprot.writeFieldBegin(SUCCESS_FIELD_DESC);
           {
             oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
struct.success.size()));
-            for (TCompactionQueueSummary _iter419 : struct.success)
+            for (TCompactionQueueSummary _iter439 : struct.success)
             {
-              _iter419.write(oprot);
+              _iter439.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -36501,9 +37961,9 @@ public class TabletClientService {
         if (struct.isSetSuccess()) {
           {
             oprot.writeI32(struct.success.size());
-            for (TCompactionQueueSummary _iter420 : struct.success)
+            for (TCompactionQueueSummary _iter440 : struct.success)
             {
-              _iter420.write(oprot);
+              _iter440.write(oprot);
             }
           }
         }
@@ -36518,14 +37978,14 @@ public class TabletClientService {
         java.util.BitSet incoming = iprot.readBitSet(2);
         if (incoming.get(0)) {
           {
-            org.apache.thrift.protocol.TList _list421 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
-            struct.success = new 
java.util.ArrayList<TCompactionQueueSummary>(_list421.size);
-            @org.apache.thrift.annotation.Nullable TCompactionQueueSummary 
_elem422;
-            for (int _i423 = 0; _i423 < _list421.size; ++_i423)
+            org.apache.thrift.protocol.TList _list441 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
+            struct.success = new 
java.util.ArrayList<TCompactionQueueSummary>(_list441.size);
+            @org.apache.thrift.annotation.Nullable TCompactionQueueSummary 
_elem442;
+            for (int _i443 = 0; _i443 < _list441.size; ++_i443)
             {
-              _elem422 = new TCompactionQueueSummary();
-              _elem422.read(iprot);
-              struct.success.add(_elem422);
+              _elem442 = new TCompactionQueueSummary();
+              _elem442.read(iprot);
+              struct.success.add(_elem442);
             }
           }
           struct.setSuccessIsSet(true);
diff --git a/core/src/main/thrift/tabletserver.thrift 
b/core/src/main/thrift/tabletserver.thrift
index 9fdc76b532..ce9a60f7ae 100644
--- a/core/src/main/thrift/tabletserver.thrift
+++ b/core/src/main/thrift/tabletserver.thrift
@@ -386,6 +386,15 @@ service TabletClientService {
     6:bool setTime
   )
 
+  void loadFilesV2(
+    1:trace.TInfo tinfo
+    2:security.TCredentials credentials
+    3:i64 tid
+    4:string dir
+    5:map<data.TKeyExtent, map<string, data.MapFileInfo>> files
+    6:bool setTime
+  )
+
   void splitTablet(
     4:trace.TInfo tinfo
     1:security.TCredentials credentials
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/LoadFiles.java
 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/LoadFiles.java
index abed9684aa..df0b53bdbb 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/LoadFiles.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/LoadFiles.java
@@ -32,6 +32,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.accumulo.core.client.BatchWriter;
 import org.apache.accumulo.core.client.MutationsRejectedException;
@@ -39,6 +40,7 @@ import org.apache.accumulo.core.clientImpl.bulk.Bulk;
 import org.apache.accumulo.core.clientImpl.bulk.Bulk.Files;
 import org.apache.accumulo.core.clientImpl.bulk.BulkSerialize;
 import org.apache.accumulo.core.clientImpl.bulk.LoadMappingIterator;
+import org.apache.accumulo.core.conf.AccumuloConfiguration;
 import org.apache.accumulo.core.conf.Property;
 import org.apache.accumulo.core.data.Mutation;
 import org.apache.accumulo.core.dataImpl.KeyExtent;
@@ -69,6 +71,7 @@ import org.apache.accumulo.manager.tableOps.ManagerRepo;
 import org.apache.accumulo.server.fs.VolumeManager;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.Text;
+import org.apache.thrift.TApplicationException;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -114,7 +117,7 @@ class LoadFiles extends ManagerRepo {
 
       Loader loader;
       if (bulkInfo.tableState == TableState.ONLINE) {
-        loader = new OnlineLoader();
+        loader = new OnlineLoader(manager.getConfiguration());
       } else {
         loader = new OfflineLoader();
       }
@@ -159,12 +162,12 @@ class LoadFiles extends ManagerRepo {
 
   private static class OnlineLoader extends Loader {
 
+    private final int maxConnections;
     long timeInMillis;
     String fmtTid;
     int locationLess = 0;
 
-    // track how many tablets were sent load messages per tablet server
-    MapCounter<HostAndPort> loadMsgs;
+    int tabletsAdded;
 
     // Each RPC to a tablet server needs to check in zookeeper to see if the 
transaction is still
     // active. The purpose of this map is to group load request by tablet 
servers inorder to do less
@@ -172,6 +175,11 @@ class LoadFiles extends ManagerRepo {
     Map<HostAndPort,Map<TKeyExtent,Map<String,MapFileInfo>>> loadQueue;
     private int queuedDataSize = 0;
 
+    public OnlineLoader(AccumuloConfiguration configuration) {
+      super();
+      this.maxConnections = 
configuration.getCount(Property.MANAGER_BULK_MAX_CONNECTIONS);
+    }
+
     @Override
     void start(Path bulkDir, Manager manager, long tid, boolean setTime) 
throws Exception {
       super.start(bulkDir, manager, tid, setTime);
@@ -179,42 +187,125 @@ class LoadFiles extends ManagerRepo {
       timeInMillis = 
manager.getConfiguration().getTimeInMillis(Property.MANAGER_BULK_TIMEOUT);
       fmtTid = FateTxId.formatTid(tid);
 
-      loadMsgs = new MapCounter<>();
+      tabletsAdded = 0;
 
       loadQueue = new HashMap<>();
     }
 
+    private static class Client {
+      final HostAndPort server;
+      final TabletClientService.Client service;
+
+      private Client(HostAndPort server, TabletClientService.Client service) {
+        this.server = server;
+        this.service = service;
+      }
+    }
+
     private void sendQueued(int threshhold) {
       if (queuedDataSize > threshhold || threshhold == 0) {
-        loadQueue.forEach((server, tabletFiles) -> {
+        var sendTimer = Timer.startNew();
+
+        List<Client> clients = new ArrayList<>();
+        try {
+
+          // Send load messages to tablet servers spinning up work, but do not 
wait on results.
+          loadQueue.forEach((server, tabletFiles) -> {
+
+            if (log.isTraceEnabled()) {
+              log.trace("{} asking {} to bulk import {} files for {} tablets", 
fmtTid, server,
+                  tabletFiles.values().stream().mapToInt(Map::size).sum(), 
tabletFiles.size());
+            }
+
+            // Tablet servers process tablets serially and perform a single 
metadata table write for
+            // each tablet. Break the work into per-tablet chunks so it can be 
sent over multiple
+            // connections to the tserver, allowing each chunk to be run in 
parallel on the server
+            // side. This allows multiple threads on a single tserver to do 
metadata writes for this
+            // bulk import.
+            int neededConnections = Math.min(maxConnections, 
tabletFiles.size());
+            List<Map<TKeyExtent,Map<String,MapFileInfo>>> chunks =
+                new ArrayList<>(neededConnections);
+            for (int i = 0; i < neededConnections; i++) {
+              chunks.add(new HashMap<>());
+            }
+
+            int nextConnection = 0;
+            for (var entry : tabletFiles.entrySet()) {
+              chunks.get(nextConnection++ % chunks.size()).put(entry.getKey(), 
entry.getValue());
+            }
+
+            for (var chunk : chunks) {
+              try {
+                var client = 
ThriftUtil.getClient(ThriftClientTypes.TABLET_SERVER, server,
+                    manager.getContext(), timeInMillis);
+                // add client to list before calling send in case there is an 
exception, this makes
+                // sure its returned in the finally
+                clients.add(new Client(server, client));
+                client.send_loadFilesV2(TraceUtil.traceInfo(), 
manager.getContext().rpcCreds(), tid,
+                    bulkDir.toString(), chunk, setTime);
+              } catch (TException ex) {
+                log.debug("rpc send failed server: {}, {}", server, fmtTid, 
ex);
+              }
+            }
+          });
+
+          long sendTime = sendTimer.elapsed(TimeUnit.MILLISECONDS);
+          sendTimer.restart();
+
+          int outdatedTservers = 0;
+
+          // wait for all the tservers to complete processing
+          for (var client : clients) {
+            try {
+              client.service.recv_loadFilesV2();
+            } catch (TException ex) {
+              String additionalInfo = "";
+              if (ex instanceof TApplicationException && 
((TApplicationException) ex).getType()
+                  == TApplicationException.UNKNOWN_METHOD) {
+                // A new RPC method was added in 2.1.4, a tserver running 
2.1.3 or earlier will
+                // not have this RPC. This should not kill the fate operation, 
it can wait until
+                // all tablet servers are upgraded.
+                outdatedTservers++;
+                additionalInfo = " (tserver may be running older version)";
+              }
+              log.debug("rpc recv failed server{}: {}, {}", additionalInfo, 
client.server, fmtTid,
+                  ex);
+            }
+          }
 
-          if (log.isTraceEnabled()) {
-            log.trace("{} asking {} to bulk import {} files for {} tablets", 
fmtTid, server,
-                tabletFiles.values().stream().mapToInt(Map::size).sum(), 
tabletFiles.size());
+          if (outdatedTservers > 0) {
+            log.warn(
+                "{} can not proceed with bulk import because {} tablet servers 
are likely running "
+                    + "an older version. Please update tablet servers to same 
patch level as manager.",
+                fmtTid, outdatedTservers);
           }
 
-          TabletClientService.Client client = null;
-          try {
-            client = ThriftUtil.getClient(ThriftClientTypes.TABLET_SERVER, 
server,
-                manager.getContext(), timeInMillis);
-            client.loadFiles(TraceUtil.traceInfo(), 
manager.getContext().rpcCreds(), tid,
-                bulkDir.toString(), tabletFiles, setTime);
-          } catch (TException ex) {
-            log.debug("rpc failed server: " + server + ", " + fmtTid + " " + 
ex.getMessage(), ex);
-          } finally {
-            ThriftUtil.returnClient(client, manager.getContext());
+          if (log.isDebugEnabled()) {
+            var recvTime = sendTimer.elapsed(TimeUnit.MILLISECONDS);
+            var tabletStats = 
loadQueue.values().stream().mapToInt(Map::size).summaryStatistics();
+            log.debug(
+                "{} sent {} messages to {} tablet servers for {} tablets 
(min:{} max:{} avg:{} "
+                    + "tablets per tserver), send time:{}ms recv time:{}ms 
{}:{}",
+                fmtTid, clients.size(), loadQueue.size(), tabletStats.getSum(),
+                tabletStats.getMin(), tabletStats.getMax(), 
tabletStats.getAverage(), sendTime,
+                recvTime, Property.MANAGER_BULK_MAX_CONNECTIONS.getKey(), 
maxConnections);
           }
-        });
 
-        loadQueue.clear();
-        queuedDataSize = 0;
+          loadQueue.clear();
+          queuedDataSize = 0;
+
+        } finally {
+          for (var client : clients) {
+            ThriftUtil.returnClient(client.service, manager.getContext());
+          }
+        }
       }
     }
 
     private void addToQueue(HostAndPort server, KeyExtent extent,
         Map<String,MapFileInfo> thriftImports) {
       if (!thriftImports.isEmpty()) {
-        loadMsgs.increment(server, 1);
+        tabletsAdded++;
 
         Map<String,MapFileInfo> prev = loadQueue.computeIfAbsent(server, k -> 
new HashMap<>())
             .putIfAbsent(extent.toThrift(), thriftImports);
@@ -268,10 +359,12 @@ class LoadFiles extends ManagerRepo {
       sendQueued(0);
 
       long sleepTime = 0;
-      if (loadMsgs.size() > 0) {
-        // find which tablet server had the most load messages sent to it and 
sleep 13ms for each
-        // load message
-        sleepTime = loadMsgs.max() * 13;
+      if (tabletsAdded > 0) {
+        // Waited for all the tablet servers to process everything so a long 
sleep is not needed.
+        // Even though this code waited, it does not know what succeeded on 
the tablet server side
+        // and it did not track if there were connection errors. Since success 
status is unknown
+        // must return a non-zero sleep to indicate another scan of the 
metadata table is needed.
+        sleepTime = 1;
       }
 
       if (locationLess > 0) {
diff --git 
a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletClientHandler.java
 
b/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletClientHandler.java
index 7ef64352d9..d1ccbda59b 100644
--- 
a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletClientHandler.java
+++ 
b/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletClientHandler.java
@@ -248,6 +248,13 @@ public class TabletClientHandler implements 
TabletClientService.Iface {
 
   }
 
+  @Override
+  public void loadFilesV2(TInfo tinfo, TCredentials credentials, long tid, 
String dir,
+      Map<TKeyExtent,Map<String,MapFileInfo>> tabletImports, boolean setTime)
+      throws ThriftSecurityException {
+    loadFiles(tinfo, credentials, tid, dir, tabletImports, setTime);
+  }
+
   @Override
   public long startUpdate(TInfo tinfo, TCredentials credentials, TDurability 
tdurabilty)
       throws ThriftSecurityException {
diff --git 
a/test/src/main/java/org/apache/accumulo/test/functional/BulkNewIT.java 
b/test/src/main/java/org/apache/accumulo/test/functional/BulkNewIT.java
index 1cb6bbf953..f727d0069d 100644
--- a/test/src/main/java/org/apache/accumulo/test/functional/BulkNewIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/functional/BulkNewIT.java
@@ -50,6 +50,7 @@ import java.util.TreeSet;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 import org.apache.accumulo.core.client.Accumulo;
 import org.apache.accumulo.core.client.AccumuloClient;
@@ -621,6 +622,47 @@ public class BulkNewIT extends SharedMiniClusterBase {
     }
   }
 
+  @Test
+  public void testManyTablets() throws Exception {
+
+    try (AccumuloClient c = 
Accumulo.newClient().from(getClientProps()).build()) {
+      String dir = getDir("/testManyTablets-");
+      writeData(dir + "/f1.", aconf, 0, 199);
+      writeData(dir + "/f2.", aconf, 200, 399);
+      writeData(dir + "/f3.", aconf, 400, 599);
+      writeData(dir + "/f4.", aconf, 600, 799);
+      writeData(dir + "/f5.", aconf, 800, 999);
+
+      var splits = IntStream.range(1, 
1000).mapToObj(BulkNewIT::row).map(Text::new)
+          .collect(Collectors.toCollection(TreeSet::new));
+
+      // faster to create a table w/ lots of splits
+      c.tableOperations().delete(tableName);
+      c.tableOperations().create(tableName, new 
NewTableConfiguration().withSplits(splits));
+
+      var lpBuilder = LoadPlan.builder();
+      lpBuilder.loadFileTo("f1.rf", RangeType.TABLE, null, row(1));
+      IntStream.range(2, 200)
+          .forEach(i -> lpBuilder.loadFileTo("f1.rf", RangeType.TABLE, row(i - 
1), row(i)));
+      IntStream.range(200, 400)
+          .forEach(i -> lpBuilder.loadFileTo("f2.rf", RangeType.TABLE, row(i - 
1), row(i)));
+      IntStream.range(400, 600)
+          .forEach(i -> lpBuilder.loadFileTo("f3.rf", RangeType.TABLE, row(i - 
1), row(i)));
+      IntStream.range(600, 800)
+          .forEach(i -> lpBuilder.loadFileTo("f4.rf", RangeType.TABLE, row(i - 
1), row(i)));
+      IntStream.range(800, 1000)
+          .forEach(i -> lpBuilder.loadFileTo("f5.rf", RangeType.TABLE, row(i - 
1), row(i)));
+
+      var loadPlan = lpBuilder.build();
+
+      
c.tableOperations().importDirectory(dir).to(tableName).plan(loadPlan).load();
+
+      verifyData(c, tableName, 0, 999, false);
+
+    }
+
+  }
+
   private void addSplits(AccumuloClient client, String tableName, String 
splitString)
       throws Exception {
     SortedSet<Text> splits = new TreeSet<>();
diff --git 
a/test/src/main/java/org/apache/accumulo/test/performance/NullTserver.java 
b/test/src/main/java/org/apache/accumulo/test/performance/NullTserver.java
index 19c7245d74..e470d1ff48 100644
--- a/test/src/main/java/org/apache/accumulo/test/performance/NullTserver.java
+++ b/test/src/main/java/org/apache/accumulo/test/performance/NullTserver.java
@@ -128,6 +128,10 @@ public class NullTserver {
     public void loadFiles(TInfo tinfo, TCredentials credentials, long tid, 
String dir,
         Map<TKeyExtent,Map<String,MapFileInfo>> fileMap, boolean setTime) {}
 
+    @Override
+    public void loadFilesV2(TInfo tinfo, TCredentials credentials, long tid, 
String dir,
+        Map<TKeyExtent,Map<String,MapFileInfo>> fileMap, boolean setTime) {}
+
     @Override
     public void closeMultiScan(TInfo tinfo, long scanID) {}
 


Reply via email to