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

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


The following commit(s) were added to refs/heads/main by this push:
     new d269bec82b Replaces in memory bulk status with retrieval (#6149)
d269bec82b is described below

commit d269bec82b04ad006fcf1eda6646663d5a870c9f
Author: Keith Turner <[email protected]>
AuthorDate: Tue Feb 24 11:43:37 2026 -0800

    Replaces in memory bulk status with retrieval (#6149)
    
    The manager tracked the status of bulk imports in memory. This tracking
    would be lost when the manager restarted. Replaced this tracking with
    new code that retrieves the current status from persisted data. All the
    in memory tracking code was deleted.
    
    Deleted a shell command that relied on the old way of doing things and
    added a new admin command.  This was done because the new way needs a
    server context which is not available in the shell.
    
    Updated the monitor to call the new code.  The new code offers more
    information.  Will open a follow on issue to display this additional
    information on the monitor.
    
    These changes were made in support of #6139.  Anything the manager
    tracks in memory makes it harder to split the manager into multiple
    processes.
---
 .../org/apache/accumulo/core/fate}/TraceRepo.java  |  12 +-
 .../core/manager/thrift/BulkImportState.java       |  76 ---
 .../core/manager/thrift/BulkImportStatus.java      | 627 ---------------------
 .../accumulo/core/manager/thrift/FateService.java  |  76 +--
 .../core/manager/thrift/ManagerClientService.java  | 156 ++---
 .../core/manager/thrift/ManagerMonitorInfo.java    | 290 +++-------
 core/src/main/thrift/manager.thrift                |  23 -
 .../server/util/ServerBulkImportStatus.java        |  54 --
 .../util/bulkCommand/BulkFateOperation.java}       |  27 +-
 .../accumulo/server/util/bulkCommand/ListBulk.java | 129 +++++
 .../accumulo/manager/FateServiceHandler.java       |   5 +-
 .../java/org/apache/accumulo/manager/Manager.java  |  17 +-
 .../manager/ManagerClientServiceHandler.java       |   2 +-
 .../manager/merge/FindMergeableRangeTask.java      |   2 +-
 .../apache/accumulo/manager/tableOps/FateEnv.java  |   5 -
 ...ulkInfo.java => AbstractBulkFateOperation.java} |  46 +-
 .../manager/tableOps/bulkVer2/BulkImportMove.java  |  15 +-
 .../manager/tableOps/bulkVer2/BulkInfo.java        |   8 +
 .../tableOps/bulkVer2/CleanUpBulkImport.java       |  34 +-
 .../tableOps/bulkVer2/ComputeBulkRange.java        |  17 +-
 .../manager/tableOps/bulkVer2/LoadFiles.java       |  15 +-
 .../manager/tableOps/bulkVer2/PrepBulkImport.java  |  14 +-
 .../manager/tableOps/bulkVer2/RefreshTablets.java  |  13 +-
 .../rest/bulkImports/BulkImportInformation.java    |   6 +-
 .../rest/bulkImports/BulkImportResource.java       |  17 +-
 shell/pom.xml                                      |   4 -
 .../main/java/org/apache/accumulo/shell/Shell.java |   3 +-
 .../shell/commands/BulkImportListIterator.java     |  62 --
 .../accumulo/shell/commands/ListBulkCommand.java   |  80 ---
 .../shell/commands/ListBulkCommandTest.java        |  88 ---
 .../org/apache/accumulo/test/GetManagerStats.java  |  14 -
 .../accumulo/test/fate/FlakyFateManager.java       |   2 +-
 .../accumulo/test/fate/SlowFateSplitManager.java   |   2 +-
 33 files changed, 442 insertions(+), 1499 deletions(-)

diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/TraceRepo.java
 b/core/src/main/java/org/apache/accumulo/core/fate/TraceRepo.java
similarity index 93%
rename from 
server/manager/src/main/java/org/apache/accumulo/manager/tableOps/TraceRepo.java
rename to core/src/main/java/org/apache/accumulo/core/fate/TraceRepo.java
index f9da68dcca..f9c709eb23 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/TraceRepo.java
+++ b/core/src/main/java/org/apache/accumulo/core/fate/TraceRepo.java
@@ -16,11 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.accumulo.manager.tableOps;
+package org.apache.accumulo.core.fate;
 
 import org.apache.accumulo.core.clientImpl.thrift.TInfo;
-import org.apache.accumulo.core.fate.FateId;
-import org.apache.accumulo.core.fate.Repo;
 import org.apache.accumulo.core.trace.TraceUtil;
 
 import io.opentelemetry.api.trace.Span;
@@ -107,12 +105,16 @@ public class TraceRepo<T> implements Repo<T> {
     return repo.getReturn();
   }
 
+  public Repo<T> getWrapped() {
+    return repo;
+  }
+
   /**
    * @return string version of Repo that is suitable for logging
    */
