[ https://issues.apache.org/jira/browse/OAK-4623?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15429539#comment-15429539 ]
Vikas Saurabh edited comment on OAK-4623 at 8/21/16 12:10 AM: -------------------------------------------------------------- [~mreutegg], I agree with logging cached (or fresh as the case may be) document for the child - but I'm feeling a little uneasy for forcing a read with maxCacheAge=0 as it'd update doc cache just for logging purposes. I mean, I feel ok with invalidating a potential bad cache entry - but I won't want to read it from remote just for logging. But, then I can also see the counter-argument that this situation must never occur - so a penalty to read remote for logging should be ok. Also, I wonder if we should do reads in try{} to handle DocStore#find throwing DocStoreException. Here's a proposed diff btw: {noformat} diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java index 1a909e7..05b0fb0 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java @@ -1059,7 +1059,25 @@ public final class DocumentNodeStore String p = concat(parent.getPath(), input); DocumentNodeState result = getNode(p, readRevision); if (result == null) { - throw new DocumentStoreException("DocumentNodeState is null for revision " + readRevision + " of " + p + " (aborting getChildNodes())"); + //This is very unexpected situation - parent's child list declares the child to exist, while + //its node state is null. Let's put some extra effort to some logging + String cachedDocStr, uncachedDocStr; + try { + cachedDocStr = store.find(Collection.NODES, Utils.getIdFromPath(p)).asString(); + } catch (DocumentStoreException dse) { + cachedDocStr = dse.toString(); + + } + try { + uncachedDocStr = store.find(Collection.NODES, Utils.getIdFromPath(p), 0).asString(); + } catch (DocumentStoreException dse) { + uncachedDocStr = dse.toString(); + } + String exceptionMsg = String.format( + "Aborting getChildNodes() - DocumentNodeState is null for %s at %s " + + "{\"cachedDoc\":{%s}, \"uncachedDoc\":{%s})", + readRevision, p, cachedDocStr, uncachedDocStr); + throw new DocumentStoreException(exceptionMsg); } return result; } {noformat} was (Author: catholicon): [~mreutegg], I agree with logging cached (or fresh as the case may be) document for the child - but I'm feeling a little uneasy for forcing a read with maxCacheAge=0 as it'd update doc cache just for logging purposes. I mean, I feel ok with invalidating a potential bad cache entry - but I won't want to read it from remote just for logging. But, then I can also see the counter-argument that this situation must never occur - so a penalty to read remote for logging should be ok. Also, I wonder if we should do reads in try{} to handle DocStore#find throwing DocStoreException. > Log more information when null DocumentNodeState is read for a child while > fetching children > -------------------------------------------------------------------------------------------- > > Key: OAK-4623 > URL: https://issues.apache.org/jira/browse/OAK-4623 > Project: Jackrabbit Oak > Issue Type: Improvement > Components: documentmk > Reporter: Vikas Saurabh > Assignee: Vikas Saurabh > Priority: Minor > Fix For: 1.6 > > > {{DocumentNodeStore#getChildNodes}} validates node states of children in the > returned iterator and throws exception if a child is read as {{null}}. > This is clearly an unexpected case (although, it has been observed in running > systems). The more probable cause for such a scenario would be to have > inconsistent value in {{nodeChildrenCache}}. It'd be useful to log more > information about cache state to help investigating such cases. -- This message was sent by Atlassian JIRA (v6.3.4#6332)