This is an automated email from the ASF dual-hosted git repository.
domgarguilo 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 e19b2880c2 Improve several ITs (#5370)
e19b2880c2 is described below
commit e19b2880c2c16786257bbba3c808c20481cb480f
Author: Dom G. <[email protected]>
AuthorDate: Mon Mar 3 10:42:08 2025 -0500
Improve several ITs (#5370)
Convert AccumuloInputFormatIT, ZooKeeperPropertiesIT, and
AmpleConditionalWriterIT to use SharedMiniClusterBase in order to speed them
up. Also broke out one of the test cases in AmpleConditionalWriterIT that
required the use of AccumuloClusterHarness. Also included other misc.
improvements to various test cases.
---
.../its/mapreduce/AccumuloInputFormatIT.java | 19 +-
.../accumulo/test/ZooKeeperPropertiesIT.java | 20 +-
.../test/functional/AmpleConditionalWriterIT.java | 1528 +++++++++-----------
.../accumulo/test/functional/SuspendMarkerIT.java | 139 ++
.../functional/TabletResourceGroupBalanceIT.java | 15 +-
.../accumulo/test/manager/SuspendedTabletsIT.java | 3 +-
6 files changed, 880 insertions(+), 844 deletions(-)
diff --git
a/hadoop-mapreduce/src/test/java/org/apache/accumulo/hadoop/its/mapreduce/AccumuloInputFormatIT.java
b/hadoop-mapreduce/src/test/java/org/apache/accumulo/hadoop/its/mapreduce/AccumuloInputFormatIT.java
index 70e2cb46ef..4a8d883bad 100644
---
a/hadoop-mapreduce/src/test/java/org/apache/accumulo/hadoop/its/mapreduce/AccumuloInputFormatIT.java
+++
b/hadoop-mapreduce/src/test/java/org/apache/accumulo/hadoop/its/mapreduce/AccumuloInputFormatIT.java
@@ -53,8 +53,7 @@ import
org.apache.accumulo.hadoop.mapreduce.AccumuloInputFormat;
import
org.apache.accumulo.hadoop.mapreduce.InputFormatBuilder.InputFormatOptions;
import org.apache.accumulo.hadoopImpl.mapreduce.BatchInputSplit;
import org.apache.accumulo.hadoopImpl.mapreduce.RangeInputSplit;
-import org.apache.accumulo.harness.AccumuloClusterHarness;
-import org.apache.accumulo.miniclusterImpl.MiniAccumuloConfigImpl;
+import org.apache.accumulo.harness.SharedMiniClusterBase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.io.Text;
@@ -66,7 +65,9 @@ import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.output.NullOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
+import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -78,7 +79,7 @@ import com.google.common.collect.Multimap;
*
* @since 2.0
*/
-public class AccumuloInputFormatIT extends AccumuloClusterHarness {
+public class AccumuloInputFormatIT extends SharedMiniClusterBase {
AccumuloInputFormat inputFormat;
AccumuloClient client;
@@ -88,9 +89,15 @@ public class AccumuloInputFormatIT extends
AccumuloClusterHarness {
return Duration.ofMinutes(4);
}
- @Override
- public void configureMiniCluster(MiniAccumuloConfigImpl cfg, Configuration
hadoopCoreSite) {
- cfg.getClusterServerConfiguration().setNumDefaultTabletServers(1);
+ @BeforeAll
+ public static void setup() throws Exception {
+ SharedMiniClusterBase.startMiniClusterWithConfig(
+ (cfg, coreSite) ->
cfg.getClusterServerConfiguration().setNumDefaultTabletServers(1));
+ }
+
+ @AfterAll
+ public static void teardown() {
+ SharedMiniClusterBase.stopMiniCluster();
}
@BeforeEach
diff --git
a/test/src/main/java/org/apache/accumulo/test/ZooKeeperPropertiesIT.java
b/test/src/main/java/org/apache/accumulo/test/ZooKeeperPropertiesIT.java
index 99b120e9bf..08b0adc4bb 100644
--- a/test/src/main/java/org/apache/accumulo/test/ZooKeeperPropertiesIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/ZooKeeperPropertiesIT.java
@@ -36,15 +36,27 @@ import
org.apache.accumulo.core.client.TableNotFoundException;
import org.apache.accumulo.core.conf.Property;
import org.apache.accumulo.core.data.NamespaceId;
import org.apache.accumulo.core.data.TableId;
-import org.apache.accumulo.harness.AccumuloClusterHarness;
+import org.apache.accumulo.harness.SharedMiniClusterBase;
import org.apache.accumulo.server.ServerContext;
import org.apache.accumulo.server.conf.store.NamespacePropKey;
import org.apache.accumulo.server.conf.store.TablePropKey;
import org.apache.accumulo.server.util.PropUtil;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
-public class ZooKeeperPropertiesIT extends AccumuloClusterHarness {
+public class ZooKeeperPropertiesIT extends SharedMiniClusterBase {
+
+ @BeforeAll
+ public static void setup() throws Exception {
+ SharedMiniClusterBase.startMiniCluster();
+ }
+
+ @AfterAll
+ public static void teardown() {
+ SharedMiniClusterBase.stopMiniCluster();
+ }
@Test
public void testNoFiles() {
@@ -59,7 +71,7 @@ public class ZooKeeperPropertiesIT extends
AccumuloClusterHarness {
@Timeout(30)
public void testTablePropUtils() throws AccumuloException,
TableExistsException,
AccumuloSecurityException, TableNotFoundException {
- ServerContext context = getServerContext();
+ ServerContext context = getCluster().getServerContext();
try (AccumuloClient client =
Accumulo.newClient().from(getClientProps()).build()) {
@@ -111,7 +123,7 @@ public class ZooKeeperPropertiesIT extends
AccumuloClusterHarness {
@Timeout(30)
public void testNamespacePropUtils() throws AccumuloException,
AccumuloSecurityException,
NamespaceExistsException, NamespaceNotFoundException {
- ServerContext context = getServerContext();
+ ServerContext context = getCluster().getServerContext();
try (AccumuloClient client =
Accumulo.newClient().from(getClientProps()).build()) {
diff --git
a/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java
b/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java
index b965b0b07d..11e529fb7c 100644
---
a/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java
+++
b/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java
@@ -32,7 +32,6 @@ import static
org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType
import static
org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.OPID;
import static
org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.PREV_ROW;
import static
org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.SELECTED;
-import static
org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.SUSPEND;
import static
org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.TIME;
import static
org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.UNSPLITTABLE;
import static
org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.USER_COMPACTION_REQUESTED;
@@ -40,7 +39,6 @@ import static
org.apache.accumulo.core.util.LazySingletons.GSON;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -69,7 +67,6 @@ import org.apache.accumulo.core.client.Scanner;
import org.apache.accumulo.core.client.admin.NewTableConfiguration;
import org.apache.accumulo.core.client.admin.TabletAvailability;
import org.apache.accumulo.core.client.admin.TimeType;
-import org.apache.accumulo.core.conf.Property;
import org.apache.accumulo.core.data.Mutation;
import org.apache.accumulo.core.data.Range;
import org.apache.accumulo.core.data.TableId;
@@ -81,7 +78,6 @@ import org.apache.accumulo.core.metadata.AccumuloTable;
import org.apache.accumulo.core.metadata.ReferencedTabletFile;
import org.apache.accumulo.core.metadata.RootTable;
import org.apache.accumulo.core.metadata.StoredTabletFile;
-import org.apache.accumulo.core.metadata.SuspendingTServer;
import org.apache.accumulo.core.metadata.TServerInstance;
import org.apache.accumulo.core.metadata.schema.Ample;
import org.apache.accumulo.core.metadata.schema.Ample.ConditionalResult.Status;
@@ -103,28 +99,35 @@ import
org.apache.accumulo.core.metadata.schema.filters.GcWalsFilter;
import org.apache.accumulo.core.metadata.schema.filters.HasCurrentFilter;
import org.apache.accumulo.core.metadata.schema.filters.TabletMetadataFilter;
import org.apache.accumulo.core.security.TablePermission;
-import org.apache.accumulo.core.spi.balancer.TableLoadBalancer;
import org.apache.accumulo.core.spi.compaction.CompactionKind;
import org.apache.accumulo.core.spi.compaction.CompactorGroupId;
import org.apache.accumulo.core.tabletserver.log.LogEntry;
import org.apache.accumulo.core.util.time.SteadyTime;
-import org.apache.accumulo.harness.AccumuloClusterHarness;
-import org.apache.accumulo.minicluster.ServerType;
-import org.apache.accumulo.miniclusterImpl.MiniAccumuloClusterImpl;
+import org.apache.accumulo.harness.SharedMiniClusterBase;
import org.apache.accumulo.server.ServerContext;
import org.apache.accumulo.server.metadata.AsyncConditionalTabletsMutatorImpl;
import org.apache.accumulo.server.metadata.ConditionalTabletsMutatorImpl;
-import org.apache.accumulo.test.util.Wait;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
-import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
-public class AmpleConditionalWriterIT extends AccumuloClusterHarness {
+public class AmpleConditionalWriterIT extends SharedMiniClusterBase {
+
+ @BeforeAll
+ public static void setup() throws Exception {
+ SharedMiniClusterBase.startMiniCluster();
+ }
+
+ @AfterAll
+ public static void teardown() {
+ SharedMiniClusterBase.stopMiniCluster();
+ }
private TableId tid;
private KeyExtent e1;
@@ -154,319 +157,315 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
}
@Test
- public void testLocations() throws Exception {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
+ public void testLocations() {
- var ts1 = new TServerInstance("localhost:9997", 5000L);
- var ts2 = new TServerInstance("localhost:9997", 6000L);
+ var ts1 = new TServerInstance("localhost:9997", 5000L);
+ var ts2 = new TServerInstance("localhost:9997", 6000L);
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
- assertNull(context.getAmple().readTablet(e1).getLocation());
+ assertNull(context.getAmple().readTablet(e1).getLocation());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
- .putLocation(Location.future(ts1)).submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Location.future(ts1),
context.getAmple().readTablet(e1).getLocation());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+ .putLocation(Location.future(ts1)).submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Location.future(ts1),
context.getAmple().readTablet(e1).getLocation());
- // test require absent with a future location set
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
- .putLocation(Location.future(ts2)).submit(tm -> false,
- () -> "Testing that requireAbsentLocation() fails when a
future location is set");
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Location.future(ts1),
context.getAmple().readTablet(e1).getLocation());
- try (TabletsMetadata tablets =
- context.getAmple().readTablets().forTable(tid).filter(new
HasCurrentFilter()).build()) {
- List<KeyExtent> actual =
-
tablets.stream().map(TabletMetadata::getExtent).collect(Collectors.toList());
- assertEquals(List.of(), actual);
- }
+ // test require absent with a future location set
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+ .putLocation(Location.future(ts2)).submit(tm -> false,
+ () -> "Testing that requireAbsentLocation() fails when a future
location is set");
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Location.future(ts1),
context.getAmple().readTablet(e1).getLocation());
+ try (TabletsMetadata tablets =
+ context.getAmple().readTablets().forTable(tid).filter(new
HasCurrentFilter()).build()) {
+ List<KeyExtent> actual =
+
tablets.stream().map(TabletMetadata::getExtent).collect(Collectors.toList());
+ assertEquals(List.of(), actual);
+ }
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.future(ts1))
-
.putLocation(Location.current(ts1)).deleteLocation(Location.future(ts1))
- .submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Location.current(ts1),
context.getAmple().readTablet(e1).getLocation());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.future(ts1))
+
.putLocation(Location.current(ts1)).deleteLocation(Location.future(ts1))
+ .submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Location.current(ts1),
context.getAmple().readTablet(e1).getLocation());
- // test require absent with a current location set
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
- .putLocation(Location.future(ts2)).submit(tm -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus(),
- () -> "Testing that requireAbsentLocation() fails when a current
location is set");
- }
- assertEquals(Location.current(ts1),
context.getAmple().readTablet(e1).getLocation());
+ // test require absent with a current location set
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+ .putLocation(Location.future(ts2)).submit(tm -> false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus(),
+ () -> "Testing that requireAbsentLocation() fails when a current
location is set");
+ }
+ assertEquals(Location.current(ts1),
context.getAmple().readTablet(e1).getLocation());
- try (TabletsMetadata tablets =
- context.getAmple().readTablets().forTable(tid).filter(new
HasCurrentFilter()).build()) {
- List<KeyExtent> actual =
-
tablets.stream().map(TabletMetadata::getExtent).collect(Collectors.toList());
- assertEquals(List.of(e1), actual);
- }
+ try (TabletsMetadata tablets =
+ context.getAmple().readTablets().forTable(tid).filter(new
HasCurrentFilter()).build()) {
+ List<KeyExtent> actual =
+
tablets.stream().map(TabletMetadata::getExtent).collect(Collectors.toList());
+ assertEquals(List.of(e1), actual);
+ }
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.future(ts1))
-
.putLocation(Location.current(ts1)).deleteLocation(Location.future(ts1))
- .submit(tm -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Location.current(ts1),
context.getAmple().readTablet(e1).getLocation());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.future(ts1))
+
.putLocation(Location.current(ts1)).deleteLocation(Location.future(ts1))
+ .submit(tm -> false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Location.current(ts1),
context.getAmple().readTablet(e1).getLocation());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.future(ts2))
-
.putLocation(Location.current(ts2)).deleteLocation(Location.future(ts2))
- .submit(tm -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Location.current(ts1),
context.getAmple().readTablet(e1).getLocation());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.future(ts2))
+
.putLocation(Location.current(ts2)).deleteLocation(Location.future(ts2))
+ .submit(tm -> false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Location.current(ts1),
context.getAmple().readTablet(e1).getLocation());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.current(ts1))
- .deleteLocation(Location.current(ts1)).submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- assertNull(context.getAmple().readTablet(e1).getLocation());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.current(ts1))
+ .deleteLocation(Location.current(ts1)).submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ assertNull(context.getAmple().readTablet(e1).getLocation());
- // Set two current locations, this puts the tablet in a bad state as its
only expected that
- // single location should be set
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().putLocation(Location.current(ts1))
- .putLocation(Location.current(ts2)).submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- // When a tablet has two locations reading it should throw an exception
- assertThrows(IllegalStateException.class, () ->
context.getAmple().readTablet(e1));
+ // Set two current locations, this puts the tablet in a bad state as its
only expected that
+ // single location should be set
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().putLocation(Location.current(ts1))
+ .putLocation(Location.current(ts2)).submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ // When a tablet has two locations reading it should throw an exception
+ assertThrows(IllegalStateException.class, () ->
context.getAmple().readTablet(e1));
- // Try to update the tablet requiring one of the locations that is set
on the tablet. Even
- // though the required location exists, the presence of the other
location in the tablet
- // metadata should cause the update to fail.
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.current(ts1))
-
.deleteLocation(Location.current(ts1)).deleteLocation(Location.current(ts2))
- .submit(tm -> false);
- // The update should be rejected because of the two locations. When a
conditional mutation
- // is rejected an attempt is made to read the tablet metadata and
examine. This read of the
- // tablet metadata will fail because the tablet has two locations.
- assertThrows(IllegalStateException.class,
ctmi.process().get(e1)::getStatus);
- }
- // tablet should still have two location set, so reading it should fail
- assertThrows(IllegalStateException.class, () ->
context.getAmple().readTablet(e1));
+ // Try to update the tablet requiring one of the locations that is set on
the tablet. Even
+ // though the required location exists, the presence of the other location
in the tablet
+ // metadata should cause the update to fail.
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.current(ts1))
+
.deleteLocation(Location.current(ts1)).deleteLocation(Location.current(ts2))
+ .submit(tm -> false);
+ // The update should be rejected because of the two locations. When a
conditional mutation
+ // is rejected an attempt is made to read the tablet metadata and
examine. This read of the
+ // tablet metadata will fail because the tablet has two locations.
+ assertThrows(IllegalStateException.class,
ctmi.process().get(e1)::getStatus);
+ }
+ // tablet should still have two location set, so reading it should fail
+ assertThrows(IllegalStateException.class, () ->
context.getAmple().readTablet(e1));
- // Requiring an absent location should fail when two locations are set
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
-
.deleteLocation(Location.current(ts1)).deleteLocation(Location.current(ts2))
- .submit(tm -> false);
- assertThrows(IllegalStateException.class,
ctmi.process().get(e1)::getStatus);
- }
- // tablet should still have two location set, so reading it should fail
- assertThrows(IllegalStateException.class, () ->
context.getAmple().readTablet(e1));
+ // Requiring an absent location should fail when two locations are set
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+
.deleteLocation(Location.current(ts1)).deleteLocation(Location.current(ts2))
+ .submit(tm -> false);
+ assertThrows(IllegalStateException.class,
ctmi.process().get(e1)::getStatus);
+ }
+ // tablet should still have two location set, so reading it should fail
+ assertThrows(IllegalStateException.class, () ->
context.getAmple().readTablet(e1));
- // Change the tablet to have a future and current location set.
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().deleteLocation(Location.current(ts1))
- .putLocation(Location.future(ts1)).submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- // tablet should still have two location set, so reading it should fail
- assertThrows(IllegalStateException.class, () ->
context.getAmple().readTablet(e1));
-
- // Test requiring different locations. Some of the required locations
are actually set and
- // some are not. All should fail because the tablet has multiple
locations set and/or the
- // required location does not exist.
- for (var loc : List.of(Location.current(ts1), Location.current(ts2),
Location.future(ts1),
- Location.future(ts2))) {
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(loc)
-
.deleteLocation(Location.future(ts1)).deleteLocation(Location.current(ts2))
- .submit(tm -> false);
- // tablet should still have two location set, so reading it should
fail
- assertThrows(IllegalStateException.class,
ctmi.process().get(e1)::getStatus);
- }
- }
+ // Change the tablet to have a future and current location set.
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().deleteLocation(Location.current(ts1))
+ .putLocation(Location.future(ts1)).submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ // tablet should still have two location set, so reading it should fail
+ assertThrows(IllegalStateException.class, () ->
context.getAmple().readTablet(e1));
- // Requiring an absent location should fail when a future and current
location are set
+ // Test requiring different locations. Some of the required locations are
actually set and
+ // some are not. All should fail because the tablet has multiple locations
set and/or the
+ // required location does not exist.
+ for (var loc : List.of(Location.current(ts1), Location.current(ts2),
Location.future(ts1),
+ Location.future(ts2))) {
try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
-
.deleteLocation(Location.current(ts1)).deleteLocation(Location.current(ts2))
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(loc)
+
.deleteLocation(Location.future(ts1)).deleteLocation(Location.current(ts2))
.submit(tm -> false);
+ // tablet should still have two location set, so reading it should fail
assertThrows(IllegalStateException.class,
ctmi.process().get(e1)::getStatus);
}
- // tablet should still have two location set, so reading it should fail
- assertThrows(IllegalStateException.class, () ->
context.getAmple().readTablet(e1));
+ }
- // Delete one of the locations w/o any location requirements, this
should succeed.
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().deleteLocation(Location.future(ts1))
- .submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- // This check validates the expected state of the tablet as some of the
previous test were
- // catching an exception and making assumption about the state of the
tablet metadata based on
- // the fact that an exception was thrown.
- assertEquals(Location.current(ts2),
context.getAmple().readTablet(e1).getLocation());
+ // Requiring an absent location should fail when a future and current
location are set
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+
.deleteLocation(Location.current(ts1)).deleteLocation(Location.current(ts2))
+ .submit(tm -> false);
+ assertThrows(IllegalStateException.class,
ctmi.process().get(e1)::getStatus);
}
+ // tablet should still have two location set, so reading it should fail
+ assertThrows(IllegalStateException.class, () ->
context.getAmple().readTablet(e1));
+
+ // Delete one of the locations w/o any location requirements, this should
succeed.
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().deleteLocation(Location.future(ts1))
+ .submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ // This check validates the expected state of the tablet as some of the
previous test were
+ // catching an exception and making assumption about the state of the
tablet metadata based on
+ // the fact that an exception was thrown.
+ assertEquals(Location.current(ts2),
context.getAmple().readTablet(e1).getLocation());
}
@Test
- public void testFiles() throws Exception {
+ public void testFiles() {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
- var ts1 = new TServerInstance("localhost:9997", 5000L);
- var ts2 = new TServerInstance("localhost:9997", 6000L);
+ var ts1 = new TServerInstance("localhost:9997", 5000L);
+ var ts2 = new TServerInstance("localhost:9997", 6000L);
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
- var stf1 = StoredTabletFile
- .of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000070.rf"));
- var stf2 = StoredTabletFile
- .of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000071.rf"));
- var stf3 = StoredTabletFile
- .of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000072.rf"));
- var stf4 = StoredTabletFile
- .of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/C0000073.rf"));
- var dfv = new DataFileValue(100, 100);
+ var stf1 = StoredTabletFile
+ .of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000070.rf"));
+ var stf2 = StoredTabletFile
+ .of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000071.rf"));
+ var stf3 = StoredTabletFile
+ .of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000072.rf"));
+ var stf4 = StoredTabletFile
+ .of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/C0000073.rf"));
+ var dfv = new DataFileValue(100, 100);
- System.out.println(context.getAmple().readTablet(e1).getLocation());
+ System.out.println(context.getAmple().readTablet(e1).getLocation());
- // simulate a compaction where the tablet location is not set
+ // simulate a compaction where the tablet location is not set
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ var tm1 = TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2,
dfv).putFile(stf3, dfv)
+ .build();
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm1, FILES)
+ .putFile(stf4, new DataFileValue(0, 0)).submit(tm -> false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Set.of(), context.getAmple().readTablet(e1).getFiles());
+
+ var tm2 =
TabletMetadata.builder(e1).putLocation(Location.current(ts1)).build();
+ // simulate minor compacts where the tablet location is not set
+ for (StoredTabletFile file : List.of(stf1, stf2, stf3)) {
try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- var tm1 = TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2,
dfv)
- .putFile(stf3, dfv).build();
- ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm1, FILES)
- .putFile(stf4, new DataFileValue(0, 0)).submit(tm -> false);
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2,
LOCATION)
+ .putFile(file, new DataFileValue(0, 0)).submit(tm -> false);
assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
}
- assertEquals(Set.of(), context.getAmple().readTablet(e1).getFiles());
+ }
- var tm2 =
TabletMetadata.builder(e1).putLocation(Location.current(ts1)).build();
- // simulate minor compacts where the tablet location is not set
- for (StoredTabletFile file : List.of(stf1, stf2, stf3)) {
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2,
LOCATION)
- .putFile(file, new DataFileValue(0, 0)).submit(tm -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- }
+ assertEquals(Set.of(), context.getAmple().readTablet(e1).getFiles());
- assertEquals(Set.of(), context.getAmple().readTablet(e1).getFiles());
+ // set the location
+ var tm3 = TabletMetadata.builder(e1).build(LOCATION);
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm3, LOCATION)
+ .putLocation(Location.current(ts1)).submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
- // set the location
- var tm3 = TabletMetadata.builder(e1).build(LOCATION);
+ var tm4 =
TabletMetadata.builder(e1).putLocation(Location.current(ts2)).build();
+ // simulate minor compacts where the tablet location is wrong
+ for (StoredTabletFile file : List.of(stf1, stf2, stf3)) {
try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm3,
LOCATION)
- .putLocation(Location.current(ts1)).submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
-
- var tm4 =
TabletMetadata.builder(e1).putLocation(Location.current(ts2)).build();
- // simulate minor compacts where the tablet location is wrong
- for (StoredTabletFile file : List.of(stf1, stf2, stf3)) {
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm4,
LOCATION)
- .putFile(file, new DataFileValue(0, 0)).submit(tm -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm4,
LOCATION)
+ .putFile(file, new DataFileValue(0, 0)).submit(tm -> false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
}
+ }
- assertEquals(Set.of(), context.getAmple().readTablet(e1).getFiles());
+ assertEquals(Set.of(), context.getAmple().readTablet(e1).getFiles());
- // simulate minor compacts where the tablet location is set
- for (StoredTabletFile file : List.of(stf1, stf2, stf3)) {
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2,
LOCATION)
- .putFile(file, new DataFileValue(0, 0)).submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
+ // simulate minor compacts where the tablet location is set
+ for (StoredTabletFile file : List.of(stf1, stf2, stf3)) {
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2,
LOCATION)
+ .putFile(file, new DataFileValue(0, 0)).submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
}
+ }
- assertEquals(Set.of(stf1, stf2, stf3),
context.getAmple().readTablet(e1).getFiles());
-
- // simulate a compaction and test a subset and superset of files
- for (var tabletMeta : List.of(
- TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2,
dfv).build(),
- TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2,
dfv).putFile(stf3, dfv)
- .putFile(stf4, dfv).build())) {
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta, FILES)
- .putFile(stf4, new DataFileValue(0,
0)).deleteFile(stf1).deleteFile(stf2)
- .deleteFile(stf3).submit(tm -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Set.of(stf1, stf2, stf3),
context.getAmple().readTablet(e1).getFiles());
- }
+ assertEquals(Set.of(stf1, stf2, stf3),
context.getAmple().readTablet(e1).getFiles());
- // simulate a compaction
- var tm5 = TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2,
dfv).putFile(stf3, dfv)
- .build();
+ // simulate a compaction and test a subset and superset of files
+ for (var tabletMeta : List.of(
+ TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2,
dfv).build(),
+ TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2,
dfv).putFile(stf3, dfv)
+ .putFile(stf4, dfv).build())) {
try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm5, FILES)
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta,
FILES)
.putFile(stf4, new DataFileValue(0,
0)).deleteFile(stf1).deleteFile(stf2)
.deleteFile(stf3).submit(tm -> false);
- // First attempt should fail because the dfvs were replaced in the test
- // so the values of the files will not match
assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
}
+ assertEquals(Set.of(stf1, stf2, stf3),
context.getAmple().readTablet(e1).getFiles());
+ }
- // Try again with the correct comapcted datafiles
- var compactedDv = new DataFileValue(0, 0);
- tm5 = TabletMetadata.builder(e1).putFile(stf1,
compactedDv).putFile(stf2, compactedDv)
- .putFile(stf3, compactedDv).build();
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm5, FILES)
- .putFile(stf4, new DataFileValue(0,
0)).deleteFile(stf1).deleteFile(stf2)
- .deleteFile(stf3).submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Set.of(stf4), context.getAmple().readTablet(e1).getFiles());
+ // simulate a compaction
+ var tm5 =
+ TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2,
dfv).putFile(stf3, dfv).build();
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm5, FILES)
+ .putFile(stf4, new DataFileValue(0,
0)).deleteFile(stf1).deleteFile(stf2).deleteFile(stf3)
+ .submit(tm -> false);
+ // First attempt should fail because the dfvs were replaced in the test
+ // so the values of the files will not match
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
- // simulate a bulk import
- var stf5 = StoredTabletFile
- .of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/b-0000009/I0000074.rf"));
- var tm6 = TabletMetadata.builder(e1).build(LOADED);
- FateInstanceType type = FateInstanceType.fromTableId(tid);
- FateId fateId = FateId.from(type, UUID.randomUUID());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm6, LOADED)
- .putFile(stf5, new DataFileValue(0,
0)).putBulkFile(stf5.getTabletFile(), fateId)
- .submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Set.of(stf4, stf5),
context.getAmple().readTablet(e1).getFiles());
+ // Try again with the correct comapcted datafiles
+ var compactedDv = new DataFileValue(0, 0);
+ tm5 = TabletMetadata.builder(e1).putFile(stf1, compactedDv).putFile(stf2,
compactedDv)
+ .putFile(stf3, compactedDv).build();
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm5, FILES)
+ .putFile(stf4, new DataFileValue(0,
0)).deleteFile(stf1).deleteFile(stf2).deleteFile(stf3)
+ .submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Set.of(stf4), context.getAmple().readTablet(e1).getFiles());
- // simulate a compaction
- var stf6 = StoredTabletFile
- .of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/A0000075.rf"));
- var tm7 =
- TabletMetadata.builder(e1).putFile(stf4, compactedDv).putFile(stf5,
compactedDv).build();
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm7, FILES)
- .putFile(stf6, new DataFileValue(0,
0)).deleteFile(stf4).deleteFile(stf5)
- .submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Set.of(stf6), context.getAmple().readTablet(e1).getFiles());
+ // simulate a bulk import
+ var stf5 = StoredTabletFile
+ .of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/b-0000009/I0000074.rf"));
+ var tm6 = TabletMetadata.builder(e1).build(LOADED);
+ FateInstanceType type = FateInstanceType.fromTableId(tid);
+ FateId fateId = FateId.from(type, UUID.randomUUID());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm6, LOADED)
+ .putFile(stf5, new DataFileValue(0,
0)).putBulkFile(stf5.getTabletFile(), fateId)
+ .submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Set.of(stf4, stf5),
context.getAmple().readTablet(e1).getFiles());
- // simulate trying to re bulk import file after a compaction
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm6, LOADED)
- .putFile(stf5, new DataFileValue(0,
0)).putBulkFile(stf5.getTabletFile(), fateId)
- .submit(tm -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Set.of(stf6), context.getAmple().readTablet(e1).getFiles());
+ // simulate a compaction
+ var stf6 = StoredTabletFile
+ .of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/A0000075.rf"));
+ var tm7 =
+ TabletMetadata.builder(e1).putFile(stf4, compactedDv).putFile(stf5,
compactedDv).build();
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm7, FILES)
+ .putFile(stf6, new DataFileValue(0,
0)).deleteFile(stf4).deleteFile(stf5)
+ .submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
}
+ assertEquals(Set.of(stf6), context.getAmple().readTablet(e1).getFiles());
+
+ // simulate trying to re bulk import file after a compaction
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm6, LOADED)
+ .putFile(stf5, new DataFileValue(0,
0)).putBulkFile(stf5.getTabletFile(), fateId)
+ .submit(tm -> false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Set.of(stf6), context.getAmple().readTablet(e1).getFiles());
}
@Test
public void testWALs() {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
// Test adding a WAL to a tablet and verifying its presence
String walFilePath =
@@ -563,8 +562,8 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
}
@Test
- public void testSelectedFiles() throws Exception {
- var context = cluster.getServerContext();
+ public void testSelectedFiles() {
+ var context = getCluster().getServerContext();
var stf1 = StoredTabletFile
.of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000070.rf"));
@@ -652,7 +651,7 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
@Test
public void testSelectedFilesReordering() throws Exception {
try (AccumuloClient client =
Accumulo.newClient().from(getClientProps()).build()) {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
String pathPrefix =
"hdfs://localhost:8020/accumulo/tables/2a/default_tablet/";
StoredTabletFile stf1 = StoredTabletFile.of(new Path(pathPrefix +
"F0000070.rf"));
@@ -767,272 +766,264 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
@Test
public void testMultipleExtents() {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
- var ts1 = new TServerInstance("localhost:9997", 5000L);
- var ts2 = new TServerInstance("localhost:9997", 6000L);
+ var ts1 = new TServerInstance("localhost:9997", 5000L);
+ var ts2 = new TServerInstance("localhost:9997", 6000L);
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
- .putLocation(Location.future(ts1)).submit(tm -> false);
- ctmi.mutateTablet(e2).requireAbsentOperation().requireAbsentLocation()
- .putLocation(Location.future(ts2)).submit(tm -> false);
- var results = ctmi.process();
- assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
- assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
- assertEquals(Set.of(e1, e2), results.keySet());
- }
- assertEquals(Location.future(ts1),
context.getAmple().readTablet(e1).getLocation());
- assertEquals(Location.future(ts2),
context.getAmple().readTablet(e2).getLocation());
- assertNull(context.getAmple().readTablet(e3).getLocation());
- assertNull(context.getAmple().readTablet(e4).getLocation());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+ .putLocation(Location.future(ts1)).submit(tm -> false);
+ ctmi.mutateTablet(e2).requireAbsentOperation().requireAbsentLocation()
+ .putLocation(Location.future(ts2)).submit(tm -> false);
+ var results = ctmi.process();
+ assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+ assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+ assertEquals(Set.of(e1, e2), results.keySet());
+ }
+ assertEquals(Location.future(ts1),
context.getAmple().readTablet(e1).getLocation());
+ assertEquals(Location.future(ts2),
context.getAmple().readTablet(e2).getLocation());
+ assertNull(context.getAmple().readTablet(e3).getLocation());
+ assertNull(context.getAmple().readTablet(e4).getLocation());
- var e5 = new KeyExtent(tid, new Text("yz"), new Text("ya"));
- assertNull(context.getAmple().readTablet(e5));
+ var e5 = new KeyExtent(tid, new Text("yz"), new Text("ya"));
+ assertNull(context.getAmple().readTablet(e5));
- // in addition to testing multiple tablets also testing
requireAbsentTablet() which is
- // currently not called elsewhere in this IT
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
- .putLocation(Location.future(ts2)).submit(tm -> false);
-
ctmi.mutateTablet(e2).requireAbsentTablet().putLocation(Location.future(ts1))
- .submit(tm -> false);
- ctmi.mutateTablet(e3).requireAbsentOperation().requireAbsentLocation()
- .putLocation(Location.future(ts1)).submit(tm -> false);
- ctmi.mutateTablet(e4).requireAbsentOperation().requireAbsentLocation()
- .putLocation(Location.future(ts2)).submit(tm -> false);
- ctmi.mutateTablet(e5).requireAbsentTablet().putDirName("t-54321")
-
.putPrevEndRow(e5.prevEndRow()).putTabletAvailability(TabletAvailability.ONDEMAND)
- .submit(tm -> false);
- var results = ctmi.process();
- assertEquals(Status.REJECTED, results.get(e1).getStatus());
- assertEquals(Status.REJECTED, results.get(e2).getStatus());
- assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
- assertEquals(Status.ACCEPTED, results.get(e4).getStatus());
- assertEquals(Status.ACCEPTED, results.get(e5).getStatus());
- assertEquals(Set.of(e1, e2, e3, e4, e5), results.keySet());
- }
- assertEquals(Location.future(ts1),
context.getAmple().readTablet(e1).getLocation());
- assertEquals(Location.future(ts2),
context.getAmple().readTablet(e2).getLocation());
- assertEquals(Location.future(ts1),
context.getAmple().readTablet(e3).getLocation());
- assertEquals(Location.future(ts2),
context.getAmple().readTablet(e4).getLocation());
- assertEquals("t-54321", context.getAmple().readTablet(e5).getDirName());
+ // in addition to testing multiple tablets also testing
requireAbsentTablet() which is
+ // currently not called elsewhere in this IT
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+ .putLocation(Location.future(ts2)).submit(tm -> false);
+
ctmi.mutateTablet(e2).requireAbsentTablet().putLocation(Location.future(ts1))
+ .submit(tm -> false);
+ ctmi.mutateTablet(e3).requireAbsentOperation().requireAbsentLocation()
+ .putLocation(Location.future(ts1)).submit(tm -> false);
+ ctmi.mutateTablet(e4).requireAbsentOperation().requireAbsentLocation()
+ .putLocation(Location.future(ts2)).submit(tm -> false);
+ ctmi.mutateTablet(e5).requireAbsentTablet().putDirName("t-54321")
+
.putPrevEndRow(e5.prevEndRow()).putTabletAvailability(TabletAvailability.ONDEMAND)
+ .submit(tm -> false);
+ var results = ctmi.process();
+ assertEquals(Status.REJECTED, results.get(e1).getStatus());
+ assertEquals(Status.REJECTED, results.get(e2).getStatus());
+ assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
+ assertEquals(Status.ACCEPTED, results.get(e4).getStatus());
+ assertEquals(Status.ACCEPTED, results.get(e5).getStatus());
+ assertEquals(Set.of(e1, e2, e3, e4, e5), results.keySet());
}
+ assertEquals(Location.future(ts1),
context.getAmple().readTablet(e1).getLocation());
+ assertEquals(Location.future(ts2),
context.getAmple().readTablet(e2).getLocation());
+ assertEquals(Location.future(ts1),
context.getAmple().readTablet(e3).getLocation());
+ assertEquals(Location.future(ts2),
context.getAmple().readTablet(e4).getLocation());
+ assertEquals("t-54321", context.getAmple().readTablet(e5).getDirName());
}
@Test
public void testOperations() {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
- FateInstanceType type = FateInstanceType.fromTableId(tid);
- FateId fateId1 = FateId.from(type, UUID.randomUUID());
- FateId fateId2 = FateId.from(type, UUID.randomUUID());
- var opid1 = TabletOperationId.from(TabletOperationType.SPLITTING,
fateId1);
- var opid2 = TabletOperationId.from(TabletOperationType.MERGING, fateId2);
+ FateInstanceType type = FateInstanceType.fromTableId(tid);
+ FateId fateId1 = FateId.from(type, UUID.randomUUID());
+ FateId fateId2 = FateId.from(type, UUID.randomUUID());
+ var opid1 = TabletOperationId.from(TabletOperationType.SPLITTING, fateId1);
+ var opid2 = TabletOperationId.from(TabletOperationType.MERGING, fateId2);
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().putOperation(opid1).submit(tm ->
false);
-
ctmi.mutateTablet(e2).requireAbsentOperation().putOperation(opid2).submit(tm ->
false);
-
ctmi.mutateTablet(e3).requireOperation(opid1).deleteOperation().submit(tm ->
false);
- var results = ctmi.process();
- assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
- assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
- assertEquals(Status.REJECTED, results.get(e3).getStatus());
- }
- assertEquals(TabletOperationType.SPLITTING,
- context.getAmple().readTablet(e1).getOperationId().getType());
- assertEquals(opid1, context.getAmple().readTablet(e1).getOperationId());
- assertEquals(TabletOperationType.MERGING,
- context.getAmple().readTablet(e2).getOperationId().getType());
- assertEquals(opid2, context.getAmple().readTablet(e2).getOperationId());
- assertNull(context.getAmple().readTablet(e3).getOperationId());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().putOperation(opid1).submit(tm ->
false);
+
ctmi.mutateTablet(e2).requireAbsentOperation().putOperation(opid2).submit(tm ->
false);
+
ctmi.mutateTablet(e3).requireOperation(opid1).deleteOperation().submit(tm ->
false);
+ var results = ctmi.process();
+ assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+ assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+ assertEquals(Status.REJECTED, results.get(e3).getStatus());
+ }
+ assertEquals(TabletOperationType.SPLITTING,
+ context.getAmple().readTablet(e1).getOperationId().getType());
+ assertEquals(opid1, context.getAmple().readTablet(e1).getOperationId());
+ assertEquals(TabletOperationType.MERGING,
+ context.getAmple().readTablet(e2).getOperationId().getType());
+ assertEquals(opid2, context.getAmple().readTablet(e2).getOperationId());
+ assertNull(context.getAmple().readTablet(e3).getOperationId());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireOperation(opid2).deleteOperation().submit(tm ->
false);
-
ctmi.mutateTablet(e2).requireOperation(opid1).deleteOperation().submit(tm ->
false);
- var results = ctmi.process();
- assertEquals(Status.REJECTED, results.get(e1).getStatus());
- assertEquals(Status.REJECTED, results.get(e2).getStatus());
- }
- assertEquals(TabletOperationType.SPLITTING,
- context.getAmple().readTablet(e1).getOperationId().getType());
- assertEquals(TabletOperationType.MERGING,
- context.getAmple().readTablet(e2).getOperationId().getType());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireOperation(opid2).deleteOperation().submit(tm ->
false);
+
ctmi.mutateTablet(e2).requireOperation(opid1).deleteOperation().submit(tm ->
false);
+ var results = ctmi.process();
+ assertEquals(Status.REJECTED, results.get(e1).getStatus());
+ assertEquals(Status.REJECTED, results.get(e2).getStatus());
+ }
+ assertEquals(TabletOperationType.SPLITTING,
+ context.getAmple().readTablet(e1).getOperationId().getType());
+ assertEquals(TabletOperationType.MERGING,
+ context.getAmple().readTablet(e2).getOperationId().getType());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireOperation(opid1).deleteOperation().submit(tm ->
false);
-
ctmi.mutateTablet(e2).requireOperation(opid2).deleteOperation().submit(tm ->
false);
- var results = ctmi.process();
- assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
- assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
- }
- assertNull(context.getAmple().readTablet(e1).getOperationId());
- assertNull(context.getAmple().readTablet(e2).getOperationId());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireOperation(opid1).deleteOperation().submit(tm ->
false);
+
ctmi.mutateTablet(e2).requireOperation(opid2).deleteOperation().submit(tm ->
false);
+ var results = ctmi.process();
+ assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+ assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
}
+ assertNull(context.getAmple().readTablet(e1).getOperationId());
+ assertNull(context.getAmple().readTablet(e2).getOperationId());
}
@Test
public void testCompaction() {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
- ExternalCompactionId ecid1 =
ExternalCompactionId.generate(UUID.randomUUID());
- ExternalCompactionId ecid2 =
ExternalCompactionId.generate(UUID.randomUUID());
+ ExternalCompactionId ecid1 =
ExternalCompactionId.generate(UUID.randomUUID());
+ ExternalCompactionId ecid2 =
ExternalCompactionId.generate(UUID.randomUUID());
- FateInstanceType type = FateInstanceType.fromTableId(tid);
- FateId fateId = FateId.from(type, UUID.randomUUID());
-
- ReferencedTabletFile tmpFile =
- ReferencedTabletFile.of(new
Path("file:///accumulo/tables/t-0/b-0/c1.rf"));
- CompactorGroupId ceid = CompactorGroupId.of("G1");
- Set<StoredTabletFile> jobFiles =
- Set.of(StoredTabletFile.of(new
Path("file:///accumulo/tables/t-0/b-0/b2.rf")));
- CompactionMetadata ecMeta = new CompactionMetadata(jobFiles, tmpFile,
"localhost:4444",
- CompactionKind.SYSTEM, (short) 2, ceid, false, fateId);
-
- // create a tablet metadata w/ en empty set of compactions
- var tabletMetaNoCompactions = TabletMetadata.builder(e1).build(ECOMP);
- var tabletMetaCompactions =
- TabletMetadata.builder(e1).putExternalCompaction(ecid1,
ecMeta).build();
-
- // Test different compaction requirement scenarios for tablets w/o any
compactions in the
- // metadata table
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMetaNoCompactions,
ECOMP)
- .putExternalCompaction(ecid1, ecMeta).submit(tm -> false);
- ctmi.mutateTablet(e2).requireAbsentOperation().requireCompaction(ecid2)
- .putExternalCompaction(ecid1, ecMeta).submit(tm -> false);
-
ctmi.mutateTablet(e3).requireAbsentOperation().requireSame(tabletMetaNoCompactions,
ECOMP)
- .putExternalCompaction(ecid1, ecMeta).putExternalCompaction(ecid2,
ecMeta)
- .submit(tm -> false);
-
ctmi.mutateTablet(e4).requireAbsentOperation().requireSame(tabletMetaCompactions,
ECOMP)
- .putExternalCompaction(ecid1, ecMeta).submit(tm -> false);
- var results = ctmi.process();
- assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
- assertEquals(Status.REJECTED, results.get(e2).getStatus());
- assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
- assertEquals(Status.REJECTED, results.get(e4).getStatus());
- }
- assertEquals(Set.of(ecid1),
- context.getAmple().readTablet(e1).getExternalCompactions().keySet());
- assertEquals(Set.of(),
context.getAmple().readTablet(e2).getExternalCompactions().keySet());
- assertEquals(Set.of(ecid1, ecid2),
- context.getAmple().readTablet(e3).getExternalCompactions().keySet());
- assertEquals(Set.of(),
context.getAmple().readTablet(e4).getExternalCompactions().keySet());
-
- // Test compaction requirements that do not match the compaction ids
that exists in the
- // metadata table.
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation().requireCompaction(ecid2)
- .deleteExternalCompaction(ecid1).submit(tm -> false);
-
ctmi.mutateTablet(e3).requireAbsentOperation().requireSame(tabletMetaCompactions,
ECOMP)
- .deleteExternalCompaction(ecid1).submit(tm -> false);
- var results = ctmi.process();
- assertEquals(Status.REJECTED, results.get(e1).getStatus());
- assertEquals(Status.REJECTED, results.get(e3).getStatus());
- }
- assertEquals(Set.of(ecid1),
- context.getAmple().readTablet(e1).getExternalCompactions().keySet());
- assertEquals(Set.of(ecid1, ecid2),
- context.getAmple().readTablet(e3).getExternalCompactions().keySet());
+ FateInstanceType type = FateInstanceType.fromTableId(tid);
+ FateId fateId = FateId.from(type, UUID.randomUUID());
+
+ ReferencedTabletFile tmpFile =
+ ReferencedTabletFile.of(new
Path("file:///accumulo/tables/t-0/b-0/c1.rf"));
+ CompactorGroupId ceid = CompactorGroupId.of("G1");
+ Set<StoredTabletFile> jobFiles =
+ Set.of(StoredTabletFile.of(new
Path("file:///accumulo/tables/t-0/b-0/b2.rf")));
+ CompactionMetadata ecMeta = new CompactionMetadata(jobFiles, tmpFile,
"localhost:4444",
+ CompactionKind.SYSTEM, (short) 2, ceid, false, fateId);
+
+ // create a tablet metadata w/ en empty set of compactions
+ var tabletMetaNoCompactions = TabletMetadata.builder(e1).build(ECOMP);
+ var tabletMetaCompactions =
+ TabletMetadata.builder(e1).putExternalCompaction(ecid1,
ecMeta).build();
+
+ // Test different compaction requirement scenarios for tablets w/o any
compactions in the
+ // metadata table
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMetaNoCompactions,
ECOMP)
+ .putExternalCompaction(ecid1, ecMeta).submit(tm -> false);
+ ctmi.mutateTablet(e2).requireAbsentOperation().requireCompaction(ecid2)
+ .putExternalCompaction(ecid1, ecMeta).submit(tm -> false);
+
ctmi.mutateTablet(e3).requireAbsentOperation().requireSame(tabletMetaNoCompactions,
ECOMP)
+ .putExternalCompaction(ecid1, ecMeta).putExternalCompaction(ecid2,
ecMeta)
+ .submit(tm -> false);
+
ctmi.mutateTablet(e4).requireAbsentOperation().requireSame(tabletMetaCompactions,
ECOMP)
+ .putExternalCompaction(ecid1, ecMeta).submit(tm -> false);
+ var results = ctmi.process();
+ assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+ assertEquals(Status.REJECTED, results.get(e2).getStatus());
+ assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
+ assertEquals(Status.REJECTED, results.get(e4).getStatus());
+ }
+ assertEquals(Set.of(ecid1),
+ context.getAmple().readTablet(e1).getExternalCompactions().keySet());
+ assertEquals(Set.of(),
context.getAmple().readTablet(e2).getExternalCompactions().keySet());
+ assertEquals(Set.of(ecid1, ecid2),
+ context.getAmple().readTablet(e3).getExternalCompactions().keySet());
+ assertEquals(Set.of(),
context.getAmple().readTablet(e4).getExternalCompactions().keySet());
+
+ // Test compaction requirements that do not match the compaction ids that
exists in the
+ // metadata table.
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireCompaction(ecid2)
+ .deleteExternalCompaction(ecid1).submit(tm -> false);
+
ctmi.mutateTablet(e3).requireAbsentOperation().requireSame(tabletMetaCompactions,
ECOMP)
+ .deleteExternalCompaction(ecid1).submit(tm -> false);
+ var results = ctmi.process();
+ assertEquals(Status.REJECTED, results.get(e1).getStatus());
+ assertEquals(Status.REJECTED, results.get(e3).getStatus());
+ }
+ assertEquals(Set.of(ecid1),
+ context.getAmple().readTablet(e1).getExternalCompactions().keySet());
+ assertEquals(Set.of(ecid1, ecid2),
+ context.getAmple().readTablet(e3).getExternalCompactions().keySet());
- // Test compaction requirements that match the compaction ids that
exists in the metadata
- // table.
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMetaCompactions,
ECOMP)
- .deleteExternalCompaction(ecid1).submit(tm -> false);
- ctmi.mutateTablet(e3).requireAbsentOperation().requireCompaction(ecid2)
- .deleteExternalCompaction(ecid1).submit(tm -> false);
- var results = ctmi.process();
- assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
- assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
- }
- assertEquals(Set.of(),
context.getAmple().readTablet(e1).getExternalCompactions().keySet());
- assertEquals(Set.of(ecid2),
- context.getAmple().readTablet(e3).getExternalCompactions().keySet());
+ // Test compaction requirements that match the compaction ids that exists
in the metadata
+ // table.
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMetaCompactions,
ECOMP)
+ .deleteExternalCompaction(ecid1).submit(tm -> false);
+ ctmi.mutateTablet(e3).requireAbsentOperation().requireCompaction(ecid2)
+ .deleteExternalCompaction(ecid1).submit(tm -> false);
+ var results = ctmi.process();
+ assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+ assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
}
+ assertEquals(Set.of(),
context.getAmple().readTablet(e1).getExternalCompactions().keySet());
+ assertEquals(Set.of(ecid2),
+ context.getAmple().readTablet(e3).getExternalCompactions().keySet());
}
@Test
public void testCompacted() {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
- FateInstanceType type = FateInstanceType.fromTableId(tid);
- FateId fateId1 = FateId.from(type, UUID.randomUUID());
- FateId fateId2 = FateId.from(type, UUID.randomUUID());
- FateId fateId3 = FateId.from(type, UUID.randomUUID());
- FateId fateId4 = FateId.from(type, UUID.randomUUID());
- FateId fateId5 = FateId.from(type, UUID.randomUUID());
+ FateInstanceType type = FateInstanceType.fromTableId(tid);
+ FateId fateId1 = FateId.from(type, UUID.randomUUID());
+ FateId fateId2 = FateId.from(type, UUID.randomUUID());
+ FateId fateId3 = FateId.from(type, UUID.randomUUID());
+ FateId fateId4 = FateId.from(type, UUID.randomUUID());
+ FateId fateId5 = FateId.from(type, UUID.randomUUID());
- var tabletMeta1 = TabletMetadata.builder(e1).build(COMPACTED);
+ var tabletMeta1 = TabletMetadata.builder(e1).build(COMPACTED);
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
COMPACTED)
- .putCompacted(fateId2)
- .submit(tabletMetadata ->
tabletMetadata.getCompacted().contains(fateId2));
- var tabletMeta2 =
TabletMetadata.builder(e2).putCompacted(fateId1).build(COMPACTED);
-
ctmi.mutateTablet(e2).requireAbsentOperation().requireSame(tabletMeta2,
COMPACTED)
- .putCompacted(fateId3)
- .submit(tabletMetadata ->
tabletMetadata.getCompacted().contains(fateId3));
- var results = ctmi.process();
- assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
- assertEquals(Status.REJECTED, results.get(e2).getStatus());
- }
- tabletMeta1 = context.getAmple().readTablet(e1);
- assertEquals(Set.of(fateId2), tabletMeta1.getCompacted());
- assertEquals(Set.of(), context.getAmple().readTablet(e2).getCompacted());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
COMPACTED)
+ .putCompacted(fateId2)
+ .submit(tabletMetadata ->
tabletMetadata.getCompacted().contains(fateId2));
+ var tabletMeta2 =
TabletMetadata.builder(e2).putCompacted(fateId1).build(COMPACTED);
+ ctmi.mutateTablet(e2).requireAbsentOperation().requireSame(tabletMeta2,
COMPACTED)
+ .putCompacted(fateId3)
+ .submit(tabletMetadata ->
tabletMetadata.getCompacted().contains(fateId3));
+ var results = ctmi.process();
+ assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+ assertEquals(Status.REJECTED, results.get(e2).getStatus());
+ }
+ tabletMeta1 = context.getAmple().readTablet(e1);
+ assertEquals(Set.of(fateId2), tabletMeta1.getCompacted());
+ assertEquals(Set.of(), context.getAmple().readTablet(e2).getCompacted());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
COMPACTED)
- .putCompacted(fateId4).putCompacted(fateId5).submit(tabletMetadata
-> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- tabletMeta1 = context.getAmple().readTablet(e1);
- assertEquals(Set.of(fateId2, fateId4, fateId5),
tabletMeta1.getCompacted());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
COMPACTED)
+ .putCompacted(fateId4).putCompacted(fateId5).submit(tabletMetadata
-> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ tabletMeta1 = context.getAmple().readTablet(e1);
+ assertEquals(Set.of(fateId2, fateId4, fateId5),
tabletMeta1.getCompacted());
- // test require same with a superset
- tabletMeta1 =
TabletMetadata.builder(e2).putCompacted(fateId2).putCompacted(fateId4)
- .putCompacted(fateId5).putCompacted(fateId1).build(COMPACTED);
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
COMPACTED)
-
.deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5)
- .submit(tabletMetadata -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Set.of(fateId2, fateId4, fateId5),
- context.getAmple().readTablet(e1).getCompacted());
+ // test require same with a superset
+ tabletMeta1 =
TabletMetadata.builder(e2).putCompacted(fateId2).putCompacted(fateId4)
+ .putCompacted(fateId5).putCompacted(fateId1).build(COMPACTED);
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
COMPACTED)
+
.deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5)
+ .submit(tabletMetadata -> false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Set.of(fateId2, fateId4, fateId5),
+ context.getAmple().readTablet(e1).getCompacted());
- // test require same with a subset
- tabletMeta1 =
-
TabletMetadata.builder(e2).putCompacted(fateId2).putCompacted(fateId4).build(COMPACTED);
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
COMPACTED)
-
.deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5)
- .submit(tabletMetadata -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Set.of(fateId2, fateId4, fateId5),
- context.getAmple().readTablet(e1).getCompacted());
+ // test require same with a subset
+ tabletMeta1 =
+
TabletMetadata.builder(e2).putCompacted(fateId2).putCompacted(fateId4).build(COMPACTED);
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
COMPACTED)
+
.deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5)
+ .submit(tabletMetadata -> false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Set.of(fateId2, fateId4, fateId5),
+ context.getAmple().readTablet(e1).getCompacted());
- // now use the exact set the tablet has
- tabletMeta1 =
TabletMetadata.builder(e2).putCompacted(fateId2).putCompacted(fateId4)
- .putCompacted(fateId5).build(COMPACTED);
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
COMPACTED)
-
.deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5)
- .submit(tabletMetadata -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Set.of(), context.getAmple().readTablet(e1).getCompacted());
+ // now use the exact set the tablet has
+ tabletMeta1 =
TabletMetadata.builder(e2).putCompacted(fateId2).putCompacted(fateId4)
+ .putCompacted(fateId5).build(COMPACTED);
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
COMPACTED)
+
.deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5)
+ .submit(tabletMetadata -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
}
+ assertEquals(Set.of(), context.getAmple().readTablet(e1).getCompacted());
}
@Test
public void testRootTabletUpdate() {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
var rootMeta = context.getAmple().readTablet(RootTable.EXTENT);
var loc = rootMeta.getLocation();
@@ -1071,116 +1062,110 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
@Test
public void testTime() {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
- for (var time : List.of(new MetadataTime(100, TimeType.LOGICAL),
- new MetadataTime(100, TimeType.MILLIS), new MetadataTime(0,
TimeType.LOGICAL))) {
- var tabletMeta1 = TabletMetadata.builder(e1).putTime(time).build();
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, TIME)
- .putTime(new MetadataTime(101,
TimeType.LOGICAL)).submit(tabletMetadata -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(new MetadataTime(0, TimeType.MILLIS),
- context.getAmple().readTablet(e1).getTime());
+ for (var time : List.of(new MetadataTime(100, TimeType.LOGICAL),
+ new MetadataTime(100, TimeType.MILLIS), new MetadataTime(0,
TimeType.LOGICAL))) {
+ var tabletMeta1 = TabletMetadata.builder(e1).putTime(time).build();
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, TIME)
+ .putTime(new MetadataTime(101,
TimeType.LOGICAL)).submit(tabletMetadata -> false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
}
+ assertEquals(new MetadataTime(0, TimeType.MILLIS),
+ context.getAmple().readTablet(e1).getTime());
+ }
- for (int i = 0; i < 10; i++) {
- var tabletMeta1 =
- TabletMetadata.builder(e1).putTime(new MetadataTime(i,
TimeType.MILLIS)).build();
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, TIME)
- .putTime(new MetadataTime(i + 1,
TimeType.MILLIS)).submit(tabletMetadata -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(new MetadataTime(i + 1, TimeType.MILLIS),
- context.getAmple().readTablet(e1).getTime());
+ for (int i = 0; i < 10; i++) {
+ var tabletMeta1 =
+ TabletMetadata.builder(e1).putTime(new MetadataTime(i,
TimeType.MILLIS)).build();
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, TIME)
+ .putTime(new MetadataTime(i + 1,
TimeType.MILLIS)).submit(tabletMetadata -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
}
+ assertEquals(new MetadataTime(i + 1, TimeType.MILLIS),
+ context.getAmple().readTablet(e1).getTime());
}
}
@Test
public void testUserCompactionRequested() {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
- FateInstanceType type = FateInstanceType.fromTableId(tid);
- FateId fateId1 = FateId.from(type, UUID.randomUUID());
- FateId fateId2 = FateId.from(type, UUID.randomUUID());
- FateId fateId3 = FateId.from(type, UUID.randomUUID());
- FateId fateId4 = FateId.from(type, UUID.randomUUID());
- FateId fateId5 = FateId.from(type, UUID.randomUUID());
- var tabletMeta1 =
TabletMetadata.builder(e1).build(USER_COMPACTION_REQUESTED);
+ FateInstanceType type = FateInstanceType.fromTableId(tid);
+ FateId fateId1 = FateId.from(type, UUID.randomUUID());
+ FateId fateId2 = FateId.from(type, UUID.randomUUID());
+ FateId fateId3 = FateId.from(type, UUID.randomUUID());
+ FateId fateId4 = FateId.from(type, UUID.randomUUID());
+ FateId fateId5 = FateId.from(type, UUID.randomUUID());
+ var tabletMeta1 =
TabletMetadata.builder(e1).build(USER_COMPACTION_REQUESTED);
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation()
- .requireSame(tabletMeta1,
USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId2)
- .submit(
- tabletMetadata ->
tabletMetadata.getUserCompactionsRequested().contains(fateId2));
- var tabletMeta2 =
TabletMetadata.builder(e2).putUserCompactionRequested(fateId1)
- .build(USER_COMPACTION_REQUESTED);
- ctmi.mutateTablet(e2).requireAbsentOperation()
- .requireSame(tabletMeta2,
USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId3)
- .submit(
- tabletMetadata ->
tabletMetadata.getUserCompactionsRequested().contains(fateId3));
- var results = ctmi.process();
- assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
- assertEquals(Status.REJECTED, results.get(e2).getStatus());
- }
- tabletMeta1 = context.getAmple().readTablet(e1);
- assertEquals(Set.of(fateId2), tabletMeta1.getUserCompactionsRequested());
- assertEquals(Set.of(),
context.getAmple().readTablet(e2).getUserCompactionsRequested());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation()
+ .requireSame(tabletMeta1,
USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId2)
+ .submit(tabletMetadata ->
tabletMetadata.getUserCompactionsRequested().contains(fateId2));
+ var tabletMeta2 =
TabletMetadata.builder(e2).putUserCompactionRequested(fateId1)
+ .build(USER_COMPACTION_REQUESTED);
+ ctmi.mutateTablet(e2).requireAbsentOperation()
+ .requireSame(tabletMeta2,
USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId3)
+ .submit(tabletMetadata ->
tabletMetadata.getUserCompactionsRequested().contains(fateId3));
+ var results = ctmi.process();
+ assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+ assertEquals(Status.REJECTED, results.get(e2).getStatus());
+ }
+ tabletMeta1 = context.getAmple().readTablet(e1);
+ assertEquals(Set.of(fateId2), tabletMeta1.getUserCompactionsRequested());
+ assertEquals(Set.of(),
context.getAmple().readTablet(e2).getUserCompactionsRequested());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation()
- .requireSame(tabletMeta1,
USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId4)
- .putUserCompactionRequested(fateId5).submit(tabletMetadata ->
false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- tabletMeta1 = context.getAmple().readTablet(e1);
- assertEquals(Set.of(fateId2, fateId4, fateId5),
tabletMeta1.getUserCompactionsRequested());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation()
+ .requireSame(tabletMeta1,
USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId4)
+ .putUserCompactionRequested(fateId5).submit(tabletMetadata -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ tabletMeta1 = context.getAmple().readTablet(e1);
+ assertEquals(Set.of(fateId2, fateId4, fateId5),
tabletMeta1.getUserCompactionsRequested());
- // test require same with a superset
- tabletMeta1 =
TabletMetadata.builder(e2).putUserCompactionRequested(fateId2)
-
.putUserCompactionRequested(fateId4).putUserCompactionRequested(fateId5)
-
.putUserCompactionRequested(fateId1).build(USER_COMPACTION_REQUESTED);
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation()
- .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED)
-
.deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4)
- .deleteUserCompactionRequested(fateId5).submit(tabletMetadata ->
false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Set.of(fateId2, fateId4, fateId5),
- context.getAmple().readTablet(e1).getUserCompactionsRequested());
+ // test require same with a superset
+ tabletMeta1 =
TabletMetadata.builder(e2).putUserCompactionRequested(fateId2)
+
.putUserCompactionRequested(fateId4).putUserCompactionRequested(fateId5)
+ .putUserCompactionRequested(fateId1).build(USER_COMPACTION_REQUESTED);
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation()
+ .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED)
+
.deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4)
+ .deleteUserCompactionRequested(fateId5).submit(tabletMetadata ->
false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Set.of(fateId2, fateId4, fateId5),
+ context.getAmple().readTablet(e1).getUserCompactionsRequested());
- // test require same with a subset
- tabletMeta1 =
TabletMetadata.builder(e2).putUserCompactionRequested(fateId2)
-
.putUserCompactionRequested(fateId4).build(USER_COMPACTION_REQUESTED);
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation()
- .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED)
-
.deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4)
- .deleteUserCompactionRequested(fateId5).submit(tabletMetadata ->
false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Set.of(fateId2, fateId4, fateId5),
- context.getAmple().readTablet(e1).getUserCompactionsRequested());
+ // test require same with a subset
+ tabletMeta1 =
TabletMetadata.builder(e2).putUserCompactionRequested(fateId2)
+ .putUserCompactionRequested(fateId4).build(USER_COMPACTION_REQUESTED);
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation()
+ .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED)
+
.deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4)
+ .deleteUserCompactionRequested(fateId5).submit(tabletMetadata ->
false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(Set.of(fateId2, fateId4, fateId5),
+ context.getAmple().readTablet(e1).getUserCompactionsRequested());
- // now use the exact set the tablet has
- tabletMeta1 =
TabletMetadata.builder(e2).putUserCompactionRequested(fateId2)
-
.putUserCompactionRequested(fateId4).putUserCompactionRequested(fateId5)
- .build(USER_COMPACTION_REQUESTED);
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation()
- .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED)
-
.deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4)
- .deleteUserCompactionRequested(fateId5).submit(tabletMetadata ->
false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(Set.of(),
context.getAmple().readTablet(e1).getUserCompactionsRequested());
+ // now use the exact set the tablet has
+ tabletMeta1 =
TabletMetadata.builder(e2).putUserCompactionRequested(fateId2)
+
.putUserCompactionRequested(fateId4).putUserCompactionRequested(fateId5)
+ .build(USER_COMPACTION_REQUESTED);
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation()
+ .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED)
+
.deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4)
+ .deleteUserCompactionRequested(fateId5).submit(tabletMetadata ->
false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
}
+ assertEquals(Set.of(),
context.getAmple().readTablet(e1).getUserCompactionsRequested());
}
@Nested
@@ -1227,7 +1212,7 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
@Test
public void multipleFilters() {
- ServerContext context = cluster.getServerContext();
+ ServerContext context = getCluster().getServerContext();
// make sure we read all tablets on table initially with no filters
testFilterApplied(context, Set.of(), Set.of(e1, e2, e3, e4),
@@ -1280,17 +1265,15 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
@Test
public void testCompactedAndFlushIdFilter() {
- ServerContext context = cluster.getServerContext();
+ ServerContext context = getCluster().getServerContext();
Set<TabletMetadataFilter> filter = Set.of(new
TestTabletMetadataFilter());
FateInstanceType type = FateInstanceType.fromTableId(tid);
FateId fateId1 = FateId.from(type, UUID.randomUUID());
FateId fateId2 = FateId.from(type, UUID.randomUUID());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- // make sure we read all tablets on table initially with no filters
- testFilterApplied(context, Set.of(), Set.of(e1, e2, e3, e4),
- "Initially, all tablets should be present");
- }
+ // make sure we read all tablets on table initially with no filters
+ testFilterApplied(context, Set.of(), Set.of(e1, e2, e3, e4),
+ "Initially, all tablets should be present");
try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
// Set compacted on e2 but with no flush ID
@@ -1331,7 +1314,7 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
@Test
public void walFilter() {
- ServerContext context = cluster.getServerContext();
+ ServerContext context = getCluster().getServerContext();
Set<TabletMetadataFilter> filter = Set.of(new GcWalsFilter(Set.of()));
@@ -1412,7 +1395,7 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
@Test
public void partialFetch() {
- ServerContext context = cluster.getServerContext();
+ ServerContext context = getCluster().getServerContext();
TestTabletMetadataFilter filter = new TestTabletMetadataFilter();
// if we only fetch some columns needed by the filter, we should get an
exception
TabletsMetadata.Options options =
@@ -1427,49 +1410,43 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
@Test
public void testFlushId() {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
- assertTrue(context.getAmple().readTablet(e1).getFlushId().isEmpty());
+ assertTrue(context.getAmple().readTablet(e1).getFlushId().isEmpty());
- var tabletMeta1 = TabletMetadata.builder(e1).putFlushId(42L).build();
- assertTrue(tabletMeta1.getFlushId().isPresent());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
FLUSH_ID)
- .putFlushId(43L)
- .submit(tabletMetadata -> tabletMetadata.getFlushId().orElse(-1)
== 43L);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertTrue(context.getAmple().readTablet(e1).getFlushId().isEmpty());
+ var tabletMeta1 = TabletMetadata.builder(e1).putFlushId(42L).build();
+ assertTrue(tabletMeta1.getFlushId().isPresent());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
FLUSH_ID)
+ .putFlushId(43L).submit(tabletMetadata ->
tabletMetadata.getFlushId().orElse(-1) == 43L);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
+ assertTrue(context.getAmple().readTablet(e1).getFlushId().isEmpty());
- var tabletMeta2 = TabletMetadata.builder(e1).build(FLUSH_ID);
- assertFalse(tabletMeta2.getFlushId().isPresent());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2,
FLUSH_ID)
- .putFlushId(43L)
- .submit(tabletMetadata -> tabletMetadata.getFlushId().orElse(-1)
== 43L);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(43L,
context.getAmple().readTablet(e1).getFlushId().getAsLong());
+ var tabletMeta2 = TabletMetadata.builder(e1).build(FLUSH_ID);
+ assertFalse(tabletMeta2.getFlushId().isPresent());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2,
FLUSH_ID)
+ .putFlushId(43L).submit(tabletMetadata ->
tabletMetadata.getFlushId().orElse(-1) == 43L);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(43L,
context.getAmple().readTablet(e1).getFlushId().getAsLong());
- var tabletMeta3 = TabletMetadata.builder(e1).putFlushId(43L).build();
- assertTrue(tabletMeta3.getFlushId().isPresent());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3,
FLUSH_ID)
- .putFlushId(44L)
- .submit(tabletMetadata -> tabletMetadata.getFlushId().orElse(-1)
== 44L);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(44L,
context.getAmple().readTablet(e1).getFlushId().getAsLong());
+ var tabletMeta3 = TabletMetadata.builder(e1).putFlushId(43L).build();
+ assertTrue(tabletMeta3.getFlushId().isPresent());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3,
FLUSH_ID)
+ .putFlushId(44L).submit(tabletMetadata ->
tabletMetadata.getFlushId().orElse(-1) == 44L);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(44L,
context.getAmple().readTablet(e1).getFlushId().getAsLong());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3,
FLUSH_ID)
- .putFlushId(45L)
- .submit(tabletMetadata -> tabletMetadata.getFlushId().orElse(-1)
== 45L);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(44L,
context.getAmple().readTablet(e1).getFlushId().getAsLong());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3,
FLUSH_ID)
+ .putFlushId(45L).submit(tabletMetadata ->
tabletMetadata.getFlushId().orElse(-1) == 45L);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
}
+ assertEquals(44L,
context.getAmple().readTablet(e1).getFlushId().getAsLong());
}
@Test
@@ -1489,7 +1466,7 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
c.tableOperations().create(table, new
NewTableConfiguration().withSplits(splits));
var tableId = TableId.of(c.tableOperations().tableIdMap().get(table));
- var ample = cluster.getServerContext().getAmple();
+ var ample = getCluster().getServerContext().getAmple();
AtomicLong accepted = new AtomicLong(0);
AtomicLong total = new AtomicLong(0);
@@ -1545,214 +1522,119 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
}
@Test
- public void testSuspendMarker() throws Exception {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
-
- final String SUSPEND_RG = "SUSPEND";
-
- MiniAccumuloClusterImpl cluster = (MiniAccumuloClusterImpl) getCluster();
-
cluster.getConfig().getClusterServerConfiguration().addTabletServerResourceGroup(SUSPEND_RG,
- 1);
- cluster.getClusterControl().start(ServerType.TABLET_SERVER);
- List<Process> processes =
cluster.getClusterControl().getTabletServers(SUSPEND_RG);
- assertNotNull(processes);
- assertEquals(1, processes.size());
-
- String tableName = getUniqueNames(2)[1];
- NewTableConfiguration ntc = new NewTableConfiguration();
- ntc.withInitialTabletAvailability(TabletAvailability.HOSTED);
- ntc.setProperties(Map.of(Property.TABLE_SUSPEND_DURATION.getKey(), "30s",
- TableLoadBalancer.TABLE_ASSIGNMENT_GROUP_PROPERTY, SUSPEND_RG));
- c.tableOperations().create(tableName, ntc);
+ public void testTabletAvailability() {
+ var context = getCluster().getServerContext();
- c.instanceOperations().waitForBalance();
-
- TableId suspendTableTid =
TableId.of(c.tableOperations().tableIdMap().get(tableName));
-
- TabletMetadata originalTM = null;
- try (TabletsMetadata tms =
TabletsMetadata.builder(c).forTable(suspendTableTid).build()) {
- assertEquals(1, Iterables.size(tms));
- originalTM = tms.iterator().next();
- assertNull(originalTM.getSuspend());
- }
-
- cluster.getClusterControl().stopTabletServerGroup(SUSPEND_RG);
-
- Wait.waitFor(() -> getSuspendedColumn(c, suspendTableTid) != null,
60_000);
-
- try (var tabletsMutator =
getServerContext().getAmple().conditionallyMutateTablets()) {
-
tabletsMutator.mutateTablet(originalTM.getExtent()).requireAbsentOperation()
- .requireSame(originalTM,
SUSPEND).putTabletAvailability(TabletAvailability.ONDEMAND)
- .submit(tabletMetadata -> false);
+ assertEquals(TabletAvailability.ONDEMAND,
+ context.getAmple().readTablet(e1).getTabletAvailability());
+ assertEquals(TabletAvailability.ONDEMAND,
+ context.getAmple().readTablet(e2).getTabletAvailability());
- // This should fail because the original tablet metadata does not have
a suspend column
- // and the current tablet metadata does.
-
assertTrue(tabletsMutator.process().get(originalTM.getExtent()).getStatus()
- .equals(Status.REJECTED));
- }
-
- // test require same when the tablet metadata passed in has a suspend
column set
- var suspendedTM =
getServerContext().getAmple().readTablet(originalTM.getExtent());
- assertNotNull(suspendedTM.getSuspend());
- try (var tabletsMutator =
getServerContext().getAmple().conditionallyMutateTablets()) {
-
tabletsMutator.mutateTablet(originalTM.getExtent()).requireAbsentOperation()
- .requireSame(suspendedTM,
SUSPEND).putFlushNonce(6789).submit(tabletMetadata -> false);
-
- // This should succeed because the tablet metadata does have a suspend
column and the
- // current tablet metadata does.
-
assertTrue(tabletsMutator.process().get(originalTM.getExtent()).getStatus()
- .equals(Status.ACCEPTED));
- }
-
- cluster.getClusterControl().start(ServerType.TABLET_SERVER);
-
- Wait.waitFor(() -> getSuspendedColumn(c, suspendTableTid) == null,
60_000);
-
- try (var tabletsMutator =
getServerContext().getAmple().conditionallyMutateTablets()) {
-
tabletsMutator.mutateTablet(originalTM.getExtent()).requireAbsentOperation()
- .requireSame(originalTM,
SUSPEND).putTabletAvailability(TabletAvailability.ONDEMAND)
- .submit(tabletMetadata -> false);
-
- // This should succeed because the original tablet metadata does not
have a suspend column
- // and the current tablet metadata does not also because the tablet
server for the SUSPEND
- // resource group was restarted.
-
assertTrue(tabletsMutator.process().get(originalTM.getExtent()).getStatus()
- .equals(Status.ACCEPTED));
-
- }
- }
- }
-
- private static SuspendingTServer getSuspendedColumn(AccumuloClient c,
TableId tid) {
- try (TabletsMetadata tms =
TabletsMetadata.builder(c).forTable(tid).build()) {
- assertEquals(1, Iterables.size(tms));
- TabletMetadata tm = tms.iterator().next();
- return tm.getSuspend();
- }
- }
-
- @Test
- public void testTabletAvailability() throws Exception {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
- var context = cluster.getServerContext();
-
- assertEquals(TabletAvailability.ONDEMAND,
- context.getAmple().readTablet(e1).getTabletAvailability());
- assertEquals(TabletAvailability.ONDEMAND,
- context.getAmple().readTablet(e2).getTabletAvailability());
-
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentOperation()
- .requireTabletAvailability(TabletAvailability.HOSTED)
- .putTabletAvailability(TabletAvailability.UNHOSTED).submit(tm ->
false);
- ctmi.mutateTablet(e2).requireAbsentOperation()
- .requireTabletAvailability(TabletAvailability.ONDEMAND)
- .putTabletAvailability(TabletAvailability.UNHOSTED).submit(tm ->
false);
- var results = ctmi.process();
- assertEquals(Status.REJECTED, results.get(e1).getStatus());
- assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
- }
- assertEquals(TabletAvailability.ONDEMAND,
- context.getAmple().readTablet(e1).getTabletAvailability());
- assertEquals(TabletAvailability.UNHOSTED,
- context.getAmple().readTablet(e2).getTabletAvailability());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation()
+ .requireTabletAvailability(TabletAvailability.HOSTED)
+ .putTabletAvailability(TabletAvailability.UNHOSTED).submit(tm ->
false);
+ ctmi.mutateTablet(e2).requireAbsentOperation()
+ .requireTabletAvailability(TabletAvailability.ONDEMAND)
+ .putTabletAvailability(TabletAvailability.UNHOSTED).submit(tm ->
false);
+ var results = ctmi.process();
+ assertEquals(Status.REJECTED, results.get(e1).getStatus());
+ assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
}
+ assertEquals(TabletAvailability.ONDEMAND,
+ context.getAmple().readTablet(e1).getTabletAvailability());
+ assertEquals(TabletAvailability.UNHOSTED,
+ context.getAmple().readTablet(e2).getTabletAvailability());
}
@Test
public void testUnsplittable() {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
- var tabletMeta1 = TabletMetadata.builder(e1).build(UNSPLITTABLE);
- // require the UNSPLITTABLE column to be absent when it is absent
- var usm1 = UnSplittableMetadata.toUnSplittable(e1, 1000, 100000, 32,
Set.of());
+ var tabletMeta1 = TabletMetadata.builder(e1).build(UNSPLITTABLE);
+ // require the UNSPLITTABLE column to be absent when it is absent
+ var usm1 = UnSplittableMetadata.toUnSplittable(e1, 1000, 100000, 32,
Set.of());
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
UNSPLITTABLE)
- .setUnSplittable(usm1).submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- var tabletMeta2 = context.getAmple().readTablet(e1);
- assertEquals(usm1.toBase64(), tabletMeta2.getUnSplittable().toBase64());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
UNSPLITTABLE)
+ .setUnSplittable(usm1).submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ var tabletMeta2 = context.getAmple().readTablet(e1);
+ assertEquals(usm1.toBase64(), tabletMeta2.getUnSplittable().toBase64());
- // require the UNSPLITTABLE column to be absent when it is not absent
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
UNSPLITTABLE)
- .deleteUnSplittable().submit(tm -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(usm1.toBase64(),
context.getAmple().readTablet(e1).getUnSplittable().toBase64());
+ // require the UNSPLITTABLE column to be absent when it is not absent
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1,
UNSPLITTABLE)
+ .deleteUnSplittable().submit(tm -> false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(usm1.toBase64(),
context.getAmple().readTablet(e1).getUnSplittable().toBase64());
- var usm2 = UnSplittableMetadata.toUnSplittable(e1, 1001, 100001, 33,
Set.of());
- var tabletMeta3 =
TabletMetadata.builder(e1).setUnSplittable(usm2).build(UNSPLITTABLE);
- // require the UNSPLITTABLE column to be usm2 when it is actually usm1
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3,
UNSPLITTABLE)
- .deleteUnSplittable().submit(tm -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertEquals(usm1.toBase64(),
context.getAmple().readTablet(e1).getUnSplittable().toBase64());
+ var usm2 = UnSplittableMetadata.toUnSplittable(e1, 1001, 100001, 33,
Set.of());
+ var tabletMeta3 =
TabletMetadata.builder(e1).setUnSplittable(usm2).build(UNSPLITTABLE);
+ // require the UNSPLITTABLE column to be usm2 when it is actually usm1
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3,
UNSPLITTABLE)
+ .deleteUnSplittable().submit(tm -> false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+ }
+ assertEquals(usm1.toBase64(),
context.getAmple().readTablet(e1).getUnSplittable().toBase64());
- // require the UNSPLITTABLE column to be usm1 when it is actually usm1
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2,
UNSPLITTABLE)
- .deleteUnSplittable().submit(tm -> false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- }
- assertNull(context.getAmple().readTablet(e1).getUnSplittable());
+ // require the UNSPLITTABLE column to be usm1 when it is actually usm1
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2,
UNSPLITTABLE)
+ .deleteUnSplittable().submit(tm -> false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ }
+ assertNull(context.getAmple().readTablet(e1).getUnSplittable());
- // require the UNSPLITTABLE column to be usm1 when it is actually absent
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2,
UNSPLITTABLE)
- .setUnSplittable(usm2).submit(tm -> false);
- assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
- }
- assertNull(context.getAmple().readTablet(e1).getUnSplittable());
+ // require the UNSPLITTABLE column to be usm1 when it is actually absent
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2,
UNSPLITTABLE)
+ .setUnSplittable(usm2).submit(tm -> false);
+ assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
}
+ assertNull(context.getAmple().readTablet(e1).getUnSplittable());
}
@Test
public void testErrors() {
- try (AccumuloClient c =
Accumulo.newClient().from(getClientProps()).build()) {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- ctmi.mutateTablet(e1).requireAbsentTablet().putDirName("d1").submit(tm
-> false);
- // making multiple updates for the same tablet is not supported
- assertThrows(IllegalStateException.class,
- () ->
ctmi.mutateTablet(e1).requireAbsentTablet().putDirName("d2").submit(tm ->
false));
- // attempt to use a column that requireSame does not support
- TabletMetadata tabletMetadata = TabletMetadata.builder(e2).build();
- assertThrows(UnsupportedOperationException.class,
- () -> ctmi.mutateTablet(e2).requireAbsentOperation()
- .requireSame(tabletMetadata,
HOSTING_REQUESTED).putDirName("d2")
- .submit(tm -> false));
- }
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ ctmi.mutateTablet(e1).requireAbsentTablet().putDirName("d1").submit(tm
-> false);
+ // making multiple updates for the same tablet is not supported
+ assertThrows(IllegalStateException.class,
+ () ->
ctmi.mutateTablet(e1).requireAbsentTablet().putDirName("d2").submit(tm ->
false));
+ // attempt to use a column that requireSame does not support
+ TabletMetadata tabletMetadata = TabletMetadata.builder(e2).build();
+ assertThrows(UnsupportedOperationException.class,
+ () -> ctmi.mutateTablet(e2).requireAbsentOperation()
+ .requireSame(tabletMetadata,
HOSTING_REQUESTED).putDirName("d2").submit(tm -> false));
+ }
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
- // the following end prev end row update should cause a constraint
violation because a
- // tablet's prev end row must be less than its end row
-
ctmi.mutateTablet(e1).requireAbsentOperation().putPrevEndRow(e1.endRow())
- .submit(tm -> false);
- // getting status when a constraint violation happened should throw an
exception
- assertThrows(IllegalStateException.class, () ->
ctmi.process().get(e1).getStatus());
- }
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+ // the following end prev end row update should cause a constraint
violation because a
+ // tablet's prev end row must be less than its end row
+
ctmi.mutateTablet(e1).requireAbsentOperation().putPrevEndRow(e1.endRow()).submit(tm
-> false);
+ // getting status when a constraint violation happened should throw an
exception
+ assertThrows(IllegalStateException.class, () ->
ctmi.process().get(e1).getStatus());
+ }
- try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
-
ctmi.mutateTablet(e1).requireAbsentOperation().putFlushNonce(1234).submit(tm ->
false);
- assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+ try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+
ctmi.mutateTablet(e1).requireAbsentOperation().putFlushNonce(1234).submit(tm ->
false);
+ assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
- // attempting to use after calling proccess() should throw an exception
- assertThrows(IllegalStateException.class, () -> ctmi.mutateTablet(e1)
- .requireAbsentOperation().putFlushNonce(1234).submit(tm -> false));
- }
+ // attempting to use after calling proccess() should throw an exception
+ assertThrows(IllegalStateException.class, () ->
ctmi.mutateTablet(e1).requireAbsentOperation()
+ .putFlushNonce(1234).submit(tm -> false));
}
}
@Test
public void testRequiresFiles() {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
var stf1 = StoredTabletFile
.of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000070.rf"));
@@ -1803,7 +1685,7 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
@Test
public void testFilesLimit() {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
var stf1 = StoredTabletFile
.of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000070.rf"));
@@ -1880,7 +1762,7 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
@Test
public void testRequireAbsentLoaded() {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
var stf1 = StoredTabletFile
.of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000070.rf"));
@@ -1959,7 +1841,7 @@ public class AmpleConditionalWriterIT extends
AccumuloClusterHarness {
@Test
public void testMetadataCheck() {
- var context = cluster.getServerContext();
+ var context = getCluster().getServerContext();
var stf1 = StoredTabletFile
.of(new
Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000070.rf"));
diff --git
a/test/src/main/java/org/apache/accumulo/test/functional/SuspendMarkerIT.java
b/test/src/main/java/org/apache/accumulo/test/functional/SuspendMarkerIT.java
new file mode 100644
index 0000000000..a27b038427
--- /dev/null
+++
b/test/src/main/java/org/apache/accumulo/test/functional/SuspendMarkerIT.java
@@ -0,0 +1,139 @@
+/*
+ * 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.test.functional;
+
+import static com.google.common.collect.MoreCollectors.onlyElement;
+import static
org.apache.accumulo.core.metadata.schema.Ample.ConditionalResult.Status.ACCEPTED;
+import static
org.apache.accumulo.core.metadata.schema.Ample.ConditionalResult.Status.REJECTED;
+import static
org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.SUSPEND;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.accumulo.core.client.Accumulo;
+import org.apache.accumulo.core.client.AccumuloClient;
+import org.apache.accumulo.core.client.admin.NewTableConfiguration;
+import org.apache.accumulo.core.client.admin.TabletAvailability;
+import org.apache.accumulo.core.conf.Property;
+import org.apache.accumulo.core.data.TableId;
+import org.apache.accumulo.core.metadata.schema.TabletMetadata;
+import org.apache.accumulo.core.metadata.schema.TabletsMetadata;
+import org.apache.accumulo.core.spi.balancer.TableLoadBalancer;
+import org.apache.accumulo.minicluster.ServerType;
+import org.apache.accumulo.miniclusterImpl.MiniAccumuloClusterControl;
+import org.apache.accumulo.miniclusterImpl.MiniAccumuloConfigImpl;
+import org.apache.accumulo.test.util.Wait;
+import org.apache.hadoop.conf.Configuration;
+import org.junit.jupiter.api.Test;
+
+public class SuspendMarkerIT extends ConfigurableMacBase {
+
+ final String SUSPEND_RG = "SUSPEND";
+
+ @Override
+ protected void configure(MiniAccumuloConfigImpl cfg, Configuration
hadoopCoreSite) {
+ cfg.getClusterServerConfiguration().setNumDefaultTabletServers(1);
+
cfg.getClusterServerConfiguration().addTabletServerResourceGroup(SUSPEND_RG, 1);
+
+ }
+
+ @Test
+ public void testSuspendMarker() throws Exception {
+ try (AccumuloClient c =
Accumulo.newClient().from(getClientProperties()).build()) {
+
+ MiniAccumuloClusterControl clusterControl =
getCluster().getClusterControl();
+
+ List<Process> processes = clusterControl.getTabletServers(SUSPEND_RG);
+ assertNotNull(processes);
+ assertEquals(1, processes.size());
+
+ String tableName = getUniqueNames(1)[0];
+ NewTableConfiguration ntc = new NewTableConfiguration();
+ ntc.withInitialTabletAvailability(TabletAvailability.HOSTED);
+ ntc.setProperties(Map.of(Property.TABLE_SUSPEND_DURATION.getKey(), "30s",
+ TableLoadBalancer.TABLE_ASSIGNMENT_GROUP_PROPERTY, SUSPEND_RG));
+ c.tableOperations().create(tableName, ntc);
+
+ c.instanceOperations().waitForBalance();
+
+ TableId suspendTableTid =
TableId.of(c.tableOperations().tableIdMap().get(tableName));
+
+ TabletMetadata originalTM;
+ try (TabletsMetadata tms =
TabletsMetadata.builder(c).forTable(suspendTableTid).build()) {
+ originalTM = tms.stream().collect(onlyElement());
+ assertNull(originalTM.getSuspend());
+ }
+
+ clusterControl.stopTabletServerGroup(SUSPEND_RG);
+
+ Wait.waitFor(() -> suspendColumnExists(c, suspendTableTid), 60_000);
+
+ try (var tabletsMutator =
+
getCluster().getServerContext().getAmple().conditionallyMutateTablets()) {
+
tabletsMutator.mutateTablet(originalTM.getExtent()).requireAbsentOperation()
+ .requireSame(originalTM,
SUSPEND).putTabletAvailability(TabletAvailability.ONDEMAND)
+ .submit(tabletMetadata -> false);
+
+ // This should fail because the original tablet metadata does not have
a suspend column
+ // and the current tablet metadata does.
+ assertEquals(REJECTED,
tabletsMutator.process().get(originalTM.getExtent()).getStatus());
+ }
+
+ // test require same when the tablet metadata passed in has a suspend
column set
+ var suspendedTM =
+
getCluster().getServerContext().getAmple().readTablet(originalTM.getExtent());
+ assertNotNull(suspendedTM.getSuspend());
+ try (var tabletsMutator =
+
getCluster().getServerContext().getAmple().conditionallyMutateTablets()) {
+
tabletsMutator.mutateTablet(originalTM.getExtent()).requireAbsentOperation()
+ .requireSame(suspendedTM,
SUSPEND).putFlushNonce(6789).submit(tabletMetadata -> false);
+
+ // This should succeed because the tablet metadata does have a suspend
column and the
+ // current tablet metadata does.
+ assertEquals(ACCEPTED,
tabletsMutator.process().get(originalTM.getExtent()).getStatus());
+ }
+
+ clusterControl.start(ServerType.TABLET_SERVER);
+
+ Wait.waitFor(() -> !suspendColumnExists(c, suspendTableTid), 60_000);
+
+ try (var tabletsMutator =
+
getCluster().getServerContext().getAmple().conditionallyMutateTablets()) {
+
tabletsMutator.mutateTablet(originalTM.getExtent()).requireAbsentOperation()
+ .requireSame(originalTM,
SUSPEND).putTabletAvailability(TabletAvailability.ONDEMAND)
+ .submit(tabletMetadata -> false);
+
+ // This should succeed because the original tablet metadata does not
have a suspend column
+ // and the current tablet metadata does not also because the tablet
server for the SUSPEND
+ // resource group was restarted.
+ assertEquals(ACCEPTED,
tabletsMutator.process().get(originalTM.getExtent()).getStatus());
+ }
+ }
+ }
+
+ private static boolean suspendColumnExists(AccumuloClient c, TableId tid) {
+ try (TabletsMetadata tms =
TabletsMetadata.builder(c).forTable(tid).build()) {
+ TabletMetadata tm = tms.stream().collect(onlyElement());
+ return tm.getSuspend() != null;
+ }
+ }
+}
diff --git
a/test/src/main/java/org/apache/accumulo/test/functional/TabletResourceGroupBalanceIT.java
b/test/src/main/java/org/apache/accumulo/test/functional/TabletResourceGroupBalanceIT.java
index 52ee70ea48..dd4ea0bb5f 100644
---
a/test/src/main/java/org/apache/accumulo/test/functional/TabletResourceGroupBalanceIT.java
+++
b/test/src/main/java/org/apache/accumulo/test/functional/TabletResourceGroupBalanceIT.java
@@ -18,6 +18,7 @@
*/
package org.apache.accumulo.test.functional;
+import static
org.apache.accumulo.core.spi.balancer.TableLoadBalancer.TABLE_ASSIGNMENT_GROUP_PROPERTY;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -123,7 +124,7 @@ public class TabletResourceGroupBalanceIT extends
SharedMiniClusterBase {
ntc1.withSplits(splits);
Map<String,String> properties = new HashMap<>();
- properties.put("table.custom.assignment.group", "GROUP1");
+ properties.put(TABLE_ASSIGNMENT_GROUP_PROPERTY, "GROUP1");
NewTableConfiguration ntc2 = new NewTableConfiguration();
ntc2.withInitialTabletAvailability(TabletAvailability.HOSTED);
@@ -173,7 +174,7 @@ public class TabletResourceGroupBalanceIT extends
SharedMiniClusterBase {
IntStream.range(97, 122).forEach(i -> splits.add(new Text(new String("" +
i))));
Map<String,String> properties = new HashMap<>();
- properties.put("table.custom.assignment.group", "GROUP2");
+ properties.put(TABLE_ASSIGNMENT_GROUP_PROPERTY, "GROUP2");
NewTableConfiguration ntc1 = new NewTableConfiguration();
ntc1.withInitialTabletAvailability(TabletAvailability.HOSTED);
@@ -214,13 +215,7 @@ public class TabletResourceGroupBalanceIT extends
SharedMiniClusterBase {
} finally {
client.tableOperations().delete(tableName);
- // Stop all tablet servers because there is no way to just stop
- // the GROUP2 server yet.
-
getCluster().getClusterControl().stopAllServers(ServerType.TABLET_SERVER);
-
getCluster().getConfig().getClusterServerConfiguration().clearTServerResourceGroups();
- getCluster().getConfig().getClusterServerConfiguration()
- .addTabletServerResourceGroup("GROUP1", 1);
- getCluster().getClusterControl().start(ServerType.TABLET_SERVER);
+ getCluster().getClusterControl().stopTabletServerGroup("GROUP2");
}
}
}
@@ -297,7 +292,7 @@ public class TabletResourceGroupBalanceIT extends
SharedMiniClusterBase {
locations.forEach(loc -> assertEquals(l1, loc.getLocation()));
// change the resource group property for the table
- client.tableOperations().setProperty(tableName,
"table.custom.assignment.group", "GROUP1");
+ client.tableOperations().setProperty(tableName,
TABLE_ASSIGNMENT_GROUP_PROPERTY, "GROUP1");
locations = getLocations(ample, tableId);
// wait for GROUP1 to show up in the list of locations as the current
location
diff --git
a/test/src/main/java/org/apache/accumulo/test/manager/SuspendedTabletsIT.java
b/test/src/main/java/org/apache/accumulo/test/manager/SuspendedTabletsIT.java
index 7e44e6d57a..280f12a973 100644
---
a/test/src/main/java/org/apache/accumulo/test/manager/SuspendedTabletsIT.java
+++
b/test/src/main/java/org/apache/accumulo/test/manager/SuspendedTabletsIT.java
@@ -19,6 +19,7 @@
package org.apache.accumulo.test.manager;
import static java.util.concurrent.TimeUnit.SECONDS;
+import static
org.apache.accumulo.core.spi.balancer.TableLoadBalancer.TABLE_ASSIGNMENT_GROUP_PROPERTY;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -196,7 +197,7 @@ public class SuspendedTabletsIT extends
AccumuloClusterHarness {
}
log.info("Creating table " + tableName);
Map<String,String> properties = new HashMap<>();
- properties.put("table.custom.assignment.group", TEST_GROUP_NAME);
+ properties.put(TABLE_ASSIGNMENT_GROUP_PROPERTY, TEST_GROUP_NAME);
properties.put(Property.TABLE_SUSPEND_DURATION.getKey(),
action.suspendTime);
NewTableConfiguration ntc = new
NewTableConfiguration().withSplits(splitPoints)