[
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)