Skip to content

Commit a479b79

Browse files
rishabhdaimRishabh Kumar
authored andcommitted
OAK-11439 : set remaining full gc modes (apache#2036)
Co-authored-by: Rishabh Kumar <diam@adobe.com>
1 parent b135b11 commit a479b79

File tree

6 files changed

+159
-71
lines changed

6 files changed

+159
-71
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.apache.jackrabbit.oak.plugins.document;
20+
21+
import org.slf4j.Logger;
22+
23+
import static org.slf4j.LoggerFactory.getLogger;
24+
25+
/**
26+
* During hardening of FullGC one can choose level type of garbage should be cleaned up.
27+
* Ultimately the goal is to clean up all possible garbage. After hardening these modes
28+
* might no longer be supported.
29+
*/
30+
enum FullGCMode {
31+
/**
32+
* no full GC is done at all
33+
*/
34+
NONE,
35+
/**
36+
* GC only empty properties
37+
*/
38+
EMPTYPROPS,
39+
/**
40+
* GC only orphaned nodes with gaps in ancestor docs
41+
*/
42+
GAP_ORPHANS,
43+
/**
44+
* GC orphaned nodes with gaps in ancestor docs, plus empty properties
45+
*/
46+
GAP_ORPHANS_EMPTYPROPS,
47+
/**
48+
* GC any kind of orphaned nodes, plus empty properties
49+
*/
50+
ALL_ORPHANS_EMPTYPROPS,
51+
/**
52+
* GC any kind of orphaned nodes, empty properties plus keep 1 (== keep
53+
* traversed) revision, applied to user properties only
54+
*/
55+
ORPHANS_EMPTYPROPS_KEEP_ONE_USER_PROPS,
56+
/**
57+
* GC any kind of orphaned nodes, empty properties plus keep 1 (== keep
58+
* traversed) revision, applied to all properties
59+
*/
60+
ORPHANS_EMPTYPROPS_KEEP_ONE_ALL_PROPS,
61+
/**
62+
* GC any kind of orphaned nodes, empty properties plus cleanup unmerged BCs
63+
*/
64+
ORPHANS_EMPTYPROPS_UNMERGED_BC,
65+
/**
66+
* GC any kind of orphaned nodes, empty properties plus cleanup revisions, also
67+
* between checkpoints
68+
*/
69+
ORPHANS_EMPTYPROPS_BETWEEN_CHECKPOINTS_NO_UNMERGED_BC,
70+
/**
71+
* GC any kind of orphaned nodes, empty properties, cleanup revisions, also
72+
* between checkpoints, plus cleanup unmerged BCs
73+
*/
74+
ORPHANS_EMPTYPROPS_BETWEEN_CHECKPOINTS_WITH_UNMERGED_BC;
75+
76+
private static final Logger log = getLogger(FullGCMode.class);
77+
78+
public static FullGCMode getMode(final int mode) {
79+
80+
switch (mode) {
81+
case 1:
82+
return EMPTYPROPS;
83+
case 2:
84+
return GAP_ORPHANS;
85+
case 3:
86+
return GAP_ORPHANS_EMPTYPROPS;
87+
case 4:
88+
return ALL_ORPHANS_EMPTYPROPS;
89+
case 5:
90+
return ORPHANS_EMPTYPROPS_KEEP_ONE_USER_PROPS;
91+
case 6:
92+
return ORPHANS_EMPTYPROPS_KEEP_ONE_ALL_PROPS;
93+
case 7:
94+
return ORPHANS_EMPTYPROPS_UNMERGED_BC;
95+
case 8:
96+
return ORPHANS_EMPTYPROPS_BETWEEN_CHECKPOINTS_NO_UNMERGED_BC;
97+
case 9:
98+
return ORPHANS_EMPTYPROPS_BETWEEN_CHECKPOINTS_WITH_UNMERGED_BC;
99+
default:
100+
log.warn("Unsupported full GC mode configuration value: {}. Resetting to NONE", mode);
101+
return NONE;
102+
}
103+
}
104+
105+
}

oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java

Lines changed: 5 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@
9393
import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType.COMMIT_ROOT_ONLY;
9494
import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType.DEFAULT_LEAF;
9595
import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType.DEFAULT_NO_BRANCH;
96-
import static org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode.EMPTYPROPS;
97-
import static org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode.GAP_ORPHANS;
98-
import static org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode.GAP_ORPHANS_EMPTYPROPS;
99-
import static org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode.NONE;
96+
import static org.apache.jackrabbit.oak.plugins.document.FullGCMode.EMPTYPROPS;
97+
import static org.apache.jackrabbit.oak.plugins.document.FullGCMode.GAP_ORPHANS;
98+
import static org.apache.jackrabbit.oak.plugins.document.FullGCMode.GAP_ORPHANS_EMPTYPROPS;
99+
import static org.apache.jackrabbit.oak.plugins.document.FullGCMode.NONE;
100100
import static org.apache.jackrabbit.oak.plugins.document.util.Utils.getIdFromPath;
101101
import static org.apache.jackrabbit.oak.plugins.document.util.Utils.timestampToString;
102102
import static org.apache.jackrabbit.oak.stats.StatisticsProvider.NOOP;
@@ -157,48 +157,6 @@ public class VersionGarbageCollector {
157157
*/
158158
static final String SETTINGS_COLLECTION_FULL_GC_DRY_RUN_DOCUMENT_ID_PROP = "fullGCDryRunId";
159159

160-
/**
161-
* During hardening of FullGC one can choose level type of garbage should be cleaned up.
162-
* Ultimately the goal is to clean up all possible garbage. After hardening these modes
163-
* might no longer be supported.
164-
*/
165-
enum FullGCMode {
166-
/** no full GC is done at all */
167-
NONE,
168-
/** GC only empty properties */
169-
EMPTYPROPS,
170-
/** GC only orphaned nodes with gaps in ancestor docs */
171-
GAP_ORPHANS,
172-
/** GC orphaned nodes with gaps in ancestor docs, plus empty properties */
173-
GAP_ORPHANS_EMPTYPROPS,
174-
/** GC any kind of orphaned nodes, plus empty properties */
175-
ALL_ORPHANS_EMPTYPROPS,
176-
/**
177-
* GC any kind of orphaned nodes, empty properties plus keep 1 (== keep
178-
* traversed) revision, applied to user properties only
179-
*/
180-
ORPHANS_EMPTYPROPS_KEEP_ONE_USER_PROPS,
181-
/**
182-
* GC any kind of orphaned nodes, empty properties plus keep 1 (== keep
183-
* traversed) revision, applied to all properties
184-
*/
185-
ORPHANS_EMPTYPROPS_KEEP_ONE_ALL_PROPS,
186-
/**
187-
* GC any kind of orphaned nodes, empty properties plus cleanup unmerged BCs
188-
*/
189-
ORPHANS_EMPTYPROPS_UNMERGED_BC,
190-
/**
191-
* GC any kind of orphaned nodes, empty properties plus cleanup revisions, also
192-
* between checkpoints
193-
*/
194-
ORPHANS_EMPTYPROPS_BETWEEN_CHECKPOINTS_NO_UNMERGED_BC,
195-
/**
196-
* GC any kind of orphaned nodes, empty properties, cleanup revisions, also
197-
* between checkpoints, plus cleanup unmerged BCs
198-
*/
199-
ORPHANS_EMPTYPROPS_BETWEEN_CHECKPOINTS_WITH_UNMERGED_BC
200-
}
201-
202160
private static FullGCMode fullGcMode = GAP_ORPHANS_EMPTYPROPS;
203161

204162
static FullGCMode getFullGcMode() {
@@ -212,23 +170,7 @@ static FullGCMode getFullGcMode() {
212170
* @param fullGcMode configuration value for full GC mode
213171
*/
214172
static void setFullGcMode(int fullGcMode) {
215-
switch (fullGcMode) {
216-
case 0:
217-
VersionGarbageCollector.fullGcMode = NONE;
218-
break;
219-
case 1:
220-
VersionGarbageCollector.fullGcMode = EMPTYPROPS;
221-
break;
222-
case 2:
223-
VersionGarbageCollector.fullGcMode = GAP_ORPHANS;
224-
break;
225-
case 3:
226-
VersionGarbageCollector.fullGcMode = GAP_ORPHANS_EMPTYPROPS;
227-
break;
228-
default:
229-
log.warn("Unsupported full GC mode configuration value: {}. Resetting to NONE", fullGcMode);
230-
VersionGarbageCollector.fullGcMode = NONE;
231-
}
173+
VersionGarbageCollector.fullGcMode = FullGCMode.getMode(fullGcMode);
232174
}
233175

234176
private final DocumentNodeStore nodeStore;

oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BranchCommitGCTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import java.util.function.Consumer;
5252

5353
import org.apache.jackrabbit.oak.plugins.document.DocumentMK.Builder;
54-
import org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode;
5554
import org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollectorIT.GCCounts;
5655
import org.apache.jackrabbit.oak.plugins.document.util.Utils;
5756
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;

oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/FullGCHelper.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
*/
1919
package org.apache.jackrabbit.oak.plugins.document;
2020

21-
import org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode;
2221
import org.apache.jackrabbit.oak.plugins.document.util.Utils;
2322
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
2423
import org.apache.jackrabbit.oak.spi.commit.EmptyHook;

oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCTest.java

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@ ns, new VersionGCSupport(store), true, false, false,
561561

562562
@Test
563563
public void testVersionGCLoadGCModeConfigurationNotApplicable() {
564-
int fullGcModeNotAllowedValue = 5;
564+
int fullGcModeNotAllowedValue = 15;
565565
int fullGcModeGapOrphans = 2;
566566

567567
// set fullGcMode to allowed value that is different than NONE
@@ -573,7 +573,7 @@ ns, new VersionGCSupport(store), true, false, false,
573573
fullGcModeNotAllowedValue, 0, DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
574574

575575
assertEquals("Starting VersionGarbageCollector with not applicable / not allowed value" +
576-
"will set fullGcMode to default NONE", VersionGarbageCollector.FullGCMode.NONE, VersionGarbageCollector.getFullGcMode());
576+
"will set fullGcMode to default NONE", FullGCMode.NONE, VersionGarbageCollector.getFullGcMode());
577577
}
578578

579579
@Test
@@ -583,7 +583,7 @@ public void testVersionGCLoadGCModeConfigurationNone() {
583583
ns, new VersionGCSupport(store), true, false, false,
584584
fullGcModeNone, 0, DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
585585

586-
assertEquals(VersionGarbageCollector.FullGCMode.NONE, VersionGarbageCollector.getFullGcMode());
586+
assertEquals(FullGCMode.NONE, VersionGarbageCollector.getFullGcMode());
587587
}
588588

589589
@Test
@@ -593,7 +593,7 @@ public void testVersionGCLoadGCModeConfigurationGapOrphans() {
593593
ns, new VersionGCSupport(store), true, false, false,
594594
fullGcModeGapOrphans, 0, DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
595595

596-
assertEquals(VersionGarbageCollector.FullGCMode.GAP_ORPHANS, VersionGarbageCollector.getFullGcMode());
596+
assertEquals(FullGCMode.GAP_ORPHANS, VersionGarbageCollector.getFullGcMode());
597597
}
598598

599599
@Test
@@ -603,11 +603,55 @@ public void testVersionGCLoadGCModeConfigurationGapOrphansEmptyProperties() {
603603
ns, new VersionGCSupport(store), true, false, false,
604604
fullGcModeGapOrphansEmptyProperties, 0, DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
605605

606-
assertEquals(VersionGarbageCollector.FullGCMode.GAP_ORPHANS_EMPTYPROPS, VersionGarbageCollector.getFullGcMode());
606+
assertEquals(FullGCMode.GAP_ORPHANS_EMPTYPROPS, VersionGarbageCollector.getFullGcMode());
607607
}
608608

609609
// OAK-10896 END
610610

611+
// OAK-11439
612+
613+
@Test
614+
public void testVersionGCLoadGCModeConfigurationAllOrphansEmptyProps() {
615+
int fullGcModeAllOrphansEmptyProperties = 4;
616+
VersionGarbageCollector gc = new VersionGarbageCollector(
617+
ns, new VersionGCSupport(store), true, false, false,
618+
fullGcModeAllOrphansEmptyProperties, 0, DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
619+
620+
assertEquals(FullGCMode.ALL_ORPHANS_EMPTYPROPS, VersionGarbageCollector.getFullGcMode());
621+
}
622+
623+
@Test
624+
public void testVersionGCLoadGCModeConfigurationAllOrphansEmptyPropsKeepOneUserProps() {
625+
int fullGcModeAllOrphansEmptyPropertiesKeepOneUserProps = 5;
626+
VersionGarbageCollector gc = new VersionGarbageCollector(
627+
ns, new VersionGCSupport(store), true, false, false,
628+
fullGcModeAllOrphansEmptyPropertiesKeepOneUserProps, 0, DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
629+
630+
assertEquals(FullGCMode.ORPHANS_EMPTYPROPS_KEEP_ONE_USER_PROPS, VersionGarbageCollector.getFullGcMode());
631+
}
632+
633+
@Test
634+
public void testVersionGCLoadGCModeConfigurationAllOrphansEmptyPropsKeepOneAllProps() {
635+
int fullGcModeAllOrphansEmptyPropertiesKeepOneAllProps = 6;
636+
VersionGarbageCollector gc = new VersionGarbageCollector(
637+
ns, new VersionGCSupport(store), true, false, false,
638+
fullGcModeAllOrphansEmptyPropertiesKeepOneAllProps, 0, DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
639+
640+
assertEquals(FullGCMode.ORPHANS_EMPTYPROPS_KEEP_ONE_ALL_PROPS, VersionGarbageCollector.getFullGcMode());
641+
}
642+
643+
@Test
644+
public void testVersionGCLoadGCModeConfigurationAllOrphansEmptyPropsUnmergedBC() {
645+
int fullGcModeAllOrphansEmptyPropertiesUnmergedBC = 7;
646+
VersionGarbageCollector gc = new VersionGarbageCollector(
647+
ns, new VersionGCSupport(store), true, false, false,
648+
fullGcModeAllOrphansEmptyPropertiesUnmergedBC, 0, DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
649+
650+
assertEquals(FullGCMode.ORPHANS_EMPTYPROPS_UNMERGED_BC, VersionGarbageCollector.getFullGcMode());
651+
}
652+
653+
// OAK-11439 END
654+
611655
private Future<VersionGCStats> gc() {
612656
// run gc in a separate thread
613657
return execService.submit(new Callable<VersionGCStats>() {

oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@
113113
import org.apache.jackrabbit.oak.commons.collections.ListUtils;
114114
import org.apache.jackrabbit.oak.plugins.document.DocumentStoreFixture.RDBFixture;
115115
import org.apache.jackrabbit.oak.plugins.document.FailingDocumentStore.FailedUpdateOpListener;
116-
import org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode;
117116
import org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.VersionGCStats;
118117
import org.apache.jackrabbit.oak.plugins.document.bundlor.BundlingConfigInitializer;
119118
import org.apache.jackrabbit.oak.plugins.document.mongo.MongoTestUtils;

0 commit comments

Comments
 (0)