This is an automated email from the ASF dual-hosted git repository. kturner pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/main by this push: new 26f316d188 Removes deprecated minor compaction idle time (#4888) 26f316d188 is described below commit 26f316d188873383a7322a64d64bf1d0c94dc0d5 Author: Keith Turner <ktur...@apache.org> AuthorDate: Tue Sep 17 12:12:18 2024 -0400 Removes deprecated minor compaction idle time (#4888) --- .../org/apache/accumulo/core/conf/Property.java | 8 -- .../tserver/TabletServerResourceManager.java | 17 +-- .../tserver/memory/LargestFirstMemoryManager.java | 52 ++------- .../tserver/memory/TabletMemoryReport.java | 10 +- .../memory/LargestFirstMemoryManagerTest.java | 129 +++++++++------------ .../accumulo/test/ScanServerMaxLatencyIT.java | 23 +--- .../test/functional/ManyWriteAheadLogsIT.java | 5 +- 7 files changed, 77 insertions(+), 167 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/conf/Property.java b/core/src/main/java/org/apache/accumulo/core/conf/Property.java index 670ff7d292..1947ea376e 100644 --- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java +++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java @@ -865,14 +865,6 @@ public enum Property { + "server to see a write to a tablet server. The default value of this property is set to such a " + "high value that is should never cause a minor compaction.", "3.1.0"), - @Deprecated(since = "3.1.0") - @ReplacedBy(property = TABLE_MINC_COMPACT_MAXAGE) - TABLE_MINC_COMPACT_IDLETIME("table.compaction.minor.idle", "5m", PropertyType.TIMEDURATION, - "When the age of the youngest key value in a tablets in memory map exceeds this configuration, then" - + " a minor compaction may be initiated. There is no guarantee an idle tablet will be compacted." - + "This property was deprecated because the new property table.compaction.minor.age can offer the " - + " same functionality although it may cause more minor compactions than this property would have.", - "1.3.5"), TABLE_COMPACTION_DISPATCHER("table.compaction.dispatcher", SimpleCompactionDispatcher.class.getName(), PropertyType.CLASSNAME, "A configurable dispatcher that decides what compaction service a table should use.", diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServerResourceManager.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServerResourceManager.java index fe8f33da5e..37037d2f6c 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServerResourceManager.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServerResourceManager.java @@ -577,10 +577,9 @@ public class TabletServerResourceManager { } } - public void updateMemoryUsageStats(Tablet tablet, long size, long lastCommitTime, long mincSize, + public void updateMemoryUsageStats(Tablet tablet, long size, long mincSize, Timer firstWriteTimer) { - memUsageReports - .add(new TabletMemoryReport(tablet, lastCommitTime, size, mincSize, firstWriteTimer)); + memUsageReports.add(new TabletMemoryReport(tablet, size, mincSize, firstWriteTimer)); } public void tabletClosed(KeyExtent extent) { @@ -686,7 +685,6 @@ public class TabletServerResourceManager { private final AtomicLong lastReportedSize = new AtomicLong(); private final AtomicLong lastReportedMincSize = new AtomicLong(); private final AtomicReference<Timer> firstReportedCommitTimer = new AtomicReference<>(null); - private volatile long lastReportedCommitTime = 0; public void updateMemoryUsageStats(Tablet tablet, long size, long mincSize) { @@ -721,19 +719,12 @@ public class TabletServerResourceManager { report = true; } - long currentTime = System.currentTimeMillis(); - - if ((delta > 32000 || delta < 0 || (currentTime - lastReportedCommitTime > 1000)) - && lastReportedSize.compareAndSet(lrs, totalSize)) { - if (delta > 0) { - lastReportedCommitTime = currentTime; - } + if ((delta > 32000 || delta < 0) && lastReportedSize.compareAndSet(lrs, totalSize)) { report = true; } if (report) { - memMgmt.updateMemoryUsageStats(tablet, size, lastReportedCommitTime, mincSize, - firstReportedCommitTimer.get()); + memMgmt.updateMemoryUsageStats(tablet, size, mincSize, firstReportedCommitTimer.get()); } } diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/memory/LargestFirstMemoryManager.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/memory/LargestFirstMemoryManager.java index 42623f7027..8a6d1b939c 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/memory/LargestFirstMemoryManager.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/memory/LargestFirstMemoryManager.java @@ -45,7 +45,6 @@ import org.slf4j.LoggerFactory; public class LargestFirstMemoryManager { private static final Logger log = LoggerFactory.getLogger(LargestFirstMemoryManager.class); - static final long ZERO_TIME = System.currentTimeMillis(); private static final int TSERV_MINC_MAXCONCURRENT_NUMWAITING_MULTIPLIER = 2; private static final double MAX_FLUSH_AT_ONCE_PERCENT = 0.20; @@ -63,14 +62,10 @@ public class LargestFirstMemoryManager { private static class TabletInfo { final KeyExtent extent; final long memTableSize; - final long idleTime; - final long load; - public TabletInfo(KeyExtent extent, long memTableSize, long idleTime, long load) { + public TabletInfo(KeyExtent extent, long memTableSize) { this.extent = extent; this.memTableSize = memTableSize; - this.idleTime = idleTime; - this.load = load; } } @@ -138,13 +133,6 @@ public class LargestFirstMemoryManager { maxObserved = 0; } - @SuppressWarnings("deprecation") - protected long getMinCIdleThreshold(KeyExtent extent) { - TableId tableId = extent.tableId(); - return mincIdleThresholds.computeIfAbsent(tableId, tid -> context.getTableConfiguration(tid) - .getTimeInMillis(Property.TABLE_MINC_COMPACT_IDLETIME)); - } - protected long getMaxAge(KeyExtent extent) { TableId tableId = extent.tableId(); return mincAgeThresholds.computeIfAbsent(tableId, tid -> context.getTableConfiguration(tid) @@ -174,8 +162,7 @@ public class LargestFirstMemoryManager { final List<KeyExtent> tabletsToMinorCompact = new ArrayList<>(); LargestMap largestMemTablets = new LargestMap(maxMinCs); - final LargestMap largestIdleMemTablets = new LargestMap(maxConcurrentMincs); - final long now = currentTimeMillis(); + final LargestMap oldMemTablets = new LargestMap(maxConcurrentMincs); long ingestMemory = 0; long compactionMemory = 0; @@ -191,17 +178,15 @@ public class LargestFirstMemoryManager { } final long memTabletSize = ts.getMemTableSize(); + final long minorCompactingSize = ts.getMinorCompactingMemTableSize(); - final long idleTime = now - Math.max(ts.getLastCommitTime(), ZERO_TIME); - final long timeMemoryLoad = timeMemoryLoad(memTabletSize, idleTime); ingestMemory += memTabletSize; if (minorCompactingSize == 0 && memTabletSize > 0) { - TabletInfo tabletInfo = new TabletInfo(tablet, memTabletSize, idleTime, timeMemoryLoad); + TabletInfo tabletInfo = new TabletInfo(tablet, memTabletSize); try { // If the table was deleted, getMinCIdleThreshold will throw an exception - if (idleTime > getMinCIdleThreshold(tablet) - || ts.getElapsedSinceFirstWrite(TimeUnit.MILLISECONDS) > getMaxAge(tablet)) { - largestIdleMemTablets.put(timeMemoryLoad, tabletInfo); + if (ts.getElapsedSinceFirstWrite(TimeUnit.MILLISECONDS) > getMaxAge(tablet)) { + oldMemTablets.put(memTabletSize, tabletInfo); } } catch (IllegalArgumentException e) { Throwable cause = e.getCause(); @@ -216,7 +201,7 @@ public class LargestFirstMemoryManager { throw e; } // Only place the tablet into largestMemTablets map when the table still exists - largestMemTablets.put(timeMemoryLoad, tabletInfo); + largestMemTablets.put(memTabletSize, tabletInfo); } compactionMemory += minorCompactingSize; @@ -241,10 +226,9 @@ public class LargestFirstMemoryManager { // compaction if (memoryChange >= 0 && ingestMemory + memoryChange > compactionThreshold * maxMemory) { startMinC = true; - } else if (!largestIdleMemTablets.isEmpty()) { + } else if (!oldMemTablets.isEmpty()) { startMinC = true; - // switch largestMemTablets to largestIdleMemTablets - largestMemTablets = largestIdleMemTablets; + largestMemTablets = oldMemTablets; log.debug("IDLE minor compaction chosen"); } } @@ -257,10 +241,9 @@ public class LargestFirstMemoryManager { for (TabletInfo largest : lastEntry.getValue()) { toBeCompacted += largest.memTableSize; tabletsToMinorCompact.add(largest.extent); - log.debug(String.format("COMPACTING %s total = %,d ingestMemory = %,d", - largest.extent.toString(), (ingestMemory + compactionMemory), ingestMemory)); - log.debug(String.format("chosenMem = %,d chosenIT = %.2f load %,d", largest.memTableSize, - largest.idleTime / 1000.0, largest.load)); + log.debug(String.format("COMPACTING %s total = %,d ingestMemory = %,d chosenMem = %,d", + largest.extent.toString(), (ingestMemory + compactionMemory), ingestMemory, + largest.memTableSize)); if (toBeCompacted > ingestMemory * MAX_FLUSH_AT_ONCE_PERCENT) { break outer; } @@ -297,15 +280,4 @@ public class LargestFirstMemoryManager { return tabletsToMinorCompact; } - - protected long currentTimeMillis() { - return System.currentTimeMillis(); - } - - // The load function: memory times the idle time, doubling every 15 mins - static long timeMemoryLoad(long mem, long time) { - double minutesIdle = time / 60000.0; - - return (long) (mem * Math.pow(2, minutesIdle / 15.0)); - } } diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/memory/TabletMemoryReport.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/memory/TabletMemoryReport.java index 00339d9711..1f1f7cc9fe 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/memory/TabletMemoryReport.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/memory/TabletMemoryReport.java @@ -27,15 +27,13 @@ import org.apache.accumulo.tserver.tablet.Tablet; public class TabletMemoryReport implements Cloneable { private final Tablet tablet; - private final long lastCommitTime; private final long memTableSize; private final long minorCompactingMemTableSize; private final Timer firstWriteTimer; - public TabletMemoryReport(Tablet tablet, long lastCommitTime, long memTableSize, - long minorCompactingMemTableSize, Timer firstWriteTimer) { + public TabletMemoryReport(Tablet tablet, long memTableSize, long minorCompactingMemTableSize, + Timer firstWriteTimer) { this.tablet = tablet; - this.lastCommitTime = lastCommitTime; this.memTableSize = memTableSize; this.minorCompactingMemTableSize = minorCompactingMemTableSize; this.firstWriteTimer = firstWriteTimer; @@ -49,10 +47,6 @@ public class TabletMemoryReport implements Cloneable { return tablet; } - public long getLastCommitTime() { - return lastCommitTime; - } - public long getElapsedSinceFirstWrite(TimeUnit unit) { return firstWriteTimer == null ? 0 : firstWriteTimer.elapsed(unit); } diff --git a/server/tserver/src/test/java/org/apache/accumulo/tserver/memory/LargestFirstMemoryManagerTest.java b/server/tserver/src/test/java/org/apache/accumulo/tserver/memory/LargestFirstMemoryManagerTest.java index 35b2459e95..b24ff2ab0b 100644 --- a/server/tserver/src/test/java/org/apache/accumulo/tserver/memory/LargestFirstMemoryManagerTest.java +++ b/server/tserver/src/test/java/org/apache/accumulo/tserver/memory/LargestFirstMemoryManagerTest.java @@ -43,8 +43,6 @@ import org.junit.jupiter.api.Timeout; @Timeout(60) public class LargestFirstMemoryManagerTest { - private static final long ZERO = LargestFirstMemoryManager.ZERO_TIME; - private static final long LATER = ZERO + MINUTES.toMillis(20); private static final long ONE_GIG = 1024 * 1024 * 1024; private static final long ONE_MEG = 1024 * 1024; private static final long HALF_GIG = ONE_GIG / 2; @@ -69,108 +67,99 @@ public class LargestFirstMemoryManagerTest { List<KeyExtent> tabletsToMinorCompact; // nothing to do tabletsToMinorCompact = - mgr.tabletsToMinorCompact(tablets(t(k("x"), ZERO, 1000, 0), t(k("y"), ZERO, 2000, 0))); + mgr.tabletsToMinorCompact(tablets(t(k("x"), 1000, 0), t(k("y"), 2000, 0))); assertEquals(0, tabletsToMinorCompact.size()); // one tablet is really big tabletsToMinorCompact = - mgr.tabletsToMinorCompact(tablets(t(k("x"), ZERO, ONE_GIG, 0), t(k("y"), ZERO, 2000, 0))); + mgr.tabletsToMinorCompact(tablets(t(k("x"), ONE_GIG, 0), t(k("y"), 2000, 0))); assertEquals(1, tabletsToMinorCompact.size()); assertEquals(k("x"), tabletsToMinorCompact.get(0)); - // one tablet is idle - mgr.currentTime = LATER; tabletsToMinorCompact = - mgr.tabletsToMinorCompact(tablets(t(k("x"), ZERO, 1001, 0), t(k("y"), LATER, 2000, 0))); - assertEquals(1, tabletsToMinorCompact.size()); - assertEquals(k("x"), tabletsToMinorCompact.get(0)); - // one tablet is idle, but one is really big + mgr.tabletsToMinorCompact(tablets(t(k("x"), 1000, 0), t(k("y"), 2000, 0))); + assertEquals(0, tabletsToMinorCompact.size()); tabletsToMinorCompact = - mgr.tabletsToMinorCompact(tablets(t(k("x"), ZERO, 1001, 0), t(k("y"), LATER, ONE_GIG, 0))); + mgr.tabletsToMinorCompact(tablets(t(k("x"), 1001, 0), t(k("y"), ONE_GIG, 0))); assertEquals(1, tabletsToMinorCompact.size()); assertEquals(k("y"), tabletsToMinorCompact.get(0)); // lots of work to do mgr = new LargestFirstMemoryManagerUnderTest(); mgr.init(context); - tabletsToMinorCompact = mgr.tabletsToMinorCompact(tablets(t(k("a"), ZERO, HALF_GIG, 0), - t(k("b"), ZERO, HALF_GIG + ONE_MEG, 0), t(k("c"), ZERO, HALF_GIG + (2 * ONE_MEG), 0), - t(k("d"), ZERO, HALF_GIG + (3 * ONE_MEG), 0), t(k("e"), ZERO, HALF_GIG + (4 * ONE_MEG), 0), - t(k("f"), ZERO, HALF_GIG + (5 * ONE_MEG), 0), t(k("g"), ZERO, HALF_GIG + (6 * ONE_MEG), 0), - t(k("h"), ZERO, HALF_GIG + (7 * ONE_MEG), 0), - t(k("i"), ZERO, HALF_GIG + (8 * ONE_MEG), 0))); + tabletsToMinorCompact = mgr.tabletsToMinorCompact(tablets(t(k("a"), HALF_GIG, 0), + t(k("b"), HALF_GIG + ONE_MEG, 0), t(k("c"), HALF_GIG + (2 * ONE_MEG), 0), + t(k("d"), HALF_GIG + (3 * ONE_MEG), 0), t(k("e"), HALF_GIG + (4 * ONE_MEG), 0), + t(k("f"), HALF_GIG + (5 * ONE_MEG), 0), t(k("g"), HALF_GIG + (6 * ONE_MEG), 0), + t(k("h"), HALF_GIG + (7 * ONE_MEG), 0), t(k("i"), HALF_GIG + (8 * ONE_MEG), 0))); assertEquals(2, tabletsToMinorCompact.size()); assertEquals(k("i"), tabletsToMinorCompact.get(0)); assertEquals(k("h"), tabletsToMinorCompact.get(1)); // one finished, one in progress, one filled up mgr = new LargestFirstMemoryManagerUnderTest(); mgr.init(context); - tabletsToMinorCompact = mgr.tabletsToMinorCompact(tablets(t(k("a"), ZERO, HALF_GIG, 0), - t(k("b"), ZERO, HALF_GIG + ONE_MEG, 0), t(k("c"), ZERO, HALF_GIG + (2 * ONE_MEG), 0), - t(k("d"), ZERO, HALF_GIG + (3 * ONE_MEG), 0), t(k("e"), ZERO, HALF_GIG + (4 * ONE_MEG), 0), - t(k("f"), ZERO, HALF_GIG + (5 * ONE_MEG), 0), t(k("g"), ZERO, ONE_GIG, 0), - t(k("h"), ZERO, 0, HALF_GIG + (7 * ONE_MEG)), t(k("i"), ZERO, 0, 0))); + tabletsToMinorCompact = + mgr.tabletsToMinorCompact(tablets(t(k("a"), HALF_GIG, 0), t(k("b"), HALF_GIG + ONE_MEG, 0), + t(k("c"), HALF_GIG + (2 * ONE_MEG), 0), t(k("d"), HALF_GIG + (3 * ONE_MEG), 0), + t(k("e"), HALF_GIG + (4 * ONE_MEG), 0), t(k("f"), HALF_GIG + (5 * ONE_MEG), 0), + t(k("g"), ONE_GIG, 0), t(k("h"), 0, HALF_GIG + (7 * ONE_MEG)), t(k("i"), 0, 0))); assertEquals(1, tabletsToMinorCompact.size()); assertEquals(k("g"), tabletsToMinorCompact.get(0)); // memory is very full, lots of candidates - tabletsToMinorCompact = mgr.tabletsToMinorCompact(tablets(t(k("a"), ZERO, HALF_GIG, 0), - t(k("b"), ZERO, ONE_GIG + ONE_MEG, 0), t(k("c"), ZERO, ONE_GIG + (2 * ONE_MEG), 0), - t(k("d"), ZERO, ONE_GIG + (3 * ONE_MEG), 0), t(k("e"), ZERO, ONE_GIG + (4 * ONE_MEG), 0), - t(k("f"), ZERO, ONE_GIG + (5 * ONE_MEG), 0), t(k("g"), ZERO, ONE_GIG + (6 * ONE_MEG), 0), - t(k("h"), ZERO, 0, 0), t(k("i"), ZERO, 0, 0))); + tabletsToMinorCompact = + mgr.tabletsToMinorCompact(tablets(t(k("a"), HALF_GIG, 0), t(k("b"), ONE_GIG + ONE_MEG, 0), + t(k("c"), ONE_GIG + (2 * ONE_MEG), 0), t(k("d"), ONE_GIG + (3 * ONE_MEG), 0), + t(k("e"), ONE_GIG + (4 * ONE_MEG), 0), t(k("f"), ONE_GIG + (5 * ONE_MEG), 0), + t(k("g"), ONE_GIG + (6 * ONE_MEG), 0), t(k("h"), 0, 0), t(k("i"), 0, 0))); assertEquals(2, tabletsToMinorCompact.size()); assertEquals(k("g"), tabletsToMinorCompact.get(0)); assertEquals(k("f"), tabletsToMinorCompact.get(1)); // only have two compactors, still busy - tabletsToMinorCompact = mgr.tabletsToMinorCompact(tablets(t(k("a"), ZERO, HALF_GIG, 0), - t(k("b"), ZERO, ONE_GIG + ONE_MEG, 0), t(k("c"), ZERO, ONE_GIG + (2 * ONE_MEG), 0), - t(k("d"), ZERO, ONE_GIG + (3 * ONE_MEG), 0), t(k("e"), ZERO, ONE_GIG + (4 * ONE_MEG), 0), - t(k("f"), ZERO, ONE_GIG, ONE_GIG + (5 * ONE_MEG)), - t(k("g"), ZERO, ONE_GIG, ONE_GIG + (6 * ONE_MEG)), t(k("h"), ZERO, 0, 0), - t(k("i"), ZERO, 0, 0))); + tabletsToMinorCompact = + mgr.tabletsToMinorCompact(tablets(t(k("a"), HALF_GIG, 0), t(k("b"), ONE_GIG + ONE_MEG, 0), + t(k("c"), ONE_GIG + (2 * ONE_MEG), 0), t(k("d"), ONE_GIG + (3 * ONE_MEG), 0), + t(k("e"), ONE_GIG + (4 * ONE_MEG), 0), t(k("f"), ONE_GIG, ONE_GIG + (5 * ONE_MEG)), + t(k("g"), ONE_GIG, ONE_GIG + (6 * ONE_MEG)), t(k("h"), 0, 0), t(k("i"), 0, 0))); assertEquals(0, tabletsToMinorCompact.size()); // finished one - tabletsToMinorCompact = mgr.tabletsToMinorCompact(tablets(t(k("a"), ZERO, HALF_GIG, 0), - t(k("b"), ZERO, ONE_GIG + ONE_MEG, 0), t(k("c"), ZERO, ONE_GIG + (2 * ONE_MEG), 0), - t(k("d"), ZERO, ONE_GIG + (3 * ONE_MEG), 0), t(k("e"), ZERO, ONE_GIG + (4 * ONE_MEG), 0), - t(k("f"), ZERO, ONE_GIG, ONE_GIG + (5 * ONE_MEG)), t(k("g"), ZERO, ONE_GIG, 0), - t(k("h"), ZERO, 0, 0), t(k("i"), ZERO, 0, 0))); + tabletsToMinorCompact = + mgr.tabletsToMinorCompact(tablets(t(k("a"), HALF_GIG, 0), t(k("b"), ONE_GIG + ONE_MEG, 0), + t(k("c"), ONE_GIG + (2 * ONE_MEG), 0), t(k("d"), ONE_GIG + (3 * ONE_MEG), 0), + t(k("e"), ONE_GIG + (4 * ONE_MEG), 0), t(k("f"), ONE_GIG, ONE_GIG + (5 * ONE_MEG)), + t(k("g"), ONE_GIG, 0), t(k("h"), 0, 0), t(k("i"), 0, 0))); assertEquals(1, tabletsToMinorCompact.size()); assertEquals(k("e"), tabletsToMinorCompact.get(0)); // many are running: do nothing mgr = new LargestFirstMemoryManagerUnderTest(); mgr.init(context); - tabletsToMinorCompact = mgr.tabletsToMinorCompact(tablets(t(k("a"), ZERO, HALF_GIG, 0), - t(k("b"), ZERO, HALF_GIG + ONE_MEG, 0), t(k("c"), ZERO, HALF_GIG + (2 * ONE_MEG), 0), - t(k("d"), ZERO, 0, HALF_GIG), t(k("e"), ZERO, 0, HALF_GIG), t(k("f"), ZERO, 0, HALF_GIG), - t(k("g"), ZERO, 0, HALF_GIG), t(k("i"), ZERO, 0, HALF_GIG), t(k("j"), ZERO, 0, HALF_GIG), - t(k("k"), ZERO, 0, HALF_GIG), t(k("l"), ZERO, 0, HALF_GIG), t(k("m"), ZERO, 0, HALF_GIG))); + tabletsToMinorCompact = mgr.tabletsToMinorCompact(tablets(t(k("a"), HALF_GIG, 0), + t(k("b"), HALF_GIG + ONE_MEG, 0), t(k("c"), HALF_GIG + (2 * ONE_MEG), 0), + t(k("d"), 0, HALF_GIG), t(k("e"), 0, HALF_GIG), t(k("f"), 0, HALF_GIG), + t(k("g"), 0, HALF_GIG), t(k("i"), 0, HALF_GIG), t(k("j"), 0, HALF_GIG), + t(k("k"), 0, HALF_GIG), t(k("l"), 0, HALF_GIG), t(k("m"), 0, HALF_GIG))); assertEquals(0, tabletsToMinorCompact.size()); // observe adjustment: mgr = new LargestFirstMemoryManagerUnderTest(); mgr.init(context); // compact the largest - tabletsToMinorCompact = mgr.tabletsToMinorCompact(tablets(t(k("a"), ZERO, QGIG, 0), - t(k("b"), ZERO, QGIG + 1, 0), t(k("c"), ZERO, QGIG + 2, 0))); + tabletsToMinorCompact = mgr.tabletsToMinorCompact( + tablets(t(k("a"), QGIG, 0), t(k("b"), QGIG + 1, 0), t(k("c"), QGIG + 2, 0))); assertEquals(1, tabletsToMinorCompact.size()); assertEquals(k("c"), tabletsToMinorCompact.get(0)); // show that it is compacting... do nothing - tabletsToMinorCompact = mgr.tabletsToMinorCompact(tablets(t(k("a"), ZERO, QGIG, 0), - t(k("b"), ZERO, QGIG + 1, 0), t(k("c"), ZERO, 0, QGIG + 2))); + tabletsToMinorCompact = mgr.tabletsToMinorCompact( + tablets(t(k("a"), QGIG, 0), t(k("b"), QGIG + 1, 0), t(k("c"), 0, QGIG + 2))); assertEquals(0, tabletsToMinorCompact.size()); // not going to bother compacting any more - mgr.currentTime += MINUTES.toMillis(1); - tabletsToMinorCompact = mgr.tabletsToMinorCompact(tablets(t(k("a"), ZERO, QGIG, 0), - t(k("b"), ZERO, QGIG + 1, 0), t(k("c"), ZERO, 0, QGIG + 2))); + tabletsToMinorCompact = mgr.tabletsToMinorCompact( + tablets(t(k("a"), QGIG, 0), t(k("b"), QGIG + 1, 0), t(k("c"), 0, QGIG + 2))); assertEquals(0, tabletsToMinorCompact.size()); // now do nothing - mgr.currentTime += MINUTES.toMillis(1); - tabletsToMinorCompact = mgr.tabletsToMinorCompact( - tablets(t(k("a"), ZERO, QGIG, 0), t(k("b"), ZERO, 0, 0), t(k("c"), ZERO, 0, 0))); + tabletsToMinorCompact = + mgr.tabletsToMinorCompact(tablets(t(k("a"), QGIG, 0), t(k("b"), 0, 0), t(k("c"), 0, 0))); assertEquals(0, tabletsToMinorCompact.size()); // on no! more data, this time we compact because we've adjusted - mgr.currentTime += MINUTES.toMillis(1); tabletsToMinorCompact = mgr.tabletsToMinorCompact( - tablets(t(k("a"), ZERO, QGIG, 0), t(k("b"), ZERO, QGIG + 1, 0), t(k("c"), ZERO, 0, 0))); + tablets(t(k("a"), QGIG, 0), t(k("b"), QGIG + 1, 0), t(k("c"), 0, 0))); assertEquals(1, tabletsToMinorCompact.size()); assertEquals(k("b"), tabletsToMinorCompact.get(0)); } @@ -190,8 +179,8 @@ public class LargestFirstMemoryManagerTest { // one tablet is really big and the other is for a nonexistent table KeyExtent extent = new KeyExtent(TableId.of("3"), new Text("j"), null); KeyExtent extent2 = new KeyExtent(TableId.of("2"), new Text("j"), null); - tabletsToMinorCompact = mgr.tabletsToMinorCompact(tablets(t(extent, ZERO, ONE_GIG, 0), - t(extent2, ZERO, ONE_GIG, 0), t(k("j"), ZERO, ONE_GIG, 0))); + tabletsToMinorCompact = mgr.tabletsToMinorCompact( + tablets(t(extent, ONE_GIG, 0), t(extent2, ONE_GIG, 0), t(k("j"), ONE_GIG, 0))); assertEquals(1, tabletsToMinorCompact.size()); assertEquals(extent, tabletsToMinorCompact.get(0)); } @@ -204,31 +193,19 @@ public class LargestFirstMemoryManagerTest { // nothing to do tabletsToMinorCompact = - mgr.tabletsToMinorCompact(tablets(t(k("x"), ZERO, 1000, 0), t(k("y"), ZERO, 2000, 0))); + mgr.tabletsToMinorCompact(tablets(t(k("x"), 1000, 0), t(k("y"), 2000, 0))); assertEquals(0, tabletsToMinorCompact.size()); // a tablet that exceeds the configured max age should need to compact tabletsToMinorCompact = - mgr.tabletsToMinorCompact(tablets(t(k("x"), ZERO, 1000, 0, Duration.ofMinutes(14)), - t(k("y"), ZERO, 2000, 0, Duration.ofMinutes(16)))); + mgr.tabletsToMinorCompact(tablets(t(k("x"), 1000, 0, Duration.ofMinutes(14)), + t(k("y"), 2000, 0, Duration.ofMinutes(16)))); assertEquals(1, tabletsToMinorCompact.size()); assertEquals(k("y"), tabletsToMinorCompact.get(0)); } private static class LargestFirstMemoryManagerUnderTest extends LargestFirstMemoryManager { - public long currentTime = ZERO; - - @Override - protected long currentTimeMillis() { - return currentTime; - } - - @Override - protected long getMinCIdleThreshold(KeyExtent extent) { - return MINUTES.toMillis(15); - } - @Override protected long getMaxAge(KeyExtent extent) { return MINUTES.toMillis(15); @@ -272,8 +249,8 @@ public class LargestFirstMemoryManagerTest { return new KeyExtent(TableId.of("1"), new Text(endRow), null); } - private TabletMemoryReport t(KeyExtent ke, long lastCommit, long memSize, long compactingSize) { - return new TabletMemoryReport(null, lastCommit, memSize, compactingSize, null) { + private TabletMemoryReport t(KeyExtent ke, long memSize, long compactingSize) { + return new TabletMemoryReport(null, memSize, compactingSize, null) { @Override public KeyExtent getExtent() { return ke; @@ -281,9 +258,9 @@ public class LargestFirstMemoryManagerTest { }; } - private TabletMemoryReport t(KeyExtent ke, long lastCommit, long memSize, long compactingSize, + private TabletMemoryReport t(KeyExtent ke, long memSize, long compactingSize, Duration elapsedSinceFirstWrite) { - return new TabletMemoryReport(null, lastCommit, memSize, compactingSize, null) { + return new TabletMemoryReport(null, memSize, compactingSize, null) { @Override public KeyExtent getExtent() { return ke; diff --git a/test/src/main/java/org/apache/accumulo/test/ScanServerMaxLatencyIT.java b/test/src/main/java/org/apache/accumulo/test/ScanServerMaxLatencyIT.java index b6a0b81894..8e2fb7b796 100644 --- a/test/src/main/java/org/apache/accumulo/test/ScanServerMaxLatencyIT.java +++ b/test/src/main/java/org/apache/accumulo/test/ScanServerMaxLatencyIT.java @@ -57,16 +57,12 @@ public class ScanServerMaxLatencyIT extends ConfigurableMacBase { cfg.setProperty(Property.SSERV_CACHED_TABLET_METADATA_EXPIRATION, "2s"); } - @SuppressWarnings("deprecation") - private static Property IDLE_MINC_PROP = Property.TABLE_MINC_COMPACT_IDLETIME; - @Test public void testMaxLatency() throws Exception { - final String[] tables = this.getUniqueNames(4); + final String[] tables = this.getUniqueNames(3); final String table1 = tables[0]; final String table2 = tables[1]; final String table3 = tables[2]; - final String table4 = tables[3]; ExecutorService executor = Executors.newCachedThreadPool(); try (var client = Accumulo.newClient().from(getClientProperties()).build()) { @@ -81,30 +77,24 @@ public class ScanServerMaxLatencyIT extends ConfigurableMacBase { ntc.withInitialTabletAvailability(TabletAvailability.HOSTED); client.tableOperations().create(table2, ntc); ntc = new NewTableConfiguration(); - ntc.setProperties(Map.of(IDLE_MINC_PROP.getKey(), "2s")); - ntc.withInitialTabletAvailability(TabletAvailability.HOSTED); - client.tableOperations().create(table3, ntc); - ntc = new NewTableConfiguration(); ntc.setProperties(Map.of(Property.TABLE_MINC_COMPACT_MAXAGE.getKey(), "3s")); ntc.withInitialTabletAvailability(TabletAvailability.HOSTED); - client.tableOperations().create(table4, ntc); + client.tableOperations().create(table3, ntc); Timer timer = Timer.startNew(); // Write to table4 once, this is different than the other tables that are continually being // written to. table4 should minor compact 3 seconds after this write. - writeElapsed(new SecureRandom(), client, table4, timer); + writeElapsed(new SecureRandom(), client, table3, timer); boolean sawDataInTable4 = false; List<Future<Void>> futures = new ArrayList<>(); futures.add(executor.submit(createWriterTask(client, table1, timer))); futures.add(executor.submit(createWriterTask(client, table2, timer))); - futures.add(executor.submit(createWriterTask(client, table3, timer))); // wait for some data to be written Wait.waitFor(() -> readMaxElapsed(client, IMMEDIATE, table1) > 0 - && readMaxElapsed(client, IMMEDIATE, table2) > 0 - && readMaxElapsed(client, IMMEDIATE, table3) > 0); + && readMaxElapsed(client, IMMEDIATE, table2) > 0); long lastMaxSeen = -1; int changes = 0; @@ -131,11 +121,8 @@ public class ScanServerMaxLatencyIT extends ConfigurableMacBase { // The other table does not have the setting to minor compact based on age, so should never // see any data for it from the scan server. assertEquals(-1, readMaxElapsed(client, EVENTUAL, table2)); - // The background thread is writing to this table every 100ms so it should not be considered - // idle and therefor should not minor compact. - assertEquals(-1, readMaxElapsed(client, EVENTUAL, table3)); - if (!sawDataInTable4 && readMaxElapsed(client, EVENTUAL, table4) != -1) { + if (!sawDataInTable4 && readMaxElapsed(client, EVENTUAL, table3) != -1) { assertTrue( timer.elapsed(TimeUnit.MILLISECONDS) > 3000 diff --git a/test/src/main/java/org/apache/accumulo/test/functional/ManyWriteAheadLogsIT.java b/test/src/main/java/org/apache/accumulo/test/functional/ManyWriteAheadLogsIT.java index f497430ba1..aa2d54d298 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/ManyWriteAheadLogsIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/ManyWriteAheadLogsIT.java @@ -55,9 +55,6 @@ public class ManyWriteAheadLogsIT extends AccumuloClusterHarness { private String walSize; - @SuppressWarnings("deprecation") - private static Property IDLE_MINC_PROP = Property.TABLE_MINC_COMPACT_IDLETIME; - @Override public void configureMiniCluster(MiniAccumuloConfigImpl cfg, Configuration hadoopCoreSite) { // configure a smaller wal size so the wals will roll frequently in the test @@ -69,7 +66,7 @@ public class ManyWriteAheadLogsIT extends AccumuloClusterHarness { // idle compactions may addess the problem this test is creating, however they will not prevent // lots of closed WALs for all write patterns. This test ensures code that directly handles many // tablets referencing many different WALs is working. - cfg.setProperty(IDLE_MINC_PROP, "1h"); + cfg.setProperty(Property.TABLE_MINC_COMPACT_MAXAGE, "1h"); cfg.getClusterServerConfiguration().setNumDefaultTabletServers(1); hadoopCoreSite.set("fs.file.impl", RawLocalFileSystem.class.getName()); }