stefan-egli commented on code in PR #1372: URL: https://github.com/apache/jackrabbit-oak/pull/1372#discussion_r1537698677
########## oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java: ########## @@ -1246,6 +1349,256 @@ private void collectRevisionsOlderThan24hAndBetweenCheckpoints(final NodeDocumen } } + /** + * Remove all property revisions in the local document that are no longer used. + * This includes bundled properties. It also includes related entries that + * become obsolete as a result - i.e. _commitRoot and _bc (though the latter + * is never removed on root) + */ + private void collectUnusedPropertyRevisions(final NodeDocument doc, + final GCPhases phases, final UpdateOp updateOp, + final DocumentNodeState traversedMainNode, + final boolean ignoreInternalProperties) { + + if (!phases.start(GCPhase.DETAILED_GC_COLLECT_OLD_REVS)){ + // cancelled + return; + } + final Set<Revision> allKeepRevs = new HashSet<>(); + // phase A : collectUnusedUserPropertyRevisions + int deletedTotalRevsCount = collectUnusedUserPropertyRevisions(doc, phases, updateOp, traversedMainNode, allKeepRevs); + int deletedUserRevsCount = deletedTotalRevsCount; + // phase B : collectUnusedInternalPropertyRevisions + if (!ignoreInternalProperties) { + deletedTotalRevsCount = collectUnusedInternalPropertyRevisions(doc, phases, updateOp, traversedMainNode, allKeepRevs, deletedTotalRevsCount); + } + + // then some accounting... + int deletedInternalRevsCount = deletedTotalRevsCount - deletedUserRevsCount; + if (deletedUserRevsCount != 0) { + deletedPropRevsCountMap.merge(doc.getId(), deletedUserRevsCount, Integer::sum); + } + if (deletedInternalRevsCount != 0) { + deletedInternalPropRevsCountMap.merge(doc.getId(), deletedInternalRevsCount, Integer::sum); + } + phases.stop(GCPhase.DETAILED_GC_COLLECT_OLD_REVS); + } + + private int collectUnusedUserPropertyRevisions(final NodeDocument doc, + final GCPhases phases, final UpdateOp updateOp, + final DocumentNodeState traversedMainNode, + final Set<Revision> allKeepRevs) { + int deletedRevsCount = 0; + + // phase 1 : non bundled nodes only + for (PropertyState prop : traversedMainNode.getProperties()) { + final String escapedPropName = Utils.escapePropertyName(prop.getName()); + deletedRevsCount += removeUnusedPropertyEntries(doc, traversedMainNode, updateOp, escapedPropName, + (r) -> { updateOp.removeMapEntry(escapedPropName, r); return null;}, + allKeepRevs); + } Review Comment: had to manually apply this as github was giving up on this one - done in https://github.com/apache/jackrabbit-oak/pull/1372/commits/3de2d572b8cfc941901db3bf4f86c4848a130639 -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: dev-unsubscr...@jackrabbit.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org