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

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

commit f6c0da3f72af01ded77e743c03bac60fd5aaa3e1
Merge: 51633db8df ba9c376ecc
Author: Dave Marion <dlmar...@apache.org>
AuthorDate: Fri Nov 8 20:16:45 2024 +0000

    Merge branch '2.1' into 3.1

 .../core/spi/compaction/CompactionPlanner.java     |   9 +
 .../spi/compaction/DefaultCompactionPlanner.java   |  21 ++-
 .../util/compaction/CompactionJobPrioritizer.java  | 143 +++++++++++++---
 .../compaction/DefaultCompactionPlannerTest.java   |   8 +
 .../util/compaction/CompactionPrioritizerTest.java | 185 ++++++++++++++++++---
 .../tserver/compactions/CompactionService.java     |   7 +
 6 files changed, 324 insertions(+), 49 deletions(-)

diff --cc 
core/src/main/java/org/apache/accumulo/core/spi/compaction/DefaultCompactionPlanner.java
index ee07bc2fc0,6c60d5095c..7455625034
--- 
a/core/src/main/java/org/apache/accumulo/core/spi/compaction/DefaultCompactionPlanner.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/spi/compaction/DefaultCompactionPlanner.java
@@@ -32,8 -28,8 +32,9 @@@ import java.util.HashSet
  import java.util.List;
  import java.util.Objects;
  import java.util.Set;
 +import java.util.stream.Collectors;
  
+ import org.apache.accumulo.core.client.TableNotFoundException;
  import org.apache.accumulo.core.client.admin.compaction.CompactableFile;
  import org.apache.accumulo.core.conf.ConfigurationTypeHelper;
  import org.apache.accumulo.core.conf.Property;
