This is an automated email from the ASF dual-hosted git repository. zghao pushed a commit to branch HBASE-14850 in repository https://gitbox.apache.org/repos/asf/hbase.git
commit b5e5881649855873c3cb1a77d17b849db05e22e6 Author: Enis Soztutar <[email protected]> AuthorDate: Tue Aug 1 16:02:20 2017 -0700 HBASE-18459 [C++] Fix Segfault in location-cache --- hbase-native-client/core/configuration.cc | 2 +- hbase-native-client/core/location-cache.cc | 18 ++++++++++++------ hbase-native-client/core/location-cache.h | 4 ++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/hbase-native-client/core/configuration.cc b/hbase-native-client/core/configuration.cc index f4fc46d..1fd2851 100644 --- a/hbase-native-client/core/configuration.cc +++ b/hbase-native-client/core/configuration.cc @@ -24,8 +24,8 @@ #include <utility> #include <glog/logging.h> -#include <boost/lexical_cast.hpp> #include <boost/format.hpp> +#include <boost/lexical_cast.hpp> namespace hbase { diff --git a/hbase-native-client/core/location-cache.cc b/hbase-native-client/core/location-cache.cc index 5f68420..ed5f5dc 100644 --- a/hbase-native-client/core/location-cache.cc +++ b/hbase-native-client/core/location-cache.cc @@ -84,17 +84,20 @@ folly::Future<ServerName> LocationCache::LocateMeta() { } return meta_promise_->getFuture().onError([&](const folly::exception_wrapper &ew) { auto promise = InvalidateMeta(); - promise->setException(ew); + if (promise) { + promise->setException(ew); + } + throw ew; return ServerName{}; }); } -std::unique_ptr<folly::SharedPromise<hbase::pb::ServerName>> LocationCache::InvalidateMeta() { +std::shared_ptr<folly::SharedPromise<hbase::pb::ServerName>> LocationCache::InvalidateMeta() { VLOG(2) << "Invalidating meta location"; std::lock_guard<std::recursive_mutex> g(meta_lock_); if (meta_promise_ != nullptr) { // return the unique_ptr back to the caller. - std::unique_ptr<folly::SharedPromise<hbase::pb::ServerName>> ret = nullptr; + std::shared_ptr<folly::SharedPromise<hbase::pb::ServerName>> ret = nullptr; std::swap(ret, meta_promise_); return ret; } else { @@ -102,10 +105,13 @@ std::unique_ptr<folly::SharedPromise<hbase::pb::ServerName>> LocationCache::Inva } } -/// MUST hold the meta_lock_ void LocationCache::RefreshMetaLocation() { - meta_promise_ = std::make_unique<folly::SharedPromise<ServerName>>(); - cpu_executor_->add([&] { meta_promise_->setWith([&] { return this->ReadMetaLocation(); }); }); + meta_promise_ = std::make_shared<folly::SharedPromise<ServerName>>(); + auto p = meta_promise_; + cpu_executor_->add([this, p] { + std::lock_guard<std::recursive_mutex> g(meta_lock_); + p->setWith([&] { return this->ReadMetaLocation(); }); + }); } // Note: this is a blocking call to zookeeper diff --git a/hbase-native-client/core/location-cache.h b/hbase-native-client/core/location-cache.h index a374fb6..932bef7 100644 --- a/hbase-native-client/core/location-cache.h +++ b/hbase-native-client/core/location-cache.h @@ -137,7 +137,7 @@ class LocationCache : public AsyncRegionLocator { /** * Remove the cached location of meta. */ - std::unique_ptr<folly::SharedPromise<hbase::pb::ServerName>> InvalidateMeta(); + std::shared_ptr<folly::SharedPromise<hbase::pb::ServerName>> InvalidateMeta(); /** * Return cached region location corresponding to this row, @@ -201,7 +201,7 @@ class LocationCache : public AsyncRegionLocator { std::shared_ptr<hbase::Configuration> conf_; std::string zk_quorum_; std::shared_ptr<wangle::CPUThreadPoolExecutor> cpu_executor_; - std::unique_ptr<folly::SharedPromise<hbase::pb::ServerName>> meta_promise_; + std::shared_ptr<folly::SharedPromise<hbase::pb::ServerName>> meta_promise_; std::recursive_mutex meta_lock_; MetaUtil meta_util_; std::shared_ptr<ConnectionPool> cp_;
