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

Sijie Guo commented on BOOKKEEPER-568:
--------------------------------------

ah, it seems that this code doesn't handle calling hasNext twice. so second 
time call hasNext would fail with null pointer. the case would happened when 
there is no ledgers existed in bookkeeper.

[~merlimat] it is OK to fix as your suggestion. could you generate a patch for 
it? thanks.
                
> NPE during GC with HierarchicalLedgerManager
> --------------------------------------------
>
>                 Key: BOOKKEEPER-568
>                 URL: https://issues.apache.org/jira/browse/BOOKKEEPER-568
>             Project: Bookkeeper
>          Issue Type: Bug
>          Components: bookkeeper-server
>    Affects Versions: 4.2.0
>            Reporter: Matteo Merli
>            Priority: Minor
>
> {noformat}
> 2013-02-11 14:06:28,904 - WARN  - 
> [GarbageCollectorThread:ScanAndCompareGarbageCollector@103] - Exception when 
> iterating over the metadata {}
> java.io.IOException: Error when check more elements
>       at 
> org.apache.bookkeeper.meta.HierarchicalLedgerManager$HierarchicalLedgerRangeIterator.hasNext(HierarchicalLedgerManager.java:423)
>       at 
> org.apache.bookkeeper.bookie.ScanAndCompareGarbageCollector.gc(ScanAndCompareGarbageCollector.java:75)
>       at 
> org.apache.bookkeeper.bookie.GarbageCollectorThread.doGcLedgers(GarbageCollectorThread.java:302)
>       at 
> org.apache.bookkeeper.bookie.GarbageCollectorThread.run(GarbageCollectorThread.java:271)
> Caused by: java.lang.NullPointerException
>       at 
> org.apache.bookkeeper.meta.HierarchicalLedgerManager$HierarchicalLedgerRangeIterator.hasNext(HierarchicalLedgerManager.java:419)
>       ... 3 more
> {noformat}
> In the code below, l2NodesIter appears to be null.
> {code}
> public boolean hasNext() throws IOException {
>    try {
>       if (l1NodesIter == null) {
>           l1NodesIter = zk.getChildren(ledgerRootPath, null).iterator();
>           hasMoreElement = nextL1Node();
>       } else if (!l2NodesIter.hasNext()) {
>           hasMoreElement = nextL1Node();
>       }
>    } catch (Exception e) {
>       throw new IOException("Error when check more elements", e);
>    }
>    return hasMoreElement;
> }
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to