@@@ -297,120 -233,121 +298,128 @@@ public class DefaultCompactionPlanner i
      determineMaxFilesToCompact(params);
    }
  
 -  @SuppressWarnings("removal")
 +  @SuppressWarnings("deprecation")
    private void determineMaxFilesToCompact(InitParameters params) {
 -    String fqo = params.getFullyQualifiedOption("maxOpen");
 -    if (!params.getServiceEnvironment().getConfiguration().isSet(fqo)
 -        && params.getServiceEnvironment().getConfiguration()
 -            .isSet(Property.TSERV_MAJC_THREAD_MAXOPEN.getKey())) {
 -      log.warn("The property " + Property.TSERV_MAJC_THREAD_MAXOPEN.getKey()
 -          + " was set, it is deprecated.  Set the " + fqo + " option 
instead.");
 -      this.maxFilesToCompact = 
Integer.parseInt(params.getServiceEnvironment().getConfiguration()
 -          .get(Property.TSERV_MAJC_THREAD_MAXOPEN.getKey()));
 -    } else {
 -      this.maxFilesToCompact = 
Integer.parseInt(params.getOptions().getOrDefault("maxOpen",
 -          
Property.TSERV_COMPACTION_SERVICE_DEFAULT_MAX_OPEN.getDefaultValue()));
 +
 +    String maxOpen = params.getOptions().get("maxOpen");
 +    if (maxOpen == null) {
 +      maxOpen = 
Property.TSERV_COMPACTION_SERVICE_DEFAULT_MAX_OPEN.getDefaultValue();
 +      log.trace("default maxOpen not set, defaulting to {}", maxOpen);
      }
 +    this.maxFilesToCompact = Integer.parseInt(maxOpen);
    }
  
 -  @Override
 -  public CompactionPlan makePlan(PlanningParameters params) {
 -    int maxTabletFiles = 0;
 -    try {
 +  private void validateConfig(JsonElement json, List<String> fields, String 
className) {
  
 -      if (params.getCandidates().isEmpty()) {
 -        return params.createPlanBuilder().build();
 -      }
 +    JsonObject jsonObject = GSON.get().fromJson(json, JsonObject.class);
  
 -      Set<CompactableFile> filesCopy = new HashSet<>(params.getCandidates());
 +    List<String> objectProperties = new ArrayList<>(jsonObject.keySet());
 +    HashSet<String> classFieldNames = new HashSet<>(fields);
  
 -      long maxSizeToCompact = getMaxSizeToCompact(params.getKind());
 +    if (!classFieldNames.containsAll(objectProperties)) {
 +      objectProperties.removeAll(classFieldNames);
 +      throw new JsonParseException(
 +          "Invalid fields: " + objectProperties + " provided for class: " + 
className);
 +    }
 +  }
  
 -      Collection<CompactableFile> group;
 -      if (params.getRunningCompactions().isEmpty()) {
 -        group = findDataFilesToCompact(filesCopy, params.getRatio(), 
maxFilesToCompact,
 -            maxSizeToCompact);
 +  @Override
 +  public CompactionPlan makePlan(PlanningParameters params) {
 +    if (params.getCandidates().isEmpty()) {
 +      return params.createPlanBuilder().build();
 +    }
 +
 +    Set<CompactableFile> filesCopy = new HashSet<>(params.getCandidates());
  
 -        if (!group.isEmpty() && group.size() < params.getCandidates().size()
 -            && params.getCandidates().size() <= maxFilesToCompact
 -            && (params.getKind() == CompactionKind.USER
 -                || params.getKind() == CompactionKind.SELECTOR)) {
 -          // USER and SELECTOR compactions must eventually compact all files. 
When a subset of files
 -          // that meets the compaction ratio is selected, look ahead and see 
if the next compaction
 -          // would also meet the compaction ratio. If not then compact 
everything to avoid doing
 -          // more than logarithmic work across multiple comapctions.
 +    long maxSizeToCompact = getMaxSizeToCompact(params.getKind());
  
 -          filesCopy.removeAll(group);
 -          filesCopy.add(getExpected(group, 0));
 +    Collection<CompactableFile> group;
 +    if (params.getRunningCompactions().isEmpty()) {
 +      group =
 +          findDataFilesToCompact(filesCopy, params.getRatio(), 
maxFilesToCompact, maxSizeToCompact);
  
 -          if (findDataFilesToCompact(filesCopy, params.getRatio(), 
maxFilesToCompact,
 -              maxSizeToCompact).isEmpty()) {
 -            // The next possible compaction does not meet the compaction 
ratio, so compact
 -            // everything.
 -            group = Set.copyOf(params.getCandidates());
 -          }
 +      if (!group.isEmpty() && group.size() < params.getCandidates().size()
 +          && params.getCandidates().size() <= maxFilesToCompact
 +          && (params.getKind() == CompactionKind.USER
 +              || params.getKind() == DeprecatedCompactionKind.SELECTOR)) {
 +        // USER and SELECTOR compactions must eventually compact all files. 
When a subset of files
 +        // that meets the compaction ratio is selected, look ahead and see if 
the next compaction
 +        // would also meet the compaction ratio. If not then compact 
everything to avoid doing
 +        // more than logarithmic work across multiple comapctions.
  
 +        filesCopy.removeAll(group);
 +        filesCopy.add(getExpected(group, 0));
 +
 +        if (findDataFilesToCompact(filesCopy, params.getRatio(), 
maxFilesToCompact,
 +            maxSizeToCompact).isEmpty()) {
 +          // The next possible compaction does not meet the compaction ratio, 
so compact
 +          // everything.
 +          group = Set.copyOf(params.getCandidates());
          }
  
 -      } else if (params.getKind() == CompactionKind.SYSTEM) {
 -        // This code determines if once the files compacting finish would 
they be included in a
 -        // compaction with the files smaller than them? If so, then wait for 
the running compaction
 -        // to complete.
 +      }
  
 -        // The set of files running compactions may produce
 -        var expectedFiles = getExpected(params.getRunningCompactions());
 +    } else if (params.getKind() == CompactionKind.SYSTEM) {
 +      // This code determines if once the files compacting finish would they 
be included in a
 +      // compaction with the files smaller than them? If so, then wait for 
the running compaction
 +      // to complete.
  
 -        if (!Collections.disjoint(filesCopy, expectedFiles)) {
 -          throw new AssertionError();
 -        }
 +      // The set of files running compactions may produce
 +      var expectedFiles = getExpected(params.getRunningCompactions());
  
 -        filesCopy.addAll(expectedFiles);
 +      if (!Collections.disjoint(filesCopy, expectedFiles)) {
 +        throw new AssertionError();
 +      }
  
 -        group = findDataFilesToCompact(filesCopy, params.getRatio(), 
maxFilesToCompact,
 -            maxSizeToCompact);
 +      filesCopy.addAll(expectedFiles);
  
 -        if (!Collections.disjoint(group, expectedFiles)) {
 -          // file produced by running compaction will eventually compact with 
existing files, so
 -          // wait.
 -          group = Set.of();
 -        }
 -      } else {
 +      group =
 +          findDataFilesToCompact(filesCopy, params.getRatio(), 
maxFilesToCompact, maxSizeToCompact);
 +
 +      if (!Collections.disjoint(group, expectedFiles)) {
 +        // file produced by running compaction will eventually compact with 
existing files, so
 +        // wait.
          group = Set.of();
        }
 +    } else {
 +      group = Set.of();
 +    }
  
 -      if (group.isEmpty()) {
 -
 -        if ((params.getKind() == CompactionKind.USER || params.getKind() == 
CompactionKind.SELECTOR
 -            || params.getKind() == CompactionKind.CHOP)
 -            && params.getRunningCompactions().stream()
 -                .noneMatch(job -> job.getKind() == params.getKind())) {
 -          group = findMaximalRequiredSetToCompact(params.getCandidates(), 
maxFilesToCompact);
 -        } else if (params.getKind() == CompactionKind.SYSTEM
 -            && params.getRunningCompactions().isEmpty()
 -            && params.getAll().size() == params.getCandidates().size()) {
 -          maxTabletFiles = getMaxTabletFiles(
 -              
params.getServiceEnvironment().getConfiguration(params.getTableId()));
 -          if (params.getAll().size() > maxTabletFiles) {
 -            // The tablet is above its max files, there are no compactions 
running, all files are
 -            // candidates for a system compaction, and no files were found to 
compact. Attempt to
 -            // find a set of files to compact by lowering the compaction 
ratio.
 -            group = findFilesToCompactWithLowerRatio(params, 
maxSizeToCompact, maxTabletFiles);
 -          }
++    int maxTabletFiles = 0;
 +    if (group.isEmpty()) {
 +      if ((params.getKind() == CompactionKind.USER
 +          || params.getKind() == DeprecatedCompactionKind.SELECTOR)
 +          && params.getRunningCompactions().stream()
 +              .noneMatch(job -> job.getKind() == params.getKind())) {
 +        group = findMaximalRequiredSetToCompact(params.getCandidates(), 
maxFilesToCompact);
 +      } else if (params.getKind() == CompactionKind.SYSTEM
 +          && params.getRunningCompactions().isEmpty()
 +          && params.getAll().size() == params.getCandidates().size()) {
-         int maxTabletFiles =
++        maxTabletFiles =
 +            
getMaxTabletFiles(params.getServiceEnvironment().getConfiguration(params.getTableId()));
 +        if (params.getAll().size() > maxTabletFiles) {
 +          // The tablet is above its max files, there are no compactions 
running, all files are
 +          // candidates for a system compaction, and no files were found to 
compact. Attempt to
 +          // find a set of files to compact by lowering the compaction ratio.
 +          group = findFilesToCompactWithLowerRatio(params, maxSizeToCompact, 
maxTabletFiles);
          }
        }
 +    }
  
 -      if (group.isEmpty()) {
 -        return params.createPlanBuilder().build();
 -      } else {
 -        // determine which executor to use based on the size of the files
 -        var ceid = getExecutor(group);
 +    if (group.isEmpty()) {
 +      return params.createPlanBuilder().build();
 +    } else {
 +      // determine which executor to use based on the size of the files
 +      var ceid = getExecutor(group);
  
-       return params.createPlanBuilder().addJob(createPriority(params, group), 
ceid, group).build();
++      try {
+         return params.createPlanBuilder()
+             .addJob(createPriority(params, group, maxTabletFiles), ceid, 
group).build();
++      } catch (RuntimeException e) {
++        throw e;
++      } catch (TableNotFoundException e) {
++        throw new RuntimeException("Error getting namespace for table: " + 
params.getTableId(), e);
+       }
 -    } catch (RuntimeException e) {
 -      throw e;
 -    } catch (TableNotFoundException e) {
 -      throw new RuntimeException("Error getting namespace for table: " + 
params.getTableId(), e);
      }
    }
  
diff --cc 
core/src/main/java/org/apache/accumulo/core/util/compaction/CompactionJobPrioritizer.java
index 039201b7c0,686e589f5c..608027cb3f
--- 
a/core/src/main/java/org/apache/accumulo/core/util/compaction/CompactionJobPrioritizer.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/util/compaction/CompactionJobPrioritizer.java
@@@ -19,9 -19,22 +19,21 @@@
  package org.apache.accumulo.core.util.compaction;
  
  import java.util.Comparator;
+ import java.util.HashMap;
+ import java.util.Map;
+ import java.util.Objects;
+ import java.util.function.Function;
  
+ import org.apache.accumulo.core.clientImpl.Namespace;
+ import org.apache.accumulo.core.data.NamespaceId;
+ import org.apache.accumulo.core.data.TableId;
 -import org.apache.accumulo.core.metadata.MetadataTable;
 -import org.apache.accumulo.core.metadata.RootTable;
++import org.apache.accumulo.core.metadata.AccumuloTable;
  import org.apache.accumulo.core.spi.compaction.CompactionJob;
  import org.apache.accumulo.core.spi.compaction.CompactionKind;
+ import org.apache.accumulo.core.util.Pair;
+ import org.apache.commons.lang3.Range;
+ 
+ import com.google.common.base.Preconditions;
  
  public class CompactionJobPrioritizer {
  
@@@ -29,32 -42,113 +41,115 @@@
        Comparator.comparingInt(CompactionJob::getPriority)
            .thenComparingInt(job -> job.getFiles().size()).reversed();
  
+   private static final Map<Pair<TableId,CompactionKind>,Range<Short>> 
SYSTEM_TABLE_RANGES =
+       new HashMap<>();
+   private static final Map<Pair<NamespaceId,CompactionKind>,
+       Range<Short>> ACCUMULO_NAMESPACE_RANGES = new HashMap<>();
+ 
+   // Create ranges of possible priority values where each range has
+   // 2000 possible values. Priority order is:
+   // root table user initiated
+   // root table system initiated
+   // metadata table user initiated
+   // metadata table system initiated
+   // other tables in accumulo namespace user initiated
+   // other tables in accumulo namespace system initiated
+   // user tables that have more files that configured system initiated
+   // user tables user initiated
+   // user tables system initiated
+   static final Range<Short> ROOT_TABLE_USER = Range.of((short) 30768, (short) 
32767);
+   static final Range<Short> ROOT_TABLE_SYSTEM = Range.of((short) 28768, 
(short) 30767);
+ 
+   static final Range<Short> METADATA_TABLE_USER = Range.of((short) 26768, 
(short) 28767);
+   static final Range<Short> METADATA_TABLE_SYSTEM = Range.of((short) 24768, 
(short) 26767);
+ 
+   static final Range<Short> SYSTEM_NS_USER = Range.of((short) 22768, (short) 
24767);
+   static final Range<Short> SYSTEM_NS_SYSTEM = Range.of((short) 20768, 
(short) 22767);
+ 
+   static final Range<Short> TABLE_OVER_SIZE = Range.of((short) 18768, (short) 
20767);
+ 
+   static final Range<Short> USER_TABLE_USER = Range.of((short) 1, (short) 
18767);
+   static final Range<Short> USER_TABLE_SYSTEM = Range.of((short) -32768, 
(short) 0);
+ 
+   static {
+     // root table
 -    SYSTEM_TABLE_RANGES.put(new Pair<>(RootTable.ID, CompactionKind.USER), 
ROOT_TABLE_USER);
 -    SYSTEM_TABLE_RANGES.put(new Pair<>(RootTable.ID, CompactionKind.SYSTEM), 
ROOT_TABLE_SYSTEM);
++    SYSTEM_TABLE_RANGES.put(new Pair<>(AccumuloTable.ROOT.tableId(), 
CompactionKind.USER),
++        ROOT_TABLE_USER);
++    SYSTEM_TABLE_RANGES.put(new Pair<>(AccumuloTable.ROOT.tableId(), 
CompactionKind.SYSTEM),
++        ROOT_TABLE_SYSTEM);
+ 
+     // metadata table
 -    SYSTEM_TABLE_RANGES.put(new Pair<>(MetadataTable.ID, 
CompactionKind.USER), METADATA_TABLE_USER);
 -    SYSTEM_TABLE_RANGES.put(new Pair<>(MetadataTable.ID, 
CompactionKind.SYSTEM),
++    SYSTEM_TABLE_RANGES.put(new Pair<>(AccumuloTable.METADATA.tableId(), 
CompactionKind.USER),
++        METADATA_TABLE_USER);
++    SYSTEM_TABLE_RANGES.put(new Pair<>(AccumuloTable.METADATA.tableId(), 
CompactionKind.SYSTEM),
+         METADATA_TABLE_SYSTEM);
+ 
+     // metadata table
+     ACCUMULO_NAMESPACE_RANGES.put(new Pair<>(Namespace.ACCUMULO.id(), 
CompactionKind.USER),
+         SYSTEM_NS_USER);
+     ACCUMULO_NAMESPACE_RANGES.put(new Pair<>(Namespace.ACCUMULO.id(), 
CompactionKind.SYSTEM),
+         SYSTEM_NS_SYSTEM);
+   }
+ 
 +  @SuppressWarnings("deprecation")
-   public static short createPriority(CompactionKind kind, int totalFiles, int 
compactingFiles) {
- 
-     int prio = totalFiles + compactingFiles;
- 
-     switch (kind) {
-       case USER:
-         // user-initiated compactions will have a positive priority
-         // based on number of files
-         if (prio > Short.MAX_VALUE) {
-           return Short.MAX_VALUE;
-         }
-         return (short) prio;
-       case SELECTOR:
-       case SYSTEM:
-         // system-initiated compactions will have a negative priority
-         // starting at -32768 and increasing based on number of files
-         // maxing out at -1
-         if (prio > Short.MAX_VALUE) {
-           return -1;
-         } else {
-           return (short) (Short.MIN_VALUE + prio);
-         }
-       default:
-         throw new AssertionError("Unknown kind " + kind);
+   public static short createPriority(final NamespaceId nsId, final TableId 
tableId,
+       final CompactionKind kind, final int totalFiles, final int 
compactingFiles,
+       final int maxFilesPerTablet) {
+ 
+     Objects.requireNonNull(nsId, "nsId cannot be null");
+     Objects.requireNonNull(tableId, "tableId cannot be null");
+     Preconditions.checkArgument(totalFiles >= 0, "totalFiles is negative %s", 
totalFiles);
+     Preconditions.checkArgument(compactingFiles >= 0, "compactingFiles is 
negative %s",
+         compactingFiles);
+ 
+     final Function<Range<Short>,Short> normalPriorityFunction = new 
Function<>() {
+       @Override
+       public Short apply(Range<Short> f) {
+         return (short) Math.min(f.getMaximum(), f.getMinimum() + totalFiles + 
compactingFiles);
+       }
+     };
+ 
+     final Function<Range<Short>,Short> tabletOverSizeFunction = new 
Function<>() {
+       @Override
+       public Short apply(Range<Short> f) {
+         return (short) Math.min(f.getMaximum(),
+             f.getMinimum() + compactingFiles + (totalFiles - 
maxFilesPerTablet));
+       }
+     };
+ 
+     // Handle the case of a CHOP compaction. For the purposes of determining
+     // a priority, treat them as a USER compaction.
+     CompactionKind calculationKind = kind;
 -    if (kind == CompactionKind.CHOP) {
 -      calculationKind = CompactionKind.USER;
 -    } else if (kind == CompactionKind.SELECTOR) {
++    if (kind == CompactionKind.SELECTOR) {
+       calculationKind = CompactionKind.SYSTEM;
      }
+ 
+     Range<Short> range = null;
+     Function<Range<Short>,Short> func = normalPriorityFunction;
+     if (Namespace.ACCUMULO.id() == nsId) {
+       // Handle system tables
+       range = SYSTEM_TABLE_RANGES.get(new Pair<>(tableId, calculationKind));
+       if (range == null) {
+         range = ACCUMULO_NAMESPACE_RANGES.get(new Pair<>(nsId, 
calculationKind));
+       }
+     } else {
+       // Handle user tables
+       if (totalFiles > maxFilesPerTablet && calculationKind == 
CompactionKind.SYSTEM) {
+         range = TABLE_OVER_SIZE;
+         func = tabletOverSizeFunction;
+       } else if (calculationKind == CompactionKind.SYSTEM) {
+         range = USER_TABLE_SYSTEM;
+       } else {
+         range = USER_TABLE_USER;
+       }
+     }
+ 
+     if (range == null) {
+       throw new IllegalStateException(
+           "Error calculating compaction priority for table: " + tableId);
+     }
+     return func.apply(range);
+ 
    }
  
  }
diff --cc 
core/src/test/java/org/apache/accumulo/core/spi/compaction/DefaultCompactionPlannerTest.java
index e0c32dde6f,f3186701ad..55cf3e1f97
--- 
a/core/src/test/java/org/apache/accumulo/core/spi/compaction/DefaultCompactionPlannerTest.java
+++ 
b/core/src/test/java/org/apache/accumulo/core/spi/compaction/DefaultCompactionPlannerTest.java
@@@ -36,9 -35,15 +36,12 @@@ import java.util.Optional
  import java.util.Set;
  import java.util.stream.Collectors;
  
+ import org.apache.accumulo.core.client.TableNotFoundException;
  import org.apache.accumulo.core.client.admin.compaction.CompactableFile;
+ import org.apache.accumulo.core.clientImpl.Namespace;
 -import org.apache.accumulo.core.conf.ConfigurationCopy;
  import org.apache.accumulo.core.conf.ConfigurationTypeHelper;
 -import org.apache.accumulo.core.conf.DefaultConfiguration;
  import org.apache.accumulo.core.conf.Property;
 -import org.apache.accumulo.core.conf.SiteConfiguration;
+ import org.apache.accumulo.core.data.NamespaceId;
  import org.apache.accumulo.core.data.TableId;
  import org.apache.accumulo.core.spi.common.ServiceEnvironment;
  import org.apache.accumulo.core.spi.common.ServiceEnvironment.Configuration;
diff --cc 
core/src/test/java/org/apache/accumulo/core/util/compaction/CompactionPrioritizerTest.java
index 5eaad1df0b,1aa62c4f6b..3720890f15
--- 
a/core/src/test/java/org/apache/accumulo/core/util/compaction/CompactionPrioritizerTest.java
+++ 
b/core/src/test/java/org/apache/accumulo/core/util/compaction/CompactionPrioritizerTest.java
@@@ -28,8 -40,13 +40,12 @@@ import java.util.List
  import java.util.Optional;
  
  import org.apache.accumulo.core.client.admin.compaction.CompactableFile;
+ import org.apache.accumulo.core.clientImpl.Namespace;
+ import org.apache.accumulo.core.data.TableId;
 -import org.apache.accumulo.core.metadata.MetadataTable;
 -import org.apache.accumulo.core.metadata.RootTable;
++import org.apache.accumulo.core.metadata.AccumuloTable;
  import org.apache.accumulo.core.spi.compaction.CompactionJob;
  import org.apache.accumulo.core.spi.compaction.CompactionKind;
+ import org.apache.commons.lang3.Range;
  import org.junit.jupiter.api.Test;
  
  public class CompactionPrioritizerTest {
@@@ -48,23 -67,161 +66,152 @@@
    }
  
    @Test
-   public void testPrioritizer() throws Exception {
-     assertEquals((short) 0, 
CompactionJobPrioritizer.createPriority(CompactionKind.USER, 0, 0));
-     assertEquals((short) 10000,
-         CompactionJobPrioritizer.createPriority(CompactionKind.USER, 10000, 
0));
-     assertEquals((short) 32767,
-         CompactionJobPrioritizer.createPriority(CompactionKind.USER, 32767, 
0));
-     assertEquals((short) 32767,
-         CompactionJobPrioritizer.createPriority(CompactionKind.USER, 
Integer.MAX_VALUE, 0));
- 
-     assertEquals((short) -32768,
-         CompactionJobPrioritizer.createPriority(CompactionKind.SYSTEM, 0, 0));
-     assertEquals((short) -22768,
-         CompactionJobPrioritizer.createPriority(CompactionKind.SYSTEM, 10000, 
0));
-     assertEquals((short) -1,
-         CompactionJobPrioritizer.createPriority(CompactionKind.SYSTEM, 32767, 
0));
-     assertEquals((short) -1,
-         CompactionJobPrioritizer.createPriority(CompactionKind.SYSTEM, 
Integer.MAX_VALUE, 0));
+   public void testNonOverlappingRanges() {
+     List<Range<Short>> ranges = new ArrayList<>();
+     ranges.add(ROOT_TABLE_USER);
+     ranges.add(ROOT_TABLE_SYSTEM);
+     ranges.add(METADATA_TABLE_USER);
+     ranges.add(METADATA_TABLE_SYSTEM);
+     ranges.add(SYSTEM_NS_USER);
+     ranges.add(SYSTEM_NS_SYSTEM);
+     ranges.add(TABLE_OVER_SIZE);
+     ranges.add(USER_TABLE_USER);
+     ranges.add(USER_TABLE_SYSTEM);
+ 
+     for (Range<Short> r1 : ranges) {
+       for (Range<Short> r2 : ranges) {
+         if (r1 == r2) {
+           continue;
+         }
+         assertFalse(r1.isOverlappedBy(r2), r1.toString() + " is overlapped by 
" + r2.toString());
+       }
+     }
+ 
+     Collections.sort(ranges, new Comparator<Range<Short>>() {
+       @Override
+       public int compare(Range<Short> r1, Range<Short> r2) {
+         return Short.compare(r1.getMinimum(), r2.getMinimum());
+       }
+     });
+     assertEquals(Short.MIN_VALUE, ranges.get(0).getMinimum());
+     assertEquals(Short.MAX_VALUE, ranges.get(ranges.size() - 1).getMaximum());
+     // check that the max of the previous range is one less than the
+     // minimum of the current range to make sure there are no holes.
+     short lastMax = Short.MIN_VALUE;
+     for (Range<Short> r : ranges) {
+       if (lastMax != Short.MIN_VALUE) {
+         assertTrue(r.getMinimum() - lastMax == 1);
+       }
+       lastMax = r.getMaximum();
+     }
+   }
+ 
+   @Test
+   public void testRootTablePriorities() {
 -    assertEquals(ROOT_TABLE_USER.getMinimum() + 1, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), RootTable.ID, CompactionKind.USER, 0, 1, 
TABLET_FILE_MAX));
 -    assertEquals(ROOT_TABLE_USER.getMinimum() + 1010, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), RootTable.ID, CompactionKind.USER, 1000, 10, 
TABLET_FILE_MAX));
 -    assertEquals(ROOT_TABLE_USER.getMaximum(), 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), RootTable.ID, CompactionKind.USER, 3000, 
100, TABLET_FILE_MAX));
 -
 -    assertEquals(ROOT_TABLE_USER.getMinimum() + 2, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), RootTable.ID, CompactionKind.CHOP, 0, 2, 
TABLET_FILE_MAX));
 -    assertEquals(ROOT_TABLE_USER.getMinimum() + 1020, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), RootTable.ID, CompactionKind.CHOP, 1000, 20, 
TABLET_FILE_MAX));
 -    assertEquals(ROOT_TABLE_USER.getMaximum(), 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), RootTable.ID, CompactionKind.CHOP, 3000, 
200, TABLET_FILE_MAX));
 -
 -    assertEquals(ROOT_TABLE_SYSTEM.getMinimum() + 3, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), RootTable.ID, CompactionKind.SYSTEM, 0, 3, 
TABLET_FILE_MAX));
 -    assertEquals(ROOT_TABLE_SYSTEM.getMinimum() + 1030, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), RootTable.ID, CompactionKind.SYSTEM, 1000, 
30, TABLET_FILE_MAX));
 -    assertEquals(ROOT_TABLE_SYSTEM.getMaximum(), 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), RootTable.ID, CompactionKind.SYSTEM, 3000, 
