Iuliia Emelianova created HBASE-25581:
-----------------------------------------

             Summary: 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: Iuliia Emelianova


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.3.4#803005)

Reply via email to