-  public static String toLogString(Repo<FateEnv> repo) {
+  public static <T2> String toLogString(Repo<T2> repo) {
     if (repo instanceof TraceRepo) {
-      repo = ((TraceRepo<FateEnv>) repo).repo;
+      repo = ((TraceRepo<T2>) repo).repo;
     }
 
     return repo.getClass() + " " + repo.getName();
diff --git 
a/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/BulkImportState.java
 
b/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/BulkImportState.java
deleted file mode 100644
index 3cb402c314..0000000000
--- 
a/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/BulkImportState.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/**
- * Autogenerated by Thrift Compiler (0.17.0)
- *
- * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
- *  @generated
- */
-package org.apache.accumulo.core.manager.thrift;
-
-
-public enum BulkImportState implements org.apache.thrift.TEnum {
-  INITIAL(0),
-  MOVING(1),
-  PROCESSING(2),
-  ASSIGNING(3),
-  LOADING(4),
-  COPY_FILES(5),
-  CLEANUP(6);
-
-  private final int value;
-
-  private BulkImportState(int value) {
-    this.value = value;
-  }
-
-  /**
-   * Get the integer value of this enum value, as defined in the Thrift IDL.
-   */
-  @Override
-  public int getValue() {
-    return value;
-  }
-
-  /**
-   * Find a the enum type by its integer value, as defined in the Thrift IDL.
-   * @return null if the value is not found.
-   */
-  @org.apache.thrift.annotation.Nullable
-  public static BulkImportState findByValue(int value) { 
-    switch (value) {
-      case 0:
-        return INITIAL;
-      case 1:
-        return MOVING;
-      case 2:
-        return PROCESSING;
-      case 3:
-        return ASSIGNING;
-      case 4:
-        return LOADING;
-      case 5:
-        return COPY_FILES;
-      case 6:
-        return CLEANUP;
-      default:
-        return null;
-    }
-  }
-}
diff --git 
a/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/BulkImportStatus.java
 
b/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/BulkImportStatus.java
deleted file mode 100644
index 64de85baf3..0000000000
--- 
a/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/BulkImportStatus.java
+++ /dev/null
@@ -1,627 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/**
- * Autogenerated by Thrift Compiler (0.17.0)
- *
- * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
- *  @generated
- */
-package org.apache.accumulo.core.manager.thrift;
-
-@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
-public class BulkImportStatus implements 
org.apache.thrift.TBase<BulkImportStatus, BulkImportStatus._Fields>, 
java.io.Serializable, Cloneable, Comparable<BulkImportStatus> {
-  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new 
org.apache.thrift.protocol.TStruct("BulkImportStatus");
-
-  private static final org.apache.thrift.protocol.TField START_TIME_FIELD_DESC 
= new org.apache.thrift.protocol.TField("startTime", 
org.apache.thrift.protocol.TType.I64, (short)1);
-  private static final org.apache.thrift.protocol.TField FILENAME_FIELD_DESC = 
new org.apache.thrift.protocol.TField("filename", 
org.apache.thrift.protocol.TType.STRING, (short)2);
-  private static final org.apache.thrift.protocol.TField STATE_FIELD_DESC = 
new org.apache.thrift.protocol.TField("state", 
org.apache.thrift.protocol.TType.I32, (short)3);
-
-  private static final org.apache.thrift.scheme.SchemeFactory 
STANDARD_SCHEME_FACTORY = new BulkImportStatusStandardSchemeFactory();
-  private static final org.apache.thrift.scheme.SchemeFactory 
TUPLE_SCHEME_FACTORY = new BulkImportStatusTupleSchemeFactory();
-
-  public long startTime; // required
-  public @org.apache.thrift.annotation.Nullable java.lang.String filename; // 
required
-  /**
-   * 
-   * @see BulkImportState
-   */
-  public @org.apache.thrift.annotation.Nullable BulkImportState state; // 
required
-
-  /** The set of fields this struct contains, along with convenience methods 
for finding and manipulating them. */
-  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-    START_TIME((short)1, "startTime"),
-    FILENAME((short)2, "filename"),
-    /**
-     * 
-     * @see BulkImportState
-     */
-    STATE((short)3, "state");
-
-    private static final 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: // START_TIME
-          return START_TIME;
-        case 2: // FILENAME
-          return FILENAME;
-        case 3: // STATE
-          return STATE;
-        default:
-          return null;
-      }
-    }
-
-    /**
-     * Find the _Fields constant that matches fieldId, throwing an exception
-     * if it is not found.
-     */
-    public static _Fields findByThriftIdOrThrow(int fieldId) {
-      _Fields fields = findByThriftId(fieldId);
-      if (fields == null) throw new 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 __STARTTIME_ISSET_ID = 0;
-  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.START_TIME, new 
org.apache.thrift.meta_data.FieldMetaData("startTime", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
-        new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
-    tmpMap.put(_Fields.FILENAME, new 
org.apache.thrift.meta_data.FieldMetaData("filename", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
-        new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
-    tmpMap.put(_Fields.STATE, new 
org.apache.thrift.meta_data.FieldMetaData("state", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
-        new 
org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, 
BulkImportState.class)));
-    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
-    
org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(BulkImportStatus.class,
 metaDataMap);
-  }
-
-  public BulkImportStatus() {
-  }
-
-  public BulkImportStatus(
-    long startTime,
-    java.lang.String filename,
-    BulkImportState state)
-  {
-    this();
-    this.startTime = startTime;
-    setStartTimeIsSet(true);
-    this.filename = filename;
-    this.state = state;
-  }
-
-  /**
-   * Performs a deep copy on <i>other</i>.
-   */
-  public BulkImportStatus(BulkImportStatus other) {
-    __isset_bitfield = other.__isset_bitfield;
-    this.startTime = other.startTime;
-    if (other.isSetFilename()) {
-      this.filename = other.filename;
-    }
-    if (other.isSetState()) {
-      this.state = other.state;
-    }
-  }
-
-  @Override
-  public BulkImportStatus deepCopy() {
-    return new BulkImportStatus(this);
-  }
-
-  @Override
-  public void clear() {
-    setStartTimeIsSet(false);
-    this.startTime = 0;
-    this.filename = null;
-    this.state = null;
-  }
-
-  public long getStartTime() {
-    return this.startTime;
-  }
-
-  public BulkImportStatus setStartTime(long startTime) {
-    this.startTime = startTime;
-    setStartTimeIsSet(true);
-    return this;
-  }
-
-  public void unsetStartTime() {
-    __isset_bitfield = 
org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, 
__STARTTIME_ISSET_ID);
-  }
-
-  /** Returns true if field startTime is set (has been assigned a value) and 
false otherwise */
-  public boolean isSetStartTime() {
-    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, 
__STARTTIME_ISSET_ID);
-  }
-
-  public void setStartTimeIsSet(boolean value) {
-    __isset_bitfield = 
org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __STARTTIME_ISSET_ID, 
value);
-  }
-
-  @org.apache.thrift.annotation.Nullable
-  public java.lang.String getFilename() {
-    return this.filename;
-  }
-
-  public BulkImportStatus setFilename(@org.apache.thrift.annotation.Nullable 
java.lang.String filename) {
-    this.filename = filename;
-    return this;
-  }
-
-  public void unsetFilename() {
-    this.filename = null;
-  }
-
-  /** Returns true if field filename is set (has been assigned a value) and 
false otherwise */
-  public boolean isSetFilename() {
-    return this.filename != null;
-  }
-
-  public void setFilenameIsSet(boolean value) {
-    if (!value) {
-      this.filename = null;
-    }
-  }
-
-  /**
-   * 
-   * @see BulkImportState
-   */
-  @org.apache.thrift.annotation.Nullable
-  public BulkImportState getState() {
-    return this.state;
-  }
-
-  /**
-   * 
-   * @see BulkImportState
-   */
-  public BulkImportStatus setState(@org.apache.thrift.annotation.Nullable 
BulkImportState state) {
-    this.state = state;
-    return this;
-  }
-
-  public void unsetState() {
-    this.state = null;
-  }
-
-  /** Returns true if field state is set (has been assigned a value) and false 
otherwise */
-  public boolean isSetState() {
-    return this.state != null;
-  }
-
-  public void setStateIsSet(boolean value) {
-    if (!value) {
-      this.state = null;
-    }
-  }
-
-  @Override
-  public void setFieldValue(_Fields field, 
@org.apache.thrift.annotation.Nullable java.lang.Object value) {
-    switch (field) {
-    case START_TIME:
-      if (value == null) {
-        unsetStartTime();
-      } else {
-        setStartTime((java.lang.Long)value);
-      }
-      break;
-
-    case FILENAME:
-      if (value == null) {
-        unsetFilename();
-      } else {
-        setFilename((java.lang.String)value);
-      }
-      break;
-
-    case STATE:
-      if (value == null) {
-        unsetState();
-      } else {
-        setState((BulkImportState)value);
-      }
-      break;
-
-    }
-  }
-
-  @org.apache.thrift.annotation.Nullable
-  @Override
-  public java.lang.Object getFieldValue(_Fields field) {
-    switch (field) {
-    case START_TIME:
-      return getStartTime();
-
-    case FILENAME:
-      return getFilename();
-
-    case STATE:
-      return getState();
-
-    }
-    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 START_TIME:
-      return isSetStartTime();
-    case FILENAME:
-      return isSetFilename();
-    case STATE:
-      return isSetState();
-    }
-    throw new java.lang.IllegalStateException();
-  }
-
-  @Override
-  public boolean equals(java.lang.Object that) {
-    if (that instanceof BulkImportStatus)
-      return this.equals((BulkImportStatus)that);
-    return false;
-  }
-
-  public boolean equals(BulkImportStatus that) {
-    if (that == null)
-      return false;
-    if (this == that)
-      return true;
-
-    boolean this_present_startTime = true;
-    boolean that_present_startTime = true;
-    if (this_present_startTime || that_present_startTime) {
-      if (!(this_present_startTime && that_present_startTime))
-        return false;
-      if (this.startTime != that.startTime)
-        return false;
-    }
-
-    boolean this_present_filename = true && this.isSetFilename();
-    boolean that_present_filename = true && that.isSetFilename();
-    if (this_present_filename || that_present_filename) {
-      if (!(this_present_filename && that_present_filename))
-        return false;
-      if (!this.filename.equals(that.filename))
-        return false;
-    }
-
-    boolean this_present_state = true && this.isSetState();
-    boolean that_present_state = true && that.isSetState();
-    if (this_present_state || that_present_state) {
-      if (!(this_present_state && that_present_state))
-        return false;
-      if (!this.state.equals(that.state))
-        return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int hashCode = 1;
-
-    hashCode = hashCode * 8191 + 
org.apache.thrift.TBaseHelper.hashCode(startTime);
-
-    hashCode = hashCode * 8191 + ((isSetFilename()) ? 131071 : 524287);
-    if (isSetFilename())
-      hashCode = hashCode * 8191 + filename.hashCode();
-
-    hashCode = hashCode * 8191 + ((isSetState()) ? 131071 : 524287);
-    if (isSetState())
-      hashCode = hashCode * 8191 + state.getValue();
-
-    return hashCode;
-  }
-
-  @Override
-  public int compareTo(BulkImportStatus other) {
-    if (!getClass().equals(other.getClass())) {
-      return getClass().getName().compareTo(other.getClass().getName());
-    }
-
-    int lastComparison = 0;
-
-    lastComparison = java.lang.Boolean.compare(isSetStartTime(), 
other.isSetStartTime());
-    if (lastComparison != 0) {
-      return lastComparison;
-    }
-    if (isSetStartTime()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.startTime, 
other.startTime);
-      if (lastComparison != 0) {
-        return lastComparison;
-      }
-    }
-    lastComparison = java.lang.Boolean.compare(isSetFilename(), 
other.isSetFilename());
-    if (lastComparison != 0) {
-      return lastComparison;
-    }
-    if (isSetFilename()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.filename, 
other.filename);
-      if (lastComparison != 0) {
-        return lastComparison;
-      }
-    }
-    lastComparison = java.lang.Boolean.compare(isSetState(), 
other.isSetState());
-    if (lastComparison != 0) {
-      return lastComparison;
-    }
-    if (isSetState()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.state, 
other.state);
-      if (lastComparison != 0) {
-        return lastComparison;
-      }
-    }
-    return 0;
-  }
-
-  @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("BulkImportStatus(");
-    boolean first = true;
-
-    sb.append("startTime:");
-    sb.append(this.startTime);
-    first = false;
-    if (!first) sb.append(", ");
-    sb.append("filename:");
-    if (this.filename == null) {
-      sb.append("null");
-    } else {
-      sb.append(this.filename);
-    }
-    first = false;
-    if (!first) sb.append(", ");
-    sb.append("state:");
-    if (this.state == null) {
-      sb.append("null");
-    } else {
-      sb.append(this.state);
-    }
-    first = false;
-    sb.append(")");
-    return sb.toString();
-  }
-
-  public void validate() throws org.apache.thrift.TException {
-    // check for required fields
-    // check for sub-struct validity
-  }
-
-  private void writeObject(java.io.ObjectOutputStream out) throws 
java.io.IOException {
-    try {
-      write(new org.apache.thrift.protocol.TCompactProtocol(new 
org.apache.thrift.transport.TIOStreamTransport(out)));
-    } catch (org.apache.thrift.TException te) {
-      throw new java.io.IOException(te);
-    }
-  }
-
-  private void readObject(java.io.ObjectInputStream in) throws 
java.io.IOException, 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 BulkImportStatusStandardSchemeFactory implements 
org.apache.thrift.scheme.SchemeFactory {
-    @Override
-    public BulkImportStatusStandardScheme getScheme() {
-      return new BulkImportStatusStandardScheme();
-    }
-  }
-
-  private static class BulkImportStatusStandardScheme extends 
org.apache.thrift.scheme.StandardScheme<BulkImportStatus> {
-
-    @Override
-    public void read(org.apache.thrift.protocol.TProtocol iprot, 
BulkImportStatus struct) throws org.apache.thrift.TException {
-      org.apache.thrift.protocol.TField schemeField;
-      iprot.readStructBegin();
-      while (true)
-      {
-        schemeField = iprot.readFieldBegin();
-        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
-          break;
-        }
-        switch (schemeField.id) {
-          case 1: // START_TIME
-            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
-              struct.startTime = iprot.readI64();
-              struct.setStartTimeIsSet(true);
-            } else { 
-              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
-            }
-            break;
-          case 2: // FILENAME
-            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
-              struct.filename = iprot.readString();
-              struct.setFilenameIsSet(true);
-            } else { 
-              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
-            }
-            break;
-          case 3: // STATE
-            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
-              struct.state = 
org.apache.accumulo.core.manager.thrift.BulkImportState.findByValue(iprot.readI32());
-              struct.setStateIsSet(true);
-            } else { 
-              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
-            }
-            break;
-          default:
-            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
-        }
-        iprot.readFieldEnd();
-      }
-      iprot.readStructEnd();
-
-      // check for required fields of primitive type, which can't be checked 
in the validate method
-      struct.validate();
-    }
-
-    @Override
-    public void write(org.apache.thrift.protocol.TProtocol oprot, 
BulkImportStatus struct) throws org.apache.thrift.TException {
-      struct.validate();
-
-      oprot.writeStructBegin(STRUCT_DESC);
-      oprot.writeFieldBegin(START_TIME_FIELD_DESC);
-      oprot.writeI64(struct.startTime);
-      oprot.writeFieldEnd();
-      if (struct.filename != null) {
-        oprot.writeFieldBegin(FILENAME_FIELD_DESC);
-        oprot.writeString(struct.filename);
-        oprot.writeFieldEnd();
-      }
-      if (struct.state != null) {
-        oprot.writeFieldBegin(STATE_FIELD_DESC);
-        oprot.writeI32(struct.state.getValue());
-        oprot.writeFieldEnd();
-      }
-      oprot.writeFieldStop();
-      oprot.writeStructEnd();
-    }
-
-  }
-
-  private static class BulkImportStatusTupleSchemeFactory implements 
org.apache.thrift.scheme.SchemeFactory {
-    @Override
-    public BulkImportStatusTupleScheme getScheme() {
-      return new BulkImportStatusTupleScheme();
-    }
-  }
-
-  private static class BulkImportStatusTupleScheme extends 
org.apache.thrift.scheme.TupleScheme<BulkImportStatus> {
-
-    @Override
-    public void write(org.apache.thrift.protocol.TProtocol prot, 
BulkImportStatus 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.isSetStartTime()) {
-        optionals.set(0);
-      }
-      if (struct.isSetFilename()) {
-        optionals.set(1);
-      }
-      if (struct.isSetState()) {
-        optionals.set(2);
-      }
-      oprot.writeBitSet(optionals, 3);
-      if (struct.isSetStartTime()) {
-        oprot.writeI64(struct.startTime);
-      }
-      if (struct.isSetFilename()) {
-        oprot.writeString(struct.filename);
-      }
-      if (struct.isSetState()) {
-        oprot.writeI32(struct.state.getValue());
-      }
-    }
-
-    @Override
-    public void read(org.apache.thrift.protocol.TProtocol prot, 
BulkImportStatus struct) throws org.apache.thrift.TException {
-      org.apache.thrift.protocol.TTupleProtocol iprot = 
(org.apache.thrift.protocol.TTupleProtocol) prot;
-      java.util.BitSet incoming = iprot.readBitSet(3);
-      if (incoming.get(0)) {
-        struct.startTime = iprot.readI64();
-        struct.setStartTimeIsSet(true);
-      }
-      if (incoming.get(1)) {
-        struct.filename = iprot.readString();
-        struct.setFilenameIsSet(true);
-      }
-      if (incoming.get(2)) {
-        struct.state = 
org.apache.accumulo.core.manager.thrift.BulkImportState.findByValue(iprot.readI32());
-        struct.setStateIsSet(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();
-  }
-  private static void unusedMethod() {}
-}
-
diff --git 
a/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/FateService.java
 
b/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/FateService.java
index 9fd6e7808f..c80d7e165e 100644
--- 
a/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/FateService.java
+++ 
b/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/FateService.java
@@ -3182,13 +3182,13 @@ public class FateService {
             case 5: // ARGUMENTS
               if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
                 {
-                  org.apache.thrift.protocol.TList _list78 = 
iprot.readListBegin();
-                  struct.arguments = new 
java.util.ArrayList<java.nio.ByteBuffer>(_list78.size);
-                  @org.apache.thrift.annotation.Nullable java.nio.ByteBuffer 
_elem79;
-                  for (int _i80 = 0; _i80 < _list78.size; ++_i80)
+                  org.apache.thrift.protocol.TList _list70 = 
iprot.readListBegin();
+                  struct.arguments = new 
java.util.ArrayList<java.nio.ByteBuffer>(_list70.size);
+                  @org.apache.thrift.annotation.Nullable java.nio.ByteBuffer 
_elem71;
+                  for (int _i72 = 0; _i72 < _list70.size; ++_i72)
                   {
-                    _elem79 = iprot.readBinary();
-                    struct.arguments.add(_elem79);
+                    _elem71 = iprot.readBinary();
+                    struct.arguments.add(_elem71);
                   }
                   iprot.readListEnd();
                 }
@@ -3200,15 +3200,15 @@ public class FateService {
             case 6: // OPTIONS
               if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
                 {
-                  org.apache.thrift.protocol.TMap _map81 = 
iprot.readMapBegin();
-                  struct.options = new 
java.util.HashMap<java.lang.String,java.lang.String>(2*_map81.size);
-                  @org.apache.thrift.annotation.Nullable java.lang.String 
_key82;
-                  @org.apache.thrift.annotation.Nullable java.lang.String 
_val83;
-                  for (int _i84 = 0; _i84 < _map81.size; ++_i84)
+                  org.apache.thrift.protocol.TMap _map73 = 
iprot.readMapBegin();
+                  struct.options = new 
java.util.HashMap<java.lang.String,java.lang.String>(2*_map73.size);
+                  @org.apache.thrift.annotation.Nullable java.lang.String 
_key74;
+                  @org.apache.thrift.annotation.Nullable java.lang.String 
_val75;
+                  for (int _i76 = 0; _i76 < _map73.size; ++_i76)
                   {
-                    _key82 = iprot.readString();
-                    _val83 = iprot.readString();
-                    struct.options.put(_key82, _val83);
+                    _key74 = iprot.readString();
+                    _val75 = iprot.readString();
+                    struct.options.put(_key74, _val75);
                   }
                   iprot.readMapEnd();
                 }
@@ -3265,9 +3265,9 @@ public class FateService {
           oprot.writeFieldBegin(ARGUMENTS_FIELD_DESC);
           {
             oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, 
struct.arguments.size()));
-            for (java.nio.ByteBuffer _iter85 : struct.arguments)
+            for (java.nio.ByteBuffer _iter77 : struct.arguments)
             {
-              oprot.writeBinary(_iter85);
+              oprot.writeBinary(_iter77);
             }
             oprot.writeListEnd();
           }
@@ -3277,10 +3277,10 @@ public class FateService {
           oprot.writeFieldBegin(OPTIONS_FIELD_DESC);
           {
             oprot.writeMapBegin(new 
org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.STRING, struct.options.size()));
-            for (java.util.Map.Entry<java.lang.String, java.lang.String> 
_iter86 : struct.options.entrySet())
+            for (java.util.Map.Entry<java.lang.String, java.lang.String> 
_iter78 : struct.options.entrySet())
             {
-              oprot.writeString(_iter86.getKey());
-              oprot.writeString(_iter86.getValue());
+              oprot.writeString(_iter78.getKey());
+              oprot.writeString(_iter78.getValue());
             }
             oprot.writeMapEnd();
           }
@@ -3345,19 +3345,19 @@ public class FateService {
         if (struct.isSetArguments()) {
           {
             oprot.writeI32(struct.arguments.size());
-            for (java.nio.ByteBuffer _iter87 : struct.arguments)
+            for (java.nio.ByteBuffer _iter79 : struct.arguments)
             {
-              oprot.writeBinary(_iter87);
+              oprot.writeBinary(_iter79);
             }
           }
         }
         if (struct.isSetOptions()) {
           {
             oprot.writeI32(struct.options.size());
-            for (java.util.Map.Entry<java.lang.String, java.lang.String> 
_iter88 : struct.options.entrySet())
+            for (java.util.Map.Entry<java.lang.String, java.lang.String> 
_iter80 : struct.options.entrySet())
             {
-              oprot.writeString(_iter88.getKey());
-              oprot.writeString(_iter88.getValue());
+              oprot.writeString(_iter80.getKey());
+              oprot.writeString(_iter80.getValue());
             }
           }
         }
@@ -3391,28 +3391,28 @@ public class FateService {
         }
         if (incoming.get(4)) {
           {
-            org.apache.thrift.protocol.TList _list89 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRING);
-            struct.arguments = new 
java.util.ArrayList<java.nio.ByteBuffer>(_list89.size);
-            @org.apache.thrift.annotation.Nullable java.nio.ByteBuffer _elem90;
-            for (int _i91 = 0; _i91 < _list89.size; ++_i91)
+            org.apache.thrift.protocol.TList _list81 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRING);
+            struct.arguments = new 
java.util.ArrayList<java.nio.ByteBuffer>(_list81.size);
+            @org.apache.thrift.annotation.Nullable java.nio.ByteBuffer _elem82;
+            for (int _i83 = 0; _i83 < _list81.size; ++_i83)
             {
-              _elem90 = iprot.readBinary();
-              struct.arguments.add(_elem90);
+              _elem82 = iprot.readBinary();
+              struct.arguments.add(_elem82);
             }
           }
           struct.setArgumentsIsSet(true);
         }
         if (incoming.get(5)) {
           {
-            org.apache.thrift.protocol.TMap _map92 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.STRING); 
-            struct.options = new 
java.util.HashMap<java.lang.String,java.lang.String>(2*_map92.size);
-            @org.apache.thrift.annotation.Nullable java.lang.String _key93;
-            @org.apache.thrift.annotation.Nullable java.lang.String _val94;
-            for (int _i95 = 0; _i95 < _map92.size; ++_i95)
+            org.apache.thrift.protocol.TMap _map84 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.STRING); 
+            struct.options = new 
java.util.HashMap<java.lang.String,java.lang.String>(2*_map84.size);
+            @org.apache.thrift.annotation.Nullable java.lang.String _key85;
+            @org.apache.thrift.annotation.Nullable java.lang.String _val86;
+            for (int _i87 = 0; _i87 < _map84.size; ++_i87)
             {
-              _key93 = iprot.readString();
-              _val94 = iprot.readString();
-              struct.options.put(_key93, _val94);
+              _key85 = iprot.readString();
+              _val86 = iprot.readString();
+              struct.options.put(_key85, _val86);
             }
           }
           struct.setOptionsIsSet(true);