300, TABLET_FILE_MAX));
++    assertEquals(ROOT_TABLE_USER.getMinimum() + 1,
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.ROOT.tableId(), CompactionKind.USER, 0, 1, 
TABLET_FILE_MAX));
++    assertEquals(ROOT_TABLE_USER.getMinimum() + 1010,
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.ROOT.tableId(), CompactionKind.USER, 1000, 10, 
TABLET_FILE_MAX));
++    assertEquals(ROOT_TABLE_USER.getMaximum(),
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.ROOT.tableId(), CompactionKind.USER, 3000, 100, 
TABLET_FILE_MAX));
++
++    assertEquals(ROOT_TABLE_SYSTEM.getMinimum() + 3,
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.ROOT.tableId(), CompactionKind.SYSTEM, 0, 3, 
TABLET_FILE_MAX));
++    assertEquals(ROOT_TABLE_SYSTEM.getMinimum() + 1030,
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.ROOT.tableId(), CompactionKind.SYSTEM, 1000, 30, 
TABLET_FILE_MAX));
++    assertEquals(ROOT_TABLE_SYSTEM.getMaximum(),
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.ROOT.tableId(), CompactionKind.SYSTEM, 3000, 300, 
TABLET_FILE_MAX));
+   }
+ 
+   @Test
+   public void testMetaTablePriorities() {
 -    assertEquals(METADATA_TABLE_USER.getMinimum() + 4, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), MetadataTable.ID, CompactionKind.USER, 0, 4, 
TABLET_FILE_MAX));
 -    assertEquals(METADATA_TABLE_USER.getMinimum() + 1040, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), MetadataTable.ID, CompactionKind.USER, 1000, 
