Skip to content

Commit 04ded6e

Browse files
authored
Log more information about why compaction can not be planned (#5532)
* Log more information about why compaction can not be planned For the case when a tablet has more than tablet.file.max files and a compaction can not be planned, log more information about what went into the planning process. * fix javadoc
1 parent a673324 commit 04ded6e

File tree

5 files changed

+71
-17
lines changed

5 files changed

+71
-17
lines changed

core/src/main/java/org/apache/accumulo/core/spi/compaction/CompactionPlanner.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.apache.accumulo.core.client.admin.compaction.CompactableFile;
2727
import org.apache.accumulo.core.data.NamespaceId;
2828
import org.apache.accumulo.core.data.TableId;
29+
import org.apache.accumulo.core.data.TabletId;
2930
import org.apache.accumulo.core.spi.common.ServiceEnvironment;
3031

3132
/**
@@ -94,6 +95,12 @@ public interface PlanningParameters {
9495
*/
9596
TableId getTableId();
9697

98+
/**
99+
* @return the tablet for which a compaction is being planned
100+
* @since 2.1.4
101+
*/
102+
TabletId getTabletId();
103+
97104
ServiceEnvironment getServiceEnvironment();
98105

99106
CompactionKind getKind();

core/src/main/java/org/apache/accumulo/core/spi/compaction/DefaultCompactionPlanner.java

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@
2828
import java.util.List;
2929
import java.util.Objects;
3030
import java.util.Set;
31+
import java.util.stream.Collectors;
3132

3233
import org.apache.accumulo.core.client.TableNotFoundException;
3334
import org.apache.accumulo.core.client.admin.compaction.CompactableFile;
3435
import org.apache.accumulo.core.conf.ConfigurationTypeHelper;
3536
import org.apache.accumulo.core.conf.Property;
3637
import org.apache.accumulo.core.spi.common.ServiceEnvironment;
38+
import org.apache.accumulo.core.util.NumUtil;
3739
import org.apache.accumulo.core.util.compaction.CompactionJobPrioritizer;
3840
import org.slf4j.Logger;
3941
import org.slf4j.LoggerFactory;
@@ -402,18 +404,34 @@ private Collection<CompactableFile> findFilesToCompactWithLowerRatio(PlanningPar
402404
}
403405

404406
if (found.isEmpty() && lowRatio == 1.0) {
405-
// in this case the data must be really skewed, operator intervention may be needed.
407+
var examinedFiles = sortAndLimitByMaxSize(candidates, maxSizeToCompact);
408+
var excludedBecauseMaxSize = candidates.size() - examinedFiles.size();
409+
var tabletId = params.getTabletId();
410+
406411
log.warn(
407-
"Attempted to lower compaction ration from {} to {} for {} because there are {} files "
408-
+ "and the max tablet files is {}, however no set of files to compact were found.",
409-
params.getRatio(), highRatio, params.getTableId(), params.getCandidates().size(),
410-
maxTabletFiles);
412+
"Unable to plan compaction for {} that has too many files. {}:{} num_files:{} "
413+
+ "excluded_large_files:{} max_compaction_size:{} ratio_search_range:{},{} ",
414+
tabletId, Property.TABLE_FILE_MAX.getKey(), maxTabletFiles, candidates.size(),
415+
excludedBecauseMaxSize, NumUtil.bigNumberForSize(maxSizeToCompact), highRatio,
416+
params.getRatio());
417+
if (log.isDebugEnabled()) {
418+
var sizesOfExamined = examinedFiles.stream()
419+
.map(compactableFile -> NumUtil.bigNumberForSize(compactableFile.getEstimatedSize()))
420+
.collect(Collectors.toList());
421+
HashSet<CompactableFile> excludedFiles = new HashSet<>(candidates);
422+
examinedFiles.forEach(excludedFiles::remove);
423+
var sizesOfExcluded = excludedFiles.stream()
424+
.map(compactableFile -> NumUtil.bigNumberForSize(compactableFile.getEstimatedSize()))
425+
.collect(Collectors.toList());
426+
log.debug("Failed planning details for {} examined_file_sizes:{} excluded_file_sizes:{}",
427+
tabletId, sizesOfExamined, sizesOfExcluded);
428+
}
411429
}
412430

413431
log.info(
414432
"For {} found {} files to compact lowering compaction ratio from {} to {} because the tablet "
415433
+ "exceeded {} files, it had {}",
416-
params.getTableId(), found.size(), params.getRatio(), lowRatio, maxTabletFiles,
434+
params.getTabletId(), found.size(), params.getRatio(), lowRatio, maxTabletFiles,
417435
params.getCandidates().size());
418436

419437
return found;
@@ -482,15 +500,18 @@ private Set<CompactableFile> getExpected(Collection<CompactionJob> compacting) {
482500
return sortedFiles.subList(0, numToCompact);
483501
}
484502