diff --git 
a/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/ManagerClientService.java
 
b/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/ManagerClientService.java
index 9e845fbdcd..db2078f17e 100644
--- 
a/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/ManagerClientService.java
+++ 
b/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/ManagerClientService.java
@@ -35618,13 +35618,13 @@ public class ManagerClientService {
             case 0: // SUCCESS
               if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
                 {
-                  org.apache.thrift.protocol.TList _list96 = 
iprot.readListBegin();
-                  struct.success = new 
java.util.ArrayList<java.lang.String>(_list96.size);
-                  @org.apache.thrift.annotation.Nullable java.lang.String 
_elem97;
-                  for (int _i98 = 0; _i98 < _list96.size; ++_i98)
+                  org.apache.thrift.protocol.TList _list88 = 
iprot.readListBegin();
+                  struct.success = new 
java.util.ArrayList<java.lang.String>(_list88.size);
+                  @org.apache.thrift.annotation.Nullable java.lang.String 
_elem89;
+                  for (int _i90 = 0; _i90 < _list88.size; ++_i90)
                   {
-                    _elem97 = iprot.readString();
-                    struct.success.add(_elem97);
+                    _elem89 = iprot.readString();
+                    struct.success.add(_elem89);
                   }
                   iprot.readListEnd();
                 }
@@ -35671,9 +35671,9 @@ public class ManagerClientService {
           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 _iter99 : struct.success)
+            for (java.lang.String _iter91 : struct.success)
             {
-              oprot.writeString(_iter99);
+              oprot.writeString(_iter91);
             }
             oprot.writeListEnd();
           }
@@ -35721,9 +35721,9 @@ public class ManagerClientService {
         if (struct.isSetSuccess()) {
           {
             oprot.writeI32(struct.success.size());
-            for (java.lang.String _iter100 : struct.success)
+            for (java.lang.String _iter92 : struct.success)
             {
-              oprot.writeString(_iter100);
+              oprot.writeString(_iter92);
             }
           }
         }
@@ -35741,13 +35741,13 @@ public class ManagerClientService {
         java.util.BitSet incoming = iprot.readBitSet(3);
         if (incoming.get(0)) {
           {
-            org.apache.thrift.protocol.TList _list101 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRING);
-            struct.success = new 
java.util.ArrayList<java.lang.String>(_list101.size);
-            @org.apache.thrift.annotation.Nullable java.lang.String _elem102;
-            for (int _i103 = 0; _i103 < _list101.size; ++_i103)
+            org.apache.thrift.protocol.TList _list93 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRING);
+            struct.success = new 
java.util.ArrayList<java.lang.String>(_list93.size);
+            @org.apache.thrift.annotation.Nullable java.lang.String _elem94;
+            for (int _i95 = 0; _i95 < _list93.size; ++_i95)
             {
-              _elem102 = iprot.readString();
-              struct.success.add(_elem102);
+              _elem94 = iprot.readString();
+              struct.success.add(_elem94);
             }
           }
           struct.setSuccessIsSet(true);
@@ -37579,14 +37579,14 @@ public class ManagerClientService {
             case 4: // EXTENTS
               if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
                 {
-                  org.apache.thrift.protocol.TList _list104 = 
iprot.readListBegin();
-                  struct.extents = new 
java.util.ArrayList<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent>(_list104.size);
-                  @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _elem105;
-                  for (int _i106 = 0; _i106 < _list104.size; ++_i106)
+                  org.apache.thrift.protocol.TList _list96 = 
iprot.readListBegin();
+                  struct.extents = new 
java.util.ArrayList<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent>(_list96.size);
+                  @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _elem97;
+                  for (int _i98 = 0; _i98 < _list96.size; ++_i98)
                   {
-                    _elem105 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
-                    _elem105.read(iprot);
-                    struct.extents.add(_elem105);
+                    _elem97 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
+                    _elem97.read(iprot);
+                    struct.extents.add(_elem97);
                   }
                   iprot.readListEnd();
                 }
@@ -37630,9 +37630,9 @@ public class ManagerClientService {
           oprot.writeFieldBegin(EXTENTS_FIELD_DESC);
           {
             oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
struct.extents.size()));
-            for (org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _iter107 
: struct.extents)
+            for (org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _iter99 : 
struct.extents)
             {
-              _iter107.write(oprot);
+              _iter99.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -37682,9 +37682,9 @@ public class ManagerClientService {
         if (struct.isSetExtents()) {
           {
             oprot.writeI32(struct.extents.size());
-            for (org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _iter108 
: struct.extents)
+            for (org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _iter100 
: struct.extents)
             {
-              _iter108.write(oprot);
+              _iter100.write(oprot);
             }
           }
         }
@@ -37710,14 +37710,14 @@ public class ManagerClientService {
         }
         if (incoming.get(3)) {
           {
-            org.apache.thrift.protocol.TList _list109 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
-            struct.extents = new 
java.util.ArrayList<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent>(_list109.size);
-            @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _elem110;
-            for (int _i111 = 0; _i111 < _list109.size; ++_i111)
+            org.apache.thrift.protocol.TList _list101 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
+            struct.extents = new 
java.util.ArrayList<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent>(_list101.size);
+            @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _elem102;
+            for (int _i103 = 0; _i103 < _list101.size; ++_i103)
             {
-              _elem110 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
-              _elem110.read(iprot);
-              struct.extents.add(_elem110);
+              _elem102 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
+              _elem102.read(iprot);
+              struct.extents.add(_elem102);
             }
           }
           struct.setExtentsIsSet(true);
@@ -38829,17 +38829,17 @@ public class ManagerClientService {
             case 4: // SPLITS
               if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
                 {
-                  org.apache.thrift.protocol.TMap _map112 = 
iprot.readMapBegin();
-                  struct.splits = new 
java.util.HashMap<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,TTabletMergeability>(2*_map112.size);
-                  @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _key113;
-                  @org.apache.thrift.annotation.Nullable TTabletMergeability 
_val114;
-                  for (int _i115 = 0; _i115 < _map112.size; ++_i115)
+                  org.apache.thrift.protocol.TMap _map104 = 
iprot.readMapBegin();
+                  struct.splits = new 
java.util.HashMap<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,TTabletMergeability>(2*_map104.size);
+                  @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _key105;
+                  @org.apache.thrift.annotation.Nullable TTabletMergeability 
_val106;
+                  for (int _i107 = 0; _i107 < _map104.size; ++_i107)
                   {
-                    _key113 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
-                    _key113.read(iprot);
-                    _val114 = new TTabletMergeability();
-                    _val114.read(iprot);
-                    struct.splits.put(_key113, _val114);
+                    _key105 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
+                    _key105.read(iprot);
+                    _val106 = new TTabletMergeability();
+                    _val106.read(iprot);
+                    struct.splits.put(_key105, _val106);
                   }
                   iprot.readMapEnd();
                 }
@@ -38883,10 +38883,10 @@ public class ManagerClientService {
           oprot.writeFieldBegin(SPLITS_FIELD_DESC);
           {
             oprot.writeMapBegin(new 
org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRUCT, 
org.apache.thrift.protocol.TType.STRUCT, struct.splits.size()));
-            for 
(java.util.Map.Entry<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent, 
TTabletMergeability> _iter116 : struct.splits.entrySet())
+            for 
(java.util.Map.Entry<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent, 
TTabletMergeability> _iter108 : struct.splits.entrySet())
             {
-              _iter116.getKey().write(oprot);
-              _iter116.getValue().write(oprot);
+              _iter108.getKey().write(oprot);
+              _iter108.getValue().write(oprot);
             }
             oprot.writeMapEnd();
           }
@@ -38936,10 +38936,10 @@ public class ManagerClientService {
         if (struct.isSetSplits()) {
           {
             oprot.writeI32(struct.splits.size());
-            for 
(java.util.Map.Entry<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent, 
TTabletMergeability> _iter117 : struct.splits.entrySet())
+            for 
(java.util.Map.Entry<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent, 
TTabletMergeability> _iter109 : struct.splits.entrySet())
             {
-              _iter117.getKey().write(oprot);
-              _iter117.getValue().write(oprot);
+              _iter109.getKey().write(oprot);
+              _iter109.getValue().write(oprot);
             }
           }
         }
@@ -38965,17 +38965,17 @@ public class ManagerClientService {
         }
         if (incoming.get(3)) {
           {
-            org.apache.thrift.protocol.TMap _map118 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRUCT, 
org.apache.thrift.protocol.TType.STRUCT); 
-            struct.splits = new 
java.util.HashMap<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,TTabletMergeability>(2*_map118.size);
-            @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _key119;
-            @org.apache.thrift.annotation.Nullable TTabletMergeability _val120;
-            for (int _i121 = 0; _i121 < _map118.size; ++_i121)
+            org.apache.thrift.protocol.TMap _map110 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRUCT, 
org.apache.thrift.protocol.TType.STRUCT); 
+            struct.splits = new 
java.util.HashMap<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent,TTabletMergeability>(2*_map110.size);
+            @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _key111;
+            @org.apache.thrift.annotation.Nullable TTabletMergeability _val112;
+            for (int _i113 = 0; _i113 < _map110.size; ++_i113)
             {
-              _key119 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
-              _key119.read(iprot);
-              _val120 = new TTabletMergeability();
-              _val120.read(iprot);
-              struct.splits.put(_key119, _val120);
+              _key111 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
+              _key111.read(iprot);
+              _val112 = new TTabletMergeability();
+              _val112.read(iprot);
+              struct.splits.put(_key111, _val112);
             }
           }
           struct.setSplitsIsSet(true);
@@ -39481,14 +39481,14 @@ public class ManagerClientService {
             case 0: // SUCCESS
               if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
                 {
-                  org.apache.thrift.protocol.TList _list122 = 
iprot.readListBegin();
-                  struct.success = new 
java.util.ArrayList<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent>(_list122.size);
-                  @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _elem123;
-                  for (int _i124 = 0; _i124 < _list122.size; ++_i124)
+                  org.apache.thrift.protocol.TList _list114 = 
iprot.readListBegin();
+                  struct.success = new 
java.util.ArrayList<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent>(_list114.size);
+                  @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _elem115;
+                  for (int _i116 = 0; _i116 < _list114.size; ++_i116)
                   {
-                    _elem123 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
-                    _elem123.read(iprot);
-                    struct.success.add(_elem123);
+                    _elem115 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
+                    _elem115.read(iprot);
+                    struct.success.add(_elem115);
                   }
                   iprot.readListEnd();
                 }
@@ -39535,9 +39535,9 @@ public class ManagerClientService {
           oprot.writeFieldBegin(SUCCESS_FIELD_DESC);
           {
             oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
struct.success.size()));
-            for (org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _iter125 
: struct.success)
+            for (org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _iter117 
: struct.success)
             {
-              _iter125.write(oprot);
+              _iter117.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -39585,9 +39585,9 @@ public class ManagerClientService {
         if (struct.isSetSuccess()) {
           {
             oprot.writeI32(struct.success.size());
-            for (org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _iter126 
: struct.success)
+            for (org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _iter118 
: struct.success)
             {
-              _iter126.write(oprot);
+              _iter118.write(oprot);
             }
           }
         }
@@ -39605,14 +39605,14 @@ public class ManagerClientService {
         java.util.BitSet incoming = iprot.readBitSet(3);
         if (incoming.get(0)) {
           {
-            org.apache.thrift.protocol.TList _list127 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
-            struct.success = new 
java.util.ArrayList<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent>(_list127.size);
-            @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _elem128;
-            for (int _i129 = 0; _i129 < _list127.size; ++_i129)
+            org.apache.thrift.protocol.TList _list119 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
+            struct.success = new 
java.util.ArrayList<org.apache.accumulo.core.dataImpl.thrift.TKeyExtent>(_list119.size);
+            @org.apache.thrift.annotation.Nullable 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent _elem120;
+            for (int _i121 = 0; _i121 < _list119.size; ++_i121)
             {
-              _elem128 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
-              _elem128.read(iprot);
-              struct.success.add(_elem128);
+              _elem120 = new 
org.apache.accumulo.core.dataImpl.thrift.TKeyExtent();
+              _elem120.read(iprot);
+              struct.success.add(_elem120);
             }
           }
           struct.setSuccessIsSet(true);
diff --git 
a/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/ManagerMonitorInfo.java
 
b/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/ManagerMonitorInfo.java
index 66a43f5c6b..8a028db0ce 100644
--- 
a/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/ManagerMonitorInfo.java
+++ 
b/core/src/main/thrift-gen-java/org/apache/accumulo/core/manager/thrift/ManagerMonitorInfo.java
@@ -36,7 +36,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
   private static final org.apache.thrift.protocol.TField 
UNASSIGNED_TABLETS_FIELD_DESC = new 
org.apache.thrift.protocol.TField("unassignedTablets", 
org.apache.thrift.protocol.TType.I32, (short)6);
   private static final org.apache.thrift.protocol.TField 
SERVERS_SHUTTING_DOWN_FIELD_DESC = new 
org.apache.thrift.protocol.TField("serversShuttingDown", 
org.apache.thrift.protocol.TType.SET, (short)7);
   private static final org.apache.thrift.protocol.TField 
DEAD_TABLET_SERVERS_FIELD_DESC = new 
org.apache.thrift.protocol.TField("deadTabletServers", 
org.apache.thrift.protocol.TType.LIST, (short)8);
-  private static final org.apache.thrift.protocol.TField 
BULK_IMPORTS_FIELD_DESC = new org.apache.thrift.protocol.TField("bulkImports", 
org.apache.thrift.protocol.TType.LIST, (short)9);
 
   private static final org.apache.thrift.scheme.SchemeFactory 
STANDARD_SCHEME_FACTORY = new ManagerMonitorInfoStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory 
TUPLE_SCHEME_FACTORY = new ManagerMonitorInfoTupleSchemeFactory();
@@ -57,7 +56,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
   public int unassignedTablets; // required
   public @org.apache.thrift.annotation.Nullable 
java.util.Set<java.lang.String> serversShuttingDown; // required
   public @org.apache.thrift.annotation.Nullable java.util.List<DeadServer> 
deadTabletServers; // required
-  public @org.apache.thrift.annotation.Nullable 
java.util.List<BulkImportStatus> bulkImports; // required
 
   /** The set of fields this struct contains, along with convenience methods 
for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -76,8 +74,7 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
     GOAL_STATE((short)5, "goalState"),
     UNASSIGNED_TABLETS((short)6, "unassignedTablets"),
     SERVERS_SHUTTING_DOWN((short)7, "serversShuttingDown"),
-    DEAD_TABLET_SERVERS((short)8, "deadTabletServers"),
-    BULK_IMPORTS((short)9, "bulkImports");
+    DEAD_TABLET_SERVERS((short)8, "deadTabletServers");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new 
java.util.HashMap<java.lang.String, _Fields>();
 
@@ -109,8 +106,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
           return SERVERS_SHUTTING_DOWN;
         case 8: // DEAD_TABLET_SERVERS
           return DEAD_TABLET_SERVERS;
-        case 9: // BULK_IMPORTS
-          return BULK_IMPORTS;
         default:
           return null;
       }
@@ -182,9 +177,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
     tmpMap.put(_Fields.DEAD_TABLET_SERVERS, new 
org.apache.thrift.meta_data.FieldMetaData("deadTabletServers", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
         new 
org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
             new 
org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT,
 DeadServer.class))));
-    tmpMap.put(_Fields.BULK_IMPORTS, new 
org.apache.thrift.meta_data.FieldMetaData("bulkImports", 
org.apache.thrift.TFieldRequirementType.DEFAULT, 
-        new 
org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
-            new 
org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT,
 BulkImportStatus.class))));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     
org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ManagerMonitorInfo.class,
 metaDataMap);
   }
@@ -200,8 +192,7 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
     ManagerGoalState goalState,
     int unassignedTablets,
     java.util.Set<java.lang.String> serversShuttingDown,
-    java.util.List<DeadServer> deadTabletServers,
-    java.util.List<BulkImportStatus> bulkImports)
+    java.util.List<DeadServer> deadTabletServers)
   {
     this();
     this.tableMap = tableMap;
@@ -213,7 +204,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
     setUnassignedTabletsIsSet(true);
     this.serversShuttingDown = serversShuttingDown;
     this.deadTabletServers = deadTabletServers;
-    this.bulkImports = bulkImports;
   }
 
   /**
@@ -265,13 +255,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
       }
       this.deadTabletServers = __this__deadTabletServers;
     }
-    if (other.isSetBulkImports()) {
-      java.util.List<BulkImportStatus> __this__bulkImports = new 
java.util.ArrayList<BulkImportStatus>(other.bulkImports.size());
-      for (BulkImportStatus other_element : other.bulkImports) {
-        __this__bulkImports.add(new BulkImportStatus(other_element));
-      }
-      this.bulkImports = __this__bulkImports;
-    }
   }
 
   @Override
@@ -290,7 +273,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
     this.unassignedTablets = 0;
     this.serversShuttingDown = null;
     this.deadTabletServers = null;
-    this.bulkImports = null;
   }
 
   public int getTableMapSize() {
@@ -577,47 +559,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
     }
   }
 
-  public int getBulkImportsSize() {
-    return (this.bulkImports == null) ? 0 : this.bulkImports.size();
-  }
-
-  @org.apache.thrift.annotation.Nullable
-  public java.util.Iterator<BulkImportStatus> getBulkImportsIterator() {
-    return (this.bulkImports == null) ? null : this.bulkImports.iterator();
-  }
-
-  public void addToBulkImports(BulkImportStatus elem) {
-    if (this.bulkImports == null) {
-      this.bulkImports = new java.util.ArrayList<BulkImportStatus>();
-    }
-    this.bulkImports.add(elem);
-  }
-
-  @org.apache.thrift.annotation.Nullable
-  public java.util.List<BulkImportStatus> getBulkImports() {
-    return this.bulkImports;
-  }
-
-  public ManagerMonitorInfo 
setBulkImports(@org.apache.thrift.annotation.Nullable 
java.util.List<BulkImportStatus> bulkImports) {
-    this.bulkImports = bulkImports;
-    return this;
-  }
-
-  public void unsetBulkImports() {
-    this.bulkImports = null;
-  }
-
-  /** Returns true if field bulkImports is set (has been assigned a value) and 
false otherwise */
-  public boolean isSetBulkImports() {
-    return this.bulkImports != null;
-  }
-
-  public void setBulkImportsIsSet(boolean value) {
-    if (!value) {
-      this.bulkImports = null;
-    }
-  }
-
   @Override
   public void setFieldValue(_Fields field, 
@org.apache.thrift.annotation.Nullable java.lang.Object value) {
     switch (field) {
@@ -685,14 +626,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
       }
       break;
 
-    case BULK_IMPORTS:
-      if (value == null) {
-        unsetBulkImports();
-      } else {
-        setBulkImports((java.util.List<BulkImportStatus>)value);
-      }
-      break;
-
     }
   }
 
@@ -724,9 +657,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
     case DEAD_TABLET_SERVERS:
       return getDeadTabletServers();
 
-    case BULK_IMPORTS:
-      return getBulkImports();
-
     }
     throw new java.lang.IllegalStateException();
   }
@@ -755,8 +685,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
       return isSetServersShuttingDown();
     case DEAD_TABLET_SERVERS:
       return isSetDeadTabletServers();
-    case BULK_IMPORTS:
-      return isSetBulkImports();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -846,15 +774,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
         return false;
     }
 
-    boolean this_present_bulkImports = true && this.isSetBulkImports();
-    boolean that_present_bulkImports = true && that.isSetBulkImports();
-    if (this_present_bulkImports || that_present_bulkImports) {
-      if (!(this_present_bulkImports && that_present_bulkImports))
-        return false;
-      if (!this.bulkImports.equals(that.bulkImports))
-        return false;
-    }
-
     return true;
   }
 
@@ -892,10 +811,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
     if (isSetDeadTabletServers())
       hashCode = hashCode * 8191 + deadTabletServers.hashCode();
 
-    hashCode = hashCode * 8191 + ((isSetBulkImports()) ? 131071 : 524287);
-    if (isSetBulkImports())
-      hashCode = hashCode * 8191 + bulkImports.hashCode();
-
     return hashCode;
   }
 
@@ -987,16 +902,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
         return lastComparison;
       }
     }
-    lastComparison = java.lang.Boolean.compare(isSetBulkImports(), 
other.isSetBulkImports());
-    if (lastComparison != 0) {
-      return lastComparison;
-    }
-    if (isSetBulkImports()) {
-      lastComparison = 
org.apache.thrift.TBaseHelper.compareTo(this.bulkImports, other.bulkImports);
-      if (lastComparison != 0) {
-        return lastComparison;
-      }
-    }
     return 0;
   }
 
@@ -1080,14 +985,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
       sb.append(this.deadTabletServers);
     }
     first = false;
-    if (!first) sb.append(", ");
-    sb.append("bulkImports:");
-    if (this.bulkImports == null) {
-      sb.append("null");
-    } else {
-      sb.append(this.bulkImports);
-    }
-    first = false;
     sb.append(")");
     return sb.toString();
   }
