[ 
https://issues.apache.org/jira/browse/HBASE-25581?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Andrew Kyle Purtell resolved HBASE-25581.
-----------------------------------------
    Resolution: Incomplete

> BUG - HBase native client memory leak - threads keep running after connection 
> is closed
> ---------------------------------------------------------------------------------------
>
>                 Key: HBASE-25581
>                 URL: https://issues.apache.org/jira/browse/HBASE-25581
>             Project: HBase
>          Issue Type: Sub-task
>            Reporter: Julia Emelianova
>            Priority: Major
>
> Hello everyone, 
> First of all, thank you for creating such an amazing product
> I'm trying to implement an open-source PHP-extension based on HBase native 
> client. It seems more promising performance-wise than Thrifts we're currently 
> using
> In terms of PHP-fpm, we need to be able to open and close connection multiple 
> times in one process, and here's when the library leaks memory
> Calling 'Close' methods on Table and Clients is not enough for closing all of 
> the threads.
> A simple program
>  
> {code:java}
> int main() {
>     zoo_set_debug_level( (ZooLogLevel)4);
>     google::SetCommandLineOption("GLOG_minloglevel", "0");
>     std::shared_ptr<hbase::Configuration> conf = 
> std::make_shared<hbase::Configuration>();
>     conf->Set(hbase::ZKUtil::kHBaseZookeeperQuorum_, "quorum");
>     conf->Set(hbase::ZKUtil::kHBaseZookeeperClientPort_, "2181");
>     conf->Set(hbase::ZKUtil::kHBaseZnodeParent_, "/hbase-unsecure");
>     createClient(conf);  
>     int i = 0;
>     while (true) {
>         i++;
>         std::cout << "Slept " << i << std::endl;
>         sleep(5);
>     }
>     return 0;
> }
> void createClient(const std::shared_ptr<hbase::Configuration>& conf)
> {
>     std::cout << "opening " << std::endl << std::endl << std::endl;
>     auto tn = 
> std::make_shared<hbase::pb::TableName>(folly::to<hbase::pb::TableName>("table"));
>     auto client = std::make_unique<hbase::Client>(*conf);
>     auto table = client->Table(*tn);
>     std::cout << "closing " << std::endl << std::endl << std::endl;
>     table->Close();
>     client->Close();
> }
> {code}
>  
> Logs :
> {code:java}
> [julia@fdf346c7aa2b myhbase]$ ./myhbase
> opening
> WARNING: Logging before InitGoogleLogging() is written to STDERR
> I0216 08:54:44.391023  5259 location-cache.cc:77] Connecting to ZooKeeper. 
> Quorum:quorum
> 2021-02-16 08:54:44,391:5259(0x7fa88b38d3c0):ZOO_INFO@log_env@726: Client 
> environment:zookeeper.version=zookeeper C client 3.4.8
> 2021-02-16 08:54:44,391:5259(0x7fa88b38d3c0):ZOO_INFO@log_env@730: Client 
> environment:host.name=fdf346c7aa2b
> 2021-02-16 08:54:44,391:5259(0x7fa88b38d3c0):ZOO_INFO@log_env@737: Client 
> environment:os.name=Linux
> 2021-02-16 08:54:44,391:5259(0x7fa88b38d3c0):ZOO_INFO@log_env@738: Client 
> environment:os.arch=5.8.1-1.el7.elrepo.x86_64
> 2021-02-16 08:54:44,391:5259(0x7fa88b38d3c0):ZOO_INFO@log_env@739: Client 
> environment:os.version=#1 SMP Tue Aug 11 12:01:11 EDT 2020
> 2021-02-16 08:54:44,391:5259(0x7fa88b38d3c0):ZOO_INFO@log_env@747: Client 
> environment:user.name=(null)
> 2021-02-16 08:54:44,391:5259(0x7fa88b38d3c0):ZOO_INFO@log_env@755: Client 
> environment:user.home=/home/julia
> 2021-02-16 08:54:44,391:5259(0x7fa88b38d3c0):ZOO_INFO@log_env@767: Client 
> environment:user.dir=/usr/src/hbase/myhbase
> 2021-02-16 08:54:44,391:5259(0x7fa88b38d3c0):ZOO_INFO@zookeeper_init@800: 
> Initiating client connection, host=quorum sessionTimeout=90000 watcher=(nil) 
> sessionId=0 sessionPasswd=<null> context=(nil) flags=0
> 2021-02-16 08:54:44,400:5259(0x7fa88b38d3c0):ZOO_DEBUG@start_threads@221: 
> starting threads...
> 2021-02-16 08:54:44,400:5259(0x7fa7a77fe700):ZOO_DEBUG@do_io@367: started IO 
> thread
> 2021-02-16 08:54:44,400:5259(0x7fa7a6ffd700):ZOO_DEBUG@do_completion@459: 
> started completion thread
> closing
> I0216 08:54:44.400823  5259 client.cc:56] called destructor on Client
> 2021-02-16 08:54:44,400:5259(0x7fa7a77fe700):ZOO_INFO@check_events@1728: 
> initiated connection to server [192.168.197.12:2181]
> 2021-02-16 08:54:44,403:5259(0x7fa7a77fe700):ZOO_INFO@check_events@1775: 
> session establishment complete on server [192.168.197.12:2181], 
> sessionId=0x27640b8a9bd0932, negotiated timeout=60000
> 2021-02-16 08:54:44,403:5259(0x7fa7a77fe700):ZOO_DEBUG@check_events@1781: 
> Calling a watcher for a ZOO_SESSION_EVENT and the state=ZOO_CONNECTED_STATE
> 2021-02-16 
> 08:54:44,403:5259(0x7fa7a6ffd700):ZOO_DEBUG@process_completions@2132: Calling 
> a watcher for node [], type = -1 event=ZOO_SESSION_EVENT
> I0216 08:54:44.403533  5259 table.cc:50] called destructor on Table
> Slept 1
> Slept 2
> Slept 3
> Slept 4
> Slept 5
> 2021-02-16 
> 08:55:04,421:5259(0x7fa7a77fe700):ZOO_WARN@zookeeper_interest@1570: Exceeded 
> deadline by 19ms
> 2021-02-16 
> 08:55:04,421:5259(0x7fa7a77fe700):ZOO_DEBUG@zookeeper_process@2218: Got ping 
> response in 0 ms
> Slept 6
> Slept 7
> Slept 8
> Slept 9
> 2021-02-16 
> 08:55:24,436:5259(0x7fa7a77fe700):ZOO_WARN@zookeeper_interest@1570: Exceeded 
> deadline by 14ms
> 2021-02-16 
> 08:55:24,436:5259(0x7fa7a77fe700):ZOO_DEBUG@zookeeper_process@2218: Got ping 
> response in 0 ms
> Slept 10
> Slept 11
> Slept 12
> {code}
> As you can see, after calling destructors on Table and Client, a connection 
> to Zookeeper is still open, no other destructors are called.
> If I'm calling createClient()  function multiple times, I can see consumed 
> memory is growing and being released only after the program exits
>  
> Best regards,
> Julia



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to