jackrabbit-oak-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Thomas Mueller (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (OAK-3395) RevisionGC fails for JCR paths having line feed characters
Date Wed, 16 Sep 2015 08:46:45 GMT

    [ https://issues.apache.org/jira/browse/OAK-3395?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14747155#comment-14747155
] 

Thomas Mueller commented on OAK-3395:
-------------------------------------

I would simplify EscapeUtils a bit:

{noformat}
    private static boolean unescapingRequired(String line) {
        return line.indexOf('\\') >= 0;
    }
{noformat}

I would also allocate one additional character here:

{noformat}
    escape(String line) {
        int len = line.length();
        StringBuilder sb = new StringBuilder(len + 1);
{noformat}

and one fewer here:

{noformat}
    private static String unescape(String line) {
        int len = line.length();
        StringBuilder sb = new StringBuilder(len - 1);
{noformat}

For unformat, I would throw an IllegalArgumentException on invalid syntax, to detect bugs
(missing escape calls):

{noformat}
    private static String unescape(String line) {
        int len = line.length();
        StringBuilder sb = new StringBuilder(len - 1);
        for (int i = 0; i < len; i++) {
            char c = line.charAt(i);
            if (c == '\\') {
                char nextChar = line.charAt(i + 1);
                switch (nextChar) {
                    case 'n':
                        sb.append('\n');
                        i++;
                        break;
                    case 'r':
                        sb.append('\r');
                        i++;
                        break;
                    case '\\':
                        sb.append('\\');
                        i++;
                        break;
                    default:
                        throw new IllegalArgumentException(...);
{noformat}

(by the way, even now an exception is throws if the last character if a backslash).

There should be unit tests for the special cases as well (code coverage should be 100%).

> RevisionGC fails for JCR paths having line feed characters
> ----------------------------------------------------------
>
>                 Key: OAK-3395
>                 URL: https://issues.apache.org/jira/browse/OAK-3395
>             Project: Jackrabbit Oak
>          Issue Type: Bug
>          Components: mongomk, rdbmk
>            Reporter: Chetan Mehrotra
>            Assignee: Chetan Mehrotra
>            Priority: Minor
>             Fix For: 1.3.7, 1.2.6, 1.0.21
>
>         Attachments: OAK-3395-1.patch
>
>
> RevisionGC fails with error while processing any id (derived from JCR path) having line
feed or carriage return char
> This happens because it relies on Oak Commons StringSort and ExternalSort which works
with line delimited string and having an id with line break would break this sorting logic.
Error reported is like
> {noformat}
> java.lang.AssertionError: Invalid id /1442211320
> 	at org.apache.jackrabbit.oak.plugins.document.util.Utils.getDepthFromId(Utils.java:337)
> 	at org.apache.jackrabbit.oak.plugins.document.NodeDocumentIdComparator.compare(NodeDocumentIdComparator.java:38)
> 	at org.apache.jackrabbit.oak.plugins.document.NodeDocumentIdComparator.compare(NodeDocumentIdComparator.java:30)
> 	at java.util.TimSort.countRunAndMakeAscending(TimSort.java:324)
> 	at java.util.TimSort.sort(TimSort.java:203)
> 	at java.util.TimSort.sort(TimSort.java:173)
> 	at java.util.Arrays.sort(Arrays.java:659)
> 	at java.util.Collections.sort(Collections.java:217)
> 	at org.apache.jackrabbit.oak.commons.sort.ExternalSort.sortAndSave(ExternalSort.java:279)
> 	at org.apache.jackrabbit.oak.commons.sort.ExternalSort.sortInBatch(ExternalSort.java:218)
> 	at org.apache.jackrabbit.oak.commons.sort.ExternalSort.sortInBatch(ExternalSort.java:257)
> 	at org.apache.jackrabbit.oak.commons.sort.StringSort$PersistentState.sort(StringSort.java:191)
> 	at org.apache.jackrabbit.oak.commons.sort.StringSort.sort(StringSort.java:88)
> 	at org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector$DeletedDocsGC.ensureSorted(VersionGarbageCollector.java:383)
> 	at org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector$DeletedDocsGC.getDocIdsToDelete(VersionGarbageCollector.java:274)
> 	at org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector$DeletedDocsGC.removeDeletedDocuments(VersionGarbageCollector.java:296)
> 	at org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector$DeletedDocsGC.removeDocuments(VersionGarbageCollector.java:241)
> 	at org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.collectDeletedDocuments(VersionGarbageCollector.java:154)
> 	at org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.gc(VersionGarbageCollector.java:105)
> 	at org.apache.jackrabbit.oak.plugins.document.VersionGCDeletionTest.gcWithPathsHavingNewLine(VersionGCDeletionTest.java:203)
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message