@@ -1256,25 +1153,6 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
             }
             break;
-          case 9: // BULK_IMPORTS
-            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
-              {
-                org.apache.thrift.protocol.TList _list43 = 
iprot.readListBegin();
-                struct.bulkImports = new 
java.util.ArrayList<BulkImportStatus>(_list43.size);
-                @org.apache.thrift.annotation.Nullable BulkImportStatus 
_elem44;
-                for (int _i45 = 0; _i45 < _list43.size; ++_i45)
-                {
-                  _elem44 = new BulkImportStatus();
-                  _elem44.read(iprot);
-                  struct.bulkImports.add(_elem44);
-                }
-                iprot.readListEnd();
-              }
-              struct.setBulkImportsIsSet(true);
-            } else { 
-              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
-            }
-            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
         }
@@ -1295,10 +1173,10 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
         oprot.writeFieldBegin(TABLE_MAP_FIELD_DESC);
         {
           oprot.writeMapBegin(new 
org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.STRUCT, struct.tableMap.size()));
-          for (java.util.Map.Entry<java.lang.String, TableInfo> _iter46 : 
struct.tableMap.entrySet())
+          for (java.util.Map.Entry<java.lang.String, TableInfo> _iter43 : 
struct.tableMap.entrySet())
           {
-            oprot.writeString(_iter46.getKey());
-            _iter46.getValue().write(oprot);
+            oprot.writeString(_iter43.getKey());
+            _iter43.getValue().write(oprot);
           }
           oprot.writeMapEnd();
         }
@@ -1308,9 +1186,9 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
         oprot.writeFieldBegin(T_SERVER_INFO_FIELD_DESC);
         {
           oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
struct.tServerInfo.size()));
-          for (TabletServerStatus _iter47 : struct.tServerInfo)
+          for (TabletServerStatus _iter44 : struct.tServerInfo)
           {
-            _iter47.write(oprot);
+            _iter44.write(oprot);
           }
           oprot.writeListEnd();
         }
@@ -1320,10 +1198,10 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
         oprot.writeFieldBegin(BAD_TSERVERS_FIELD_DESC);
         {
           oprot.writeMapBegin(new 
org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.BYTE, struct.badTServers.size()));
-          for (java.util.Map.Entry<java.lang.String, java.lang.Byte> _iter48 : 
struct.badTServers.entrySet())
+          for (java.util.Map.Entry<java.lang.String, java.lang.Byte> _iter45 : 
struct.badTServers.entrySet())
           {
-            oprot.writeString(_iter48.getKey());
-            oprot.writeByte(_iter48.getValue());
+            oprot.writeString(_iter45.getKey());
+            oprot.writeByte(_iter45.getValue());
           }
           oprot.writeMapEnd();
         }
@@ -1346,9 +1224,9 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
         oprot.writeFieldBegin(SERVERS_SHUTTING_DOWN_FIELD_DESC);
         {
           oprot.writeSetBegin(new 
org.apache.thrift.protocol.TSet(org.apache.thrift.protocol.TType.STRING, 
struct.serversShuttingDown.size()));
-          for (java.lang.String _iter49 : struct.serversShuttingDown)
+          for (java.lang.String _iter46 : struct.serversShuttingDown)
           {
-            oprot.writeString(_iter49);
+            oprot.writeString(_iter46);
           }
           oprot.writeSetEnd();
         }
@@ -1358,21 +1236,9 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
         oprot.writeFieldBegin(DEAD_TABLET_SERVERS_FIELD_DESC);
         {
           oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
struct.deadTabletServers.size()));
-          for (DeadServer _iter50 : struct.deadTabletServers)
+          for (DeadServer _iter47 : struct.deadTabletServers)
           {
-            _iter50.write(oprot);
-          }
-          oprot.writeListEnd();
-        }
-        oprot.writeFieldEnd();
-      }
-      if (struct.bulkImports != null) {
-        oprot.writeFieldBegin(BULK_IMPORTS_FIELD_DESC);
-        {
-          oprot.writeListBegin(new 
org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, 
struct.bulkImports.size()));
-          for (BulkImportStatus _iter51 : struct.bulkImports)
-          {
-            _iter51.write(oprot);
+            _iter47.write(oprot);
           }
           oprot.writeListEnd();
         }
@@ -1421,36 +1287,33 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
       if (struct.isSetDeadTabletServers()) {
         optionals.set(7);
       }
-      if (struct.isSetBulkImports()) {
-        optionals.set(8);
-      }
-      oprot.writeBitSet(optionals, 9);
+      oprot.writeBitSet(optionals, 8);
       if (struct.isSetTableMap()) {
         {
           oprot.writeI32(struct.tableMap.size());
-          for (java.util.Map.Entry<java.lang.String, TableInfo> _iter52 : 
struct.tableMap.entrySet())
+          for (java.util.Map.Entry<java.lang.String, TableInfo> _iter48 : 
struct.tableMap.entrySet())
           {
-            oprot.writeString(_iter52.getKey());
-            _iter52.getValue().write(oprot);
+            oprot.writeString(_iter48.getKey());
+            _iter48.getValue().write(oprot);
           }
         }
       }
       if (struct.isSetTServerInfo()) {
         {
           oprot.writeI32(struct.tServerInfo.size());
-          for (TabletServerStatus _iter53 : struct.tServerInfo)
+          for (TabletServerStatus _iter49 : struct.tServerInfo)
           {
-            _iter53.write(oprot);
+            _iter49.write(oprot);
           }
         }
       }
       if (struct.isSetBadTServers()) {
         {
           oprot.writeI32(struct.badTServers.size());
-          for (java.util.Map.Entry<java.lang.String, java.lang.Byte> _iter54 : 
struct.badTServers.entrySet())
+          for (java.util.Map.Entry<java.lang.String, java.lang.Byte> _iter50 : 
struct.badTServers.entrySet())
           {
-            oprot.writeString(_iter54.getKey());
-            oprot.writeByte(_iter54.getValue());
+            oprot.writeString(_iter50.getKey());
+            oprot.writeByte(_iter50.getValue());
           }
         }
       }
@@ -1466,27 +1329,18 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
       if (struct.isSetServersShuttingDown()) {
         {
           oprot.writeI32(struct.serversShuttingDown.size());
-          for (java.lang.String _iter55 : struct.serversShuttingDown)
+          for (java.lang.String _iter51 : struct.serversShuttingDown)
           {
-            oprot.writeString(_iter55);
+            oprot.writeString(_iter51);
           }
         }
       }
       if (struct.isSetDeadTabletServers()) {
         {
           oprot.writeI32(struct.deadTabletServers.size());
-          for (DeadServer _iter56 : struct.deadTabletServers)
+          for (DeadServer _iter52 : struct.deadTabletServers)
           {
-            _iter56.write(oprot);
-          }
-        }
-      }
-      if (struct.isSetBulkImports()) {
-        {
-          oprot.writeI32(struct.bulkImports.size());
-          for (BulkImportStatus _iter57 : struct.bulkImports)
-          {
-            _iter57.write(oprot);
+            _iter52.write(oprot);
           }
         }
       }
