This is an automated email from the ASF dual-hosted git repository. mmiller pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/master by this push: new ba6d5e1 Split IteratorUtil up into 2 non-API classes (#986) ba6d5e1 is described below commit ba6d5e100aff11177e09b5285e42de58f435144a Author: Mike Miller <mmil...@apache.org> AuthorDate: Tue Feb 26 17:03:41 2019 -0500 Split IteratorUtil up into 2 non-API classes (#986) * Moved methods not useful to users to non-API classes * Created IterConfigUtil and SystemIteratorUtil for internal use * Cleaned up loadIterators methods and created IterLoad class to assist * Remove Generics from IterConfigUtil and other minor improvements --- .../core/client/ClientSideIteratorScanner.java | 12 +- .../core/client/admin/NewTableConfiguration.java | 4 +- .../accumulo/core/client/rfile/RFileScanner.java | 17 +- .../accumulo/core/clientImpl/OfflineIterator.java | 16 +- .../core/clientImpl/TableOperationsImpl.java | 4 +- .../apache/accumulo/core/conf/IterConfigUtil.java | 261 ++++++++++++++ .../org/apache/accumulo/core/conf/IterLoad.java | 66 ++++ .../accumulo/core/iterators/IteratorUtil.java | 400 +-------------------- .../accumulo/core/util/SystemIteratorUtil.java | 110 ++++++ .../IterConfigUtilTest.java} | 58 +-- .../accumulo/server/conf/TableConfiguration.java | 12 +- .../apache/accumulo/master/FateServiceHandler.java | 4 +- .../accumulo/tserver/ConditionCheckerContext.java | 12 +- .../apache/accumulo/tserver/tablet/Compactor.java | 6 +- .../accumulo/tserver/tablet/ScanDataSource.java | 13 +- .../shell/commands/CreateTableCommand.java | 4 +- .../test/performance/scan/CollectTabletStats.java | 10 +- 17 files changed, 540 insertions(+), 469 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/client/ClientSideIteratorScanner.java b/core/src/main/java/org/apache/accumulo/core/client/ClientSideIteratorScanner.java index c666b1d..f928f6a 100644 --- a/core/src/main/java/org/apache/accumulo/core/client/ClientSideIteratorScanner.java +++ b/core/src/main/java/org/apache/accumulo/core/client/ClientSideIteratorScanner.java @@ -31,6 +31,8 @@ import java.util.concurrent.TimeUnit; import org.apache.accumulo.core.Constants; import org.apache.accumulo.core.client.sample.SamplerConfiguration; import org.apache.accumulo.core.clientImpl.ScannerOptions; +import org.apache.accumulo.core.conf.IterConfigUtil; +import org.apache.accumulo.core.conf.IterLoad; import org.apache.accumulo.core.data.ArrayByteSequence; import org.apache.accumulo.core.data.ByteSequence; import org.apache.accumulo.core.data.Column; @@ -40,7 +42,6 @@ import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.dataImpl.thrift.IterInfo; import org.apache.accumulo.core.iterators.IteratorAdapter; import org.apache.accumulo.core.iterators.IteratorEnvironment; -import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.core.iterators.SortedKeyValueIterator; import org.apache.accumulo.core.security.Authorizations; @@ -247,10 +248,11 @@ public class ClientSideIteratorScanner extends ScannerOptions implements Scanner SortedKeyValueIterator<Key,Value> skvi; try { - skvi = IteratorUtil.loadIterators(smi, tm.values(), serverSideIteratorOptions, - new ClientSideIteratorEnvironment(getSamplerConfiguration() != null, - getIteratorSamplerConfigurationInternal()), - false, null); + IteratorEnvironment env = new ClientSideIteratorEnvironment(getSamplerConfiguration() != null, + getIteratorSamplerConfigurationInternal()); + IterLoad iterLoad = new IterLoad().iters(tm.values()).iterOpts(serverSideIteratorOptions) + .iterEnv(env).useAccumuloClassLoader(false); + skvi = IterConfigUtil.loadIterators(smi, iterLoad); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/core/src/main/java/org/apache/accumulo/core/client/admin/NewTableConfiguration.java b/core/src/main/java/org/apache/accumulo/core/client/admin/NewTableConfiguration.java index 48849a3..f4b1d8e 100644 --- a/core/src/main/java/org/apache/accumulo/core/client/admin/NewTableConfiguration.java +++ b/core/src/main/java/org/apache/accumulo/core/client/admin/NewTableConfiguration.java @@ -36,8 +36,8 @@ import org.apache.accumulo.core.client.sample.SamplerConfiguration; import org.apache.accumulo.core.client.summary.Summarizer; import org.apache.accumulo.core.client.summary.SummarizerConfiguration; import org.apache.accumulo.core.clientImpl.TableOperationsHelper; +import org.apache.accumulo.core.conf.IterConfigUtil; import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.core.iterators.user.VersioningIterator; import org.apache.accumulo.core.sample.impl.SamplerConfigurationImpl; @@ -168,7 +168,7 @@ public class NewTableConfiguration { Map<String,String> propertyMap = new HashMap<>(); if (limitVersion) - propertyMap.putAll(IteratorUtil.generateInitialTableProperties(limitVersion)); + propertyMap.putAll(IterConfigUtil.generateInitialTableProperties(limitVersion)); propertyMap.putAll(summarizerProps); propertyMap.putAll(samplerProps); diff --git a/core/src/main/java/org/apache/accumulo/core/client/rfile/RFileScanner.java b/core/src/main/java/org/apache/accumulo/core/client/rfile/RFileScanner.java index 571f335..2eb2ccb 100644 --- a/core/src/main/java/org/apache/accumulo/core/client/rfile/RFileScanner.java +++ b/core/src/main/java/org/apache/accumulo/core/client/rfile/RFileScanner.java @@ -37,6 +37,8 @@ import org.apache.accumulo.core.clientImpl.ScannerOptions; import org.apache.accumulo.core.conf.AccumuloConfiguration; import org.apache.accumulo.core.conf.ConfigurationCopy; import org.apache.accumulo.core.conf.DefaultConfiguration; +import org.apache.accumulo.core.conf.IterConfigUtil; +import org.apache.accumulo.core.conf.IterLoad; import org.apache.accumulo.core.conf.Property; import org.apache.accumulo.core.crypto.CryptoServiceFactory; import org.apache.accumulo.core.crypto.CryptoServiceFactory.ClassloaderType; @@ -52,7 +54,6 @@ import org.apache.accumulo.core.file.rfile.RFile; import org.apache.accumulo.core.file.rfile.RFile.Reader; import org.apache.accumulo.core.iterators.IteratorAdapter; import org.apache.accumulo.core.iterators.IteratorEnvironment; -import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.core.iterators.SortedKeyValueIterator; import org.apache.accumulo.core.iterators.system.MultiIterator; @@ -64,6 +65,7 @@ import org.apache.accumulo.core.spi.cache.CacheEntry; import org.apache.accumulo.core.spi.cache.CacheType; import org.apache.accumulo.core.spi.crypto.CryptoService; import org.apache.accumulo.core.util.LocalityGroupUtil; +import org.apache.accumulo.core.util.SystemIteratorUtil; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.io.Text; @@ -364,17 +366,20 @@ class RFileScanner extends ScannerOptions implements Scanner { if (opts.useSystemIterators) { SortedSet<Column> cols = this.getFetchedColumns(); families = LocalityGroupUtil.families(cols); - iterator = IteratorUtil.setupSystemScanIterators(iterator, cols, getAuthorizations(), + iterator = SystemIteratorUtil.setupSystemScanIterators(iterator, cols, getAuthorizations(), EMPTY_BYTES, tableConf); } try { if (opts.tableConfig != null && opts.tableConfig.size() > 0) { - iterator = IteratorUtil.loadIterators(IteratorScope.scan, iterator, null, tableConf, - serverSideIteratorList, serverSideIteratorOptions, new IterEnv()); + IterLoad il = IterConfigUtil.loadIterConf(IteratorScope.scan, serverSideIteratorList, + serverSideIteratorOptions, tableConf); + iterator = IterConfigUtil.loadIterators(iterator, + il.iterEnv(new IterEnv()).useAccumuloClassLoader(true)); } else { - iterator = IteratorUtil.loadIterators(iterator, serverSideIteratorList, - serverSideIteratorOptions, new IterEnv(), false, null); + iterator = IterConfigUtil.loadIterators(iterator, + new IterLoad().iters(serverSideIteratorList).iterOpts(serverSideIteratorOptions) + .iterEnv(new IterEnv()).useAccumuloClassLoader(false)); } } catch (IOException e) { throw new RuntimeException(e); diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/OfflineIterator.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/OfflineIterator.java index 46407f8..843c72c 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/OfflineIterator.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/OfflineIterator.java @@ -34,6 +34,8 @@ import org.apache.accumulo.core.client.TableNotFoundException; import org.apache.accumulo.core.client.sample.SamplerConfiguration; import org.apache.accumulo.core.conf.AccumuloConfiguration; import org.apache.accumulo.core.conf.ConfigurationCopy; +import org.apache.accumulo.core.conf.IterConfigUtil; +import org.apache.accumulo.core.conf.IterLoad; import org.apache.accumulo.core.conf.Property; import org.apache.accumulo.core.crypto.CryptoServiceFactory; import org.apache.accumulo.core.data.Key; @@ -46,7 +48,6 @@ import org.apache.accumulo.core.dataImpl.KeyExtent; import org.apache.accumulo.core.file.FileOperations; import org.apache.accumulo.core.file.FileSKVIterator; import org.apache.accumulo.core.iterators.IteratorEnvironment; -import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.core.iterators.SortedKeyValueIterator; import org.apache.accumulo.core.iterators.system.MultiIterator; @@ -58,6 +59,7 @@ import org.apache.accumulo.core.sample.impl.SamplerConfigurationImpl; import org.apache.accumulo.core.security.Authorizations; import org.apache.accumulo.core.security.ColumnVisibility; import org.apache.accumulo.core.util.LocalityGroupUtil; +import org.apache.accumulo.core.util.SystemIteratorUtil; import org.apache.accumulo.core.volume.VolumeConfiguration; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; @@ -344,12 +346,14 @@ class OfflineIterator implements Iterator<Entry<Key,Value>> { acuTableConf.get(Property.TABLE_DEFAULT_SCANTIME_VISIBILITY)); defaultSecurityLabel = cv.getExpression(); - SortedKeyValueIterator<Key,Value> visFilter = IteratorUtil.setupSystemScanIterators(multiIter, - new HashSet<>(options.fetchedColumns), authorizations, defaultSecurityLabel, acuTableConf); + SortedKeyValueIterator<Key,Value> visFilter = SystemIteratorUtil.setupSystemScanIterators( + multiIter, new HashSet<>(options.fetchedColumns), authorizations, defaultSecurityLabel, + acuTableConf); + IterLoad iterLoad = IterConfigUtil.loadIterConf(IteratorScope.scan, + options.serverSideIteratorList, options.serverSideIteratorOptions, acuTableConf); - return iterEnv.getTopLevelIterator( - IteratorUtil.loadIterators(IteratorScope.scan, visFilter, extent, acuTableConf, - options.serverSideIteratorList, options.serverSideIteratorOptions, iterEnv, false)); + return iterEnv.getTopLevelIterator(IterConfigUtil.loadIterators(visFilter, + iterLoad.iterEnv(iterEnv).useAccumuloClassLoader(false))); } @Override diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java index 02be225..bf59cc6 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java @@ -100,7 +100,6 @@ import org.apache.accumulo.core.dataImpl.thrift.TRowRange; import org.apache.accumulo.core.dataImpl.thrift.TSummaries; import org.apache.accumulo.core.dataImpl.thrift.TSummarizerConfiguration; import org.apache.accumulo.core.dataImpl.thrift.TSummaryRequest; -import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.core.iterators.SortedKeyValueIterator; import org.apache.accumulo.core.master.state.tables.TableState; @@ -128,6 +127,7 @@ import org.apache.accumulo.core.util.MapCounter; import org.apache.accumulo.core.util.NamingThreadFactory; import org.apache.accumulo.core.util.OpTimer; import org.apache.accumulo.core.util.Pair; +import org.apache.accumulo.core.util.SystemIteratorUtil; import org.apache.accumulo.core.util.TextUtil; import org.apache.accumulo.core.volume.VolumeConfiguration; import org.apache.accumulo.fate.util.Retry; @@ -838,7 +838,7 @@ public class TableOperationsImpl extends TableOperationsHelper { List<ByteBuffer> args = Arrays.asList(ByteBuffer.wrap(tableId.canonical().getBytes(UTF_8)), start == null ? EMPTY : TextUtil.getByteBuffer(start), end == null ? EMPTY : TextUtil.getByteBuffer(end), - ByteBuffer.wrap(IteratorUtil.encodeIteratorSettings(config.getIterators())), + ByteBuffer.wrap(SystemIteratorUtil.encodeIteratorSettings(config.getIterators())), ByteBuffer.wrap(CompactionStrategyConfigUtil.encode(config.getCompactionStrategy()))); Map<String,String> opts = new HashMap<>(); diff --git a/core/src/main/java/org/apache/accumulo/core/conf/IterConfigUtil.java b/core/src/main/java/org/apache/accumulo/core/conf/IterConfigUtil.java new file mode 100644 index 0000000..a5fe350 --- /dev/null +++ b/core/src/main/java/org/apache/accumulo/core/conf/IterConfigUtil.java @@ -0,0 +1,261 @@ +/* + * 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 + * + * http://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.core.conf; + +import static java.util.Objects.requireNonNull; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.TreeMap; + +import org.apache.accumulo.core.client.IteratorSetting; +import org.apache.accumulo.core.constraints.DefaultKeySizeConstraint; +import org.apache.accumulo.core.data.Key; +import org.apache.accumulo.core.data.Value; +import org.apache.accumulo.core.dataImpl.thrift.IterInfo; +import org.apache.accumulo.core.iterators.IteratorEnvironment; +import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; +import org.apache.accumulo.core.iterators.SortedKeyValueIterator; +import org.apache.accumulo.core.iterators.user.VersioningIterator; +import org.apache.accumulo.start.classloader.vfs.AccumuloVFSClassLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Utility class for configuring iterators. These methods were moved from IteratorUtil so that it + * could be treated as API. + */ +public class IterConfigUtil { + private static final Logger log = LoggerFactory.getLogger(IterConfigUtil.class); + + public static final Comparator<IterInfo> ITER_INFO_COMPARATOR = Comparator + .comparingInt(IterInfo::getPriority); + + /** + * Fetch the correct configuration key prefix for the given scope. Throws an + * IllegalArgumentException if no property exists for the given scope. + */ + public static Property getProperty(IteratorScope scope) { + requireNonNull(scope); + switch (scope) { + case scan: + return Property.TABLE_ITERATOR_SCAN_PREFIX; + case minc: + return Property.TABLE_ITERATOR_MINC_PREFIX; + case majc: + return Property.TABLE_ITERATOR_MAJC_PREFIX; + default: + throw new IllegalStateException("Could not find configuration property for IteratorScope"); + } + } + + /** + * Generate the initial (default) properties for a table + * + * @param limitVersion + * include a VersioningIterator at priority 20 that retains a single version of a given + * K/V pair. + * @return A map of Table properties + */ + public static Map<String,String> generateInitialTableProperties(boolean limitVersion) { + TreeMap<String,String> props = new TreeMap<>(); + + if (limitVersion) { + for (IteratorScope iterScope : IteratorScope.values()) { + props.put(Property.TABLE_ITERATOR_PREFIX + iterScope.name() + ".vers", + "20," + VersioningIterator.class.getName()); + props.put(Property.TABLE_ITERATOR_PREFIX + iterScope.name() + ".vers.opt.maxVersions", "1"); + } + } + + props.put(Property.TABLE_CONSTRAINT_PREFIX + "1", DefaultKeySizeConstraint.class.getName()); + + return props; + } + + public static List<IterInfo> parseIterConf(IteratorScope scope, List<IterInfo> iters, + Map<String,Map<String,String>> allOptions, AccumuloConfiguration conf) { + Map<String,String> properties = conf.getAllPropertiesWithPrefix(getProperty(scope)); + ArrayList<IterInfo> iterators = new ArrayList<>(iters); + final Property scopeProperty = getProperty(scope); + final String scopePropertyKey = scopeProperty.getKey(); + + for (Entry<String,String> entry : properties.entrySet()) { + String suffix = entry.getKey().substring(scopePropertyKey.length()); + String suffixSplit[] = suffix.split("\\.", 3); + + if (suffixSplit.length == 1) { + String sa[] = entry.getValue().split(","); + int prio = Integer.parseInt(sa[0]); + String className = sa[1]; + iterators.add(new IterInfo(prio, className, suffixSplit[0])); + } else if (suffixSplit.length == 3 && suffixSplit[1].equals("opt")) { + String iterName = suffixSplit[0]; + String optName = suffixSplit[2]; + + Map<String,String> options = allOptions.get(iterName); + if (options == null) { + options = new HashMap<>(); + allOptions.put(iterName, options); + } + + options.put(optName, entry.getValue()); + + } else { + throw new IllegalArgumentException("Invalid iterator format: " + entry.getKey()); + } + } + + Collections.sort(iterators, ITER_INFO_COMPARATOR); + return iterators; + } + + public static void mergeIteratorConfig(List<IterInfo> destList, + Map<String,Map<String,String>> destOpts, List<IterInfo> tableIters, + Map<String,Map<String,String>> tableOpts, List<IterInfo> ssi, + Map<String,Map<String,String>> ssio) { + destList.addAll(tableIters); + destList.addAll(ssi); + Collections.sort(destList, ITER_INFO_COMPARATOR); + + Set<Entry<String,Map<String,String>>> es = tableOpts.entrySet(); + for (Entry<String,Map<String,String>> entry : es) { + if (entry.getValue() == null) { + destOpts.put(entry.getKey(), null); + } else { + destOpts.put(entry.getKey(), new HashMap<>(entry.getValue())); + } + } + + mergeOptions(ssio, destOpts); + + } + + private static void mergeOptions(Map<String,Map<String,String>> ssio, + Map<String,Map<String,String>> allOptions) { + ssio.forEach((k, v) -> { + if (v != null) { + Map<String,String> options = allOptions.get(k); + if (options == null) { + allOptions.put(k, v); + } else { + options.putAll(v); + } + } + }); + } + + public static IterLoad loadIterConf(IteratorScope scope, List<IterInfo> iters, + Map<String,Map<String,String>> iterOpts, AccumuloConfiguration conf) { + Map<String,Map<String,String>> allOptions = new HashMap<>(); + List<IterInfo> iterators = parseIterConf(scope, iters, allOptions, conf); + mergeOptions(iterOpts, allOptions); + return new IterLoad().iters(iterators).iterOpts(allOptions); + } + + /** + * Convert the list of iterators to IterInfo objects and then load the stack. + */ + public static SortedKeyValueIterator<Key,Value> convertItersAndLoad(IteratorScope scope, + SortedKeyValueIterator<Key,Value> source, AccumuloConfiguration conf, + List<IteratorSetting> iterators, IteratorEnvironment env) throws IOException { + + List<IterInfo> ssiList = new ArrayList<>(); + Map<String,Map<String,String>> ssio = new HashMap<>(); + + for (IteratorSetting is : iterators) { + ssiList.add(new IterInfo(is.getPriority(), is.getIteratorClass(), is.getName())); + ssio.put(is.getName(), is.getOptions()); + } + + IterLoad il = loadIterConf(scope, ssiList, ssio, conf); + il = il.iterEnv(env).useAccumuloClassLoader(true).context(conf.get(Property.TABLE_CLASSPATH)); + return loadIterators(source, il); + } + + /** + * Load a stack of iterators provided in the IterLoad, starting with source. + */ + public static SortedKeyValueIterator<Key,Value> loadIterators( + SortedKeyValueIterator<Key,Value> source, IterLoad iterLoad) throws IOException { + SortedKeyValueIterator<Key,Value> prev = source; + + try { + for (IterInfo iterInfo : iterLoad.iters) { + + Class<SortedKeyValueIterator<Key,Value>> clazz = null; + log.trace("Attempting to load iterator class {}", iterInfo.className); + if (iterLoad.classCache != null) { + clazz = iterLoad.classCache.get(iterInfo.className); + + if (clazz == null) { + clazz = loadClass(iterLoad.useAccumuloClassLoader, iterLoad.context, iterInfo); + iterLoad.classCache.put(iterInfo.className, clazz); + } + } else { + clazz = loadClass(iterLoad.useAccumuloClassLoader, iterLoad.context, iterInfo); + } + + SortedKeyValueIterator<Key,Value> skvi = clazz.newInstance(); + + Map<String,String> options = iterLoad.iterOpts.get(iterInfo.iterName); + + if (options == null) + options = Collections.emptyMap(); + + skvi.init(prev, options, iterLoad.iteratorEnvironment); + prev = skvi; + } + } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { + log.error(e.toString()); + throw new RuntimeException(e); + } + return prev; + } + + @SuppressWarnings("unchecked") + private static Class<SortedKeyValueIterator<Key,Value>> loadClass(boolean useAccumuloClassLoader, + String context, IterInfo iterInfo) throws ClassNotFoundException, IOException { + Class<SortedKeyValueIterator<Key,Value>> clazz; + if (useAccumuloClassLoader) { + if (context != null && !context.equals("")) { + clazz = (Class<SortedKeyValueIterator<Key,Value>>) AccumuloVFSClassLoader + .getContextManager() + .loadClass(context, iterInfo.className, SortedKeyValueIterator.class); + log.trace("Iterator class {} loaded from context {}, classloader: {}", iterInfo.className, + context, clazz.getClassLoader()); + } else { + clazz = (Class<SortedKeyValueIterator<Key,Value>>) AccumuloVFSClassLoader + .loadClass(iterInfo.className, SortedKeyValueIterator.class); + log.trace("Iterator class {} loaded from AccumuloVFSClassLoader: {}", iterInfo.className, + clazz.getClassLoader()); + } + } else { + clazz = (Class<SortedKeyValueIterator<Key,Value>>) Class.forName(iterInfo.className) + .asSubclass(SortedKeyValueIterator.class); + log.trace("Iterator class {} loaded from classpath", iterInfo.className); + } + return clazz; + } +} diff --git a/core/src/main/java/org/apache/accumulo/core/conf/IterLoad.java b/core/src/main/java/org/apache/accumulo/core/conf/IterLoad.java new file mode 100644 index 0000000..a063b95 --- /dev/null +++ b/core/src/main/java/org/apache/accumulo/core/conf/IterLoad.java @@ -0,0 +1,66 @@ +/* + * 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 + * + * http://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.core.conf; + +import java.util.Collection; +import java.util.Map; + +import org.apache.accumulo.core.data.Key; +import org.apache.accumulo.core.data.Value; +import org.apache.accumulo.core.dataImpl.thrift.IterInfo; +import org.apache.accumulo.core.iterators.IteratorEnvironment; +import org.apache.accumulo.core.iterators.SortedKeyValueIterator; + +public class IterLoad { + + Collection<IterInfo> iters; + Map<String,Map<String,String>> iterOpts; + IteratorEnvironment iteratorEnvironment; + boolean useAccumuloClassLoader; + String context; + Map<String,Class<SortedKeyValueIterator<Key,Value>>> classCache; + + public IterLoad iters(Collection<IterInfo> iters) { + this.iters = iters; + return this; + } + + public IterLoad iterOpts(Map<String,Map<String,String>> iterOpts) { + this.iterOpts = iterOpts; + return this; + } + + public IterLoad iterEnv(IteratorEnvironment iteratorEnvironment) { + this.iteratorEnvironment = iteratorEnvironment; + return this; + } + + public IterLoad useAccumuloClassLoader(boolean useAccumuloClassLoader) { + this.useAccumuloClassLoader = useAccumuloClassLoader; + return this; + } + + public IterLoad context(String context) { + this.context = context; + return this; + } + + public IterLoad classCache(Map<String,Class<SortedKeyValueIterator<Key,Value>>> classCache) { + this.classCache = classCache; + return this; + } +} diff --git a/core/src/main/java/org/apache/accumulo/core/iterators/IteratorUtil.java b/core/src/main/java/org/apache/accumulo/core/iterators/IteratorUtil.java index 4c473c4..c76b85a 100644 --- a/core/src/main/java/org/apache/accumulo/core/iterators/IteratorUtil.java +++ b/core/src/main/java/org/apache/accumulo/core/iterators/IteratorUtil.java @@ -16,348 +16,25 @@ */ package org.apache.accumulo.core.iterators; -import static java.util.Objects.requireNonNull; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.TreeMap; - -import org.apache.accumulo.core.client.IteratorSetting; -import org.apache.accumulo.core.conf.AccumuloConfiguration; -import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.constraints.DefaultKeySizeConstraint; -import org.apache.accumulo.core.data.Column; 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.dataImpl.KeyExtent; -import org.apache.accumulo.core.dataImpl.thrift.IterInfo; -import org.apache.accumulo.core.iterators.system.ColumnFamilySkippingIterator; -import org.apache.accumulo.core.iterators.system.ColumnQualifierFilter; -import org.apache.accumulo.core.iterators.system.DeletingIterator; -import org.apache.accumulo.core.iterators.system.VisibilityFilter; -import org.apache.accumulo.core.iterators.user.VersioningIterator; -import org.apache.accumulo.core.security.Authorizations; -import org.apache.accumulo.core.tabletserver.thrift.IteratorConfig; -import org.apache.accumulo.core.tabletserver.thrift.TIteratorSetting; -import org.apache.accumulo.start.classloader.vfs.AccumuloVFSClassLoader; -import org.apache.hadoop.io.Writable; -import org.apache.hadoop.io.WritableComparable; -import org.apache.thrift.TDeserializer; -import org.apache.thrift.TException; -import org.apache.thrift.TSerializer; -import org.apache.thrift.protocol.TBinaryProtocol; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +/** + * Utility class for Iterators. + */ public class IteratorUtil { - - private static final Logger log = LoggerFactory.getLogger(IteratorUtil.class); - /** * Even though this type is not in a public API package, its used by methods in the public API. * Therefore it should be treated as public API and should not reference any non public API types. * Also this type can not be moved. */ - public static enum IteratorScope { + public enum IteratorScope { majc, minc, scan } - private static Comparator<IterInfo> ITER_INFO_COMPARATOR = Comparator - .comparingInt(IterInfo::getPriority); - /** - * Fetch the correct configuration key prefix for the given scope. Throws an - * IllegalArgumentException if no property exists for the given scope. + * Maximize the Start Key timestamp. */ - static Property getProperty(IteratorScope scope) { - requireNonNull(scope); - switch (scope) { - case scan: - return Property.TABLE_ITERATOR_SCAN_PREFIX; - case minc: - return Property.TABLE_ITERATOR_MINC_PREFIX; - case majc: - return Property.TABLE_ITERATOR_MAJC_PREFIX; - default: - throw new IllegalStateException("Could not find configuration property for IteratorScope"); - } - } - - /** - * Generate the initial (default) properties for a table - * - * @param limitVersion - * include a VersioningIterator at priority 20 that retains a single version of a given - * K/V pair. - * @return A map of Table properties - */ - public static Map<String,String> generateInitialTableProperties(boolean limitVersion) { - TreeMap<String,String> props = new TreeMap<>(); - - if (limitVersion) { - for (IteratorScope iterScope : IteratorScope.values()) { - props.put(Property.TABLE_ITERATOR_PREFIX + iterScope.name() + ".vers", - "20," + VersioningIterator.class.getName()); - props.put(Property.TABLE_ITERATOR_PREFIX + iterScope.name() + ".vers.opt.maxVersions", "1"); - } - } - - props.put(Property.TABLE_CONSTRAINT_PREFIX + "1", DefaultKeySizeConstraint.class.getName()); - - return props; - } - - public static void mergeIteratorConfig(List<IterInfo> destList, - Map<String,Map<String,String>> destOpts, List<IterInfo> tableIters, - Map<String,Map<String,String>> tableOpts, List<IterInfo> ssi, - Map<String,Map<String,String>> ssio) { - destList.addAll(tableIters); - destList.addAll(ssi); - Collections.sort(destList, ITER_INFO_COMPARATOR); - - Set<Entry<String,Map<String,String>>> es = tableOpts.entrySet(); - for (Entry<String,Map<String,String>> entry : es) { - if (entry.getValue() == null) { - destOpts.put(entry.getKey(), null); - } else { - destOpts.put(entry.getKey(), new HashMap<>(entry.getValue())); - } - } - - IteratorUtil.mergeOptions(ssio, destOpts); - - } - - public static void parseIterConf(IteratorScope scope, List<IterInfo> iters, - Map<String,Map<String,String>> allOptions, AccumuloConfiguration conf) { - final Property scopeProperty = getProperty(scope); - final String scopePropertyKey = scopeProperty.getKey(); - - for (Entry<String,String> entry : conf.getAllPropertiesWithPrefix(scopeProperty).entrySet()) { - String suffix = entry.getKey().substring(scopePropertyKey.length()); - String suffixSplit[] = suffix.split("\\.", 3); - - if (suffixSplit.length == 1) { - String sa[] = entry.getValue().split(","); - int prio = Integer.parseInt(sa[0]); - String className = sa[1]; - iters.add(new IterInfo(prio, className, suffixSplit[0])); - } else if (suffixSplit.length == 3 && suffixSplit[1].equals("opt")) { - String iterName = suffixSplit[0]; - String optName = suffixSplit[2]; - - Map<String,String> options = allOptions.get(iterName); - if (options == null) { - options = new HashMap<>(); - allOptions.put(iterName, options); - } - - options.put(optName, entry.getValue()); - - } else { - throw new IllegalArgumentException("Invalid iterator format: " + entry.getKey()); - } - } - - Collections.sort(iters, ITER_INFO_COMPARATOR); - } - - // @formatter:off - public static <K extends WritableComparable<?>,V extends Writable> SortedKeyValueIterator<K,V> - loadIterators( - // @formatter:on - IteratorScope scope, SortedKeyValueIterator<K,V> source, KeyExtent extent, - AccumuloConfiguration conf, IteratorEnvironment env) throws IOException { - List<IterInfo> emptyList = Collections.emptyList(); - Map<String,Map<String,String>> emptyMap = Collections.emptyMap(); - return loadIterators(scope, source, extent, conf, emptyList, emptyMap, env); - } - - // @formatter:off - public static <K extends WritableComparable<?>,V extends Writable> SortedKeyValueIterator<K,V> - loadIterators( - // @formatter:on - IteratorScope scope, SortedKeyValueIterator<K,V> source, KeyExtent extent, - AccumuloConfiguration conf, List<IteratorSetting> iterators, IteratorEnvironment env) - throws IOException { - - List<IterInfo> ssiList = new ArrayList<>(); - Map<String,Map<String,String>> ssio = new HashMap<>(); - - for (IteratorSetting is : iterators) { - ssiList.add(new IterInfo(is.getPriority(), is.getIteratorClass(), is.getName())); - ssio.put(is.getName(), is.getOptions()); - } - - return loadIterators(scope, source, extent, conf, ssiList, ssio, env, true); - } - - // @formatter:off - public static <K extends WritableComparable<?>,V extends Writable> SortedKeyValueIterator<K,V> - loadIterators( - // @formatter:on - IteratorScope scope, SortedKeyValueIterator<K,V> source, KeyExtent extent, - AccumuloConfiguration conf, List<IterInfo> ssiList, Map<String,Map<String,String>> ssio, - IteratorEnvironment env) throws IOException { - return loadIterators(scope, source, extent, conf, ssiList, ssio, env, true); - } - - private static void parseIteratorConfiguration(IteratorScope scope, List<IterInfo> iters, - Map<String,Map<String,String>> ssio, Map<String,Map<String,String>> allOptions, - AccumuloConfiguration conf) { - parseIterConf(scope, iters, allOptions, conf); - - mergeOptions(ssio, allOptions); - } - - private static void mergeOptions(Map<String,Map<String,String>> ssio, - Map<String,Map<String,String>> allOptions) { - for (Entry<String,Map<String,String>> entry : ssio.entrySet()) { - if (entry.getValue() == null) - continue; - Map<String,String> options = allOptions.get(entry.getKey()); - if (options == null) { - allOptions.put(entry.getKey(), entry.getValue()); - } else { - options.putAll(entry.getValue()); - } - } - } - - // @formatter:off - public static <K extends WritableComparable<?>,V extends Writable> SortedKeyValueIterator<K,V> - loadIterators( - // @formatter:on - IteratorScope scope, SortedKeyValueIterator<K,V> source, KeyExtent extent, - AccumuloConfiguration conf, List<IterInfo> ssiList, Map<String,Map<String,String>> ssio, - IteratorEnvironment env, boolean useAccumuloClassLoader) throws IOException { - - return loadIteratorsHelper(scope, source, conf, ssiList, ssio, env, useAccumuloClassLoader, - conf.get(Property.TABLE_CLASSPATH)); - } - - // @formatter:off - public static <K extends WritableComparable<?>,V extends Writable> SortedKeyValueIterator<K,V> - loadIterators( - // @formatter:on - IteratorScope scope, SortedKeyValueIterator<K,V> source, KeyExtent extent, - AccumuloConfiguration conf, List<IterInfo> ssiList, Map<String,Map<String,String>> ssio, - IteratorEnvironment env, boolean useAccumuloClassLoader, String classLoaderContext) - throws IOException { - - return loadIteratorsHelper(scope, source, conf, ssiList, ssio, env, useAccumuloClassLoader, - classLoaderContext); - } - - // @formatter:off - private static <K extends WritableComparable<?>,V extends Writable> SortedKeyValueIterator<K,V> - loadIteratorsHelper( - // @formatter:on - IteratorScope scope, SortedKeyValueIterator<K,V> source, AccumuloConfiguration conf, - List<IterInfo> ssiList, Map<String,Map<String,String>> ssio, IteratorEnvironment env, - boolean useAccumuloClassLoader, String classLoaderContext) throws IOException { - - List<IterInfo> iters = new ArrayList<>(ssiList); - Map<String,Map<String,String>> allOptions = new HashMap<>(); - parseIteratorConfiguration(scope, iters, ssio, allOptions, conf); - return loadIterators(source, iters, allOptions, env, useAccumuloClassLoader, - classLoaderContext); - } - - // @formatter:off - public static <K extends WritableComparable<?>,V extends Writable> SortedKeyValueIterator<K,V> - loadIterators( - // @formatter:on - SortedKeyValueIterator<K,V> source, Collection<IterInfo> iters, - Map<String,Map<String,String>> iterOpts, IteratorEnvironment env, - boolean useAccumuloClassLoader, String context) throws IOException { - return loadIterators(source, iters, iterOpts, env, useAccumuloClassLoader, context, null); - } - - // @formatter:off - public static <K extends WritableComparable<?>,V extends Writable> SortedKeyValueIterator<K,V> - loadIterators( - // @formatter:on - SortedKeyValueIterator<K,V> source, Collection<IterInfo> iters, - Map<String,Map<String,String>> iterOpts, IteratorEnvironment env, - boolean useAccumuloClassLoader, String context, - Map<String,Class<? extends SortedKeyValueIterator<K,V>>> classCache) throws IOException { - // wrap the source in a SynchronizedIterator in case any of the additional configured iterators - // want to use threading - SortedKeyValueIterator<K,V> prev = source; - - try { - for (IterInfo iterInfo : iters) { - - Class<? extends SortedKeyValueIterator<K,V>> clazz = null; - log.trace("Attempting to load iterator class {}", iterInfo.className); - if (classCache != null) { - clazz = classCache.get(iterInfo.className); - - if (clazz == null) { - clazz = loadClass(useAccumuloClassLoader, context, iterInfo); - classCache.put(iterInfo.className, clazz); - } - } else { - clazz = loadClass(useAccumuloClassLoader, context, iterInfo); - } - - SortedKeyValueIterator<K,V> skvi = clazz.newInstance(); - - Map<String,String> options = iterOpts.get(iterInfo.iterName); - - if (options == null) - options = Collections.emptyMap(); - - skvi.init(prev, options, env); - prev = skvi; - } - } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { - log.error(e.toString()); - throw new RuntimeException(e); - } - return prev; - } - - @SuppressWarnings("unchecked") - // @formatter:off - private static - <K extends WritableComparable<?>,V extends Writable> Class<? extends SortedKeyValueIterator<K,V>> - loadClass( - // @formatter:on - boolean useAccumuloClassLoader, String context, IterInfo iterInfo) - throws ClassNotFoundException, IOException { - Class<? extends SortedKeyValueIterator<K,V>> clazz; - if (useAccumuloClassLoader) { - if (context != null && !context.equals("")) { - clazz = (Class<? extends SortedKeyValueIterator<K,V>>) AccumuloVFSClassLoader - .getContextManager() - .loadClass(context, iterInfo.className, SortedKeyValueIterator.class); - log.trace("Iterator class {} loaded from context {}, classloader: {}", iterInfo.className, - context, clazz.getClassLoader()); - } else { - clazz = (Class<? extends SortedKeyValueIterator<K,V>>) AccumuloVFSClassLoader - .loadClass(iterInfo.className, SortedKeyValueIterator.class); - log.trace("Iterator class {} loaded from AccumuloVFSClassLoader: {}", iterInfo.className, - clazz.getClassLoader()); - } - } else { - clazz = (Class<? extends SortedKeyValueIterator<K,V>>) Class.forName(iterInfo.className) - .asSubclass(SortedKeyValueIterator.class); - log.trace("Iterator class {} loaded from classpath", iterInfo.className); - } - return clazz; - } - public static Range maximizeStartKeyTimeStamp(Range range) { Range seekRange = range; @@ -375,6 +52,9 @@ public class IteratorUtil { return seekRange; } + /** + * Minimize the endKey Timestamp. + */ public static Range minimizeEndKeyTimeStamp(Range range) { Range seekRange = range; @@ -391,68 +71,4 @@ public class IteratorUtil { return seekRange; } - - public static TIteratorSetting toTIteratorSetting(IteratorSetting is) { - return new TIteratorSetting(is.getPriority(), is.getName(), is.getIteratorClass(), - is.getOptions()); - } - - public static IteratorSetting toIteratorSetting(TIteratorSetting tis) { - return new IteratorSetting(tis.getPriority(), tis.getName(), tis.getIteratorClass(), - tis.getProperties()); - } - - public static IteratorConfig toIteratorConfig(List<IteratorSetting> iterators) { - ArrayList<TIteratorSetting> tisList = new ArrayList<>(); - - for (IteratorSetting iteratorSetting : iterators) { - tisList.add(toTIteratorSetting(iteratorSetting)); - } - - return new IteratorConfig(tisList); - } - - public static List<IteratorSetting> toIteratorSettings(IteratorConfig ic) { - List<IteratorSetting> ret = new ArrayList<>(); - for (TIteratorSetting tIteratorSetting : ic.getIterators()) { - ret.add(toIteratorSetting(tIteratorSetting)); - } - - return ret; - } - - public static byte[] encodeIteratorSettings(IteratorConfig iterators) { - TSerializer tser = new TSerializer(new TBinaryProtocol.Factory()); - - try { - return tser.serialize(iterators); - } catch (TException e) { - throw new RuntimeException(e); - } - } - - public static byte[] encodeIteratorSettings(List<IteratorSetting> iterators) { - return encodeIteratorSettings(toIteratorConfig(iterators)); - } - - public static List<IteratorSetting> decodeIteratorSettings(byte[] enc) { - TDeserializer tdser = new TDeserializer(new TBinaryProtocol.Factory()); - IteratorConfig ic = new IteratorConfig(); - try { - tdser.deserialize(ic, enc); - } catch (TException e) { - throw new RuntimeException(e); - } - return toIteratorSettings(ic); - } - - public static SortedKeyValueIterator<Key,Value> setupSystemScanIterators( - SortedKeyValueIterator<Key,Value> source, Set<Column> cols, Authorizations auths, - byte[] defaultVisibility, AccumuloConfiguration conf) throws IOException { - SortedKeyValueIterator<Key,Value> delIter = DeletingIterator.wrap(source, false, - DeletingIterator.getBehavior(conf)); - ColumnFamilySkippingIterator cfsi = new ColumnFamilySkippingIterator(delIter); - SortedKeyValueIterator<Key,Value> colFilter = ColumnQualifierFilter.wrap(cfsi, cols); - return VisibilityFilter.wrap(colFilter, auths, defaultVisibility); - } } diff --git a/core/src/main/java/org/apache/accumulo/core/util/SystemIteratorUtil.java b/core/src/main/java/org/apache/accumulo/core/util/SystemIteratorUtil.java new file mode 100644 index 0000000..3e13ad1 --- /dev/null +++ b/core/src/main/java/org/apache/accumulo/core/util/SystemIteratorUtil.java @@ -0,0 +1,110 @@ +/* + * 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 + * + * http://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.core.util; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.apache.accumulo.core.client.IteratorSetting; +import org.apache.accumulo.core.conf.AccumuloConfiguration; +import org.apache.accumulo.core.data.Column; +import org.apache.accumulo.core.data.Key; +import org.apache.accumulo.core.data.Value; +import org.apache.accumulo.core.iterators.SortedKeyValueIterator; +import org.apache.accumulo.core.iterators.system.ColumnFamilySkippingIterator; +import org.apache.accumulo.core.iterators.system.ColumnQualifierFilter; +import org.apache.accumulo.core.iterators.system.DeletingIterator; +import org.apache.accumulo.core.iterators.system.VisibilityFilter; +import org.apache.accumulo.core.security.Authorizations; +import org.apache.accumulo.core.tabletserver.thrift.IteratorConfig; +import org.apache.accumulo.core.tabletserver.thrift.TIteratorSetting; +import org.apache.thrift.TDeserializer; +import org.apache.thrift.TException; +import org.apache.thrift.TSerializer; +import org.apache.thrift.protocol.TBinaryProtocol; + +/** + * System utility class. Not for client use. + */ +public class SystemIteratorUtil { + + public static TIteratorSetting toTIteratorSetting(IteratorSetting is) { + return new TIteratorSetting(is.getPriority(), is.getName(), is.getIteratorClass(), + is.getOptions()); + } + + public static IteratorSetting toIteratorSetting(TIteratorSetting tis) { + return new IteratorSetting(tis.getPriority(), tis.getName(), tis.getIteratorClass(), + tis.getProperties()); + } + + public static IteratorConfig toIteratorConfig(List<IteratorSetting> iterators) { + ArrayList<TIteratorSetting> tisList = new ArrayList<>(); + + for (IteratorSetting iteratorSetting : iterators) { + tisList.add(toTIteratorSetting(iteratorSetting)); + } + + return new IteratorConfig(tisList); + } + + public static List<IteratorSetting> toIteratorSettings(IteratorConfig ic) { + List<IteratorSetting> ret = new ArrayList<>(); + for (TIteratorSetting tIteratorSetting : ic.getIterators()) { + ret.add(toIteratorSetting(tIteratorSetting)); + } + + return ret; + } + + public static byte[] encodeIteratorSettings(IteratorConfig iterators) { + TSerializer tser = new TSerializer(new TBinaryProtocol.Factory()); + + try { + return tser.serialize(iterators); + } catch (TException e) { + throw new RuntimeException(e); + } + } + + public static byte[] encodeIteratorSettings(List<IteratorSetting> iterators) { + return encodeIteratorSettings(toIteratorConfig(iterators)); + } + + public static List<IteratorSetting> decodeIteratorSettings(byte[] enc) { + TDeserializer tdser = new TDeserializer(new TBinaryProtocol.Factory()); + IteratorConfig ic = new IteratorConfig(); + try { + tdser.deserialize(ic, enc); + } catch (TException e) { + throw new RuntimeException(e); + } + return toIteratorSettings(ic); + } + + public static SortedKeyValueIterator<Key,Value> setupSystemScanIterators( + SortedKeyValueIterator<Key,Value> source, Set<Column> cols, Authorizations auths, + byte[] defaultVisibility, AccumuloConfiguration conf) throws IOException { + SortedKeyValueIterator<Key,Value> delIter = DeletingIterator.wrap(source, false, + DeletingIterator.getBehavior(conf)); + ColumnFamilySkippingIterator cfsi = new ColumnFamilySkippingIterator(delIter); + SortedKeyValueIterator<Key,Value> colFilter = ColumnQualifierFilter.wrap(cfsi, cols); + return VisibilityFilter.wrap(colFilter, auths, defaultVisibility); + } +} diff --git a/core/src/test/java/org/apache/accumulo/core/iterators/IteratorUtilTest.java b/core/src/test/java/org/apache/accumulo/core/conf/IterConfigUtilTest.java similarity index 85% rename from core/src/test/java/org/apache/accumulo/core/iterators/IteratorUtilTest.java rename to core/src/test/java/org/apache/accumulo/core/conf/IterConfigUtilTest.java index 497e5c2..ee8359c 100644 --- a/core/src/test/java/org/apache/accumulo/core/iterators/IteratorUtilTest.java +++ b/core/src/test/java/org/apache/accumulo/core/conf/IterConfigUtilTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.accumulo.core.iterators; +package org.apache.accumulo.core.conf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -23,22 +23,22 @@ import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; -import org.apache.accumulo.core.conf.AccumuloConfiguration; -import org.apache.accumulo.core.conf.ConfigurationCopy; -import org.apache.accumulo.core.conf.Property; import org.apache.accumulo.core.data.ByteSequence; import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Range; -import org.apache.accumulo.core.data.TableId; import org.apache.accumulo.core.data.Value; -import org.apache.accumulo.core.dataImpl.KeyExtent; import org.apache.accumulo.core.dataImpl.thrift.IterInfo; +import org.apache.accumulo.core.iterators.DefaultIteratorEnvironment; +import org.apache.accumulo.core.iterators.IteratorEnvironment; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; +import org.apache.accumulo.core.iterators.SortedKeyValueIterator; +import org.apache.accumulo.core.iterators.SortedMapIterator; import org.apache.accumulo.core.iterators.system.MultiIteratorTest; import org.apache.accumulo.core.iterators.user.AgeOffFilter; import org.apache.accumulo.core.iterators.user.SummingCombiner; @@ -46,10 +46,11 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class IteratorUtilTest { +public class IterConfigUtilTest { - private static final Logger log = LoggerFactory.getLogger(IteratorUtilTest.class); + private static final Logger log = LoggerFactory.getLogger(IterConfigUtilTest.class); private static final Collection<ByteSequence> EMPTY_COL_FAMS = new ArrayList<>(); + private static final List<IterInfo> EMPTY_ITERS = Collections.emptyList(); static class WrappedIter implements SortedKeyValueIterator<Key,Value> { @@ -130,6 +131,13 @@ public class IteratorUtilTest { } } + private SortedKeyValueIterator<Key,Value> createIter(IteratorScope scope, + SortedMapIterator source, AccumuloConfiguration conf) throws IOException { + IterLoad iterLoad = IterConfigUtil.loadIterConf(scope, EMPTY_ITERS, new HashMap<>(), conf); + iterLoad = iterLoad.iterEnv(new DefaultIteratorEnvironment(conf)).useAccumuloClassLoader(true); + return IterConfigUtil.loadIterators(source, iterLoad); + } + @Test public void test1() throws IOException { ConfigurationCopy conf = new ConfigurationCopy(); @@ -146,9 +154,7 @@ public class IteratorUtilTest { MultiIteratorTest.newKeyValue(tm, 2, 0, false, "2"); SortedMapIterator source = new SortedMapIterator(tm); - - SortedKeyValueIterator<Key,Value> iter = IteratorUtil.loadIterators(IteratorScope.minc, source, - new KeyExtent(TableId.of("tab"), null, null), conf, new DefaultIteratorEnvironment(conf)); + SortedKeyValueIterator<Key,Value> iter = createIter(IteratorScope.minc, source, conf); iter.seek(new Range(), EMPTY_COL_FAMS, false); assertTrue(iter.hasTop()); @@ -179,8 +185,7 @@ public class IteratorUtilTest { SortedMapIterator source = new SortedMapIterator(tm); - SortedKeyValueIterator<Key,Value> iter = IteratorUtil.loadIterators(IteratorScope.majc, source, - new KeyExtent(TableId.of("tab"), null, null), conf, new DefaultIteratorEnvironment(conf)); + SortedKeyValueIterator<Key,Value> iter = createIter(IteratorScope.majc, source, conf); iter.seek(new Range(), EMPTY_COL_FAMS, false); assertTrue(iter.hasTop()); @@ -217,8 +222,7 @@ public class IteratorUtilTest { conf.set(Property.TABLE_ITERATOR_PREFIX + IteratorScope.minc.name() + ".sqIter", "1," + SquaringIter.class.getName()); - SortedKeyValueIterator<Key,Value> iter = IteratorUtil.loadIterators(IteratorScope.minc, source, - new KeyExtent(TableId.of("tab"), null, null), conf, new DefaultIteratorEnvironment(conf)); + SortedKeyValueIterator<Key,Value> iter = createIter(IteratorScope.minc, source, conf); iter.seek(new Range(), EMPTY_COL_FAMS, false); assertTrue(iter.hasTop()); @@ -256,8 +260,7 @@ public class IteratorUtilTest { SortedMapIterator source = new SortedMapIterator(tm); - SortedKeyValueIterator<Key,Value> iter = IteratorUtil.loadIterators(IteratorScope.minc, source, - new KeyExtent(TableId.of("tab"), null, null), conf, new DefaultIteratorEnvironment(conf)); + SortedKeyValueIterator<Key,Value> iter = createIter(IteratorScope.minc, source, conf); iter.seek(new Range(), EMPTY_COL_FAMS, false); assertTrue(iter.hasTop()); @@ -294,8 +297,7 @@ public class IteratorUtilTest { SortedMapIterator source = new SortedMapIterator(tm); - SortedKeyValueIterator<Key,Value> iter = IteratorUtil.loadIterators(IteratorScope.minc, source, - new KeyExtent(TableId.of("tab"), null, null), conf, new DefaultIteratorEnvironment(conf)); + SortedKeyValueIterator<Key,Value> iter = createIter(IteratorScope.minc, source, conf); iter.seek(new Range(), EMPTY_COL_FAMS, false); assertTrue(iter.hasTop()); @@ -312,17 +314,15 @@ public class IteratorUtilTest { // Make some configuration items, one with a bogus scope data.put(Property.TABLE_ITERATOR_SCAN_PREFIX + "foo", "50," + SummingCombiner.class.getName()); - data.put(Property.TABLE_ITERATOR_SCAN_PREFIX + "foo.opt." + SummingCombiner.ALL_OPTION, "true"); + data.put(Property.TABLE_ITERATOR_SCAN_PREFIX + "foo.opt.all", "true"); data.put(Property.TABLE_ITERATOR_PREFIX + ".fakescope.bar", "50," + SummingCombiner.class.getName()); data.put(Property.TABLE_ITERATOR_SCAN_PREFIX + "foo.opt.fakeopt", "fakevalue"); AccumuloConfiguration conf = new ConfigurationCopy(data); - List<IterInfo> iterators = new ArrayList<>(); - Map<String,Map<String,String>> options = new HashMap<>(); - - IteratorUtil.parseIterConf(IteratorScope.scan, iterators, options, conf); + List<IterInfo> iterators = IterConfigUtil.parseIterConf(IteratorScope.scan, EMPTY_ITERS, + new HashMap<>(), conf); assertEquals(1, iterators.size()); IterInfo ii = iterators.get(0); @@ -337,16 +337,16 @@ public class IteratorUtilTest { public void testInvalidIteratorFormats() { Map<String,String> data = new HashMap<>(); - List<IterInfo> iterators = new ArrayList<>(); Map<String,Map<String,String>> options = new HashMap<>(); AccumuloConfiguration conf; // create iterator with 'dot' in name + List<IterInfo> iterators = new ArrayList<>(); try { data.put(Property.TABLE_ITERATOR_SCAN_PREFIX + "foo.bar", "50," + SummingCombiner.class.getName()); conf = new ConfigurationCopy(data); - IteratorUtil.parseIterConf(IteratorScope.scan, iterators, options, conf); + iterators = IterConfigUtil.parseIterConf(IteratorScope.scan, iterators, options, conf); } catch (IllegalArgumentException ex) { log.debug("caught expected exception: " + ex.getMessage()); } @@ -360,7 +360,7 @@ public class IteratorUtilTest { data.put(Property.TABLE_ITERATOR_SCAN_PREFIX + "foo.bar.baz", "49," + SummingCombiner.class.getName()); conf = new ConfigurationCopy(data); - IteratorUtil.parseIterConf(IteratorScope.scan, iterators, options, conf); + iterators = IterConfigUtil.parseIterConf(IteratorScope.scan, iterators, options, conf); } catch (IllegalArgumentException ex) { log.debug("caught expected exception: " + ex.getMessage()); } @@ -374,7 +374,7 @@ public class IteratorUtilTest { "48," + SummingCombiner.class.getName()); data.put(Property.TABLE_ITERATOR_SCAN_PREFIX + "foobar.opt", "fakevalue"); conf = new ConfigurationCopy(data); - IteratorUtil.parseIterConf(IteratorScope.scan, iterators, options, conf); + iterators = IterConfigUtil.parseIterConf(IteratorScope.scan, iterators, options, conf); assertEquals(1, iterators.size()); IterInfo ii = iterators.get(0); assertEquals(new IterInfo(48, SummingCombiner.class.getName(), "foobar"), ii); @@ -391,7 +391,7 @@ public class IteratorUtilTest { "47," + SummingCombiner.class.getName()); data.put(Property.TABLE_ITERATOR_SCAN_PREFIX + "foobaz.fake.opt", "fakevalue"); conf = new ConfigurationCopy(data); - IteratorUtil.parseIterConf(IteratorScope.scan, iterators, options, conf); + iterators = IterConfigUtil.parseIterConf(IteratorScope.scan, iterators, options, conf); assertEquals(1, iterators.size()); IterInfo ii = iterators.get(0); assertEquals(new IterInfo(47, SummingCombiner.class.getName(), "foobaz"), ii); diff --git a/server/base/src/main/java/org/apache/accumulo/server/conf/TableConfiguration.java b/server/base/src/main/java/org/apache/accumulo/server/conf/TableConfiguration.java index 5165c5f..085acfa 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/conf/TableConfiguration.java +++ b/server/base/src/main/java/org/apache/accumulo/server/conf/TableConfiguration.java @@ -18,7 +18,7 @@ package org.apache.accumulo.server.conf; import static java.util.Objects.requireNonNull; -import java.util.ArrayList; +import java.util.Collections; import java.util.EnumMap; import java.util.HashMap; import java.util.List; @@ -29,11 +29,11 @@ import java.util.function.Predicate; import org.apache.accumulo.core.Constants; import org.apache.accumulo.core.conf.ConfigurationObserver; +import org.apache.accumulo.core.conf.IterConfigUtil; import org.apache.accumulo.core.conf.ObservableConfiguration; import org.apache.accumulo.core.conf.Property; import org.apache.accumulo.core.data.TableId; import org.apache.accumulo.core.dataImpl.thrift.IterInfo; -import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.core.spi.common.ServiceEnvironment; import org.apache.accumulo.core.spi.scan.ScanDispatcher; @@ -205,10 +205,10 @@ public class TableConfiguration extends ObservableConfiguration { AtomicReference<ParsedIteratorConfig> ref = iteratorConfig.get(scope); ParsedIteratorConfig pic = ref.get(); if (pic == null || pic.updateCount != count) { - List<IterInfo> iters = new ArrayList<>(); - Map<String,Map<String,String>> allOptions = new HashMap<>(); - IteratorUtil.parseIterConf(scope, iters, allOptions, this); - ParsedIteratorConfig newPic = new ParsedIteratorConfig(iters, allOptions, + Map<String,Map<String,String>> allOpts = new HashMap<>(); + List<IterInfo> iters = IterConfigUtil.parseIterConf(scope, Collections.emptyList(), allOpts, + this); + ParsedIteratorConfig newPic = new ParsedIteratorConfig(iters, allOpts, get(Property.TABLE_CLASSPATH), count); ref.compareAndSet(pic, newPic); pic = newPic; diff --git a/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java b/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java index 1f794bf..17a51aa 100644 --- a/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java +++ b/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java @@ -50,13 +50,13 @@ import org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException; import org.apache.accumulo.core.clientImpl.thrift.ThriftTableOperationException; import org.apache.accumulo.core.data.NamespaceId; import org.apache.accumulo.core.data.TableId; -import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.master.thrift.BulkImportState; import org.apache.accumulo.core.master.thrift.FateOperation; import org.apache.accumulo.core.master.thrift.FateService; import org.apache.accumulo.core.securityImpl.thrift.TCredentials; import org.apache.accumulo.core.trace.thrift.TInfo; import org.apache.accumulo.core.util.ByteBufferUtil; +import org.apache.accumulo.core.util.SystemIteratorUtil; import org.apache.accumulo.core.util.Validator; import org.apache.accumulo.core.volume.Volume; import org.apache.accumulo.fate.ReadOnlyTStore.TStatus; @@ -441,7 +441,7 @@ class FateServiceHandler implements FateService.Iface { TableId tableId = validateTableIdArgument(arguments.get(0), tableOp, null); byte[] startRow = ByteBufferUtil.toBytes(arguments.get(1)); byte[] endRow = ByteBufferUtil.toBytes(arguments.get(2)); - List<IteratorSetting> iterators = IteratorUtil + List<IteratorSetting> iterators = SystemIteratorUtil .decodeIteratorSettings(ByteBufferUtil.toBytes(arguments.get(3))); CompactionStrategyConfig compactionStrategy = CompactionStrategyConfigUtil .decode(ByteBufferUtil.toBytes(arguments.get(4))); diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/ConditionCheckerContext.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/ConditionCheckerContext.java index 9e7c1e2..ecd853c 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/ConditionCheckerContext.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/ConditionCheckerContext.java @@ -29,6 +29,8 @@ import java.util.Map; import org.apache.accumulo.core.clientImpl.CompressedIterators; import org.apache.accumulo.core.clientImpl.CompressedIterators.IterConfig; +import org.apache.accumulo.core.conf.IterConfigUtil; +import org.apache.accumulo.core.conf.IterLoad; import org.apache.accumulo.core.data.ArrayByteSequence; import org.apache.accumulo.core.data.ByteSequence; import org.apache.accumulo.core.data.Key; @@ -38,7 +40,6 @@ import org.apache.accumulo.core.dataImpl.thrift.IterInfo; import org.apache.accumulo.core.dataImpl.thrift.TCMResult; import org.apache.accumulo.core.dataImpl.thrift.TCMStatus; import org.apache.accumulo.core.dataImpl.thrift.TCondition; -import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.core.iterators.SortedKeyValueIterator; import org.apache.accumulo.server.ServerContext; @@ -54,7 +55,7 @@ public class ConditionCheckerContext { private Map<String,Map<String,String>> tableIterOpts; private TabletIteratorEnvironment tie; private String context; - private Map<String,Class<? extends SortedKeyValueIterator<Key,Value>>> classCache; + private Map<String,Class<SortedKeyValueIterator<Key,Value>>> classCache; private static class MergedIterConfig { List<IterInfo> mergedIters; @@ -96,7 +97,7 @@ public class ConditionCheckerContext { Map<String,Map<String,String>> mergedItersOpts = new HashMap<>( tableIterOpts.size() + ic.ssio.size()); - IteratorUtil.mergeIteratorConfig(mergedIters, mergedItersOpts, tableIters, tableIterOpts, + IterConfigUtil.mergeIteratorConfig(mergedIters, mergedItersOpts, tableIters, tableIterOpts, ic.ssiList, ic.ssio); mic = new MergedIterConfig(mergedIters, mergedItersOpts); @@ -104,8 +105,9 @@ public class ConditionCheckerContext { mergedIterCache.put(key, mic); } - return IteratorUtil.loadIterators(systemIter, mic.mergedIters, mic.mergedItersOpts, tie, true, - context, classCache); + IterLoad iterLoad = new IterLoad().iters(mic.mergedIters).iterOpts(mic.mergedItersOpts) + .iterEnv(tie).useAccumuloClassLoader(true).context(context).classCache(classCache); + return IterConfigUtil.loadIterators(systemIter, iterLoad); } boolean checkConditions(SortedKeyValueIterator<Key,Value> systemIter, diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Compactor.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Compactor.java index 05d1861..944aa67 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Compactor.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Compactor.java @@ -33,6 +33,7 @@ import java.util.concurrent.atomic.AtomicLong; import org.apache.accumulo.core.client.IteratorSetting; import org.apache.accumulo.core.conf.AccumuloConfiguration; +import org.apache.accumulo.core.conf.IterConfigUtil; import org.apache.accumulo.core.data.ByteSequence; import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Value; @@ -40,7 +41,6 @@ import org.apache.accumulo.core.dataImpl.KeyExtent; import org.apache.accumulo.core.file.FileOperations; import org.apache.accumulo.core.file.FileSKVIterator; import org.apache.accumulo.core.file.FileSKVWriter; -import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.core.iterators.SortedKeyValueIterator; import org.apache.accumulo.core.iterators.system.ColumnFamilySkippingIterator; @@ -365,8 +365,8 @@ public class Compactor implements Callable<CompactionStats> { else throw new IllegalArgumentException(); - SortedKeyValueIterator<Key,Value> itr = iterEnv.getTopLevelIterator(IteratorUtil - .loadIterators(env.getIteratorScope(), cfsi, extent, acuTableConf, iterators, iterEnv)); + SortedKeyValueIterator<Key,Value> itr = iterEnv.getTopLevelIterator(IterConfigUtil + .convertItersAndLoad(env.getIteratorScope(), cfsi, acuTableConf, iterators, iterEnv)); itr.seek(extent.toDataRange(), columnFamilies, inclusive); diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java index ca58cb2..913dd68 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java @@ -28,13 +28,14 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.accumulo.core.client.sample.SamplerConfiguration; +import org.apache.accumulo.core.conf.IterConfigUtil; +import org.apache.accumulo.core.conf.IterLoad; import org.apache.accumulo.core.data.Column; import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.dataImpl.thrift.IterInfo; import org.apache.accumulo.core.iterators.IterationInterruptedException; import org.apache.accumulo.core.iterators.IteratorEnvironment; -import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.core.iterators.SortedKeyValueIterator; import org.apache.accumulo.core.iterators.system.InterruptibleIterator; @@ -45,6 +46,7 @@ import org.apache.accumulo.core.metadata.schema.DataFileValue; import org.apache.accumulo.core.sample.impl.SamplerConfigurationImpl; import org.apache.accumulo.core.security.Authorizations; import org.apache.accumulo.core.util.Pair; +import org.apache.accumulo.core.util.SystemIteratorUtil; import org.apache.accumulo.server.conf.TableConfiguration.ParsedIteratorConfig; import org.apache.accumulo.server.fs.FileRef; import org.apache.accumulo.tserver.FileManager.ScanFileManager; @@ -199,7 +201,7 @@ class ScanDataSource implements DataSource { statsIterator = new StatsIterator(multiIter, TabletServer.seekCount, tablet.getScannedCounter()); - SortedKeyValueIterator<Key,Value> visFilter = IteratorUtil.setupSystemScanIterators( + SortedKeyValueIterator<Key,Value> visFilter = SystemIteratorUtil.setupSystemScanIterators( statsIterator, options.getColumnSet(), options.getAuthorizations(), options.getDefaultLabels(), tablet.getTableConfiguration()); @@ -221,7 +223,7 @@ class ScanDataSource implements DataSource { // iterator options. iterOpts = new HashMap<>(pic.getOpts().size() + options.getSsio().size()); iterInfos = new ArrayList<>(pic.getIterInfo().size() + options.getSsiList().size()); - IteratorUtil.mergeIteratorConfig(iterInfos, iterOpts, pic.getIterInfo(), pic.getOpts(), + IterConfigUtil.mergeIteratorConfig(iterInfos, iterOpts, pic.getIterInfo(), pic.getOpts(), options.getSsiList(), options.getSsio()); } @@ -240,8 +242,9 @@ class ScanDataSource implements DataSource { } } - return iterEnv.getTopLevelIterator( - IteratorUtil.loadIterators(visFilter, iterInfos, iterOpts, iterEnv, true, context)); + IterLoad il = new IterLoad().iters(iterInfos).iterOpts(iterOpts).iterEnv(iterEnv) + .useAccumuloClassLoader(true).context(context); + return iterEnv.getTopLevelIterator(IterConfigUtil.loadIterators(visFilter, il)); } } diff --git a/shell/src/main/java/org/apache/accumulo/shell/commands/CreateTableCommand.java b/shell/src/main/java/org/apache/accumulo/shell/commands/CreateTableCommand.java index 3cc3178..0f54482 100644 --- a/shell/src/main/java/org/apache/accumulo/shell/commands/CreateTableCommand.java +++ b/shell/src/main/java/org/apache/accumulo/shell/commands/CreateTableCommand.java @@ -35,9 +35,9 @@ import org.apache.accumulo.core.client.TableNotFoundException; import org.apache.accumulo.core.client.admin.NewTableConfiguration; import org.apache.accumulo.core.client.admin.TimeType; import org.apache.accumulo.core.clientImpl.Tables; +import org.apache.accumulo.core.conf.IterConfigUtil; import org.apache.accumulo.core.conf.Property; import org.apache.accumulo.core.constraints.VisibilityConstraint; -import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.shell.Shell; import org.apache.accumulo.shell.Shell.Command; @@ -136,7 +136,7 @@ public class CreateTableCommand extends Command { shellState.setTableName(tableName); // switch shell to new table context if (cl.hasOption(createTableNoDefaultIters.getOpt())) { - for (String key : IteratorUtil.generateInitialTableProperties(true).keySet()) { + for (String key : IterConfigUtil.generateInitialTableProperties(true).keySet()) { shellState.getAccumuloClient().tableOperations().removeProperty(tableName, key); } } diff --git a/test/src/main/java/org/apache/accumulo/test/performance/scan/CollectTabletStats.java b/test/src/main/java/org/apache/accumulo/test/performance/scan/CollectTabletStats.java index 515845a..4627e91 100644 --- a/test/src/main/java/org/apache/accumulo/test/performance/scan/CollectTabletStats.java +++ b/test/src/main/java/org/apache/accumulo/test/performance/scan/CollectTabletStats.java @@ -40,6 +40,8 @@ import org.apache.accumulo.core.client.Scanner; import org.apache.accumulo.core.clientImpl.ClientContext; import org.apache.accumulo.core.clientImpl.Tables; import org.apache.accumulo.core.conf.AccumuloConfiguration; +import org.apache.accumulo.core.conf.IterConfigUtil; +import org.apache.accumulo.core.conf.IterLoad; import org.apache.accumulo.core.crypto.CryptoServiceFactory; import org.apache.accumulo.core.data.ArrayByteSequence; import org.apache.accumulo.core.data.ByteSequence; @@ -52,7 +54,6 @@ import org.apache.accumulo.core.dataImpl.KeyExtent; import org.apache.accumulo.core.dataImpl.thrift.IterInfo; import org.apache.accumulo.core.file.FileOperations; import org.apache.accumulo.core.file.FileSKVIterator; -import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; import org.apache.accumulo.core.iterators.SortedKeyValueIterator; import org.apache.accumulo.core.iterators.SortedMapIterator; @@ -442,9 +443,10 @@ public class CollectTabletStats { SortedKeyValueIterator<Key,Value> visFilter = VisibilityFilter.wrap(colFilter, authorizations, defaultLabels); - if (useTableIterators) - return IteratorUtil.loadIterators(IteratorScope.scan, visFilter, ke, conf, ssiList, ssio, - null); + if (useTableIterators) { + IterLoad il = IterConfigUtil.loadIterConf(IteratorScope.scan, ssiList, ssio, conf); + return IterConfigUtil.loadIterators(visFilter, il.useAccumuloClassLoader(true)); + } return visFilter; }