Author: frm Date: Tue Apr 24 13:20:43 2018 New Revision: 1829996 URL: http://svn.apache.org/viewvc?rev=1829996&view=rev Log: OAK-7440 - Remove SizeDeltaGcEstimation
After the introduction of EstimationStrategy, SizeDeltaGcEstimation is now trivial and can be inlined in DefaultGarbageCollectionStrategy. Added: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullSizeDeltaEstimationStrategyTest.java (with props) jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TailSizeDeltaEstimationStrategyTest.java (with props) Removed: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/SizeDeltaGcEstimation.java jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/SizeDeltaGCEstimationTest.java Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultGarbageCollectionStrategy.java Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultGarbageCollectionStrategy.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultGarbageCollectionStrategy.java?rev=1829996&r1=1829995&r2=1829996&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultGarbageCollectionStrategy.java (original) +++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultGarbageCollectionStrategy.java Tue Apr 24 13:20:43 2018 @@ -37,6 +37,10 @@ import org.apache.jackrabbit.oak.spi.blo class DefaultGarbageCollectionStrategy implements GarbageCollectionStrategy { + private final EstimationStrategy fullEstimationStrategy = new FullSizeDeltaEstimationStrategy(); + + private final EstimationStrategy tailEstimationStrategy = new TailSizeDeltaEstimationStrategy(); + private final CompactionStrategy fullCompactionStrategy = new FullCompactionStrategy(); private final CompactionStrategy tailCompactionStrategy = new FallbackCompactionStrategy(new TailCompactionStrategy(), fullCompactionStrategy); @@ -218,12 +222,36 @@ class DefaultGarbageCollectionStrategy i } private EstimationResult estimateCompactionGain(Context context, boolean full) { - return new SizeDeltaGcEstimation( - context.getGCOptions().getGcSizeDeltaEstimation(), - context.getGCJournal(), - context.getTarFiles().size(), - full - ).estimate(); + EstimationStrategy strategy; + + if (full) { + strategy = fullEstimationStrategy; + } else { + strategy = tailEstimationStrategy; + } + + return estimateCompactionGain(context, strategy); + } + + private EstimationResult estimateCompactionGain(Context context, EstimationStrategy strategy) { + return strategy.estimate(new EstimationStrategy.Context() { + + @Override + public long getSizeDelta() { + return context.getGCOptions().getGcSizeDeltaEstimation(); + } + + @Override + public long getCurrentSize() { + return context.getTarFiles().size(); + } + + @Override + public GCJournal getGCJournal() { + return context.getGCJournal(); + } + + }); } @Override Added: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullSizeDeltaEstimationStrategyTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullSizeDeltaEstimationStrategyTest.java?rev=1829996&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullSizeDeltaEstimationStrategyTest.java (added) +++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullSizeDeltaEstimationStrategyTest.java Tue Apr 24 13:20:43 2018 @@ -0,0 +1,123 @@ +/* + * 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.jackrabbit.oak.segment.file; + +import static org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.io.File; + +import org.apache.jackrabbit.oak.segment.file.EstimationStrategy.Context; +import org.apache.jackrabbit.oak.segment.file.tar.TarPersistence; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class FullSizeDeltaEstimationStrategyTest { + + @Rule + public TemporaryFolder folder = new TemporaryFolder(new File("target")); + + private GCJournal journal; + + @Before + public void setUpJournal() { + journal = new GCJournal(new TarPersistence(folder.getRoot()).getGCJournalFile()); + } + + @Test + public void testFullSkippedEstimation() { + assertTrue(isGarbageCollectionNeeded(0, 1000)); + } + + @Test + public void testFullEmptyJournal() { + assertTrue(isGarbageCollectionNeeded(100, 1000)); + } + + @Test + public void testFullGCNeededBecauseOfSize1() { + journal.persist(100, 1000, newGCGeneration(1, 1, true), 1000, "id"); + journal.persist(110, 1100, newGCGeneration(2, 2, true), 1000, "id"); + journal.persist(120, 1200, newGCGeneration(3, 3, true), 1000, "id"); + journal.persist(130, 1000, newGCGeneration(4, 4, true), 1000, "id"); + journal.persist(100, 1010, newGCGeneration(5, 5, true), 1000, "id"); + journal.persist(110, 1020, newGCGeneration(6, 6, true), 1000, "id"); + assertTrue(isGarbageCollectionNeeded(100, 1300)); + } + + @Test + public void testFullGCNeededBecauseOfSize2() { + journal.persist(100, 1000, newGCGeneration(1, 1, true), 1000, "id"); + assertTrue(isGarbageCollectionNeeded(10, 1030)); + } + + @Test + public void testFullGCSkippedBecauseOfSize1() { + journal.persist(100, 1000, newGCGeneration(1, 1, true), 1000, "id"); + journal.persist(110, 1100, newGCGeneration(2, 2, true), 1000, "id"); + journal.persist(120, 1200, newGCGeneration(3, 3, true), 1000, "id"); + journal.persist(130, 1000, newGCGeneration(4, 4, true), 1000, "id"); + journal.persist(100, 1010, newGCGeneration(5, 5, true), 1000, "id"); + journal.persist(110, 1020, newGCGeneration(6, 6, true), 1000, "id"); + assertFalse(isGarbageCollectionNeeded(100, 1030)); + } + + @Test + public void testFullGCSkippedBecauseOfSize2() { + journal.persist(100, 1000, newGCGeneration(1, 1, true), 1000, "id"); + assertFalse(isGarbageCollectionNeeded(100, 1030)); + } + + @Test + public void testFullGCNeededBecauseOfPreviousTail() { + journal.persist(100, 1000, newGCGeneration(1, 1, true), 1000, "id"); + journal.persist(110, 1100, newGCGeneration(2, 1, true), 1000, "id"); + journal.persist(120, 1200, newGCGeneration(3, 1, true), 1000, "id"); + journal.persist(130, 1000, newGCGeneration(4, 2, true), 1000, "id"); + journal.persist(100, 1010, newGCGeneration(5, 2, true), 1000, "id"); + journal.persist(110, 1020, newGCGeneration(6, 2, true), 1000, "id"); + assertTrue(isGarbageCollectionNeeded(100, 1030)); + } + + private boolean isGarbageCollectionNeeded(long delta, long size) { + return new FullSizeDeltaEstimationStrategy().estimate(new Context() { + + @Override + public long getSizeDelta() { + return delta; + } + + @Override + public long getCurrentSize() { + return size; + } + + @Override + public GCJournal getGCJournal() { + return journal; + } + + }).isGcNeeded(); + } + +} Propchange: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullSizeDeltaEstimationStrategyTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TailSizeDeltaEstimationStrategyTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TailSizeDeltaEstimationStrategyTest.java?rev=1829996&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TailSizeDeltaEstimationStrategyTest.java (added) +++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TailSizeDeltaEstimationStrategyTest.java Tue Apr 24 13:20:43 2018 @@ -0,0 +1,94 @@ +/* + * 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.jackrabbit.oak.segment.file; + +import static org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.io.File; + +import org.apache.jackrabbit.oak.segment.file.EstimationStrategy.Context; +import org.apache.jackrabbit.oak.segment.file.tar.TarPersistence; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class TailSizeDeltaEstimationStrategyTest { + + @Rule + public TemporaryFolder folder = new TemporaryFolder(new File("target")); + + private GCJournal journal; + + @Before + public void setUpJournal() { + journal = new GCJournal(new TarPersistence(folder.getRoot()).getGCJournalFile()); + } + + @Test + public void testTailSkippedEstimation() { + assertTrue(isGarbageCollectionNeeded(0, 1000)); + } + + @Test + public void testTailEmptyJournal() { + assertTrue(isGarbageCollectionNeeded(100, 1000)); + } + + @Test + public void testTailGCNeeded() { + journal.persist(100, 1000, newGCGeneration(1, 1, true), 1000, "id"); + journal.persist(110, 1100, newGCGeneration(2, 1, true), 1000, "id"); + journal.persist(120, 1200, newGCGeneration(3, 1, true), 1000, "id"); + assertTrue(isGarbageCollectionNeeded(50, 1300)); + } + + @Test + public void testTailGCSkipped() { + journal.persist(100, 1000, newGCGeneration(1, 1, true), 1000, "id"); + journal.persist(110, 1100, newGCGeneration(2, 1, true), 1000, "id"); + journal.persist(120, 1200, newGCGeneration(3, 1, true), 1000, "id"); + assertFalse(isGarbageCollectionNeeded(200, 1300)); + } + + private boolean isGarbageCollectionNeeded(long delta, long size) { + return new TailSizeDeltaEstimationStrategy().estimate(new Context() { + + @Override + public long getSizeDelta() { + return delta; + } + + @Override + public long getCurrentSize() { + return size; + } + + @Override + public GCJournal getGCJournal() { + return journal; + } + + }).isGcNeeded(); + } + +} Propchange: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TailSizeDeltaEstimationStrategyTest.java ------------------------------------------------------------------------------ svn:eol-style = native