@@ -1495,48 +1349,48 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
     @Override
     public void read(org.apache.thrift.protocol.TProtocol prot, 
ManagerMonitorInfo struct) throws org.apache.thrift.TException {
       org.apache.thrift.protocol.TTupleProtocol iprot = 
(org.apache.thrift.protocol.TTupleProtocol) prot;
-      java.util.BitSet incoming = iprot.readBitSet(9);
+      java.util.BitSet incoming = iprot.readBitSet(8);
       if (incoming.get(0)) {
         {
-          org.apache.thrift.protocol.TMap _map58 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.STRUCT); 
-          struct.tableMap = new 
java.util.HashMap<java.lang.String,TableInfo>(2*_map58.size);
-          @org.apache.thrift.annotation.Nullable java.lang.String _key59;
-          @org.apache.thrift.annotation.Nullable TableInfo _val60;
-          for (int _i61 = 0; _i61 < _map58.size; ++_i61)
+          org.apache.thrift.protocol.TMap _map53 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.STRUCT); 
+          struct.tableMap = new 
java.util.HashMap<java.lang.String,TableInfo>(2*_map53.size);
+          @org.apache.thrift.annotation.Nullable java.lang.String _key54;
+          @org.apache.thrift.annotation.Nullable TableInfo _val55;
+          for (int _i56 = 0; _i56 < _map53.size; ++_i56)
           {
-            _key59 = iprot.readString();
-            _val60 = new TableInfo();
-            _val60.read(iprot);
-            struct.tableMap.put(_key59, _val60);
+            _key54 = iprot.readString();
+            _val55 = new TableInfo();
+            _val55.read(iprot);
+            struct.tableMap.put(_key54, _val55);
           }
         }
         struct.setTableMapIsSet(true);
       }
       if (incoming.get(1)) {
         {
-          org.apache.thrift.protocol.TList _list62 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
-          struct.tServerInfo = new 
java.util.ArrayList<TabletServerStatus>(_list62.size);
-          @org.apache.thrift.annotation.Nullable TabletServerStatus _elem63;
-          for (int _i64 = 0; _i64 < _list62.size; ++_i64)
+          org.apache.thrift.protocol.TList _list57 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
+          struct.tServerInfo = new 
java.util.ArrayList<TabletServerStatus>(_list57.size);
+          @org.apache.thrift.annotation.Nullable TabletServerStatus _elem58;
+          for (int _i59 = 0; _i59 < _list57.size; ++_i59)
           {
-            _elem63 = new TabletServerStatus();
-            _elem63.read(iprot);
-            struct.tServerInfo.add(_elem63);
+            _elem58 = new TabletServerStatus();
+            _elem58.read(iprot);
+            struct.tServerInfo.add(_elem58);
           }
         }
         struct.setTServerInfoIsSet(true);
       }
       if (incoming.get(2)) {
         {
-          org.apache.thrift.protocol.TMap _map65 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.BYTE); 
-          struct.badTServers = new 
java.util.HashMap<java.lang.String,java.lang.Byte>(2*_map65.size);
-          @org.apache.thrift.annotation.Nullable java.lang.String _key66;
-          byte _val67;
-          for (int _i68 = 0; _i68 < _map65.size; ++_i68)
+          org.apache.thrift.protocol.TMap _map60 = 
iprot.readMapBegin(org.apache.thrift.protocol.TType.STRING, 
org.apache.thrift.protocol.TType.BYTE); 
+          struct.badTServers = new 
java.util.HashMap<java.lang.String,java.lang.Byte>(2*_map60.size);
+          @org.apache.thrift.annotation.Nullable java.lang.String _key61;
+          byte _val62;
+          for (int _i63 = 0; _i63 < _map60.size; ++_i63)
           {
-            _key66 = iprot.readString();
-            _val67 = iprot.readByte();
-            struct.badTServers.put(_key66, _val67);
+            _key61 = iprot.readString();
+            _val62 = iprot.readByte();
+            struct.badTServers.put(_key61, _val62);
           }
         }
         struct.setBadTServersIsSet(true);
@@ -1555,45 +1409,31 @@ public class ManagerMonitorInfo implements 
org.apache.thrift.TBase<ManagerMonito
       }
       if (incoming.get(6)) {
         {
-          org.apache.thrift.protocol.TSet _set69 = 
iprot.readSetBegin(org.apache.thrift.protocol.TType.STRING);
-          struct.serversShuttingDown = new 
java.util.HashSet<java.lang.String>(2*_set69.size);
-          @org.apache.thrift.annotation.Nullable java.lang.String _elem70;
-          for (int _i71 = 0; _i71 < _set69.size; ++_i71)
+          org.apache.thrift.protocol.TSet _set64 = 
iprot.readSetBegin(org.apache.thrift.protocol.TType.STRING);
+          struct.serversShuttingDown = new 
java.util.HashSet<java.lang.String>(2*_set64.size);
+          @org.apache.thrift.annotation.Nullable java.lang.String _elem65;
+          for (int _i66 = 0; _i66 < _set64.size; ++_i66)
           {
-            _elem70 = iprot.readString();
-            struct.serversShuttingDown.add(_elem70);
+            _elem65 = iprot.readString();
+            struct.serversShuttingDown.add(_elem65);
           }
         }
         struct.setServersShuttingDownIsSet(true);
       }
       if (incoming.get(7)) {
         {
-          org.apache.thrift.protocol.TList _list72 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
-          struct.deadTabletServers = new 
java.util.ArrayList<DeadServer>(_list72.size);
-          @org.apache.thrift.annotation.Nullable DeadServer _elem73;
-          for (int _i74 = 0; _i74 < _list72.size; ++_i74)
+          org.apache.thrift.protocol.TList _list67 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
+          struct.deadTabletServers = new 
java.util.ArrayList<DeadServer>(_list67.size);
+          @org.apache.thrift.annotation.Nullable DeadServer _elem68;
+          for (int _i69 = 0; _i69 < _list67.size; ++_i69)
           {
-            _elem73 = new DeadServer();
-            _elem73.read(iprot);
-            struct.deadTabletServers.add(_elem73);
+            _elem68 = new DeadServer();
+            _elem68.read(iprot);
+            struct.deadTabletServers.add(_elem68);
           }
         }
         struct.setDeadTabletServersIsSet(true);
       }
-      if (incoming.get(8)) {
-        {
-          org.apache.thrift.protocol.TList _list75 = 
iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
-          struct.bulkImports = new 
java.util.ArrayList<BulkImportStatus>(_list75.size);
-          @org.apache.thrift.annotation.Nullable BulkImportStatus _elem76;
-          for (int _i77 = 0; _i77 < _list75.size; ++_i77)
-          {
-            _elem76 = new BulkImportStatus();
-            _elem76.read(iprot);
-            struct.bulkImports.add(_elem76);
-          }
-        }
-        struct.setBulkImportsIsSet(true);
-      }
     }
   }
 
diff --git a/core/src/main/thrift/manager.thrift 
b/core/src/main/thrift/manager.thrift
index 436d365e97..c9bbe45f40 100644
--- a/core/src/main/thrift/manager.thrift
+++ b/core/src/main/thrift/manager.thrift
@@ -113,28 +113,6 @@ struct RecoveryStatus {
   6:double progress
 }
 
-enum BulkImportState {
-  INITIAL
-  // manager moves the files into the accumulo area
-  MOVING
-  // tserver examines the index of the file
-  PROCESSING
-  // tserver assigns the file to tablets
-  ASSIGNING
-  // tserver incorporates file into tablet
-  LOADING
-  // manager moves error files into the error directory
-  COPY_FILES
-  // flags and locks removed
-  CLEANUP
-}
-
-struct BulkImportStatus {
-  1:i64 startTime
-  2:string filename
-  3:BulkImportState state
-}
-
 struct TabletServerStatus {
   1:map<string, TableInfo> tableMap
   2:i64 lastContact
@@ -162,7 +140,6 @@ struct ManagerMonitorInfo {
   6:i32 unassignedTablets
   7:set<string> serversShuttingDown
   8:list<DeadServer> deadTabletServers
-  9:list<BulkImportStatus> bulkImports
 }
 
 enum TFateInstanceType {
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/ServerBulkImportStatus.java
 
b/server/base/src/main/java/org/apache/accumulo/server/util/ServerBulkImportStatus.java
deleted file mode 100644
index 1ab394b29d..0000000000
--- 
a/server/base/src/main/java/org/apache/accumulo/server/util/ServerBulkImportStatus.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.accumulo.server.util;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import org.apache.accumulo.core.manager.thrift.BulkImportState;
-import org.apache.accumulo.core.manager.thrift.BulkImportStatus;
-
-// A little class to hold bulk import status information in the Manager
-// and two places in the tablet server.
-public class ServerBulkImportStatus {
-  private final ConcurrentMap<String,BulkImportStatus> status = new 
ConcurrentHashMap<>();
-
-  public List<BulkImportStatus> getBulkLoadStatus() {
-    return new ArrayList<>(status.values());
-  }
-
-  public void updateBulkImportStatus(List<String> files, BulkImportState 
state) {
-    for (String file : files) {
-      status.compute(file, (key, currentStatus) -> {
-        if (currentStatus == null) {
-          return new BulkImportStatus(System.currentTimeMillis(), file, state);
-        }
-        currentStatus.state = state;
-        return currentStatus;
-      });
-    }
-  }
-
-  public void removeBulkImportStatus(List<String> files) {
-    status.keySet().removeAll(files);
-  }
-
-}
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java
 
b/server/base/src/main/java/org/apache/accumulo/server/util/bulkCommand/BulkFateOperation.java
similarity index 63%
copy from 
server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java
copy to 
server/base/src/main/java/org/apache/accumulo/server/util/bulkCommand/BulkFateOperation.java
index 3ab809b89d..28edbf65dd 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/util/bulkCommand/BulkFateOperation.java
@@ -16,24 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.accumulo.manager.tableOps.bulkVer2;
+package org.apache.accumulo.server.util.bulkCommand;
 
-import java.io.Serializable;
+import java.time.Instant;
 
 import org.apache.accumulo.core.data.TableId;
+import org.apache.accumulo.server.util.bulkCommand.ListBulk.BulkState;
 
-/**
- * Package private class to hold all the information used for bulk import2
- */
-class BulkInfo implements Serializable {
-  private static final long serialVersionUID = 1L;
+public interface BulkFateOperation {
+  TableId getTableId();
+
+  String getSourceDir();
+
+  String getDestDir();
+
+  Instant getCreationTime();
 
-  TableId tableId;
-  String sourceDir;
-  String bulkDir;
-  boolean setTime;
-  // firstSplit and lastSplit describe the min and max splits in the table 
that overlap the bulk
-  // imported data
-  byte[] firstSplit;
-  byte[] lastSplit;
+  BulkState getState();
 }
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/bulkCommand/ListBulk.java
 
b/server/base/src/main/java/org/apache/accumulo/server/util/bulkCommand/ListBulk.java
new file mode 100644
index 0000000000..8621a0ab7b
--- /dev/null
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/util/bulkCommand/ListBulk.java
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.accumulo.server.util.bulkCommand;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.EnumSet;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+
+import org.apache.accumulo.core.cli.ServerOpts;
+import org.apache.accumulo.core.data.TableId;
+import org.apache.accumulo.core.fate.Fate;
+import org.apache.accumulo.core.fate.FateId;
+import org.apache.accumulo.core.fate.ReadOnlyFateStore;
+import org.apache.accumulo.core.fate.ReadOnlyFateStore.FateIdStatus;
+import org.apache.accumulo.core.fate.TraceRepo;
+import org.apache.accumulo.core.fate.user.UserFateStore;
+import org.apache.accumulo.core.metadata.SystemTables;
+import org.apache.accumulo.server.ServerContext;
+import org.apache.accumulo.server.util.ServerKeywordExecutable;
+import org.apache.accumulo.start.spi.CommandGroup;
+import org.apache.accumulo.start.spi.CommandGroups;
+
+import com.beust.jcommander.JCommander;
+
+public class ListBulk extends ServerKeywordExecutable<ServerOpts> {
+
+  public ListBulk() {
+    super(new ServerOpts());
+  }
+
+  @Override
+  public String keyword() {
+    return "list-bulk";
+  }
+
+  @Override
+  public CommandGroup commandGroup() {
+    return CommandGroups.INSTANCE;
+  }
+
+  @Override
+  public String description() {
+    return "List current bulk import operations";
+  }
+
+  @Override
+  public void execute(JCommander cl, ServerOpts options) throws Exception {
+    ServerContext context = getServerContext();
+    System.out.printf(" %-46s | %-8s | %-10s | %-7s | %-20s | %-20s\n", "FATE 
ID", "TABLE ID",
+        "STATE", "AGE", "SOURCE DIR", "DESTINATION DIR");
+    var now = Instant.now();
+    list(context, bs -> {
+      var elapsed = Duration.between(bs.lastUpdate, now);
+      System.out.printf(" %46s | %8s | %10s | %d:%02d:%02d | %20s | %20s\n", 
bs.fateId, bs.tableId,
+          bs.state, elapsed.toHours(), elapsed.toMinutesPart(), 
elapsed.toSecondsPart(),
+          bs.sourceDir, bs.destDir);
+    });
+  }
+
+  public enum BulkState {
+    PREPARING, MOVING, LOADING, REFRESHING, CLEANING
+  }
+
+  public record BulkStatus(FateId fateId, TableId tableId, String sourceDir, 
String destDir,
+      Instant lastUpdate, BulkState state) {
+  }
+
+  /**
+   * Gathers summary information about all running bulk import operations.
+   */
+  public static void list(ServerContext context, Consumer<BulkStatus> 
statusConsumer) {
+    var fateStore = new UserFateStore<>(context, 
SystemTables.FATE.tableName(), null, null);
+
+    try (var fateStream = fateStore.list(
+        EnumSet.of(ReadOnlyFateStore.TStatus.SUBMITTED, 
ReadOnlyFateStore.TStatus.IN_PROGRESS))) {
+      fateStream
+          .filter(fis -> fis.getFateOperation()
+              .map(op -> op == 
Fate.FateOperation.TABLE_BULK_IMPORT2).orElse(false))
+          .map(FateIdStatus::getFateId).flatMap(fateId -> getStatus(fateStore, 
fateId))
+          .forEach(statusConsumer);
+    }
+  }
+
+  private static Stream<BulkStatus> getStatus(UserFateStore<Object> fateStore, 
FateId fateId) {
+    var txStore = fateStore.read(fateId);
+    var top = txStore.top();
+    if (top == null) {
+      return Stream.of();
+    }
+
+    BulkFateOperation bfo;
+    if (top instanceof TraceRepo<Object>) {
+      var wrapped = ((TraceRepo<Object>) top).getWrapped();
+      if (wrapped instanceof BulkFateOperation) {
+        bfo = (BulkFateOperation) wrapped;
+      } else {
+        throw new IllegalStateException(
+            "Unknown fate operation class type " + 
wrapped.getClass().getName());
+      }
+    } else if (top instanceof BulkFateOperation) {
+      bfo = (BulkFateOperation) top;
+    } else {
+      throw new IllegalStateException(
+          "Unknown fate operation class type " + top.getClass().getName());
+    }
+
+    return Stream.of(new ListBulk.BulkStatus(fateId, bfo.getTableId(), 
bfo.getSourceDir(),
+        bfo.getDestDir(), bfo.getCreationTime(), bfo.getState()));
+  }
+
+}
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/FateServiceHandler.java
 
b/server/manager/src/main/java/org/apache/accumulo/manager/FateServiceHandler.java
index 6c31e9174b..f48ef33e19 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/FateServiceHandler.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/FateServiceHandler.java
@@ -73,9 +73,9 @@ import org.apache.accumulo.core.fate.Fate;
 import org.apache.accumulo.core.fate.FateId;
 import org.apache.accumulo.core.fate.FateInstanceType;
 import org.apache.accumulo.core.fate.ReadOnlyFateStore.TStatus;
+import org.apache.accumulo.core.fate.TraceRepo;
 import org.apache.accumulo.core.iteratorsImpl.IteratorConfigUtil;
 import org.apache.accumulo.core.manager.state.tables.TableState;
-import org.apache.accumulo.core.manager.thrift.BulkImportState;
 import org.apache.accumulo.core.manager.thrift.FateService;
 import org.apache.accumulo.core.manager.thrift.TFateId;
 import org.apache.accumulo.core.manager.thrift.TFateInstanceType;
@@ -87,7 +87,6 @@ import org.apache.accumulo.core.util.Validator;
 import org.apache.accumulo.core.util.tables.TableNameUtil;
 import org.apache.accumulo.core.volume.Volume;
 import org.apache.accumulo.manager.tableOps.ChangeTableState;
-import org.apache.accumulo.manager.tableOps.TraceRepo;
 import org.apache.accumulo.manager.tableOps.availability.LockTable;
 import org.apache.accumulo.manager.tableOps.bulkVer2.ComputeBulkRange;
 import org.apache.accumulo.manager.tableOps.clone.CloneTable;
@@ -673,8 +672,6 @@ class FateServiceHandler implements FateService.Iface {
           throw new ThriftSecurityException(c.getPrincipal(), 
SecurityErrorCode.PERMISSION_DENIED);
         }
 
-        manager.updateBulkImportStatus(dir, BulkImportState.INITIAL);
-
         goalMessage += "Bulk import (v2)  " + dir + " to " + tableName + "(" + 
tableId + ")";
         manager.fate(type).seedTransaction(op, fateId,
             new TraceRepo<>(new ComputeBulkRange(tableId, dir, setTime)), 
autoCleanup, goalMessage);
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java 
b/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java
index ec6df2d071..06f227967e 100644
--- a/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java
+++ b/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java
@@ -71,6 +71,7 @@ import org.apache.accumulo.core.fate.FateCleaner;
 import org.apache.accumulo.core.fate.FateId;
 import org.apache.accumulo.core.fate.FateInstanceType;
 import org.apache.accumulo.core.fate.FateStore;
+import org.apache.accumulo.core.fate.TraceRepo;
 import org.apache.accumulo.core.fate.user.UserFateStore;
 import org.apache.accumulo.core.fate.zookeeper.MetaFateStore;
 import org.apache.accumulo.core.fate.zookeeper.ZooReaderWriter;
@@ -87,7 +88,6 @@ import 
org.apache.accumulo.core.lock.ServiceLockPaths.ServiceLockPath;
 import org.apache.accumulo.core.lock.ServiceLockSupport.HAServiceLockWatcher;
 import org.apache.accumulo.core.logging.ConditionalLogger.DeduplicatingLogger;
 import org.apache.accumulo.core.manager.state.tables.TableState;
-import org.apache.accumulo.core.manager.thrift.BulkImportState;
 import org.apache.accumulo.core.manager.thrift.ManagerGoalState;
 import org.apache.accumulo.core.manager.thrift.ManagerMonitorInfo;
 import org.apache.accumulo.core.manager.thrift.ManagerState;
@@ -115,7 +115,6 @@ import org.apache.accumulo.manager.split.FileRangeCache;
 import org.apache.accumulo.manager.split.Splitter;
 import org.apache.accumulo.manager.state.TableCounts;
 import org.apache.accumulo.manager.tableOps.FateEnv;
-import org.apache.accumulo.manager.tableOps.TraceRepo;
 import org.apache.accumulo.manager.upgrade.UpgradeCoordinator;
 import org.apache.accumulo.manager.upgrade.UpgradeCoordinator.UpgradeStatus;
 import org.apache.accumulo.server.AbstractServer;
@@ -134,7 +133,6 @@ import 
org.apache.accumulo.server.security.delegation.AuthenticationTokenKeyMana
 import 
org.apache.accumulo.server.security.delegation.ZooAuthenticationKeyDistributor;
 import org.apache.accumulo.server.tables.TableManager;
 import org.apache.accumulo.server.util.ScanServerMetadataEntries;
-import org.apache.accumulo.server.util.ServerBulkImportStatus;
 import org.apache.accumulo.server.util.TableInfoUtil;
 import org.apache.thrift.TException;
 import org.apache.thrift.transport.TTransportException;
@@ -260,8 +258,6 @@ public class Manager extends AbstractServer implements 
LiveTServerSet.Listener,
     }
   }
 
-  final ServerBulkImportStatus bulkImportStatus = new ServerBulkImportStatus();
-
   private final long timeToCacheRecoveryWalExistence;
   private ExecutorService tableInformationStatusPool = null;
   private ThreadPoolExecutor tabletRefreshThreadPool;
@@ -1588,7 +1584,6 @@ public class Manager extends AbstractServer implements 
LiveTServerSet.Listener,
     }
     DeadServerList obit = new DeadServerList(getContext());
     result.deadTabletServers = obit.getList();
