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

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

commit 359c745c1611c3b083bd8c40625de99767bffaf8
Merge: 4182fa84c0 65b3fe8276
Author: Daniel Roberts ddanielr <ddani...@gmail.com>
AuthorDate: Tue Mar 11 21:44:08 2025 +0000

    Merge branch '2.1' into 3.1

 .../core/manager/balancer/BalanceParamsImpl.java   |  19 +-
 .../accumulo/core/spi/balancer/GroupBalancer.java  |  10 +-
 .../spi/balancer/HostRegexTableLoadBalancer.java   |  11 +-
 .../core/spi/balancer/TableLoadBalancer.java       |   4 +-
 .../accumulo/core/spi/balancer/TabletBalancer.java |  10 +-
 .../core/spi/balancer/GroupBalancerTest.java       |   6 +-
 ...tRegexTableLoadBalancerReconfigurationTest.java |   6 +-
 .../balancer/HostRegexTableLoadBalancerTest.java   |  16 +-
 .../core/spi/balancer/SimpleLoadBalancerTest.java  |   4 +-
 .../core/spi/balancer/TableLoadBalancerTest.java   |   4 +-
 .../server/manager/state/CurrentState.java         |   3 +-
 .../server/manager/state/MetaDataStateStore.java   |  15 +-
 .../server/manager/state/MetaDataTableScanner.java |  15 +-
 .../server/manager/state/RootTabletStateStore.java |  43 ----
 .../server/manager/state/TabletStateStore.java     |   7 +-
 .../accumulo/server/util/FindOfflineTablets.java   |  15 +-
 .../java/org/apache/accumulo/manager/Manager.java  |  64 ++----
 .../manager/ManagerClientServiceHandler.java       |   2 +-
 .../org/apache/accumulo/manager/Migrations.java    | 138 +++++++++++++
 .../accumulo/manager/TabletGroupWatcher.java       |   8 +-
 .../apache/accumulo/manager/state/MergeStats.java  |   3 +-
 .../accumulo/manager/tableOps/delete/CleanUp.java  |   3 +-
 .../apache/accumulo/manager/MigrationsTest.java    | 229 +++++++++++++++++++++
 .../monitor/rest/tables/TablesResource.java        |   5 +-
 .../test/functional/AssignLocationModeIT.java      |   9 +-
 .../test/functional/CompactLocationModeIT.java     |  10 +-
 .../test/functional/ManagerAssignmentIT.java       |   9 +-
 .../functional/TabletStateChangeIteratorIT.java    |   9 +-
 .../apache/accumulo/test/manager/MergeStateIT.java |   2 +-
 .../accumulo/test/manager/SuspendedTabletsIT.java  |  24 +--
 .../accumulo/test/performance/NullTserver.java     |   4 +-
 .../accumulo/test/ChaoticLoadBalancerTest.java     |   2 +-
 32 files changed, 491 insertions(+), 218 deletions(-)

diff --cc 
core/src/main/java/org/apache/accumulo/core/manager/balancer/BalanceParamsImpl.java
index 1cdba42cf1,5e1899c73a..3f1c17653c
--- 
a/core/src/main/java/org/apache/accumulo/core/manager/balancer/BalanceParamsImpl.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/manager/balancer/BalanceParamsImpl.java
@@@ -29,9 -29,8 +29,8 @@@ import org.apache.accumulo.core.data.Ta
  import org.apache.accumulo.core.data.TabletId;
  import org.apache.accumulo.core.dataImpl.KeyExtent;
  import org.apache.accumulo.core.dataImpl.TabletIdImpl;
 -import org.apache.accumulo.core.master.thrift.TabletServerStatus;
 +import org.apache.accumulo.core.manager.thrift.TabletServerStatus;
  import org.apache.accumulo.core.metadata.TServerInstance;
- import org.apache.accumulo.core.metadata.schema.Ample.DataLevel;
  import org.apache.accumulo.core.spi.balancer.TabletBalancer;
  import org.apache.accumulo.core.spi.balancer.data.TServerStatus;
  import org.apache.accumulo.core.spi.balancer.data.TabletMigration;
diff --cc 
server/base/src/main/java/org/apache/accumulo/server/manager/state/MetaDataTableScanner.java
index b340c19679,ad2745aec0..3af41626b5
--- 
a/server/base/src/main/java/org/apache/accumulo/server/manager/state/MetaDataTableScanner.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/manager/state/MetaDataTableScanner.java
@@@ -44,6 -45,8 +44,7 @@@ import org.apache.accumulo.core.metadat
  import org.apache.accumulo.core.metadata.TServerInstance;
  import org.apache.accumulo.core.metadata.TabletLocationState;
  import 
org.apache.accumulo.core.metadata.TabletLocationState.BadLocationStateException;
+ import org.apache.accumulo.core.metadata.schema.Ample.DataLevel;
 -import 
org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.ChoppedColumnFamily;
  import 
org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.CurrentLocationColumnFamily;
  import 