40, TABLET_FILE_MAX));
++    assertEquals(METADATA_TABLE_USER.getMinimum() + 4,
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.METADATA.tableId(), CompactionKind.USER, 0, 4, 
TABLET_FILE_MAX));
++    assertEquals(METADATA_TABLE_USER.getMinimum() + 1040,
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.METADATA.tableId(), CompactionKind.USER, 1000, 40, 
TABLET_FILE_MAX));
+     assertEquals(METADATA_TABLE_USER.getMaximum(),
 -        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(), 
MetadataTable.ID,
 -            CompactionKind.USER, 3000, 400, TABLET_FILE_MAX));
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.METADATA.tableId(), CompactionKind.USER, 3000, 400, 
TABLET_FILE_MAX));
+ 
 -    assertEquals(METADATA_TABLE_USER.getMinimum() + 5, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), MetadataTable.ID, CompactionKind.CHOP, 0, 5, 
TABLET_FILE_MAX));
 -    assertEquals(METADATA_TABLE_USER.getMinimum() + 1050, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), MetadataTable.ID, CompactionKind.CHOP, 1000, 
50, TABLET_FILE_MAX));
 -    assertEquals(METADATA_TABLE_USER.getMaximum(),
 -        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(), 
MetadataTable.ID,
 -            CompactionKind.CHOP, 3000, 500, TABLET_FILE_MAX));
 -
 -    assertEquals(METADATA_TABLE_SYSTEM.getMinimum() + 6, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), MetadataTable.ID, CompactionKind.SYSTEM, 0, 