-    result.bulkImports = bulkImportStatus.getBulkLoadStatus();
     return result;
   }
 
@@ -1605,16 +1600,6 @@ public class Manager extends AbstractServer implements 
LiveTServerSet.Listener,
     }
   }
 
-  @Override
-  public void updateBulkImportStatus(String directory, BulkImportState state) {
-    
bulkImportStatus.updateBulkImportStatus(Collections.singletonList(directory), 
state);
-  }
-
-  @Override
-  public void removeBulkImportStatus(String directory) {
-    
bulkImportStatus.removeBulkImportStatus(Collections.singletonList(directory));
-  }
-
   /**
    * Return how long there has been a manager overseeing this cluster. This is 
an approximately
    * monotonic clock, which will be approximately consistent between different 
managers or different
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/ManagerClientServiceHandler.java
 
b/server/manager/src/main/java/org/apache/accumulo/manager/ManagerClientServiceHandler.java
index 6f8d284a24..1713dca592 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/ManagerClientServiceHandler.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/ManagerClientServiceHandler.java
@@ -61,6 +61,7 @@ import org.apache.accumulo.core.dataImpl.thrift.TKeyExtent;
 import org.apache.accumulo.core.fate.Fate;
 import org.apache.accumulo.core.fate.FateId;
 import org.apache.accumulo.core.fate.FateInstanceType;
+import org.apache.accumulo.core.fate.TraceRepo;
 import org.apache.accumulo.core.fate.zookeeper.ZooReaderWriter;
 import org.apache.accumulo.core.manager.state.tables.TableState;
 import org.apache.accumulo.core.manager.thrift.ManagerClientService;
@@ -82,7 +83,6 @@ import 
org.apache.accumulo.core.securityImpl.thrift.TDelegationToken;
 import org.apache.accumulo.core.securityImpl.thrift.TDelegationTokenConfig;
 import org.apache.accumulo.core.util.ByteBufferUtil;
 import org.apache.accumulo.manager.tableOps.FateEnv;
-import org.apache.accumulo.manager.tableOps.TraceRepo;
 import org.apache.accumulo.manager.tserverOps.ShutdownTServer;
 import org.apache.accumulo.server.ServerContext;
 import org.apache.accumulo.server.client.ClientServiceHandler;
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/merge/FindMergeableRangeTask.java
 
b/server/manager/src/main/java/org/apache/accumulo/manager/merge/FindMergeableRangeTask.java
index e4b39229ef..a59bee95ef 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/merge/FindMergeableRangeTask.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/merge/FindMergeableRangeTask.java
@@ -41,12 +41,12 @@ import org.apache.accumulo.core.dataImpl.KeyExtent;
 import org.apache.accumulo.core.fate.Fate.FateOperation;
 import org.apache.accumulo.core.fate.FateInstanceType;
 import org.apache.accumulo.core.fate.FateKey;
+import org.apache.accumulo.core.fate.TraceRepo;
 import org.apache.accumulo.core.metadata.schema.TabletMetadata;
 import org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType;
 import org.apache.accumulo.core.metadata.schema.filters.TabletMetadataFilter;
 import org.apache.accumulo.core.util.time.SteadyTime;
 import org.apache.accumulo.manager.Manager;
-import org.apache.accumulo.manager.tableOps.TraceRepo;
 import org.apache.accumulo.manager.tableOps.merge.MergeInfo.Operation;
 import org.apache.accumulo.manager.tableOps.merge.TableRangeOp;
 import org.apache.commons.lang3.StringUtils;
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/FateEnv.java
 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/FateEnv.java
index e8e0085e3d..f64b3851ae 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/FateEnv.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/FateEnv.java
@@ -22,7 +22,6 @@ import java.util.Set;
 import java.util.concurrent.ExecutorService;
 
 import org.apache.accumulo.core.lock.ServiceLock;
-import org.apache.accumulo.core.manager.thrift.BulkImportState;
 import org.apache.accumulo.core.metadata.TServerInstance;
 import org.apache.accumulo.core.metadata.schema.ExternalCompactionId;
 import org.apache.accumulo.core.util.time.SteadyTime;
@@ -45,10 +44,6 @@ public interface FateEnv {
 
   VolumeManager getVolumeManager();
 
-  void updateBulkImportStatus(String string, BulkImportState bulkImportState);
-
-  void removeBulkImportStatus(String sourceDir);
-
   ServiceLock getServiceLock();
 
   SteadyTime getSteadyTime();
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java
 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/AbstractBulkFateOperation.java
similarity index 55%
copy from 
server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java
copy to 
server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/AbstractBulkFateOperation.java
index 3ab809b89d..a91520ad7d 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/AbstractBulkFateOperation.java
@@ -18,22 +18,42 @@
  */
 package org.apache.accumulo.manager.tableOps.bulkVer2;
 
-import java.io.Serializable;
+import java.time.Instant;
 
 import org.apache.accumulo.core.data.TableId;