org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.FutureLocationColumnFamily;
  import 
org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.LastLocationColumnFamily;
diff --cc 
server/base/src/main/java/org/apache/accumulo/server/util/FindOfflineTablets.java
index 0cfa61bf0d,685d5b6af9..90388ed06c
--- 
a/server/base/src/main/java/org/apache/accumulo/server/util/FindOfflineTablets.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/util/FindOfflineTablets.java
@@@ -88,31 -84,27 +87,31 @@@ public class FindOfflineTablets 
  
      int offline = 0;
  
 -    System.out.println("Scanning zookeeper");
 -    if ((offline = checkTablets(context, zooScanner, tservers)) > 0) {
 -      return offline;
 +    if (!skipZkScan) {
 +      printInfoMethod.accept("Scanning zookeeper");
 +      if ((offline = checkTablets(context, zooScanner, tservers, 
printProblemMethod)) > 0) {
 +        return offline;
 +      }
      }
  
-     if (AccumuloTable.ROOT.tableName().equals(tableName)) {
+     if (DataLevel.METADATA.metaTable().equals(tableName)) {
        return 0;
      }
  
 -    System.out.println("Scanning " + DataLevel.METADATA.metaTable());
 -    Iterator<TabletLocationState> rootScanner =
 -        new MetaDataTableScanner(context, TabletsSection.getRange(), 
DataLevel.METADATA);
 -    if ((offline = checkTablets(context, rootScanner, tservers)) > 0) {
 -      return offline;
 +    if (!skipRootScan) {
-       printInfoMethod.accept("Scanning " + AccumuloTable.ROOT.tableName());
-       Iterator<TabletLocationState> rootScanner = new 
MetaDataTableScanner(context,
-           TabletsSection.getRange(), AccumuloTable.ROOT.tableName());
++      printInfoMethod.accept("Scanning " + DataLevel.METADATA.metaTable());
++      Iterator<TabletLocationState> rootScanner =
++          new MetaDataTableScanner(context, TabletsSection.getRange(), 
DataLevel.METADATA);
 +      if ((offline = checkTablets(context, rootScanner, tservers, 
printProblemMethod)) > 0) {
 +        return offline;
 +      }
      }
  
-     if (AccumuloTable.METADATA.tableName().equals(tableName)) {
+     if (DataLevel.USER.metaTable().equals(tableName)) {
        return 0;
      }
  
-     printInfoMethod.accept("Scanning " + AccumuloTable.METADATA.tableName());
 -    System.out.println("Scanning " + DataLevel.USER.metaTable());
++    printInfoMethod.accept("Scanning " + DataLevel.USER.metaTable());
  
      Range range = TabletsSection.getRange();
      if (tableName != null) {
@@@ -121,8 -113,8 +120,8 @@@
      }
  
      try (MetaDataTableScanner metaScanner =
-         new MetaDataTableScanner(context, range, 
AccumuloTable.METADATA.tableName())) {
+         new MetaDataTableScanner(context, range, DataLevel.USER)) {
 -      return checkTablets(context, metaScanner, tservers);
 +      return checkTablets(context, metaScanner, tservers, printProblemMethod);
      }
    }
  
diff --cc server/manager/src/main/java/org/apache/accumulo/manager/Manager.java
index b55d332ed4,616dc7dac4..a5466a2531
--- a/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java
+++ b/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java
@@@ -190,10 -186,11 +189,9 @@@ public class Manager extends AbstractSe
    final Map<TServerInstance,AtomicInteger> badServers =
        Collections.synchronizedMap(new HashMap<>());
    final Set<TServerInstance> serversToShutdown = 
Collections.synchronizedSet(new HashSet<>());
-   final SortedMap<KeyExtent,TServerInstance> migrations =
-       Collections.synchronizedSortedMap(new TreeMap<>());
+   final Migrations migrations = new Migrations();
    final EventCoordinator nextEvent = new EventCoordinator();
    private final Object mergeLock = new Object();
 -  private Thread replicationWorkThread;
 -  private Thread replicationAssignerThread;
    RecoveryManager recoveryManager = null;
    private final ManagerTime timeKeeper;
  
diff --cc 
server/manager/src/main/java/org/apache/accumulo/manager/state/MergeStats.java
index 1f989ae781,c6ef3e7c46..d30a96f1db
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/state/MergeStats.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/state/MergeStats.java
@@@ -147,10 -210,9 +148,10 @@@ public class MergeStats 
  
      MergeStats verify = new MergeStats(info);
      KeyExtent extent = info.getExtent();
 -    Scanner scanner = accumuloClient
 -        .createScanner(extent.isMeta() ? RootTable.NAME : MetadataTable.NAME, 
Authorizations.EMPTY);
 +    Scanner scanner = accumuloClient.createScanner(
 +        extent.isMeta() ? AccumuloTable.ROOT.tableName() : 
AccumuloTable.METADATA.tableName(),
 +        Authorizations.EMPTY);
-     MetaDataTableScanner.configureScanner(scanner, manager);
+     MetaDataTableScanner.configureScanner(scanner, manager, 
DataLevel.of(extent.tableId()));
      Text start = extent.prevEndRow();
      if (start == null) {
        start = new Text();
diff --cc 
server/manager/src/main/java/org/apache/accumulo/manager/tableOps/delete/CleanUp.java
index c45fa1e54e,71dea7b703..8d2d77c5c8
--- 
a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/delete/CleanUp.java
+++ 
b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/delete/CleanUp.java
@@@ -35,11 -35,11 +35,12 @@@ import org.apache.accumulo.core.data.Ta
  import org.apache.accumulo.core.data.Value;
  import org.apache.accumulo.core.dataImpl.KeyExtent;
  import org.apache.accumulo.core.fate.Repo;
 +import 
org.apache.accumulo.core.fate.zookeeper.DistributedReadWriteLock.LockType;
  import org.apache.accumulo.core.iterators.user.GrepIterator;
 -import org.apache.accumulo.core.metadata.MetadataTable;
 +import org.apache.accumulo.core.metadata.AccumuloTable;
  import org.apache.accumulo.core.metadata.TabletLocationState;
  import org.apache.accumulo.core.metadata.TabletState;
+ import org.apache.accumulo.core.metadata.schema.Ample.DataLevel;
  import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection;
  import 
org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.DataFileColumnFamily;
  import org.apache.accumulo.core.security.Authorizations;
@@@ -90,9 -91,8 +91,9 @@@ class CleanUp extends ManagerRepo 
  
      boolean done = true;
      Range tableRange = new KeyExtent(tableId, null, null).toMetaRange();
 -    Scanner scanner = manager.getContext().createScanner(MetadataTable.NAME, 
Authorizations.EMPTY);
 +    Scanner scanner = 
manager.getContext().createScanner(AccumuloTable.METADATA.tableName(),
 +        Authorizations.EMPTY);
-     MetaDataTableScanner.configureScanner(scanner, manager);
+     MetaDataTableScanner.configureScanner(scanner, manager, 
DataLevel.of(tableId));
      scanner.setRange(tableRange);
  
      for (Entry<Key,Value> entry : scanner) {
diff --cc 
server/manager/src/test/java/org/apache/accumulo/manager/MigrationsTest.java
index 0000000000,bb55d03f87..c1e26614a4
mode 000000,100644..100644
--- 
a/server/manager/src/test/java/org/apache/accumulo/manager/MigrationsTest.java
+++ 
b/server/manager/src/test/java/org/apache/accumulo/manager/MigrationsTest.java
@@@ -1,0 -1,228 +1,229 @@@
+ /*
+  * 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.manager;
+ 
+ import static org.junit.jupiter.api.Assertions.assertEquals;
+ import static org.junit.jupiter.api.Assertions.assertFalse;
+ import static org.junit.jupiter.api.Assertions.assertNull;
+ import static org.junit.jupiter.api.Assertions.assertTrue;
+ 
+ import java.util.Map;
+ import java.util.Set;
+ 
+ import org.apache.accumulo.core.data.TableId;
+ import org.apache.accumulo.core.dataImpl.KeyExtent;
 -import org.apache.accumulo.core.metadata.MetadataTable;
++import org.apache.accumulo.core.metadata.AccumuloTable;
+ import org.apache.accumulo.core.metadata.RootTable;
+ import org.apache.accumulo.core.metadata.TServerInstance;
+ import org.apache.accumulo.core.metadata.schema.Ample.DataLevel;
 -import org.apache.accumulo.core.util.HostAndPort;
+ import org.junit.jupiter.api.BeforeEach;
+ import org.junit.jupiter.api.Test;
+ 
++import com.google.common.net.HostAndPort;
++
+ public class MigrationsTest {
+ 
+   private final TServerInstance TS1 =
+       new TServerInstance(HostAndPort.fromParts("server1", 9997), "s001");
+   private final TServerInstance TS2 =
+       new TServerInstance(HostAndPort.fromParts("server2", 1234), "s002");
+   private final TServerInstance TS3 =
+       new TServerInstance(HostAndPort.fromParts("server3", 6789), "s002");
+ 
+   private final TableId TID1 = TableId.of("1");
+   private final TableId TID2 = TableId.of("2");
+   private final TableId TID3 = TableId.of("3");
+ 
 -  private final KeyExtent ME = new KeyExtent(MetadataTable.ID, null, null);
++  private final KeyExtent ME = new 
KeyExtent(AccumuloTable.METADATA.tableId(), null, null);
+ 
+   private final KeyExtent KE1 = new KeyExtent(TID1, null, null);
+   private final KeyExtent KE2 = new KeyExtent(TID2, null, null);
+   private final KeyExtent KE3 = new KeyExtent(TID3, null, null);
+ 
+   Migrations migrations;
+ 
+   @BeforeEach
+   public void setup() {
+     migrations = new Migrations();
+     migrations.put(RootTable.EXTENT, TS2);
+     migrations.put(ME, TS1);
+     migrations.put(KE1, TS2);
+     migrations.put(KE2, TS1);
+   }
+ 
+   @Test
+   public void testInitial() {
+     assertEquals(4, migrations.size());
+     assertEquals(Set.of(RootTable.EXTENT, ME, KE1, KE2), 
migrations.snapshotAll());
+     assertEquals(Set.of(RootTable.EXTENT), 
migrations.snapshot(DataLevel.ROOT));
+     assertEquals(Set.of(ME), migrations.snapshot(DataLevel.METADATA));
+     assertEquals(Set.of(KE1, KE2), migrations.snapshot(DataLevel.USER));
+     assertTrue(migrations.contains(RootTable.EXTENT));
+     assertTrue(migrations.contains(ME));
+     assertTrue(migrations.contains(KE1));
+     assertTrue(migrations.contains(KE2));
+     assertFalse(migrations.contains(KE3));
+     assertEquals(TS2, migrations.get(RootTable.EXTENT));
+     assertEquals(TS1, migrations.get(ME));
+     assertEquals(TS2, migrations.get(KE1));
+     assertEquals(TS1, migrations.get(KE2));
+     assertNull(migrations.get(KE3));
+     assertFalse(migrations.isEmpty());
+     assertFalse(migrations.isEmpty(DataLevel.ROOT));
+     assertFalse(migrations.isEmpty(DataLevel.METADATA));
+     assertFalse(migrations.isEmpty(DataLevel.USER));
+     assertEquals(Map.of(DataLevel.ROOT, Set.of(RootTable.EXTENT), 
DataLevel.METADATA, Set.of(ME),
+         DataLevel.USER, Set.of(KE1, KE2)), migrations.mutableCopy());
+   }
+ 
+   @Test
+   public void testRemoveServer() {
+     migrations.removeServers(Set.of(TS1));
+ 
+     assertEquals(2, migrations.size());
+     assertEquals(Set.of(RootTable.EXTENT, KE1), migrations.snapshotAll());
+     assertEquals(Set.of(RootTable.EXTENT), 
migrations.snapshot(DataLevel.ROOT));
+     assertEquals(Set.of(), migrations.snapshot(DataLevel.METADATA));
+     assertEquals(Set.of(KE1), migrations.snapshot(DataLevel.USER));
+     assertTrue(migrations.contains(RootTable.EXTENT));
+     assertFalse(migrations.contains(ME));
+     assertTrue(migrations.contains(KE1));
+     assertFalse(migrations.contains(KE3));
+     assertEquals(TS2, migrations.get(RootTable.EXTENT));
+     assertNull(migrations.get(ME));
+     assertEquals(TS2, migrations.get(KE1));
+     assertNull(migrations.get(KE2));
+     assertNull(migrations.get(KE3));
+     assertFalse(migrations.isEmpty());
+     assertFalse(migrations.isEmpty(DataLevel.ROOT));
+     assertTrue(migrations.isEmpty(DataLevel.METADATA));
+     assertFalse(migrations.isEmpty(DataLevel.USER));
+     assertEquals(Map.of(DataLevel.ROOT, Set.of(RootTable.EXTENT), 
DataLevel.METADATA, Set.of(),
+         DataLevel.USER, Set.of(KE1)), migrations.mutableCopy());
+   }
+ 
+   @Test
+   public void testRemoveExtent() {
+     migrations.removeExtent(KE1);
+ 
+     assertEquals(3, migrations.size());
+     assertEquals(Set.of(RootTable.EXTENT, ME, KE2), migrations.snapshotAll());
+     assertEquals(Set.of(RootTable.EXTENT), 
migrations.snapshot(DataLevel.ROOT));
+     assertEquals(Set.of(ME), migrations.snapshot(DataLevel.METADATA));
+     assertEquals(Set.of(KE2), migrations.snapshot(DataLevel.USER));
+     assertTrue(migrations.contains(RootTable.EXTENT));
+     assertTrue(migrations.contains(ME));
+     assertFalse(migrations.contains(KE1));
+     assertTrue(migrations.contains(KE2));
+     assertFalse(migrations.contains(KE3));
+     assertEquals(TS2, migrations.get(RootTable.EXTENT));
+     assertEquals(TS1, migrations.get(ME));
+     assertNull(migrations.get(KE1));
+     assertEquals(TS1, migrations.get(KE2));
+     assertNull(migrations.get(KE3));
+     assertFalse(migrations.isEmpty());
+     assertFalse(migrations.isEmpty(DataLevel.ROOT));
+     assertFalse(migrations.isEmpty(DataLevel.METADATA));
+     assertFalse(migrations.isEmpty(DataLevel.USER));
+     assertEquals(Map.of(DataLevel.ROOT, Set.of(RootTable.EXTENT), 
DataLevel.METADATA, Set.of(ME),
+         DataLevel.USER, Set.of(KE2)), migrations.mutableCopy());
+   }
+ 
+   @Test
+   public void testRemoveExtents() {
+     migrations.removeExtents(Set.of(KE1, RootTable.EXTENT));
+ 
+     assertEquals(2, migrations.size());
+     assertEquals(Set.of(ME, KE2), migrations.snapshotAll());
+     assertEquals(Set.of(), migrations.snapshot(DataLevel.ROOT));
+     assertEquals(Set.of(ME), migrations.snapshot(DataLevel.METADATA));
+     assertEquals(Set.of(KE2), migrations.snapshot(DataLevel.USER));
+     assertFalse(migrations.contains(RootTable.EXTENT));
+     assertTrue(migrations.contains(ME));
+     assertFalse(migrations.contains(KE1));
+     assertTrue(migrations.contains(KE2));
+     assertFalse(migrations.contains(KE3));
+     assertNull(migrations.get(RootTable.EXTENT));
+     assertEquals(TS1, migrations.get(ME));
+     assertNull(migrations.get(KE1));
+     assertEquals(TS1, migrations.get(KE2));
+     assertNull(migrations.get(KE3));
+     assertFalse(migrations.isEmpty());
+     assertTrue(migrations.isEmpty(DataLevel.ROOT));
+     assertFalse(migrations.isEmpty(DataLevel.METADATA));
+     assertFalse(migrations.isEmpty(DataLevel.USER));
+     assertEquals(Map.of(DataLevel.ROOT, Set.of(), DataLevel.METADATA, 
Set.of(ME), DataLevel.USER,
+         Set.of(KE2)), migrations.mutableCopy());
+   }
+ 
+   @Test
+   public void testRemoveTable() {
+     migrations.removeTable(TID1);
+ 
+     assertEquals(3, migrations.size());
+     assertEquals(Set.of(RootTable.EXTENT, ME, KE2), migrations.snapshotAll());
+     assertEquals(Set.of(RootTable.EXTENT), 
migrations.snapshot(DataLevel.ROOT));
+     assertEquals(Set.of(ME), migrations.snapshot(DataLevel.METADATA));
+     assertEquals(Set.of(KE2), migrations.snapshot(DataLevel.USER));
+     assertTrue(migrations.contains(RootTable.EXTENT));
+     assertTrue(migrations.contains(ME));
+     assertFalse(migrations.contains(KE1));
+     assertTrue(migrations.contains(KE2));
+     assertFalse(migrations.contains(KE3));
+     assertEquals(TS2, migrations.get(RootTable.EXTENT));
+     assertEquals(TS1, migrations.get(ME));
+     assertNull(migrations.get(KE1));
+     assertEquals(TS1, migrations.get(KE2));
+     assertNull(migrations.get(KE3));
+     assertFalse(migrations.isEmpty());
+     assertFalse(migrations.isEmpty(DataLevel.ROOT));
+     assertFalse(migrations.isEmpty(DataLevel.METADATA));
+     assertFalse(migrations.isEmpty(DataLevel.USER));
+     assertEquals(Map.of(DataLevel.ROOT, Set.of(RootTable.EXTENT), 
DataLevel.METADATA, Set.of(ME),
+         DataLevel.USER, Set.of(KE2)), migrations.mutableCopy());
+   }
+ 
+   @Test
+   public void testEmpty() {
+     migrations.removeServers(Set.of(TS1, TS2));
+ 
+     assertEquals(0, migrations.size());
+     assertEquals(Set.of(), migrations.snapshotAll());
+     assertEquals(Set.of(), migrations.snapshot(DataLevel.ROOT));
+     assertEquals(Set.of(), migrations.snapshot(DataLevel.METADATA));
+     assertEquals(Set.of(), migrations.snapshot(DataLevel.USER));
+     assertFalse(migrations.contains(RootTable.EXTENT));
+     assertFalse(migrations.contains(ME));
+     assertFalse(migrations.contains(KE1));
+     assertFalse(migrations.contains(KE2));
+     assertFalse(migrations.contains(KE3));
+     assertNull(migrations.get(RootTable.EXTENT));
+     assertNull(migrations.get(ME));
+     assertNull(migrations.get(KE1));
+     assertNull(migrations.get(KE2));
+     assertNull(migrations.get(KE3));
+     assertTrue(migrations.isEmpty());
+     assertTrue(migrations.isEmpty(DataLevel.ROOT));
+     assertTrue(migrations.isEmpty(DataLevel.METADATA));
+     assertTrue(migrations.isEmpty(DataLevel.USER));
+     assertEquals(
+         Map.of(DataLevel.ROOT, Set.of(), DataLevel.METADATA, Set.of(), 
DataLevel.USER, Set.of()),
+         migrations.mutableCopy());
+   }
+ }
diff --cc 
server/monitor/src/main/java/org/apache/accumulo/monitor/rest/tables/TablesResource.java
index 65f6934750,668119104c..1b97325743
--- 
a/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/tables/TablesResource.java
+++ 
b/server/monitor/src/main/java/org/apache/accumulo/monitor/rest/tables/TablesResource.java
@@@ -40,10 -40,11 +40,11 @@@ import org.apache.accumulo.core.data.Ra
  import org.apache.accumulo.core.data.TableId;
  import org.apache.accumulo.core.manager.state.tables.TableState;
  import org.apache.accumulo.core.manager.thrift.ManagerMonitorInfo;
 -import org.apache.accumulo.core.master.thrift.TableInfo;
 -import org.apache.accumulo.core.master.thrift.TabletServerStatus;
 -import org.apache.accumulo.core.metadata.RootTable;
 +import org.apache.accumulo.core.manager.thrift.TableInfo;
 +import org.apache.accumulo.core.manager.thrift.TabletServerStatus;
 +import org.apache.accumulo.core.metadata.AccumuloTable;
  import org.apache.accumulo.core.metadata.TabletLocationState;
+ import org.apache.accumulo.core.metadata.schema.Ample.DataLevel;
  import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection;
  import org.apache.accumulo.monitor.Monitor;
  import org.apache.accumulo.monitor.rest.tservers.TabletServer;
@@@ -141,11 -142,9 +142,9 @@@ public class TablesResource 
      }
  
      TreeSet<String> locs = new TreeSet<>();
 -    if (RootTable.ID.equals(tableId)) {
 +    if (AccumuloTable.ROOT.tableId().equals(tableId)) {
        locs.add(rootTabletLocation);
      } else {
-       String systemTableName = 
AccumuloTable.METADATA.tableId().equals(tableId)
-           ? AccumuloTable.ROOT.tableName() : 
AccumuloTable.METADATA.tableName();
        MetaDataTableScanner scanner = new 
MetaDataTableScanner(monitor.getContext(),
            new Range(TabletsSection.encodeRow(tableId, new Text()),
                TabletsSection.encodeRow(tableId, null)),
diff --cc 
test/src/main/java/org/apache/accumulo/test/functional/AssignLocationModeIT.java
index 376dad39a2,c6b8d63e8f..bab3757ea6
--- 
a/test/src/main/java/org/apache/accumulo/test/functional/AssignLocationModeIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/functional/AssignLocationModeIT.java
@@@ -33,12 -32,12 +33,12 @@@ import org.apache.accumulo.core.conf.Pr
  import org.apache.accumulo.core.data.Mutation;
  import org.apache.accumulo.core.data.Range;
  import org.apache.accumulo.core.data.TableId;
- import org.apache.accumulo.core.metadata.AccumuloTable;
  import org.apache.accumulo.core.metadata.TabletLocationState;
+ import org.apache.accumulo.core.metadata.schema.Ample.DataLevel;
  import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection;
 -import org.apache.accumulo.core.util.UtilWaitThread;
  import org.apache.accumulo.miniclusterImpl.MiniAccumuloConfigImpl;
  import org.apache.accumulo.server.manager.state.MetaDataTableScanner;
 +import org.apache.accumulo.test.util.Wait;
  import org.apache.hadoop.conf.Configuration;
  import org.junit.jupiter.api.Test;
  
@@@ -64,11 -59,13 +64,11 @@@ public class AssignLocationModeIT exten
          getCluster().createAccumuloClient("root", new 
PasswordToken(ROOT_PASSWORD))) {
        String tableName = super.getUniqueNames(1)[0];
        c.tableOperations().create(tableName);
-       String tableId = c.tableOperations().tableIdMap().get(tableName);
+       TableId tableId = 
TableId.of(c.tableOperations().tableIdMap().get(tableName));
        // wait for the table to be online
 -      TabletLocationState newTablet;
 -      do {
 -        UtilWaitThread.sleep(250);
 -        newTablet = getTabletLocationState(c, tableId);
 -      } while (newTablet.current == null);
 +      Wait.waitFor(() -> getTabletLocationState(c, tableId) != null, 
SECONDS.toMillis(60), 250);
 +
 +      TabletLocationState newTablet = getTabletLocationState(c, tableId);
        // this would be null if the mode was not "assign"
        assertEquals(newTablet.getCurrentServer(), newTablet.getLastServer());
        assertNull(newTablet.future);
diff --cc 
test/src/main/java/org/apache/accumulo/test/functional/CompactLocationModeIT.java
index e51b6c3072,cb5ff60fef..f5846b474f
--- 
a/test/src/main/java/org/apache/accumulo/test/functional/CompactLocationModeIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/functional/CompactLocationModeIT.java
@@@ -32,12 -32,12 +32,12 @@@ import org.apache.accumulo.core.conf.Pr
  import org.apache.accumulo.core.data.Mutation;
  import org.apache.accumulo.core.data.Range;
  import org.apache.accumulo.core.data.TableId;
- import org.apache.accumulo.core.metadata.AccumuloTable;
  import org.apache.accumulo.core.metadata.TabletLocationState;
+ import org.apache.accumulo.core.metadata.schema.Ample.DataLevel;
  import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection;
 -import org.apache.accumulo.core.util.UtilWaitThread;
  import org.apache.accumulo.miniclusterImpl.MiniAccumuloConfigImpl;
  import org.apache.accumulo.server.manager.state.MetaDataTableScanner;
 +import org.apache.accumulo.test.util.Wait;
  import org.apache.hadoop.conf.Configuration;
  import org.junit.jupiter.api.Test;
  
@@@ -63,11 -59,14 +63,12 @@@ public class CompactLocationModeIT exte
          getCluster().createAccumuloClient("root", new 
PasswordToken(ROOT_PASSWORD))) {
        String tableName = super.getUniqueNames(1)[0];
        c.tableOperations().create(tableName);
-       String tableId = c.tableOperations().tableIdMap().get(tableName);
+       TableId tableId = 
TableId.of(c.tableOperations().tableIdMap().get(tableName));
+ 
        // wait for the table to be online
 -      TabletLocationState newTablet;
 -      do {
 -        UtilWaitThread.sleep(250);
 -        newTablet = getTabletLocationState(c, tableId);
 -      } while (newTablet.current == null);
 +      Wait.waitFor(() -> getTabletLocationState(c, tableId) != null);
 +
 +      TabletLocationState newTablet = getTabletLocationState(c, tableId);
        assertNull(newTablet.last);
        assertNull(newTablet.future);
  
diff --cc 
test/src/main/java/org/apache/accumulo/test/functional/ManagerAssignmentIT.java
index f14e8d587a,50827f3dac..0ed6747e00
--- 
a/test/src/main/java/org/apache/accumulo/test/functional/ManagerAssignmentIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/functional/ManagerAssignmentIT.java
@@@ -43,9 -42,10 +43,10 @@@ import org.apache.accumulo.core.clientI
  import org.apache.accumulo.core.data.Mutation;
  import org.apache.accumulo.core.data.Range;
  import org.apache.accumulo.core.data.TableId;
 -import org.apache.accumulo.core.fate.zookeeper.ServiceLock;
 -import org.apache.accumulo.core.metadata.RootTable;
 +import org.apache.accumulo.core.lock.ServiceLock;
 +import org.apache.accumulo.core.metadata.AccumuloTable;
  import org.apache.accumulo.core.metadata.TabletLocationState;
+ import org.apache.accumulo.core.metadata.schema.Ample.DataLevel;
  import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection;
  import org.apache.accumulo.core.rpc.clients.ThriftClientTypes;
  import org.apache.accumulo.core.trace.TraceUtil;
@@@ -70,12 -70,13 +71,11 @@@ public class ManagerAssignmentIT extend
      try (AccumuloClient c = 
Accumulo.newClient().from(getClientProps()).build()) {
        String tableName = super.getUniqueNames(1)[0];
        c.tableOperations().create(tableName);
-       String tableId = c.tableOperations().tableIdMap().get(tableName);
- 
+       TableId tableId = 
TableId.of(c.tableOperations().tableIdMap().get(tableName));
        // wait for the table to be online
 -      TabletLocationState newTablet;
 -      do {
 -        UtilWaitThread.sleep(250);
 -        newTablet = getTabletLocationState(c, tableId);
 -      } while (newTablet.current == null);
 +      Wait.waitFor(() -> getTabletLocationState(c, tableId) != null, 
SECONDS.toMillis(60), 250);
 +
 +      TabletLocationState newTablet = getTabletLocationState(c, tableId);
        assertNull(newTablet.last);
        assertNull(newTablet.future);
  
diff --cc 
test/src/main/java/org/apache/accumulo/test/functional/TabletStateChangeIteratorIT.java
index ed34aaf7cb,969d5d7cac..fd23ea310e
--- 
a/test/src/main/java/org/apache/accumulo/test/functional/TabletStateChangeIteratorIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/functional/TabletStateChangeIteratorIT.java
@@@ -53,14 -52,17 +53,15 @@@ import org.apache.accumulo.core.data.Mu
  import org.apache.accumulo.core.data.TableId;
  import org.apache.accumulo.core.data.Value;
  import org.apache.accumulo.core.dataImpl.KeyExtent;
 -import org.apache.accumulo.core.fate.zookeeper.ServiceLock;
  import org.apache.accumulo.core.fate.zookeeper.ZooUtil;
 +import org.apache.accumulo.core.lock.ServiceLock;
  import org.apache.accumulo.core.manager.state.tables.TableState;
  import org.apache.accumulo.core.manager.thrift.ManagerState;
 -import org.apache.accumulo.core.metadata.MetadataTable;
 -import org.apache.accumulo.core.metadata.RootTable;
 +import org.apache.accumulo.core.metadata.AccumuloTable;
  import org.apache.accumulo.core.metadata.TServerInstance;
+ import org.apache.accumulo.core.metadata.schema.Ample.DataLevel;
  import 
org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.CurrentLocationColumnFamily;
  import org.apache.accumulo.core.security.Authorizations;
 -import org.apache.accumulo.core.util.UtilWaitThread;
  import org.apache.accumulo.harness.AccumuloClusterHarness;
  import org.apache.accumulo.server.manager.state.CurrentState;
  import org.apache.accumulo.server.manager.state.MergeInfo;
@@@ -204,7 -205,11 +205,11 @@@ public class TabletStateChangeIteratorI
      int results = 0;
      List<Key> resultList = new ArrayList<>();
      try (Scanner scanner = client.createScanner(table, Authorizations.EMPTY)) 
{
-       MetaDataTableScanner.configureScanner(scanner, state);
+       DataLevel currentDataLevel = DataLevel.USER;
 -      if (table.equals(RootTable.NAME)) {
++      if (table.equals(AccumuloTable.ROOT.tableName())) {
+         currentDataLevel = DataLevel.METADATA;
+       }
+       MetaDataTableScanner.configureScanner(scanner, state, currentDataLevel);
        log.debug("Current state = {}", state);
        scanner.updateScanIteratorOption("tabletChange", "debug", "1");
        for (Entry<Key,Value> e : scanner) {
diff --cc 
test/src/main/java/org/apache/accumulo/test/manager/SuspendedTabletsIT.java
index c32cd927c0,18aa78a25d..9f9a6ab8cf
--- 
a/test/src/main/java/org/apache/accumulo/test/manager/SuspendedTabletsIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/manager/SuspendedTabletsIT.java
@@@ -53,10 -51,12 +52,12 @@@ import org.apache.accumulo.core.clientI
  import org.apache.accumulo.core.conf.ClientProperty;
  import org.apache.accumulo.core.conf.Property;
  import org.apache.accumulo.core.data.Range;
+ import org.apache.accumulo.core.data.TableId;
  import org.apache.accumulo.core.dataImpl.KeyExtent;
 -import org.apache.accumulo.core.metadata.MetadataTable;
 +import org.apache.accumulo.core.metadata.AccumuloTable;
  import org.apache.accumulo.core.metadata.TServerInstance;
  import org.apache.accumulo.core.metadata.TabletLocationState;
+ import org.apache.accumulo.core.metadata.schema.Ample.DataLevel;
  import org.apache.accumulo.core.rpc.clients.ThriftClientTypes;
  import org.apache.accumulo.core.spi.balancer.HostRegexTableLoadBalancer;
  import org.apache.accumulo.core.spi.balancer.data.TabletServerId;
@@@ -127,13 -126,11 +128,11 @@@ public class SuspendedTabletsIT extend
  
        // Wait for the balancer to assign all metadata tablets to the chosen 
server.
        ClientContext ctx = (ClientContext) client;
-       TabletLocations tl = TabletLocations.retrieve(ctx, 
AccumuloTable.METADATA.tableName(),
-           AccumuloTable.ROOT.tableName());
 -      TabletLocations tl = TabletLocations.retrieve(ctx, MetadataTable.NAME);
++      TabletLocations tl = TabletLocations.retrieve(ctx, 
AccumuloTable.METADATA.tableName());
        while (tl.hosted.keySet().size() != 1 || 
!tl.hosted.containsKey(metadataServer)) {
          log.info("Metadata tablets are not hosted on the correct server. 
Waiting for balancer...");
          Thread.sleep(1000L);
-         tl = TabletLocations.retrieve(ctx, AccumuloTable.METADATA.tableName(),
-             AccumuloTable.ROOT.tableName());
 -        tl = TabletLocations.retrieve(ctx, MetadataTable.NAME);
++        tl = TabletLocations.retrieve(ctx, 
AccumuloTable.METADATA.tableName());
        }
        log.info("Metadata tablets are now hosted on {}", metadataServer);
      }
diff --cc 
test/src/main/java/org/apache/accumulo/test/performance/NullTserver.java
index d36c9919fc,19c7245d74..fcc03f98f0
--- a/test/src/main/java/org/apache/accumulo/test/performance/NullTserver.java
+++ b/test/src/main/java/org/apache/accumulo/test/performance/NullTserver.java
@@@ -53,8 -54,7 +53,7 @@@ import org.apache.accumulo.core.dataImp
  import org.apache.accumulo.core.dataImpl.thrift.TSummaries;
  import org.apache.accumulo.core.dataImpl.thrift.TSummaryRequest;
  import org.apache.accumulo.core.dataImpl.thrift.UpdateErrors;
 -import org.apache.accumulo.core.master.thrift.TabletServerStatus;
 +import org.apache.accumulo.core.manager.thrift.TabletServerStatus;
- import org.apache.accumulo.core.metadata.AccumuloTable;
  import org.apache.accumulo.core.metadata.TServerInstance;
  import org.apache.accumulo.core.metadata.TabletLocationState;
  import org.apache.accumulo.core.metadata.schema.Ample.DataLevel;


Reply via email to