485-
static Collection<CompactableFile> findDataFilesToCompact(Set<CompactableFile> files,
486-
double ratio, int maxFilesToCompact, long maxSizeToCompact) {
487-
if (files.size() <= 1) {
488-
return Collections.emptySet();
489-
}
490-
503+
/**
504+
* @return a list of the smallest files where the sum of the sizes is less than maxSizeToCompact
505+
*/
506+
static List<CompactableFile> sortAndLimitByMaxSize(Set<CompactableFile> files,
507+
long maxSizeToCompact) {
491508
// sort files from smallest to largest. So position 0 has the smallest file.
492509
List<CompactableFile> sortedFiles = sortByFileSize(files);
493510

511+
if (maxSizeToCompact == Long.MAX_VALUE) {
512+
return sortedFiles;
513+
}
514+
494515
int maxSizeIndex = sortedFiles.size();
495516
long sum = 0;
496517
for (int i = 0; i < sortedFiles.size(); i++) {
@@ -502,10 +523,22 @@ static Collection<CompactableFile> findDataFilesToCompact(Set<CompactableFile> f
502523
}
503524

504525
if (maxSizeIndex < sortedFiles.size()) {
505-
sortedFiles = sortedFiles.subList(0, maxSizeIndex);
506-
if (sortedFiles.size() <= 1) {
507-
return Collections.emptySet();
508-
}
526+
return sortedFiles.subList(0, maxSizeIndex);
527+
} else {
528+
return sortedFiles;
529+
}
530+
}
531+
532+
static Collection<CompactableFile> findDataFilesToCompact(Set<CompactableFile> files,
533+
double ratio, int maxFilesToCompact, long maxSizeToCompact) {
534+
535+
if (files.size() <= 1) {
536+
return Collections.emptySet();
537+
}
538+
539+
List<CompactableFile> sortedFiles = sortAndLimitByMaxSize(files, maxSizeToCompact);
540+
if (sortedFiles.size() <= 1) {
541+
return Collections.emptySet();
509542
}
510543

511544
int windowStart = 0;

core/src/test/java/org/apache/accumulo/core/spi/compaction/DefaultCompactionPlannerTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@
4545
import org.apache.accumulo.core.conf.SiteConfiguration;
4646
import org.apache.accumulo.core.data.NamespaceId;
4747
import org.apache.accumulo.core.data.TableId;
48+
import org.apache.accumulo.core.data.TabletId;
49+
import org.apache.accumulo.core.dataImpl.KeyExtent;
50+
import org.apache.accumulo.core.dataImpl.TabletIdImpl;
4851
import org.apache.accumulo.core.spi.common.ServiceEnvironment;
4952
import org.apache.accumulo.core.spi.common.ServiceEnvironment.Configuration;
5053
import org.apache.accumulo.core.spi.compaction.CompactionPlan.Builder;
@@ -754,6 +757,11 @@ public TableId getTableId() {
754757
return TableId.of("42");
755758
}
756759

760+
@Override
761+
public TabletId getTabletId() {
762+
return new TabletIdImpl(new KeyExtent(getTableId(), null, null));
763+
}
764+
757765
@Override
758766
public ServiceEnvironment getServiceEnvironment() {
759767
ServiceEnvironment senv = EasyMock.createMock(ServiceEnvironment.class);

core/src/test/java/org/apache/accumulo/core/util/NumUtilTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import org.junit.jupiter.api.Test;
2828

2929
public class NumUtilTest {
30-
3130
@Test
3231
public void testBigNumberForSize() {
3332
Locale.setDefault(Locale.US);

server/tserver/src/main/java/org/apache/accumulo/tserver/compactions/CompactionService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@
4747
import org.apache.accumulo.core.conf.Property;
4848
import org.apache.accumulo.core.data.NamespaceId;
4949
import org.apache.accumulo.core.data.TableId;
50+
import org.apache.accumulo.core.data.TabletId;
5051
import org.apache.accumulo.core.dataImpl.KeyExtent;
52+
import org.apache.accumulo.core.dataImpl.TabletIdImpl;
5153
import org.apache.accumulo.core.spi.common.ServiceEnvironment;
5254
import org.apache.accumulo.core.spi.compaction.CompactionExecutorId;
5355
import org.apache.accumulo.core.spi.compaction.CompactionJob;
@@ -247,6 +249,11 @@ public TableId getTableId() {
247249
return comp.getTableId();
248250
}
249251

252+
@Override
253+
public TabletId getTabletId() {
254+
return new TabletIdImpl(comp.getExtent());
255+
}
256+
250257
@Override
251258
public ServiceEnvironment getServiceEnvironment() {
252259
return senv;

0 commit comments

Comments
 (0)