This is an automated email from the ASF dual-hosted git repository. ctubbsii pushed a commit to branch 1.10 in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/1.10 by this push: new 3cc35be037 Disable MapFile in 1.10 and 2.1 patch releases (#3391) 3cc35be037 is described below commit 3cc35be0379068e51a0ba3ac709b726f43ab392f Author: Christopher Tubbs <ctubb...@apache.org> AuthorDate: Thu May 11 23:34:10 2023 -0400 Disable MapFile in 1.10 and 2.1 patch releases (#3391) Drop MapFile support (#3359) by partially backporting PR #3378, and making minimally disruptive changes to avoid use of MapFiles for 1.10.4 and 2.1.1. As noted in #3378, MapFile support is already broken and has been for a long time. This change will cause an explicit and detectable failure, rather than a silent one, if a MapFile is attempted to be used. --- .../org/apache/accumulo/core/conf/Property.java | 2 +- .../apache/accumulo/core/conf/PropertyType.java | 7 +- .../core/iterators/system/MapFileIterator.java | 101 +++++---------------- .../accumulo/core/conf/PropertyTypeTest.java | 7 ++ 4 files changed, 39 insertions(+), 78 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/Property.java b/core/src/main/java/org/apache/accumulo/core/conf/Property.java index 6321a52322..369e310489 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java @@ -690,7 +690,7 @@ public enum Property { TABLE_SCAN_MAXMEM("table.scan.max.memory", "512K", PropertyType.MEMORY, "The maximum amount of memory that will be used to cache results of a client query/scan. " + "Once this limit is reached, the buffered data is sent to the client."), - TABLE_FILE_TYPE("table.file.type", RFile.EXTENSION, PropertyType.STRING, + TABLE_FILE_TYPE("table.file.type", RFile.EXTENSION, PropertyType.FILENAME_EXT, "Change the type of file a table writes"), TABLE_LOAD_BALANCER("table.balancer", "org.apache.accumulo.server.master.balancer.DefaultLoadBalancer", PropertyType.STRING, diff --git a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java index e84586f694..f8c468d87c 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/PropertyType.java @@ -27,6 +27,7 @@ import java.util.regex.Pattern; import java.util.stream.Stream; import org.apache.accumulo.core.Constants; +import org.apache.accumulo.core.file.rfile.RFile; import org.apache.accumulo.core.util.Pair; import org.apache.commons.lang.math.IntRange; import org.apache.hadoop.fs.Path; @@ -119,7 +120,11 @@ public enum PropertyType { BOOLEAN("boolean", in(false, null, "true", "false"), "Has a value of either 'true' or 'false' (case-insensitive)"), - URI("uri", x -> true, "A valid URI"); + URI("uri", x -> true, "A valid URI"), + + FILENAME_EXT("file name extension", in(true, RFile.EXTENSION), + "One of the currently supported filename extensions for storing table data files. " + + "Currently, only " + RFile.EXTENSION + " is supported."); private String shortname, format; // Field is transient because enums are Serializable, but Predicates aren't necessarily, diff --git a/core/src/main/java/org/apache/accumulo/core/iterators/system/MapFileIterator.java b/core/src/main/java/org/apache/accumulo/core/iterators/system/MapFileIterator.java index b1fe1a2afd..e4fca3fef5 100644 --- a/core/src/main/java/org/apache/accumulo/core/iterators/system/MapFileIterator.java +++ b/core/src/main/java/org/apache/accumulo/core/iterators/system/MapFileIterator.java @@ -17,7 +17,6 @@ package org.apache.accumulo.core.iterators.system; import java.io.DataInputStream; -import java.io.IOException; import java.util.Collection; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; @@ -28,139 +27,89 @@ import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Range; import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.file.FileSKVIterator; -import org.apache.accumulo.core.file.NoSuchMetaStoreException; -import org.apache.accumulo.core.file.map.MapFileUtil; -import org.apache.accumulo.core.iterators.IterationInterruptedException; import org.apache.accumulo.core.iterators.IteratorEnvironment; import org.apache.accumulo.core.iterators.SortedKeyValueIterator; import org.apache.accumulo.core.sample.impl.SamplerConfigurationImpl; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; -import org.apache.hadoop.fs.Path; -import org.apache.hadoop.io.MapFile.Reader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class MapFileIterator implements FileSKVIterator { - private static final Logger log = LoggerFactory.getLogger(MapFileIterator.class); - private Reader reader; - private Value topValue; - private Key topKey; - private AtomicBoolean interruptFlag; - private int interruptCheckCount = 0; - private FileSystem fs; - private String dirName; + private static final String MSG = "Map files are not supported"; public MapFileIterator(AccumuloConfiguration acuconf, FileSystem fs, String dir, - Configuration conf) throws IOException { - this.reader = MapFileUtil.openMapFile(acuconf, fs, dir, conf); - this.fs = fs; - this.dirName = dir; + Configuration conf) { + throw new UnsupportedOperationException(MSG); } @Override public void setInterruptFlag(AtomicBoolean flag) { - this.interruptFlag = flag; + throw new UnsupportedOperationException(MSG); } @Override public void init(SortedKeyValueIterator<Key,Value> source, Map<String,String> options, - IteratorEnvironment env) throws IOException { - throw new UnsupportedOperationException(); + IteratorEnvironment env) { + throw new UnsupportedOperationException(MSG); } @Override public boolean hasTop() { - return topKey != null; + throw new UnsupportedOperationException(MSG); } @Override - public void next() throws IOException { - if (interruptFlag != null && interruptCheckCount++ % 100 == 0 && interruptFlag.get()) - throw new IterationInterruptedException(); - - reader.next(topKey, topValue); + public void next() { + throw new UnsupportedOperationException(MSG); } @Override - public void seek(Range range, Collection<ByteSequence> columnFamilies, boolean inclusive) - throws IOException { - if (columnFamilies.size() != 0 || inclusive) { - throw new IllegalArgumentException("I do not know how to filter column families"); - } - - if (range == null) - throw new IllegalArgumentException("Cannot seek to null range"); - - if (interruptFlag != null && interruptFlag.get()) - throw new IterationInterruptedException(); - - Key key = range.getStartKey(); - if (key == null) { - key = new Key(); - } - - reader.seek(key); - - while (hasTop() && range.beforeStartKey(getTopKey())) { - next(); - } + public void seek(Range range, Collection<ByteSequence> columnFamilies, boolean inclusive) { + throw new UnsupportedOperationException(MSG); } @Override public Key getTopKey() { - return topKey; + throw new UnsupportedOperationException(MSG); } @Override public Value getTopValue() { - return topValue; + throw new UnsupportedOperationException(MSG); } @Override public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) { - try { - SortedKeyValueIterator<Key,Value> other = env.reserveMapFileReader(dirName); - ((InterruptibleIterator) other).setInterruptFlag(interruptFlag); - log.debug("deep copying MapFile: " + this + " -> " + other); - return other; - } catch (IOException e) { - log.error("failed to clone map file reader", e); - throw new RuntimeException(e); - } + throw new UnsupportedOperationException(MSG); } @Override - public Key getFirstKey() throws IOException { - throw new UnsupportedOperationException(); + public Key getFirstKey() { + throw new UnsupportedOperationException(MSG); } @Override - public Key getLastKey() throws IOException { - throw new UnsupportedOperationException(); + public Key getLastKey() { + throw new UnsupportedOperationException(MSG); } @Override - public DataInputStream getMetaStore(String name) throws IOException { - Path path = new Path(this.dirName, name); - if (!fs.exists(path)) - throw new NoSuchMetaStoreException("name = " + name); - return fs.open(path); + public DataInputStream getMetaStore(String name) { + throw new UnsupportedOperationException(MSG); } @Override - public void closeDeepCopies() throws IOException { - // nothing to do, deep copies are externally managed/closed + public void closeDeepCopies() { + throw new UnsupportedOperationException(MSG); } @Override - public void close() throws IOException { - reader.close(); + public void close() { + throw new UnsupportedOperationException(MSG); } @Override public FileSKVIterator getSample(SamplerConfigurationImpl sampleConfig) { - return null; + throw new UnsupportedOperationException(MSG); } } diff --git a/core/src/test/java/org/apache/accumulo/core/conf/PropertyTypeTest.java b/core/src/test/java/org/apache/accumulo/core/conf/PropertyTypeTest.java index 666d7ad3a7..53ef7c4003 100644 --- a/core/src/test/java/org/apache/accumulo/core/conf/PropertyTypeTest.java +++ b/core/src/test/java/org/apache/accumulo/core/conf/PropertyTypeTest.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.accumulo.core.file.rfile.RFile; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -200,4 +201,10 @@ public class PropertyTypeTest { valid(null, "", "hdfs://hostname", "file:///path/", "hdfs://example.com:port/path"); } + @Test + public void testTypeFILENAME_EXT() { + valid(RFile.EXTENSION, "rf"); + invalid(null, "RF", "map", "", "MAP", "rF", "Rf", " rf "); + } + }