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

Ivan Kelly commented on BOOKKEEPER-804:
---------------------------------------

The problem came in with BOOKKEEPER-654. We wrap the ledger managers catch the 
callbacks and make sure they get called when we clean up. The wrapper wasn't 
chaining the close call though (a simple omission issue), so 
AbstractZkLedgerManager#close() was never called. It only manifested when 
readEntries was called in this case, because if readEntries hadn't been called, 
the process would have exited before the thread started.

I've attached a fix. This is really hard to test for, or at least I can't find 
a clean way. I can't check what threads are alive before and after, since the 
bookies also run in the same thread, so they could also end up creating threads 
:/

Thanks for reporting this Youngjoon.

> Client program is not terminated when using openLedgerNoRecovery
> ----------------------------------------------------------------
>
>                 Key: BOOKKEEPER-804
>                 URL: https://issues.apache.org/jira/browse/BOOKKEEPER-804
>             Project: Bookkeeper
>          Issue Type: Bug
>          Components: bookkeeper-client
>    Affects Versions: 4.3.0
>            Reporter: Youngjoon Kim
>            Assignee: Ivan Kelly
>             Fix For: 4.4.0, 4.3.1
>
>
> If a client program does some operations using a ledger handle opened by 
> openLedgerNoRecovery(), the program is not terminated after the handle and 
> bookkeeper object is closed.
> Here is a sample code. 
> {code}
> import java.util.Enumeration;
> import org.apache.bookkeeper.client.BookKeeper;
> import org.apache.bookkeeper.client.LedgerEntry;
> import org.apache.bookkeeper.client.LedgerHandle;
> public class BkClient {
>   public static void main(String[] args) {
>     try {
>       BookKeeper bk = new BookKeeper("localhost:2181");
>       // 9 is a ledger id of an existing ledger
>       LedgerHandle lh = bk.openLedgerNoRecovery(9, 
> BookKeeper.DigestType.CRC32, "passwd".getBytes());
>       Enumeration<LedgerEntry> entries = lh.readEntries(0, 0);
>       lh.close();
>       bk.close();
>     } catch (Exception e) {
>       e.printStackTrace();
>     }
>   }
> }
> {code}
> Thread dump of this program shows that non-daemon thread 
> "ZkLedgerManagerScheduler-0"  is alive, after bk.close() is called. 



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

Reply via email to