+import org.apache.accumulo.manager.tableOps.AbstractFateOperation;
+import org.apache.accumulo.server.util.bulkCommand.BulkFateOperation;
+
+public abstract class AbstractBulkFateOperation extends AbstractFateOperation
+    implements BulkFateOperation {
 
-/**
- * Package private class to hold all the information used for bulk import2
- */
-class BulkInfo implements Serializable {
   private static final long serialVersionUID = 1L;
 
-  TableId tableId;
-  String sourceDir;
-  String bulkDir;
-  boolean setTime;
-  // firstSplit and lastSplit describe the min and max splits in the table 
that overlap the bulk
-  // imported data
-  byte[] firstSplit;
-  byte[] lastSplit;
+  protected final BulkInfo bulkInfo;
+  private final Instant creation;
+
+  AbstractBulkFateOperation(BulkInfo bulkInfo) {
+    this.bulkInfo = bulkInfo;
+    this.creation = Instant.now();
+  }
+
+  @Override
+  public TableId getTableId() {
+    return bulkInfo.tableId;
+  }
+
+  @Override
+  public String getSourceDir() {
+    return bulkInfo.sourceDir;
+  }
+
+  @Override
+  public String getDestDir() {
+    return bulkInfo.bulkDir;
+  }
+
+  @Override
+  public Instant getCreationTime() {
+    return creation;
+  }
 }
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkImportMove.java
 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkImportMove.java
index be562273ba..d86b270192 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkImportMove.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkImportMove.java
@@ -29,10 +29,9 @@ import 
org.apache.accumulo.core.clientImpl.thrift.TableOperationExceptionType;
 import org.apache.accumulo.core.fate.FateId;
 import org.apache.accumulo.core.fate.Repo;
 import org.apache.accumulo.core.logging.BulkLogger;
-import org.apache.accumulo.core.manager.thrift.BulkImportState;
-import org.apache.accumulo.manager.tableOps.AbstractFateOperation;
 import org.apache.accumulo.manager.tableOps.FateEnv;
 import org.apache.accumulo.server.fs.VolumeManager;
+import org.apache.accumulo.server.util.bulkCommand.ListBulk.BulkState;
 import org.apache.hadoop.fs.Path;
 
 /**
@@ -50,14 +49,12 @@ import org.apache.hadoop.fs.Path;
  * about the request. To prevent problems like this, an Arbitrator is used. 
Before starting any new
  * request, the tablet server checks the Arbitrator to see if the request is 
still valid.
  */
-class BulkImportMove extends AbstractFateOperation {
+class BulkImportMove extends AbstractBulkFateOperation {
 
   private static final long serialVersionUID = 1L;
 
-  private final BulkInfo bulkInfo;
-
   public BulkImportMove(BulkInfo bulkInfo) {
-    this.bulkInfo = bulkInfo;
+    super(bulkInfo);
   }
 
   @Override
@@ -68,7 +65,6 @@ class BulkImportMove extends AbstractFateOperation {
     VolumeManager fs = env.getVolumeManager();
 
     try {
-      env.updateBulkImportStatus(sourceDir.toString(), BulkImportState.MOVING);
       Map<String,String> oldToNewNameMap =
           BulkSerialize.readRenameMap(bulkDir.toString(), fs::open);
       moveFiles(fateId, sourceDir, bulkDir, env, fs, oldToNewNameMap);
@@ -104,4 +100,9 @@ class BulkImportMove extends AbstractFateOperation {
           ioe.getCause().getMessage());
     }
   }
+
+  @Override
+  public BulkState getState() {
+    return BulkState.MOVING;
+  }
 }
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java
 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java
index 3ab809b89d..47bfc4c432 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkInfo.java
@@ -36,4 +36,12 @@ class BulkInfo implements Serializable {
   // imported data
   byte[] firstSplit;
   byte[] lastSplit;
+
+  static BulkInfo create(TableId tableId, String sourceDir, boolean setTime) {
+    BulkInfo info = new BulkInfo();
+    info.tableId = tableId;
+    info.sourceDir = sourceDir;
+    info.setTime = setTime;
+    return info;
+  }
 }
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/CleanUpBulkImport.java
 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/CleanUpBulkImport.java
index f22127d962..b9229bf8f6 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/CleanUpBulkImport.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/CleanUpBulkImport.java
@@ -32,52 +32,48 @@ import org.apache.accumulo.core.fate.Repo;
 import org.apache.accumulo.core.fate.zookeeper.LockRange;
 import org.apache.accumulo.core.gc.ReferenceFile;
 import org.apache.accumulo.core.logging.BulkLogger;
-import org.apache.accumulo.core.manager.thrift.BulkImportState;
 import org.apache.accumulo.core.metadata.schema.Ample;
 import org.apache.accumulo.core.metadata.schema.Ample.ConditionalResult.Status;
 import org.apache.accumulo.core.metadata.schema.TabletMetadata;
 import org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType;
 import org.apache.accumulo.core.util.Retry;
-import org.apache.accumulo.manager.tableOps.AbstractFateOperation;
 import org.apache.accumulo.manager.tableOps.FateEnv;
 import org.apache.accumulo.manager.tableOps.Utils;
+import org.apache.accumulo.server.util.bulkCommand.ListBulk.BulkState;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.Text;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class CleanUpBulkImport extends AbstractFateOperation {
+public class CleanUpBulkImport extends AbstractBulkFateOperation {
 
   private static final long serialVersionUID = 1L;
 
   private static final Logger log = 
LoggerFactory.getLogger(CleanUpBulkImport.class);
 
-  private final BulkInfo info;
-
   public CleanUpBulkImport(BulkInfo info) {
-    this.info = info;
+    super(info);
   }
 
   @Override
   public Repo<FateEnv> call(FateId fateId, FateEnv env) throws Exception {
-    env.updateBulkImportStatus(info.sourceDir, BulkImportState.CLEANUP);
-    log.debug("{} removing the bulkDir processing flag file in {}", fateId, 
info.bulkDir);
+    log.debug("{} removing the bulkDir processing flag file in {}", fateId, 
bulkInfo.bulkDir);
     Ample ample = env.getContext().getAmple();
-    Path bulkDir = new Path(info.bulkDir);
+    Path bulkDir = new Path(bulkInfo.bulkDir);
     ample.removeBulkLoadInProgressFlag(
         "/" + bulkDir.getParent().getName() + "/" + bulkDir.getName());
-    ample.putGcFileAndDirCandidates(info.tableId,
-        Collections.singleton(ReferenceFile.forFile(info.tableId, bulkDir)));
+    ample.putGcFileAndDirCandidates(bulkInfo.tableId,
+        Collections.singleton(ReferenceFile.forFile(bulkInfo.tableId, 
bulkDir)));
 
-    Text firstSplit = info.firstSplit == null ? null : new 
Text(info.firstSplit);
-    Text lastSplit = info.lastSplit == null ? null : new Text(info.lastSplit);
+    Text firstSplit = bulkInfo.firstSplit == null ? null : new 
Text(bulkInfo.firstSplit);
+    Text lastSplit = bulkInfo.lastSplit == null ? null : new 
Text(bulkInfo.lastSplit);
 
     log.debug("{} removing the metadata table markers for loaded files in 
range {} {}", fateId,
         firstSplit, lastSplit);
-    removeBulkLoadEntries(ample, info.tableId, fateId, firstSplit, lastSplit);
+    removeBulkLoadEntries(ample, bulkInfo.tableId, fateId, firstSplit, 
lastSplit);
 
-    Utils.unreserveHdfsDirectory(env.getContext(), info.sourceDir, fateId);
-    Utils.getReadLock(env.getContext(), info.tableId, fateId, 
LockRange.infinite()).unlock();
+    Utils.unreserveHdfsDirectory(env.getContext(), bulkInfo.sourceDir, fateId);
+    Utils.getReadLock(env.getContext(), bulkInfo.tableId, fateId, 
LockRange.infinite()).unlock();
     // delete json renames and mapping files
     Path renamingFile = new Path(bulkDir, Constants.BULK_RENAME_FILE);
     Path mappingFile = new Path(bulkDir, Constants.BULK_LOAD_MAPPING);
@@ -89,7 +85,6 @@ public class CleanUpBulkImport extends AbstractFateOperation {
     }
 
     log.debug("completing bulkDir import transaction " + fateId);
-    env.removeBulkImportStatus(info.sourceDir);
     return null;
   }
 
@@ -145,4 +140,9 @@ public class CleanUpBulkImport extends 
AbstractFateOperation {
       }
     }
   }
+
+  @Override
+  public BulkState getState() {
+    return BulkState.CLEANING;
+  }
 }
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/ComputeBulkRange.java
 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/ComputeBulkRange.java
index 3eab86672a..afdc169764 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/ComputeBulkRange.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/ComputeBulkRange.java
@@ -26,27 +26,21 @@ import org.apache.accumulo.core.data.TableId;
 import org.apache.accumulo.core.dataImpl.KeyExtent;
 import org.apache.accumulo.core.fate.FateId;
 import org.apache.accumulo.core.fate.Repo;
-import org.apache.accumulo.manager.tableOps.AbstractFateOperation;
 import org.apache.accumulo.manager.tableOps.FateEnv;
 import org.apache.accumulo.server.fs.VolumeManager;
+import org.apache.accumulo.server.util.bulkCommand.ListBulk.BulkState;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.Text;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ComputeBulkRange extends AbstractFateOperation {
+public class ComputeBulkRange extends AbstractBulkFateOperation {
   private static final long serialVersionUID = 1L;
 
   private static final Logger log = 
LoggerFactory.getLogger(ComputeBulkRange.class);
 
-  private final BulkInfo bulkInfo;
-
   public ComputeBulkRange(TableId tableId, String sourceDir, boolean setTime) {
-    BulkInfo info = new BulkInfo();
-    info.tableId = tableId;
-    info.sourceDir = sourceDir;
-    info.setTime = setTime;
-    this.bulkInfo = info;
+    super(BulkInfo.create(tableId, sourceDir, setTime));
   }
 
   @Override
@@ -72,4 +66,9 @@ public class ComputeBulkRange extends AbstractFateOperation {
       return new PrepBulkImport(bulkInfo);
     }
   }
+
+  @Override
+  public BulkState getState() {
+    return BulkState.PREPARING;
+  }
 }
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 dae7fe4b2f..75c71f0222 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
@@ -50,7 +50,6 @@ import org.apache.accumulo.core.dataImpl.thrift.TKeyExtent;
 import org.apache.accumulo.core.fate.FateId;
 import org.apache.accumulo.core.fate.Repo;
 import org.apache.accumulo.core.logging.TabletLogger;
-import org.apache.accumulo.core.manager.thrift.BulkImportState;
 import org.apache.accumulo.core.metadata.ReferencedTabletFile;
 import org.apache.accumulo.core.metadata.StoredTabletFile;
 import org.apache.accumulo.core.metadata.TabletFile;
@@ -66,10 +65,10 @@ import 
org.apache.accumulo.core.tabletserver.thrift.TabletServerClientService;
 import org.apache.accumulo.core.trace.TraceUtil;
 import org.apache.accumulo.core.util.PeekingIterator;
 import org.apache.accumulo.core.util.Timer;
-import org.apache.accumulo.manager.tableOps.AbstractFateOperation;
 import org.apache.accumulo.manager.tableOps.FateEnv;
 import org.apache.accumulo.server.fs.VolumeManager;
 import org.apache.accumulo.server.tablets.TabletTime;
+import org.apache.accumulo.server.util.bulkCommand.ListBulk.BulkState;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.Text;
 import org.apache.thrift.TException;
@@ -83,7 +82,7 @@ import com.google.common.net.HostAndPort;
  * Make asynchronous load calls to each overlapping Tablet. This RepO does its 
work on the isReady
  * and will return a linear sleep value based on the largest number of Tablets 
on a TabletServer.
  */
-class LoadFiles extends AbstractFateOperation {
+class LoadFiles extends AbstractBulkFateOperation {
 
   // visible for testing
   interface TabletsMetadataFactory {
@@ -96,10 +95,8 @@ class LoadFiles extends AbstractFateOperation {
 
   private static final Logger log = LoggerFactory.getLogger(LoadFiles.class);
 
-  private final BulkInfo bulkInfo;
-
   public LoadFiles(BulkInfo bulkInfo) {
-    this.bulkInfo = bulkInfo;
+    super(bulkInfo);
   }
 
   @Override
@@ -112,7 +109,6 @@ class LoadFiles extends AbstractFateOperation {
     }
     VolumeManager fs = env.getVolumeManager();
     final Path bulkDir = new Path(bulkInfo.bulkDir);
-    env.updateBulkImportStatus(bulkInfo.sourceDir, BulkImportState.LOADING);
     try (LoadMappingIterator lmi =
         BulkSerialize.getUpdatedLoadMapping(bulkDir.toString(), 
bulkInfo.tableId, fs::open)) {
 
@@ -525,4 +521,9 @@ class LoadFiles extends AbstractFateOperation {
       throw ne2;
     }
   }
+
+  @Override
+  public BulkState getState() {
+    return BulkState.LOADING;
+  }
 }
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/PrepBulkImport.java
 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/PrepBulkImport.java
index 78a2303318..c6e62c975e 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/PrepBulkImport.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/PrepBulkImport.java
@@ -51,12 +51,12 @@ import org.apache.accumulo.core.logging.BulkLogger;
 import org.apache.accumulo.core.metadata.schema.TabletMetadata;
 import org.apache.accumulo.core.metadata.schema.TabletsMetadata;
 import org.apache.accumulo.core.util.PeekingIterator;
-import org.apache.accumulo.manager.tableOps.AbstractFateOperation;
 import org.apache.accumulo.manager.tableOps.FateEnv;
 import org.apache.accumulo.manager.tableOps.Utils;
 import org.apache.accumulo.server.ServerContext;
 import org.apache.accumulo.server.fs.VolumeManager;
 import org.apache.accumulo.server.tablets.UniqueNameAllocator;
+import org.apache.accumulo.server.util.bulkCommand.ListBulk.BulkState;
 import org.apache.commons.io.FilenameUtils;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.Path;
@@ -75,16 +75,14 @@ import com.google.common.annotations.VisibleForTesting;
  *
  * @since 2.0.0
  */
-public class PrepBulkImport extends AbstractFateOperation {
+public class PrepBulkImport extends AbstractBulkFateOperation {
 
   private static final long serialVersionUID = 1L;
 
   private static final Logger log = 
LoggerFactory.getLogger(PrepBulkImport.class);
 
-  private final BulkInfo bulkInfo;
-
   public PrepBulkImport(BulkInfo info) {
-    this.bulkInfo = info;
+    super(info);
   }
 
   @Override
@@ -103,6 +101,11 @@ public class PrepBulkImport extends AbstractFateOperation {
     return Utils.reserveHdfsDirectory(env.getContext(), bulkInfo.sourceDir, 
fateId);
   }
 
+  @Override
+  public BulkState getState() {
+    return BulkState.PREPARING;
+  }
+
   @VisibleForTesting
   interface TabletIterFactory extends AutoCloseable {
     Iterator<KeyExtent> newTabletIter(Text startRow);
@@ -325,6 +328,5 @@ public class PrepBulkImport extends AbstractFateOperation {
     Utils.unreserveHdfsDirectory(environment.getContext(), bulkInfo.sourceDir, 
fateId);
     Utils.getReadLock(environment.getContext(), bulkInfo.tableId, fateId, 
LockRange.infinite())
         .unlock();
-    environment.removeBulkImportStatus(bulkInfo.sourceDir);
   }
 }
diff --git 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/RefreshTablets.java
 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/RefreshTablets.java
index 477eac1976..0c3d042a24 100644
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/RefreshTablets.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/RefreshTablets.java
@@ -20,8 +20,8 @@ package org.apache.accumulo.manager.tableOps.bulkVer2;
 
 import org.apache.accumulo.core.fate.FateId;
 import org.apache.accumulo.core.fate.Repo;
-import org.apache.accumulo.manager.tableOps.AbstractFateOperation;
 import org.apache.accumulo.manager.tableOps.FateEnv;
+import org.apache.accumulo.server.util.bulkCommand.ListBulk.BulkState;
 
 /**
  * This Repo asks hosted tablets that were bulk loaded into to refresh their 
metadata. It works by
@@ -30,14 +30,12 @@ import org.apache.accumulo.manager.tableOps.FateEnv;
  * location its ok. That means the tablet either unloaded before of after the 
snapshot. In either
  * case the tablet will see the bulk files the next time its hosted somewhere.
  */
-public class RefreshTablets extends AbstractFateOperation {
+public class RefreshTablets extends AbstractBulkFateOperation {
 
   private static final long serialVersionUID = 1L;
 
-  private final BulkInfo bulkInfo;
-
   public RefreshTablets(BulkInfo bulkInfo) {
-    this.bulkInfo = bulkInfo;
+    super(bulkInfo);
   }
 
   @Override
@@ -53,4 +51,9 @@ public class RefreshTablets extends AbstractFateOperation {
 
     return new CleanUpBulkImport(bulkInfo);
   }
+
+  @Override
+  public BulkState getState() {
+    return BulkState.REFRESHING;
+  }
 }
diff --git 
a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/bulkImports/BulkImportInformation.java
 
b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/bulkImports/BulkImportInformation.java
index 39ed451884..0919751070 100644
--- 
a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/bulkImports/BulkImportInformation.java
+++ 
b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/bulkImports/BulkImportInformation.java
@@ -18,7 +18,7 @@
  */
 package org.apache.accumulo.monitor.rest.bulkImports;
 
-import org.apache.accumulo.core.manager.thrift.BulkImportState;
+import org.apache.accumulo.server.util.bulkCommand.ListBulk;
 
 /**
  * Stores bulk import in a JSON object
@@ -30,7 +30,7 @@ public class BulkImportInformation {
   // Variable names become JSON key
   public String filename;
   public long age;
-  public BulkImportState state;
+  public ListBulk.BulkState state;
 
   public BulkImportInformation() {}
 
@@ -41,7 +41,7 @@ public class BulkImportInformation {
    * @param age age of the bulk import
    * @param state state of the bulk import
    */
-  public BulkImportInformation(String filename, long age, BulkImportState 
state) {
+  public BulkImportInformation(String filename, long age, ListBulk.BulkState 
state) {
     this.filename = filename;
     this.age = age;
     this.state = state;
diff --git 
a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/bulkImports/BulkImportResource.java
 
b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/bulkImports/BulkImportResource.java
index 2a5cdf9cc7..7eea08ed31 100644
--- 
a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/bulkImports/BulkImportResource.java
+++ 
b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/bulkImports/BulkImportResource.java
@@ -24,9 +24,8 @@ import jakarta.ws.rs.Path;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
 
-import org.apache.accumulo.core.manager.thrift.BulkImportStatus;
-import org.apache.accumulo.core.manager.thrift.ManagerMonitorInfo;
 import org.apache.accumulo.monitor.Monitor;
+import org.apache.accumulo.server.util.bulkCommand.ListBulk;
 
 /**
  * The BulkImportResource is responsible for obtaining the information of the 
bulk import, and
@@ -49,16 +48,10 @@ public class BulkImportResource {
   @GET
   public BulkImport getTables() {
     BulkImport bulkImport = new BulkImport();
-    ManagerMonitorInfo mmi = monitor.getMmi();
-    if (mmi == null) {
-      return bulkImport;
-    }
-
-    // Generating Bulk Import and adding it to the return object
-    for (BulkImportStatus bulk : mmi.bulkImports) {
-      bulkImport
-          .addBulkImport(new BulkImportInformation(bulk.filename, 
bulk.startTime, bulk.state));
-    }
+    ListBulk.list(monitor.getContext(), bulkStatus -> {
+      bulkImport.addBulkImport(new 
BulkImportInformation(bulkStatus.sourceDir(),
+          bulkStatus.lastUpdate().toEpochMilli(), bulkStatus.state()));
+    });
 
     return bulkImport;
   }
diff --git a/shell/pom.xml b/shell/pom.xml
index 656d9bfb39..23afddc6bd 100644
--- a/shell/pom.xml
+++ b/shell/pom.xml
@@ -82,10 +82,6 @@
       <groupId>org.apache.hadoop</groupId>
       <artifactId>hadoop-client-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.thrift</groupId>
-      <artifactId>libthrift</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.jline</groupId>
       <artifactId>jline</artifactId>
diff --git a/shell/src/main/java/org/apache/accumulo/shell/Shell.java 
b/shell/src/main/java/org/apache/accumulo/shell/Shell.java
index f1b939889b..a1ad2f73db 100644
--- a/shell/src/main/java/org/apache/accumulo/shell/Shell.java
+++ b/shell/src/main/java/org/apache/accumulo/shell/Shell.java
@@ -131,7 +131,6 @@ import 
org.apache.accumulo.shell.commands.ImportDirectoryCommand;
 import org.apache.accumulo.shell.commands.ImportTableCommand;
 import org.apache.accumulo.shell.commands.InfoCommand;
 import org.apache.accumulo.shell.commands.InsertCommand;
-import org.apache.accumulo.shell.commands.ListBulkCommand;
 import org.apache.accumulo.shell.commands.ListCompactionsCommand;
 import org.apache.accumulo.shell.commands.ListIterCommand;
 import org.apache.accumulo.shell.commands.ListResourceGroupsCommand;
@@ -384,7 +383,7 @@ public class Shell extends 
ClientKeywordExecutable<ShellOptionsJC> {
         new InsertCommand(), new MaxRowCommand(), new ScanCommand()};
     Command[] debuggingCommands =
         {new ClasspathCommand(), new ListScansCommand(), new 
ListCompactionsCommand(),
-            new TraceCommand(), new PingCommand(), new ListBulkCommand(), new 
ListTabletsCommand()};
+            new TraceCommand(), new PingCommand(), new ListTabletsCommand()};
     Command[] execCommands = {new ExecfileCommand(), new HistoryCommand(), new 
ExtensionCommand()};
     Command[] exitCommands = {new ByeCommand(), new ExitCommand(), new 
QuitCommand()};
     Command[] helpCommands =
diff --git 
a/shell/src/main/java/org/apache/accumulo/shell/commands/BulkImportListIterator.java
 
b/shell/src/main/java/org/apache/accumulo/shell/commands/BulkImportListIterator.java
deleted file mode 100644
index 2243292566..0000000000
--- 
a/shell/src/main/java/org/apache/accumulo/shell/commands/BulkImportListIterator.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.accumulo.shell.commands;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.accumulo.core.manager.thrift.BulkImportStatus;
-import org.apache.accumulo.core.manager.thrift.ManagerMonitorInfo;
-import org.apache.accumulo.core.util.DurationFormat;
-
-public class BulkImportListIterator implements Iterator<String> {
-
-  private final Iterator<String> iter;
-
-  public BulkImportListIterator(ManagerMonitorInfo stats) {
-    List<String> result = new ArrayList<>();
-    for (BulkImportStatus status : stats.getBulkImports()) {
-      result.add(format(status));
-    }
-    iter = result.iterator();
-  }
-
-  private String format(BulkImportStatus status) {
-    long diff = System.currentTimeMillis() - status.startTime;
-    var dur = new DurationFormat(diff, " ");
-    return String.format("%25s | %4s | %s", status.filename, dur, 
status.state);
-  }
-
-  @Override
-  public boolean hasNext() {
-    return iter.hasNext();
-  }
-
-  @Override
-  public String next() {
-    return iter.next();
-  }
-
-  @Override
-  public void remove() {
-    iter.remove();
-  }
-
-}
diff --git 
a/shell/src/main/java/org/apache/accumulo/shell/commands/ListBulkCommand.java 
b/shell/src/main/java/org/apache/accumulo/shell/commands/ListBulkCommand.java
deleted file mode 100644
index 117747c495..0000000000
--- 
a/shell/src/main/java/org/apache/accumulo/shell/commands/ListBulkCommand.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.accumulo.shell.commands;
-
-import org.apache.accumulo.core.clientImpl.ClientContext;
-import org.apache.accumulo.core.manager.thrift.ManagerMonitorInfo;
-import org.apache.accumulo.core.rpc.clients.ThriftClientTypes;
-import org.apache.accumulo.core.trace.TraceUtil;
-import org.apache.accumulo.shell.Shell;
-import org.apache.accumulo.shell.Shell.Command;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.Options;
-
-public class ListBulkCommand extends Command {
-
-  private Option tserverOption;
-  private Option disablePaginationOpt;
-
-  @Override
-  public String description() {
-    return "lists what bulk imports are currently running in accumulo.";
-  }
-
-  @Override
-  public int execute(final String fullCommand, final CommandLine cl, final 
Shell shellState)
-      throws Exception {
-
-    ClientContext context = shellState.getContext();
-    ManagerMonitorInfo stats = ThriftClientTypes.MANAGER.execute(context,
-        client -> client.getManagerStats(TraceUtil.traceInfo(), 
context.rpcCreds()));
-
-    final boolean paginate = !cl.hasOption(disablePaginationOpt.getOpt());
-
-    if (cl.hasOption(tserverOption.getOpt())) {
-      shellState.getWriter().print(tserverOption.getOpt()
-          + " option is deprecated and will be removed in a future 
release.\n");
-      shellState.getWriter().flush();
-    }
-
-    shellState.printLines(new BulkImportListIterator(stats), paginate);
-    return 0;
-  }
-
-  @Override
-  public int numArgs() {
-    return 0;
-  }
-
-  @Override
-  public Options getOptions() {
-    final Options opts = new Options();
-
-    tserverOption = new Option("ts", "tabletServer", true, "tablet server to 
list bulk imports");
-    tserverOption.setArgName("tablet server");
-    opts.addOption(tserverOption);
-
-    disablePaginationOpt = new Option("np", "no-pagination", false, "disable 
pagination of output");
-    opts.addOption(disablePaginationOpt);
-
-    return opts;
-  }
-
-}
diff --git 
a/shell/src/test/java/org/apache/accumulo/shell/commands/ListBulkCommandTest.java
 
b/shell/src/test/java/org/apache/accumulo/shell/commands/ListBulkCommandTest.java
deleted file mode 100644
index 86dee19ff6..0000000000
--- 
a/shell/src/test/java/org/apache/accumulo/shell/commands/ListBulkCommandTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.accumulo.shell.commands;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.accumulo.core.manager.thrift.BulkImportState;
-import org.apache.accumulo.core.manager.thrift.BulkImportStatus;
-import org.apache.accumulo.core.manager.thrift.ManagerMonitorInfo;
-import org.junit.jupiter.api.Test;
-
-public class ListBulkCommandTest {
-
-  /**
-   * Test the iterator used by BulkCommand prints correctly
-   */
-  @Test
-  public void testBulkImportListIterator() {
-    ManagerMonitorInfo mmi = createMock(ManagerMonitorInfo.class);
-    List<BulkImportStatus> bulkImports = new ArrayList<>();
-
-    // tserver 1
-    var bis1 = new BulkImportStatus();
-    bis1.filename = "file1";
-    bis1.startTime = System.currentTimeMillis();
-    bis1.state = BulkImportState.COPY_FILES;
-
-    // tserver 2
-    var bis2 = new BulkImportStatus();
-    bis2.filename = "file2";
-    bis2.startTime = System.currentTimeMillis();
-    bis2.state = BulkImportState.LOADING;
-
-    bulkImports.add(bis1);
-    bulkImports.add(bis2);
-
-    expect(mmi.getBulkImports()).andReturn(bulkImports).once();
-
-    replay(mmi);
-
-    var iter = new BulkImportListIterator(mmi);
-    List<String> printed = printLines(iter);
-
-    assertTrue(printed.get(0).stripLeading().startsWith("file1"));
-    assertTrue(printed.get(0).endsWith("COPY_FILES"));
-    assertTrue(printed.get(1).stripLeading().startsWith("file2"));
-    assertTrue(printed.get(1).endsWith("LOADING"));
-
-    verify(mmi);
-  }
-
-  private List<String> printLines(Iterator<String> lines) {
-    List<String> printed = new ArrayList<>();
-
-    while (lines.hasNext()) {
-      String nextLine = lines.next();
-      if (nextLine == null) {
-        continue;
-      }
-      printed.add(nextLine);
-    }
-    return printed;
-  }
-}
diff --git a/test/src/main/java/org/apache/accumulo/test/GetManagerStats.java 
b/test/src/main/java/org/apache/accumulo/test/GetManagerStats.java
index 21ff2e03a9..17482ab291 100644
--- a/test/src/main/java/org/apache/accumulo/test/GetManagerStats.java
+++ b/test/src/main/java/org/apache/accumulo/test/GetManagerStats.java
@@ -23,7 +23,6 @@ import java.util.Date;
 import java.util.Map.Entry;
 
 import org.apache.accumulo.core.conf.SiteConfiguration;
-import org.apache.accumulo.core.manager.thrift.BulkImportStatus;
 import org.apache.accumulo.core.manager.thrift.DeadServer;
 import org.apache.accumulo.core.manager.thrift.ManagerMonitorInfo;
 import org.apache.accumulo.core.manager.thrift.RecoveryStatus;
@@ -62,12 +61,6 @@ public class GetManagerStats {
       out(2, "Last report: %s", new SimpleDateFormat().format(new 
Date(dead.lastStatus)));
       out(2, "Cause: %s", dead.status);
     }
-    out(0, "Bulk imports: %s", stats.bulkImports.size());
-    for (BulkImportStatus bulk : stats.bulkImports) {
-      out(1, "Import directory: %s", bulk.filename);
-      out(2, "Bulk state %s", bulk.state);
-      out(2, "Bulk start %s", bulk.startTime);
-    }
     if (stats.tableMap != null && !stats.tableMap.isEmpty()) {
       out(0, "Tables");
       for (Entry<String,TableInfo> entry : stats.tableMap.entrySet()) {
@@ -117,13 +110,6 @@ public class GetManagerStats {
           out(3, "Progress: %.2f%%", sort.progress * 100);
           out(3, "Time running: %s", sort.runtime / 1000.);
         }
-        out(3, "Bulk imports: %s", stats.bulkImports.size());
-        for (BulkImportStatus bulk : stats.bulkImports) {
-          out(4, "Import file: %s", bulk.filename);
-          out(5, "Bulk state %s", bulk.state);
-          out(5, "Bulk start %s", bulk.startTime);
-        }
-
       }
     }
   }
diff --git 
a/test/src/main/java/org/apache/accumulo/test/fate/FlakyFateManager.java 
b/test/src/main/java/org/apache/accumulo/test/fate/FlakyFateManager.java
index d8ea957834..be9a21c735 100644
--- a/test/src/main/java/org/apache/accumulo/test/fate/FlakyFateManager.java
+++ b/test/src/main/java/org/apache/accumulo/test/fate/FlakyFateManager.java
@@ -23,9 +23,9 @@ import java.io.IOException;
 import org.apache.accumulo.core.cli.ServerOpts;
 import org.apache.accumulo.core.fate.Fate;
 import org.apache.accumulo.core.fate.FateStore;
+import org.apache.accumulo.core.fate.TraceRepo;
 import org.apache.accumulo.manager.Manager;
 import org.apache.accumulo.manager.tableOps.FateEnv;
-import org.apache.accumulo.manager.tableOps.TraceRepo;
 import org.apache.accumulo.server.ServerContext;
 import org.slf4j.LoggerFactory;
 
diff --git 
a/test/src/main/java/org/apache/accumulo/test/fate/SlowFateSplitManager.java 
b/test/src/main/java/org/apache/accumulo/test/fate/SlowFateSplitManager.java
index 1b68fec1c8..b33a47044a 100644
--- a/test/src/main/java/org/apache/accumulo/test/fate/SlowFateSplitManager.java
+++ b/test/src/main/java/org/apache/accumulo/test/fate/SlowFateSplitManager.java
@@ -23,9 +23,9 @@ import java.io.IOException;
 import org.apache.accumulo.core.cli.ServerOpts;
 import org.apache.accumulo.core.fate.Fate;
 import org.apache.accumulo.core.fate.FateStore;
+import org.apache.accumulo.core.fate.TraceRepo;
 import org.apache.accumulo.manager.Manager;
 import org.apache.accumulo.manager.tableOps.FateEnv;
-import org.apache.accumulo.manager.tableOps.TraceRepo;
 import org.apache.accumulo.server.ServerContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

Reply via email to