6, TABLET_FILE_MAX));
++    assertEquals(METADATA_TABLE_SYSTEM.getMinimum() + 6,
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.METADATA.tableId(), CompactionKind.SYSTEM, 0, 6, 
TABLET_FILE_MAX));
+     assertEquals(METADATA_TABLE_SYSTEM.getMinimum() + 1060,
 -        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(), 
MetadataTable.ID,
 -            CompactionKind.SYSTEM, 1000, 60, TABLET_FILE_MAX));
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.METADATA.tableId(), CompactionKind.SYSTEM, 1000, 
60, TABLET_FILE_MAX));
+     assertEquals(METADATA_TABLE_SYSTEM.getMaximum(),
 -        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(), 
MetadataTable.ID,
 -            CompactionKind.SYSTEM, 3000, 600, TABLET_FILE_MAX));
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.METADATA.tableId(), CompactionKind.SYSTEM, 3000, 
600, TABLET_FILE_MAX));
+   }
+ 
+   @Test
+   public void testSystemNamespacePriorities() {
+     TableId tid = TableId.of("someOtherSystemTable");
+     assertEquals(SYSTEM_NS_USER.getMinimum() + 7, CompactionJobPrioritizer
+         .createPriority(Namespace.ACCUMULO.id(), tid, CompactionKind.USER, 0, 
7, TABLET_FILE_MAX));
+     assertEquals(SYSTEM_NS_USER.getMinimum() + 1070, 
CompactionJobPrioritizer.createPriority(
+         Namespace.ACCUMULO.id(), tid, CompactionKind.USER, 1000, 70, 
TABLET_FILE_MAX));
+     assertEquals(SYSTEM_NS_USER.getMaximum(), 
CompactionJobPrioritizer.createPriority(
+         Namespace.ACCUMULO.id(), tid, CompactionKind.USER, 3000, 700, 
TABLET_FILE_MAX));
+ 
 -    assertEquals(SYSTEM_NS_USER.getMinimum() + 8, CompactionJobPrioritizer
 -        .createPriority(Namespace.ACCUMULO.id(), tid, CompactionKind.CHOP, 0, 
8, TABLET_FILE_MAX));
 -    assertEquals(SYSTEM_NS_USER.getMinimum() + 1080, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), tid, CompactionKind.CHOP, 1000, 80, 
TABLET_FILE_MAX));
 -    assertEquals(SYSTEM_NS_USER.getMaximum(), 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), tid, CompactionKind.CHOP, 3000, 800, 
