This is an automated email from the ASF dual-hosted git repository. dlmarion 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 bf61fac87a Fixed bug in TabletsMetadata.fetch (#5342) bf61fac87a is described below commit bf61fac87a4b29e1e3aaa408bfea0d2711a9a812 Author: Dave Marion <dlmar...@apache.org> AuthorDate: Thu Feb 20 11:56:46 2025 -0500 Fixed bug in TabletsMetadata.fetch (#5342) A bug was introduced in #5335 to TabletsMetadata.fetch where the columns being passed as arguments to the function where not being used. This has the side effect of fetching all columns in the TabletMetadata which was causing some ITs to time out. The ITs in these cases were fetching and counting specific columns in the TabletMetadata. This bug also highlighted another bug in CloneIT where an invalid directory was being inserted into the TabletMetadata which would then subsequently fail when fetched. The directory column name was being validated on most, but not all, places where it was being inserted into the TabletMetadata. I added validation to the ServerColumnFamily.DIRECTORY_COLUMN.put method and fixed CloneIT. --- .../core/metadata/schema/MetadataSchema.java | 8 +++- .../core/metadata/schema/TabletMetadata.java | 1 - .../core/metadata/schema/TabletMutatorBase.java | 1 - .../core/metadata/schema/TabletsMetadata.java | 3 +- .../constraints/MetadataConstraintsTest.java | 3 +- .../java/org/apache/accumulo/test/CloneIT.java | 48 +++++++++++----------- 6 files changed, 34 insertions(+), 30 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/metadata/schema/MetadataSchema.java b/core/src/main/java/org/apache/accumulo/core/metadata/schema/MetadataSchema.java index 885fd32623..6a003c22fd 100644 --- a/core/src/main/java/org/apache/accumulo/core/metadata/schema/MetadataSchema.java +++ b/core/src/main/java/org/apache/accumulo/core/metadata/schema/MetadataSchema.java @@ -203,7 +203,13 @@ public class MetadataSchema { * Holds the location of the tablet in the DFS file system */ public static final String DIRECTORY_QUAL = "dir"; - public static final ColumnFQ DIRECTORY_COLUMN = new ColumnFQ(NAME, new Text(DIRECTORY_QUAL)); + public static final ColumnFQ DIRECTORY_COLUMN = new ColumnFQ(NAME, new Text(DIRECTORY_QUAL)) { + @Override + public void put(Mutation m, Value v) { + validateDirCol(v.toString()); + super.put(m, v); + } + }; /** * Initial tablet directory name for the default tablet in all tables */ diff --git a/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMetadata.java b/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMetadata.java index c737b0d66b..a5a41a2684 100644 --- a/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMetadata.java +++ b/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMetadata.java @@ -73,7 +73,6 @@ import org.apache.accumulo.core.metadata.AccumuloTable; 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.MetadataSchema.TabletsSection; import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.BulkFileColumnFamily; import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.ClonedColumnFamily; import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.CompactedColumnFamily; diff --git a/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMutatorBase.java b/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMutatorBase.java index 4f39eda7b7..537caf917e 100644 --- a/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMutatorBase.java +++ b/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMutatorBase.java @@ -90,7 +90,6 @@ public abstract class TabletMutatorBase<T extends Ample.TabletUpdates<T>> @Override public T putDirName(String dirName) { - ServerColumnFamily.validateDirCol(dirName); Preconditions.checkState(updatesEnabled, "Cannot make updates after calling mutate."); ServerColumnFamily.DIRECTORY_COLUMN.put(mutation, new Value(dirName)); return getThis(); diff --git a/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletsMetadata.java b/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletsMetadata.java index 26d157eb19..8f448c82ec 100644 --- a/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletsMetadata.java +++ b/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletsMetadata.java @@ -21,7 +21,6 @@ package org.apache.accumulo.core.metadata.schema; import static com.google.common.base.Preconditions.checkState; import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.toList; -import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.PREV_ROW; import java.io.IOException; import java.io.UncheckedIOException; @@ -305,7 +304,7 @@ public class TabletsMetadata implements Iterable<TabletMetadata>, AutoCloseable @Override public Options fetch(ColumnType... colsToFetch) { Preconditions.checkArgument(colsToFetch.length > 0); - for (var col : fetchedCols) { + for (var col : colsToFetch) { fetchedCols.add(col); var qualifier = ColumnType.resolveQualifier(col); if (qualifier != null) { diff --git a/server/base/src/test/java/org/apache/accumulo/server/constraints/MetadataConstraintsTest.java b/server/base/src/test/java/org/apache/accumulo/server/constraints/MetadataConstraintsTest.java index 40d347fcd5..ecbe69e480 100644 --- a/server/base/src/test/java/org/apache/accumulo/server/constraints/MetadataConstraintsTest.java +++ b/server/base/src/test/java/org/apache/accumulo/server/constraints/MetadataConstraintsTest.java @@ -634,7 +634,8 @@ public class MetadataConstraintsTest { assertTrue(violations.isEmpty()); m = new Mutation(new Text("0;foo")); - ServerColumnFamily.DIRECTORY_COLUMN.put(m, new Value("/invalid")); + m.put(ServerColumnFamily.DIRECTORY_COLUMN.getColumnFamily(), + ServerColumnFamily.DIRECTORY_COLUMN.getColumnQualifier(), new Value("/invalid")); violations = mc.check(createEnv(), m); assertFalse(violations.isEmpty()); assertEquals(1, violations.size()); diff --git a/test/src/main/java/org/apache/accumulo/test/CloneIT.java b/test/src/main/java/org/apache/accumulo/test/CloneIT.java index 2d7caa2e94..5b84f3685a 100644 --- a/test/src/main/java/org/apache/accumulo/test/CloneIT.java +++ b/test/src/main/java/org/apache/accumulo/test/CloneIT.java @@ -66,7 +66,7 @@ public class CloneIT extends AccumuloClusterHarness { Mutation mut = TabletColumnFamily.createPrevRowMutation(ke); ServerColumnFamily.TIME_COLUMN.put(mut, new Value("M0")); - ServerColumnFamily.DIRECTORY_COLUMN.put(mut, new Value("/default_tablet")); + ServerColumnFamily.DIRECTORY_COLUMN.put(mut, new Value("default_tablet")); try (BatchWriter bw1 = client.createBatchWriter(tableName)) { bw1.addMutation(mut); @@ -95,7 +95,7 @@ public class CloneIT extends AccumuloClusterHarness { Mutation mut = TabletColumnFamily.createPrevRowMutation(ke); ServerColumnFamily.TIME_COLUMN.put(mut, new Value("M0")); - ServerColumnFamily.DIRECTORY_COLUMN.put(mut, new Value("/default_tablet")); + ServerColumnFamily.DIRECTORY_COLUMN.put(mut, new Value("default_tablet")); mut.put(DataFileColumnFamily.NAME.toString(), getMetadata(filePrefix + "/default_tablet/0_0.rf", range1), new DataFileValue(1, 200).encodeAsString()); @@ -155,17 +155,17 @@ public class CloneIT extends AccumuloClusterHarness { try (BatchWriter bw1 = client.createBatchWriter(tableName); BatchWriter bw2 = client.createBatchWriter(tableName)) { - bw1.addMutation(createTablet("0", null, null, "/default_tablet", + bw1.addMutation(createTablet("0", null, null, "default_tablet", filePrefix + "/default_tablet/0_0.rf", range)); bw1.flush(); MetadataTableUtil.initializeClone(tableName, TableId.of("0"), TableId.of("1"), client, bw2); - bw1.addMutation(createTablet("0", "m", null, "/default_tablet", + bw1.addMutation(createTablet("0", "m", null, "default_tablet", filePrefix + "/default_tablet/0_0.rf", range)); bw1.addMutation( - createTablet("0", null, "m", "/t-1", filePrefix + "/default_tablet/0_0.rf", range)); + createTablet("0", null, "m", "t-1", filePrefix + "/default_tablet/0_0.rf", range)); bw1.flush(); @@ -203,17 +203,17 @@ public class CloneIT extends AccumuloClusterHarness { try (BatchWriter bw1 = client.createBatchWriter(tableName); BatchWriter bw2 = client.createBatchWriter(tableName)) { - bw1.addMutation(createTablet("0", null, null, "/default_tablet", + bw1.addMutation(createTablet("0", null, null, "default_tablet", filePrefix + "/default_tablet/0_0.rf", range)); bw1.flush(); MetadataTableUtil.initializeClone(tableName, TableId.of("0"), TableId.of("1"), client, bw2); - bw1.addMutation(createTablet("0", "m", null, "/default_tablet", + bw1.addMutation(createTablet("0", "m", null, "default_tablet", filePrefix + "/default_tablet/1_0.rf", range)); Mutation mut3 = - createTablet("0", null, "m", "/t-1", filePrefix + "/default_tablet/1_0.rf", range); + createTablet("0", null, "m", "t-1", filePrefix + "/default_tablet/1_0.rf", range); mut3.putDelete(DataFileColumnFamily.NAME.toString(), getMetadata(filePrefix + "/default_tablet/0_0.rf", range)); bw1.addMutation(mut3); @@ -285,17 +285,17 @@ public class CloneIT extends AccumuloClusterHarness { try (BatchWriter bw1 = client.createBatchWriter(tableName); BatchWriter bw2 = client.createBatchWriter(tableName)) { - bw1.addMutation(createTablet("0", "m", null, "/d1", filePrefix + "/d1/file1.rf", range1)); - bw1.addMutation(createTablet("0", null, "m", "/d2", filePrefix + "/d2/file2.rf", range2)); + bw1.addMutation(createTablet("0", "m", null, "d1", filePrefix + "/d1/file1.rf", range1)); + bw1.addMutation(createTablet("0", null, "m", "d2", filePrefix + "/d2/file2.rf", range2)); bw1.flush(); MetadataTableUtil.initializeClone(tableName, TableId.of("0"), TableId.of("1"), client, bw2); - bw1.addMutation(createTablet("0", "f", null, "/d1", filePrefix + "/d1/file3.rf", range3)); - bw1.addMutation(createTablet("0", "m", "f", "/d3", filePrefix + "/d1/file1.rf", range1)); - bw1.addMutation(createTablet("0", "s", "m", "/d2", filePrefix + "/d2/file2.rf", range2)); - bw1.addMutation(createTablet("0", null, "s", "/d4", filePrefix + "/d2/file2.rf", range2)); + bw1.addMutation(createTablet("0", "f", null, "d1", filePrefix + "/d1/file3.rf", range3)); + bw1.addMutation(createTablet("0", "m", "f", "d3", filePrefix + "/d1/file1.rf", range1)); + bw1.addMutation(createTablet("0", "s", "m", "d2", filePrefix + "/d2/file2.rf", range2)); + bw1.addMutation(createTablet("0", null, "s", "d4", filePrefix + "/d2/file2.rf", range2)); bw1.flush(); @@ -335,8 +335,8 @@ public class CloneIT extends AccumuloClusterHarness { try (BatchWriter bw1 = client.createBatchWriter(tableName); BatchWriter bw2 = client.createBatchWriter(tableName)) { - bw1.addMutation(createTablet("0", "m", null, "/d1", filePrefix + "/d1/file1.rf", range1)); - bw1.addMutation(createTablet("0", null, "m", "/d2", filePrefix + "/d2/file2.rf", range2)); + bw1.addMutation(createTablet("0", "m", null, "d1", filePrefix + "/d1/file1.rf", range1)); + bw1.addMutation(createTablet("0", null, "m", "d2", filePrefix + "/d2/file2.rf", range2)); bw1.flush(); @@ -347,10 +347,10 @@ public class CloneIT extends AccumuloClusterHarness { bw1.flush(); - bw1.addMutation(createTablet("0", "f", null, "/d1", filePrefix + "/d1/file3.rf", range3)); - bw1.addMutation(createTablet("0", "m", "f", "/d3", filePrefix + "/d1/file1.rf", range1)); - bw1.addMutation(createTablet("0", "s", "m", "/d2", filePrefix + "/d2/file3.rf", range3)); - bw1.addMutation(createTablet("0", null, "s", "/d4", filePrefix + "/d4/file3.rf", range3)); + bw1.addMutation(createTablet("0", "f", null, "d1", filePrefix + "/d1/file3.rf", range3)); + bw1.addMutation(createTablet("0", "m", "f", "d3", filePrefix + "/d1/file1.rf", range1)); + bw1.addMutation(createTablet("0", "s", "m", "d2", filePrefix + "/d2/file3.rf", range3)); + bw1.addMutation(createTablet("0", null, "s", "d4", filePrefix + "/d4/file3.rf", range3)); bw1.flush(); @@ -363,7 +363,7 @@ public class CloneIT extends AccumuloClusterHarness { bw1.flush(); - bw1.addMutation(createTablet("0", "m", "f", "/d3", filePrefix + "/d1/file3.rf", range3)); + bw1.addMutation(createTablet("0", "m", "f", "d3", filePrefix + "/d1/file3.rf", range3)); bw1.flush(); @@ -405,15 +405,15 @@ public class CloneIT extends AccumuloClusterHarness { try (BatchWriter bw1 = client.createBatchWriter(tableName); BatchWriter bw2 = client.createBatchWriter(tableName)) { - bw1.addMutation(createTablet("0", "m", null, "/d1", filePrefix + "/d1/file1.rf", range1)); - bw1.addMutation(createTablet("0", null, "m", "/d2", filePrefix + "/d2/file2.rf", range2)); + bw1.addMutation(createTablet("0", "m", null, "d1", filePrefix + "/d1/file1.rf", range1)); + bw1.addMutation(createTablet("0", null, "m", "d2", filePrefix + "/d2/file2.rf", range2)); bw1.flush(); MetadataTableUtil.initializeClone(tableName, TableId.of("0"), TableId.of("1"), client, bw2); bw1.addMutation(deleteTablet("0", "m", null, filePrefix + "/d1/file1.rf", range1)); - Mutation mut = createTablet("0", null, null, "/d2", filePrefix + "/d2/file2.rf", range2); + Mutation mut = createTablet("0", null, null, "d2", filePrefix + "/d2/file2.rf", range2); mut.put(DataFileColumnFamily.NAME.toString(), getMetadata(filePrefix + "/d1/file1.rf", range1), new DataFileValue(10, 200).encodeAsString());