From 9d0e452237c09ae48d077333241817497eab3a37 Mon Sep 17 00:00:00 2001 From: "Christopher L. Shannon" Date: Sun, 24 Nov 2024 15:22:28 -0500 Subject: [PATCH] Prefer splitting over compacting If a tablet needs to both split and compact it is better to split first and compact after splitting so that the compaction work can be divided up better This close #5101 --- .../accumulo/manager/TabletGroupWatcher.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/TabletGroupWatcher.java b/server/manager/src/main/java/org/apache/accumulo/manager/TabletGroupWatcher.java index 72a46691838..6496f500e9f 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/TabletGroupWatcher.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/TabletGroupWatcher.java @@ -606,16 +606,24 @@ private TableMgmtStats manageTablets(Iterator iter, state, goal, actions, tm.getLogs().size()); } - if (actions.contains(ManagementAction.NEEDS_SPLITTING)) { + final boolean needsSplit = actions.contains(ManagementAction.NEEDS_SPLITTING); + if (needsSplit) { LOG.debug("{} may need splitting.", tm.getExtent()); manager.getSplitter().initiateSplit(new SeedSplitTask(manager, tm.getExtent())); } if (actions.contains(ManagementAction.NEEDS_COMPACTING) && compactionGenerator != null) { - var jobs = compactionGenerator.generateJobs(tm, - TabletManagementIterator.determineCompactionKinds(actions)); - LOG.debug("{} may need compacting adding {} jobs", tm.getExtent(), jobs.size()); - manager.getCompactionCoordinator().addJobs(tm, jobs); + // Check if tablet needs splitting, priority should be giving to splits over + // compactions because it's best to compact after a split + if (!needsSplit) { + var jobs = compactionGenerator.generateJobs(tm, + TabletManagementIterator.determineCompactionKinds(actions)); + LOG.debug("{} may need compacting adding {} jobs", tm.getExtent(), jobs.size()); + manager.getCompactionCoordinator().addJobs(tm, jobs); + } else { + LOG.trace("skipping compaction job generation because {} may need splitting.", + tm.getExtent()); + } } if (actions.contains(ManagementAction.NEEDS_LOCATION_UPDATE)