TABLET_FILE_MAX));
 -
+     assertEquals(SYSTEM_NS_SYSTEM.getMinimum() + 9, 
CompactionJobPrioritizer.createPriority(
+         Namespace.ACCUMULO.id(), tid, CompactionKind.SYSTEM, 0, 9, 
TABLET_FILE_MAX));
+     assertEquals(SYSTEM_NS_SYSTEM.getMinimum() + 1090, 
CompactionJobPrioritizer.createPriority(
+         Namespace.ACCUMULO.id(), tid, CompactionKind.SYSTEM, 1000, 90, 
TABLET_FILE_MAX));
+     assertEquals(SYSTEM_NS_SYSTEM.getMaximum(), 
CompactionJobPrioritizer.createPriority(
+         Namespace.ACCUMULO.id(), tid, CompactionKind.SYSTEM, 3000, 900, 
TABLET_FILE_MAX));
+   }
+ 
+   @Test
+   public void testUserTablePriorities() {
+     TableId tid = TableId.of("someUserTable");
+     assertEquals(USER_TABLE_USER.getMinimum() + 10, CompactionJobPrioritizer
+         .createPriority(Namespace.DEFAULT.id(), tid, CompactionKind.USER, 0, 
10, TABLET_FILE_MAX));
+     assertEquals(USER_TABLE_USER.getMinimum() + 1100, 
CompactionJobPrioritizer.createPriority(
+         Namespace.DEFAULT.id(), tid, CompactionKind.USER, 1000, 100, 
TABLET_FILE_MAX));
+     assertEquals(USER_TABLE_USER.getMinimum() + 4000, 
CompactionJobPrioritizer.createPriority(
+         Namespace.DEFAULT.id(), tid, CompactionKind.USER, 3000, 1000, 
TABLET_FILE_MAX));
+ 
+     assertEquals(USER_TABLE_SYSTEM.getMinimum() + 11, 
CompactionJobPrioritizer.createPriority(
+         Namespace.DEFAULT.id(), tid, CompactionKind.SYSTEM, 0, 11, 
TABLET_FILE_MAX));
+     assertEquals(USER_TABLE_SYSTEM.getMinimum() + 1110, 
CompactionJobPrioritizer.createPriority(
+         Namespace.DEFAULT.id(), tid, CompactionKind.SYSTEM, 1000, 110, 
TABLET_FILE_MAX));
+     assertEquals(USER_TABLE_SYSTEM.getMinimum() + 4100, 
CompactionJobPrioritizer.createPriority(
+         Namespace.DEFAULT.id(), tid, CompactionKind.SYSTEM, 3000, 1100, 
TABLET_FILE_MAX));
+   }
+ 
+   @Test
+   public void testTableOverSize() {
+     final int tabletFileMax = 30;
+     final TableId tid = TableId.of("someTable");
 -    assertEquals(ROOT_TABLE_SYSTEM.getMinimum() + 150, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), RootTable.ID, CompactionKind.SYSTEM, 100, 
50, tabletFileMax));
 -    assertEquals(METADATA_TABLE_SYSTEM.getMinimum() + 150, 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), MetadataTable.ID, CompactionKind.SYSTEM, 
100, 50, tabletFileMax));
++    assertEquals(ROOT_TABLE_SYSTEM.getMinimum() + 150,
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.ROOT.tableId(), CompactionKind.SYSTEM, 100, 50, 
tabletFileMax));
++    assertEquals(METADATA_TABLE_SYSTEM.getMinimum() + 150,
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.METADATA.tableId(), CompactionKind.SYSTEM, 100, 50, 
tabletFileMax));
+     assertEquals(SYSTEM_NS_SYSTEM.getMinimum() + 150, 
CompactionJobPrioritizer.createPriority(
+         Namespace.ACCUMULO.id(), tid, CompactionKind.SYSTEM, 100, 50, 
tabletFileMax));
+     assertEquals(TABLE_OVER_SIZE.getMinimum() + 120, 
CompactionJobPrioritizer.createPriority(
+         Namespace.DEFAULT.id(), tid, CompactionKind.SYSTEM, 100, 50, 
tabletFileMax));
 -    assertEquals(ROOT_TABLE_SYSTEM.getMaximum(), 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), RootTable.ID, CompactionKind.SYSTEM, 3000, 
50, tabletFileMax));
 -    assertEquals(METADATA_TABLE_SYSTEM.getMaximum(), 
CompactionJobPrioritizer.createPriority(
 -        Namespace.ACCUMULO.id(), MetadataTable.ID, CompactionKind.SYSTEM, 
3000, 50, tabletFileMax));
++    assertEquals(ROOT_TABLE_SYSTEM.getMaximum(),
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.ROOT.tableId(), CompactionKind.SYSTEM, 3000, 50, 
tabletFileMax));
++    assertEquals(METADATA_TABLE_SYSTEM.getMaximum(),
++        CompactionJobPrioritizer.createPriority(Namespace.ACCUMULO.id(),
++            AccumuloTable.METADATA.tableId(), CompactionKind.SYSTEM, 3000, 
50, tabletFileMax));
+     assertEquals(SYSTEM_NS_SYSTEM.getMaximum(), 
CompactionJobPrioritizer.createPriority(
+         Namespace.ACCUMULO.id(), tid, CompactionKind.SYSTEM, 3000, 50, 
tabletFileMax));
+     assertEquals(TABLE_OVER_SIZE.getMaximum(), 
CompactionJobPrioritizer.createPriority(
+         Namespace.DEFAULT.id(), tid, CompactionKind.SYSTEM, 3000, 50, 
tabletFileMax));
    }
  
    @Test


Reply via email to