You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by en...@apache.org on 2017/09/15 21:20:36 UTC
[19/25] hbase git commit: HBASE-18725 [C++] Install header files as
well as library
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/load-client.cc
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/load-client.cc b/hbase-native-client/core/load-client.cc
deleted file mode 100644
index 8cceeef..0000000
--- a/hbase-native-client/core/load-client.cc
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <folly/Logging.h>
-#include <folly/Random.h>
-#include <gflags/gflags.h>
-
-#include <atomic>
-#include <chrono>
-#include <iostream>
-#include <thread>
-
-#include "core/client.h"
-#include "core/get.h"
-#include "core/put.h"
-#include "core/table.h"
-#include "serde/table-name.h"
-#include "utils/time-util.h"
-
-using hbase::Client;
-using hbase::Configuration;
-using hbase::Get;
-using hbase::Put;
-using hbase::Table;
-using hbase::pb::TableName;
-using hbase::TimeUtil;
-using folly::Random;
-
-DEFINE_string(table, "load_test_table", "What table to do the reads and writes with");
-DEFINE_string(families, "f", "comma separated list of column family names");
-DEFINE_string(conf, "", "Conf directory to read the config from (optional)");
-DEFINE_string(zookeeper, "localhost:2181", "What zk quorum to talk to");
-DEFINE_string(znode, "/hbase", "parent znode");
-DEFINE_uint64(num_rows, 1'000'000, "How many rows to write and read");
-DEFINE_uint64(num_cols, 1000, "How many columns there are in a row");
-DEFINE_int32(threads, 10, "How many client threads");
-DEFINE_int32(batch_num_rows, 100, "number of rows in one multi-get / multi-put");
-DEFINE_uint64(report_num_rows, 5000, "How frequent we should report the progress");
-DEFINE_bool(gets, true, "perform gets");
-DEFINE_bool(scans, true, "perform scans");
-DEFINE_bool(puts, true, "perform put's");
-DEFINE_bool(appends, true, "perform append's");
-
-static constexpr const char *kNumColumn = "num";
-static constexpr const char *incrPrefix = "i";
-static constexpr const char *appendPrefix = "a";
-
-std::string PrefixZero(int total_width, int num) {
- std::string str = std::to_string(num);
- int prefix_len = total_width - str.length();
- if (prefix_len > 0) {
- return std::string(prefix_len, '0') + str;
- }
- return str;
-}
-
-bool Verify(std::shared_ptr<hbase::Result> result, std::string family, int m) {
- auto col = std::to_string(m);
- if (!result->Value(family, col)) {
- LOG(ERROR) << "Column:" << col << " is not found for " << result->Row();
- return false;
- }
- auto l = *(result->Value(family, col));
- if (l != col) {
- LOG(ERROR) << "value " << *(result->Value(family, "1")) << " is not " << col;
- return false;
- }
- if (FLAGS_appends) {
- if (!result->Value(family, incrPrefix + col)) {
- LOG(ERROR) << "Column:" << (incrPrefix + col) << " is not found for " << result->Row();
- return false;
- }
- auto int_val = hbase::BytesUtil::ToInt64(*(result->Value(family, incrPrefix + col)));
- if (int_val != m) {
- LOG(ERROR) << "value is not " << col << " for " << result->Row();
- return false;
- }
- if (!result->Value(family, appendPrefix + col)) {
- LOG(ERROR) << "Column:" << (appendPrefix + col) << " is not found for " << result->Row();
- return false;
- }
- l = *(result->Value(family, appendPrefix + col));
- if (l != col) {
- LOG(ERROR) << "value " << *(result->Value(family, "1")) << " is not " << col;
- return false;
- }
- }
-
- return true;
-}
-
-bool Verify(std::shared_ptr<hbase::Result> result, const std::string &row,
- const std::vector<std::string> &families) {
- if (result == nullptr || result->IsEmpty()) {
- LOG(ERROR) << "didn't get result";
- return false;
- }
- if (result->Row().compare(row) != 0) {
- LOG(ERROR) << "row " << result->Row() << " is not the expected: " << row;
- return false;
- }
- // Test the values
- for (auto family : families) {
- if (!result->Value(family, kNumColumn)) {
- LOG(ERROR) << "Column:" << kNumColumn << " is not found for " << result->Row();
- return false;
- }
- auto cols = std::stoi(*(result->Value(family, kNumColumn)));
- VLOG(3) << "Result for row:" << row << " contains " << std::to_string(cols) << " columns";
- for (int m = 1; m <= cols; m++) {
- if (!Verify(result, family, m)) return false;
- }
- }
- return true;
-}
-
-bool DoScan(int iteration, uint64_t max_row, uint64_t rows, std::unique_ptr<Table> table,
- const std::vector<std::string> &families) {
- hbase::Scan scan{};
- auto start = iteration * rows;
- auto end = start + rows;
- auto width = std::to_string(max_row).length();
- scan.SetStartRow(PrefixZero(width, start));
- if (end != max_row && end != max_row + 1) {
- scan.SetStopRow(PrefixZero(width, end));
- }
-
- auto start_ns = TimeUtil::GetNowNanos();
- auto scanner = table->Scan(scan);
-
- auto cnt = 0;
- auto r = scanner->Next();
- while (r != nullptr) {
- auto row = PrefixZero(width, start + cnt);
- if (!Verify(r, row, families)) {
- return false;
- }
- cnt++;
- r = scanner->Next();
- if (cnt != 0 && cnt % FLAGS_report_num_rows == 0) {
- LOG(INFO) << "(Thread " << iteration << ") "
- << "Scan iterated over " << cnt << " results in "
- << TimeUtil::ElapsedMillis(start_ns) << " ms.";
- }
- }
- if (cnt != rows) {
- LOG(ERROR) << "(Thread " << iteration << ") "
- << "Expected number of results does not match. expected:" << rows
- << ", actual:" << cnt;
- return false;
- }
- LOG(INFO) << "(Thread " << iteration << ") "
- << "scanned " << std::to_string(cnt) << " rows in " << TimeUtil::ElapsedMillis(start_ns)
- << " ms.";
- return true;
-}
-
-bool DoGet(int iteration, uint64_t max_row, uint64_t rows, std::unique_ptr<Table> table,
- const std::vector<std::string> &families, uint64_t batch_num_rows) {
- auto width = std::to_string(max_row).length();
- auto start_ns = TimeUtil::GetNowNanos();
- for (uint64_t k = iteration; k <= max_row;) {
- uint64_t total_read = 0;
- std::vector<hbase::Get> gets;
- for (uint64_t i = 0; i < batch_num_rows && k <= max_row; ++i, k += FLAGS_threads) {
- std::string row = PrefixZero(width, k);
- hbase::Get get(row);
- gets.push_back(get);
- }
- VLOG(3) << "getting for " << batch_num_rows << " rows";
- auto results = table->Get(gets);
- if (results.size() != gets.size()) {
- LOG(ERROR) << "(Thread " << iteration << ") "
- << "Expected number of results does not match. expected:" << gets.size()
- << ", actual:" << results.size();
- return false;
- }
- for (uint64_t i = 0; i < batch_num_rows && i < results.size(); ++i) {
- if (!Verify(results[i], gets[i].row(), families)) {
- return false;
- }
- }
- total_read += gets.size();
- if (total_read != 0 && total_read % FLAGS_report_num_rows == 0) {
- LOG(INFO) << "(Thread " << iteration << ") "
- << "Sent " << total_read << " Multi-Get requests in "
- << TimeUtil::ElapsedMillis(start_ns) << " ms.";
- }
- k += batch_num_rows;
- }
- LOG(INFO) << "(Thread " << iteration << ") "
- << "Sent " << rows << " gets"
- << " in " << TimeUtil::ElapsedMillis(start_ns) << " ms.";
- return true;
-}
-
-void DoPut(int iteration, uint64_t max_row, uint64_t rows, int cols, std::unique_ptr<Table> table,
- const std::vector<std::string> &families) {
- auto start_ns = TimeUtil::GetNowNanos();
- auto width = std::to_string(max_row).length();
- for (uint64_t j = 0; j < rows; j++) {
- std::string row = PrefixZero(width, iteration * rows + j);
- auto put = Put{row};
- for (auto family : families) {
- auto n_cols = Random::rand32(1, cols);
- put.AddColumn(family, kNumColumn, std::to_string(n_cols));
- for (unsigned int k = 1; k <= n_cols; k++) {
- put.AddColumn(family, std::to_string(k), std::to_string(k));
- }
- }
- table->Put(put);
- if ((j + 1) % FLAGS_report_num_rows == 0) {
- LOG(INFO) << "(Thread " << iteration << ") "
- << "Written " << std::to_string(j + 1) << " rows in "
- << TimeUtil::ElapsedMillis(start_ns) << " ms.";
- }
- }
- LOG(INFO) << "(Thread " << iteration << ") "
- << "written " << std::to_string(rows) << " rows"
- << " in " << TimeUtil::ElapsedMillis(start_ns) << " ms.";
-}
-
-bool DoAppendIncrement(int iteration, uint64_t max_row, uint64_t rows, int cols,
- std::unique_ptr<Table> table, const std::vector<std::string> &families) {
- auto start_ns = TimeUtil::GetNowNanos();
- auto width = std::to_string(max_row).length();
- for (uint64_t j = 0; j < rows; j++) {
- std::string row = PrefixZero(width, iteration * rows + j);
- hbase::Get get(row);
- auto result = table->Get(get);
- for (auto family : families) {
- auto n_cols = std::stoi(*(result->Value(family, kNumColumn)));
- for (unsigned int k = 1; k <= n_cols; k++) {
- table->Increment(
- hbase::Increment{row}.AddColumn(family, incrPrefix + std::to_string(k), k));
- if (!table->Append(hbase::Append{row}.Add(family, appendPrefix + std::to_string(k),
- std::to_string(k)))) {
- LOG(ERROR) << "(Thread " << iteration << ") "
- << "append for " << row << " family: " << family << " failed";
- return false;
- }
- }
- }
- if ((j + 1) % FLAGS_report_num_rows == 0)
- LOG(INFO) << "(Thread " << iteration << ") "
- << "Written " << std::to_string(j + 1) << " increments"
- << " in " << TimeUtil::ElapsedMillis(start_ns) << " ms.";
- }
- LOG(INFO) << "(Thread " << iteration << ") "
- << "written " << std::to_string(rows) << " increments"
- << " in " << TimeUtil::ElapsedMillis(start_ns) << " ms.";
- return true;
-}
-
-int main(int argc, char *argv[]) {
- gflags::SetUsageMessage("Load client to manipulate multiple rows from HBase on the comamnd line");
- gflags::ParseCommandLineFlags(&argc, &argv, true);
- google::InitGoogleLogging(argv[0]);
- google::InstallFailureSignalHandler();
- FLAGS_logtostderr = 1;
- FLAGS_stderrthreshold = 1;
-
- if (FLAGS_batch_num_rows < 1) {
- LOG(ERROR) << "size of multi get should be positive";
- return -1;
- }
- if (!FLAGS_gets && !FLAGS_scans && !FLAGS_puts) {
- LOG(ERROR) << "Must perform at least Get or Put operations";
- return -1;
- }
- std::shared_ptr<Configuration> conf = nullptr;
- if (FLAGS_conf == "") {
- // Configuration
- conf = std::make_shared<Configuration>();
- conf->Set("hbase.zookeeper.quorum", FLAGS_zookeeper);
- conf->Set("zookeeper.znode.parent", FLAGS_znode);
- } else {
- setenv("HBASE_CONF", FLAGS_conf.c_str(), 1);
- hbase::HBaseConfigurationLoader loader;
- conf = std::make_shared<Configuration>(loader.LoadDefaultResources().value());
- }
- auto tn = std::make_shared<TableName>(folly::to<TableName>(FLAGS_table));
- auto num_puts = FLAGS_num_rows;
-
- auto client = std::make_unique<Client>(*conf);
-
- // Do the Put requests
-
- std::vector<std::string> families;
- std::size_t pos = 0, found;
- while ((found = FLAGS_families.find_first_of(',', pos)) != std::string::npos) {
- families.push_back(FLAGS_families.substr(pos, found - pos));
- pos = found + 1;
- }
- families.push_back(FLAGS_families.substr(pos));
-
- int rows = FLAGS_num_rows / FLAGS_threads;
- if (FLAGS_num_rows % FLAGS_threads != 0) rows++;
- int cols = FLAGS_num_cols;
- std::atomic<int8_t> succeeded{1}; // not using bool since we want atomic &=
- if (FLAGS_puts) {
- LOG(INFO) << "Sending put requests";
- auto start_ns = TimeUtil::GetNowNanos();
- std::vector<std::thread> writer_threads;
- for (int i = 0; i < FLAGS_threads; i++) {
- writer_threads.push_back(std::thread([&, i] {
- auto table = client->Table(*tn);
- DoPut(i, FLAGS_num_rows - 1, rows, cols, std::move(table), families);
- }));
- }
- for (auto &t : writer_threads) {
- t.join();
- }
- LOG(INFO) << "Successfully sent " << num_puts << " Put requests in "
- << TimeUtil::ElapsedMillis(start_ns) << " ms.";
- }
- if (FLAGS_appends) {
- LOG(INFO) << "Sending append/increment requests";
- auto start_ns = TimeUtil::GetNowNanos();
- std::vector<std::thread> writer_threads;
- for (int i = 0; i < FLAGS_threads; i++) {
- writer_threads.push_back(std::thread([&, i] {
- auto table = client->Table(*tn);
- succeeded &=
- DoAppendIncrement(i, FLAGS_num_rows - 1, rows, cols, std::move(table), families);
- }));
- }
- for (auto &t : writer_threads) {
- t.join();
- }
- LOG(INFO) << "Successfully sent " << num_puts << " append requests in "
- << TimeUtil::ElapsedMillis(start_ns) << " ms.";
- }
-
- if (FLAGS_scans) {
- LOG(INFO) << "Sending scan requests";
- auto start_ns = TimeUtil::GetNowNanos();
- std::vector<std::thread> reader_threads;
- for (int i = 0; i < FLAGS_threads; i++) {
- reader_threads.push_back(std::thread([&, i] {
- auto table1 = client->Table(*tn);
- succeeded &= DoScan(i, FLAGS_num_rows - 1, rows, std::move(table1), families);
- }));
- }
- for (auto &t : reader_threads) {
- t.join();
- }
-
- LOG(INFO) << (succeeded.load() ? "Successfully " : "Failed. ") << " scannned " << num_puts
- << " rows in " << TimeUtil::ElapsedMillis(start_ns) << " ms.";
- }
-
- if (FLAGS_gets) {
- LOG(INFO) << "Sending get requests";
- auto start_ns = TimeUtil::GetNowNanos();
- std::vector<std::thread> reader_threads;
- for (int i = 0; i < FLAGS_threads; i++) {
- reader_threads.push_back(std::thread([&, i] {
- auto table1 = client->Table(*tn);
- succeeded &=
- DoGet(i, FLAGS_num_rows - 1, rows, std::move(table1), families, FLAGS_batch_num_rows);
- }));
- }
- for (auto &t : reader_threads) {
- t.join();
- }
-
- LOG(INFO) << (succeeded.load() ? "Successful. " : "Failed. ") << " sent multi-get requests for "
- << num_puts << " rows in " << TimeUtil::ElapsedMillis(start_ns) << " ms.";
- }
- client->Close();
-
- return succeeded.load() ? 0 : -1;
-}
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/location-cache-retry-test.cc
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/location-cache-retry-test.cc b/hbase-native-client/core/location-cache-retry-test.cc
deleted file mode 100644
index f154b69..0000000
--- a/hbase-native-client/core/location-cache-retry-test.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <gtest/gtest.h>
-
-#include "core/append.h"
-#include "core/cell.h"
-#include "core/client.h"
-#include "core/configuration.h"
-#include "core/delete.h"
-#include "core/get.h"
-#include "core/hbase-configuration-loader.h"
-#include "core/increment.h"
-#include "core/meta-utils.h"
-#include "core/put.h"
-#include "core/result.h"
-#include "core/table.h"
-#include "exceptions/exception.h"
-#include "serde/table-name.h"
-#include "test-util/test-util.h"
-#include "utils/bytes-util.h"
-
-using hbase::Cell;
-using hbase::Configuration;
-using hbase::Get;
-using hbase::MetaUtil;
-using hbase::RetriesExhaustedException;
-using hbase::Put;
-using hbase::Table;
-using hbase::TestUtil;
-
-using std::chrono_literals::operator"" s;
-
-class LocationCacheRetryTest : public ::testing::Test {
- public:
- static std::unique_ptr<hbase::TestUtil> test_util;
- static void SetUpTestCase() {
- google::InstallFailureSignalHandler();
- test_util = std::make_unique<hbase::TestUtil>();
- test_util->StartMiniCluster(2);
- test_util->conf()->SetInt("hbase.client.retries.number", 5);
- }
-};
-
-std::unique_ptr<hbase::TestUtil> LocationCacheRetryTest::test_util = nullptr;
-
-TEST_F(LocationCacheRetryTest, GetFromMetaTable) {
- auto tn = folly::to<hbase::pb::TableName>("hbase:meta");
- auto row = "test1";
-
- hbase::Client client(*LocationCacheRetryTest::test_util->conf());
-
- // do a get against the other table, but not the actual table "t".
- auto table = client.Table(tn);
- hbase::Get get(row);
- auto result = table->Get(get);
-
- LocationCacheRetryTest::test_util->MoveRegion(MetaUtil::kMetaRegion, "");
-
- std::this_thread::sleep_for(3s); // sleep 3 sec
-
- result = table->Get(get);
-}
-
-TEST_F(LocationCacheRetryTest, PutGet) {
- LocationCacheRetryTest::test_util->CreateTable("t", "d");
- LocationCacheRetryTest::test_util->CreateTable("t2", "d");
-
- auto tn = folly::to<hbase::pb::TableName>("t");
- auto tn2 = folly::to<hbase::pb::TableName>("t2");
- auto row = "test1";
-
- hbase::Client client(*LocationCacheRetryTest::test_util->conf());
-
- // do a get against the other table, but not the actual table "t".
- auto table = client.Table(tn);
- auto table2 = client.Table(tn2);
- hbase::Get get(row);
- auto result = table2->Get(get);
-
- // we should have already cached the location of meta right now. Now
- // move the meta region to the other server so that we will get a NotServingRegionException
- // when we do the actual location lookup request. If there is no invalidation
- // of the meta's own location, then following put/get will result in retries exhausted.
- LocationCacheRetryTest::test_util->MoveRegion(MetaUtil::kMetaRegion, "");
-
- std::this_thread::sleep_for(3s); // sleep 3 sec
-
- table->Put(Put{row}.AddColumn("d", "1", "value1"));
-
- result = table->Get(get);
-
- ASSERT_TRUE(!result->IsEmpty()) << "Result shouldn't be empty.";
- EXPECT_EQ("test1", result->Row());
- EXPECT_EQ("value1", *(result->Value("d", "1")));
-}
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/location-cache-test.cc
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/location-cache-test.cc b/hbase-native-client/core/location-cache-test.cc
deleted file mode 100644
index fd96ff3..0000000
--- a/hbase-native-client/core/location-cache-test.cc
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-#include "core/location-cache.h"
-
-#include <folly/Memory.h>
-#include <gtest/gtest.h>
-
-#include <chrono>
-
-#include "core/keyvalue-codec.h"
-#include "if/HBase.pb.h"
-#include "serde/table-name.h"
-#include "test-util/test-util.h"
-
-using hbase::Cell;
-using hbase::Configuration;
-using hbase::ConnectionPool;
-using hbase::MetaUtil;
-using hbase::LocationCache;
-using hbase::TestUtil;
-using hbase::KeyValueCodec;
-using std::chrono::milliseconds;
-
-class LocationCacheTest : public ::testing::Test {
- protected:
- static void SetUpTestCase() {
- google::InstallFailureSignalHandler();
- test_util_ = std::make_unique<TestUtil>();
- test_util_->StartMiniCluster(2);
- }
- static void TearDownTestCase() { test_util_.release(); }
-
- virtual void SetUp() {}
- virtual void TearDown() {}
-
- public:
- static std::unique_ptr<TestUtil> test_util_;
-};
-
-std::unique_ptr<TestUtil> LocationCacheTest::test_util_ = nullptr;
-
-TEST_F(LocationCacheTest, TestGetMetaNodeContents) {
- auto cpu = std::make_shared<wangle::CPUThreadPoolExecutor>(4);
- auto io = std::make_shared<wangle::IOThreadPoolExecutor>(4);
- auto codec = std::make_shared<KeyValueCodec>();
- auto cp = std::make_shared<ConnectionPool>(io, cpu, codec, LocationCacheTest::test_util_->conf());
- LocationCache cache{LocationCacheTest::test_util_->conf(), io, cpu, cp};
- auto f = cache.LocateMeta();
- auto result = f.get();
- ASSERT_FALSE(f.hasException());
- ASSERT_TRUE(result.has_port());
- ASSERT_TRUE(result.has_host_name());
- cpu->stop();
- io->stop();
-}
-
-TEST_F(LocationCacheTest, TestGetRegionLocation) {
- auto cpu = std::make_shared<wangle::CPUThreadPoolExecutor>(4);
- auto io = std::make_shared<wangle::IOThreadPoolExecutor>(4);
- auto codec = std::make_shared<KeyValueCodec>();
- auto cp = std::make_shared<ConnectionPool>(io, cpu, codec, LocationCacheTest::test_util_->conf());
- LocationCache cache{LocationCacheTest::test_util_->conf(), io, cpu, cp};
-
- // If there is no table this should throw an exception
- auto tn = folly::to<hbase::pb::TableName>("t");
- auto row = "test";
- ASSERT_ANY_THROW(cache.LocateFromMeta(tn, row).get(milliseconds(1000)));
- LocationCacheTest::test_util_->CreateTable("t", "d");
- auto loc = cache.LocateFromMeta(tn, row).get(milliseconds(1000));
- ASSERT_TRUE(loc != nullptr);
- cpu->stop();
- io->stop();
-}
-
-TEST_F(LocationCacheTest, TestCaching) {
- auto cpu = std::make_shared<wangle::CPUThreadPoolExecutor>(4);
- auto io = std::make_shared<wangle::IOThreadPoolExecutor>(4);
- auto codec = std::make_shared<KeyValueCodec>();
- auto cp = std::make_shared<ConnectionPool>(io, cpu, codec, LocationCacheTest::test_util_->conf());
- LocationCache cache{LocationCacheTest::test_util_->conf(), io, cpu, cp};
-
- auto tn_1 = folly::to<hbase::pb::TableName>("t1");
- auto tn_2 = folly::to<hbase::pb::TableName>("t2");
- auto tn_3 = folly::to<hbase::pb::TableName>("t3");
- auto row_a = "a";
-
- // test location pulled from meta gets cached
- ASSERT_ANY_THROW(cache.LocateRegion(tn_1, row_a).get(milliseconds(1000)));
- ASSERT_ANY_THROW(cache.LocateFromMeta(tn_1, row_a).get(milliseconds(1000)));
- LocationCacheTest::test_util_->CreateTable("t1", "d");
-
- ASSERT_FALSE(cache.IsLocationCached(tn_1, row_a));
- auto loc = cache.LocateRegion(tn_1, row_a).get(milliseconds(1000));
- ASSERT_TRUE(cache.IsLocationCached(tn_1, row_a));
- ASSERT_EQ(loc, cache.GetCachedLocation(tn_1, row_a));
-
- // test with two regions
- std::vector<std::string> keys;
- keys.push_back("b");
- LocationCacheTest::test_util_->CreateTable("t2", "d", keys);
-
- ASSERT_FALSE(cache.IsLocationCached(tn_2, "a"));
- loc = cache.LocateRegion(tn_2, "a").get(milliseconds(1000));
- ASSERT_TRUE(cache.IsLocationCached(tn_2, "a"));
- ASSERT_EQ(loc, cache.GetCachedLocation(tn_2, "a"));
-
- ASSERT_FALSE(cache.IsLocationCached(tn_2, "b"));
- loc = cache.LocateRegion(tn_2, "b").get(milliseconds(1000));
- ASSERT_TRUE(cache.IsLocationCached(tn_2, "b"));
- ASSERT_EQ(loc, cache.GetCachedLocation(tn_2, "b"));
- ASSERT_TRUE(cache.IsLocationCached(tn_2, "ba"));
- ASSERT_EQ(loc, cache.GetCachedLocation(tn_2, "ba"));
-
- // test with three regions
- keys.clear();
- keys.push_back("b");
- keys.push_back("c");
- LocationCacheTest::test_util_->CreateTable("t3", "d", keys);
-
- ASSERT_FALSE(cache.IsLocationCached(tn_3, "c"));
- ASSERT_FALSE(cache.IsLocationCached(tn_3, "ca"));
- loc = cache.LocateRegion(tn_3, "ca").get(milliseconds(1000));
- ASSERT_TRUE(cache.IsLocationCached(tn_3, "c"));
- ASSERT_EQ(loc, cache.GetCachedLocation(tn_3, "c"));
- ASSERT_TRUE(cache.IsLocationCached(tn_3, "ca"));
- ASSERT_EQ(loc, cache.GetCachedLocation(tn_3, "ca"));
-
- ASSERT_FALSE(cache.IsLocationCached(tn_3, "b"));
- loc = cache.LocateRegion(tn_3, "b").get(milliseconds(1000));
- ASSERT_TRUE(cache.IsLocationCached(tn_3, "b"));
- ASSERT_EQ(loc, cache.GetCachedLocation(tn_3, "b"));
- ASSERT_TRUE(cache.IsLocationCached(tn_3, "ba"));
- ASSERT_EQ(loc, cache.GetCachedLocation(tn_3, "ba"));
-
- // clear second region
- cache.ClearCachedLocation(tn_3, "b");
- ASSERT_FALSE(cache.IsLocationCached(tn_3, "b"));
-
- ASSERT_FALSE(cache.IsLocationCached(tn_3, "a"));
- loc = cache.LocateRegion(tn_3, "a").get(milliseconds(1000));
- ASSERT_TRUE(cache.IsLocationCached(tn_3, "a"));
- ASSERT_EQ(loc, cache.GetCachedLocation(tn_3, "a"));
- ASSERT_TRUE(cache.IsLocationCached(tn_3, "abc"));
- ASSERT_EQ(loc, cache.GetCachedLocation(tn_3, "abc"));
-
- cpu->stop();
- io->stop();
-}
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/location-cache.cc
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/location-cache.cc b/hbase-native-client/core/location-cache.cc
deleted file mode 100644
index b728d95..0000000
--- a/hbase-native-client/core/location-cache.cc
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-#include "core/location-cache.h"
-
-#include <folly/Conv.h>
-#include <folly/Logging.h>
-#include <folly/io/IOBuf.h>
-#include <wangle/concurrent/CPUThreadPoolExecutor.h>
-#include <wangle/concurrent/IOThreadPoolExecutor.h>
-
-#include <map>
-#include <shared_mutex>
-#include <utility>
-
-#include "connection/response.h"
-#include "connection/rpc-connection.h"
-#include "core/meta-utils.h"
-#include "exceptions/exception.h"
-#include "if/Client.pb.h"
-#include "if/ZooKeeper.pb.h"
-#include "serde/region-info.h"
-#include "serde/server-name.h"
-#include "serde/zk.h"
-
-using hbase::pb::MetaRegionServer;
-using hbase::pb::ServerName;
-using hbase::pb::TableName;
-
-namespace hbase {
-
-LocationCache::LocationCache(std::shared_ptr<hbase::Configuration> conf,
- std::shared_ptr<wangle::IOThreadPoolExecutor> io_executor,
- std::shared_ptr<wangle::CPUThreadPoolExecutor> cpu_executor,
- std::shared_ptr<ConnectionPool> cp)
- : conf_(conf),
- io_executor_(io_executor),
- cpu_executor_(cpu_executor),
- cp_(cp),
- meta_promise_(nullptr),
- meta_lock_(),
- meta_util_(),
- zk_(nullptr),
- cached_locations_(),
- locations_lock_() {
- zk_quorum_ = ZKUtil::ParseZooKeeperQuorum(*conf_);
- EnsureZooKeeperConnection();
-}
-
-LocationCache::~LocationCache() { CloseZooKeeperConnection(); }
-
-void LocationCache::CloseZooKeeperConnection() {
- if (zk_ != nullptr) {
- zookeeper_close(zk_);
- zk_ = nullptr;
- LOG(INFO) << "Closed connection to ZooKeeper.";
- }
-}
-
-void LocationCache::EnsureZooKeeperConnection() {
- if (zk_ == nullptr) {
- LOG(INFO) << "Connecting to ZooKeeper. Quorum:" + zk_quorum_;
- auto session_timeout = ZKUtil::SessionTimeout(*conf_);
- zk_ = zookeeper_init(zk_quorum_.c_str(), nullptr, session_timeout, nullptr, nullptr, 0);
- }
-}
-
-folly::Future<ServerName> LocationCache::LocateMeta() {
- std::lock_guard<std::recursive_mutex> g(meta_lock_);
- if (meta_promise_ == nullptr) {
- this->RefreshMetaLocation();
- }
- return meta_promise_->getFuture().onError([&](const folly::exception_wrapper &ew) {
- auto promise = InvalidateMeta();
- if (promise) {
- promise->setException(ew);
- }
- throw ew;
- return ServerName{};
- });
-}
-
-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::shared_ptr<folly::SharedPromise<hbase::pb::ServerName>> ret = nullptr;
- std::swap(ret, meta_promise_);
- return ret;
- } else {
- return nullptr;
- }
-}
-
-void LocationCache::RefreshMetaLocation() {
- 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
-ServerName LocationCache::ReadMetaLocation() {
- auto buf = folly::IOBuf::create(4096);
- ZkDeserializer derser;
- EnsureZooKeeperConnection();
-
- // This needs to be int rather than size_t as that's what ZK expects.
- int len = buf->capacity();
- std::string zk_node = ZKUtil::MetaZNode(*conf_);
- int zk_result = zoo_get(this->zk_, zk_node.c_str(), 0,
- reinterpret_cast<char *>(buf->writableData()), &len, nullptr);
- if (zk_result != ZOK || len < 9) {
- LOG(ERROR) << "Error getting meta location.";
- // We just close the zk connection, and let the upper levels retry.
- CloseZooKeeperConnection();
- throw std::runtime_error("Error getting meta location. Quorum: " + zk_quorum_);
- }
- buf->append(len);
-
- MetaRegionServer mrs;
- if (derser.Parse(buf.get(), &mrs) == false) {
- LOG(ERROR) << "Unable to decode";
- throw std::runtime_error("Error getting meta location (Unable to decode). Quorum: " +
- zk_quorum_);
- }
- return mrs.server();
-}
-
-folly::Future<std::shared_ptr<RegionLocation>> LocationCache::LocateFromMeta(
- const TableName &tn, const std::string &row) {
- return this->LocateMeta()
- .via(cpu_executor_.get())
- .then([this](ServerName sn) {
- // TODO: use RpcClient?
- auto remote_id = std::make_shared<ConnectionId>(sn.host_name(), sn.port());
- return this->cp_->GetConnection(remote_id);
- })
- .then([tn, row, this](std::shared_ptr<RpcConnection> rpc_connection) {
- return rpc_connection->SendRequest(std::move(meta_util_.MetaRequest(tn, row)));
- })
- .onError([&](const folly::exception_wrapper &ew) {
- auto promise = InvalidateMeta();
- throw ew;
- return static_cast<std::unique_ptr<Response>>(nullptr);
- })
- .then([tn, this](std::unique_ptr<Response> resp) {
- // take the protobuf response and make it into
- // a region location.
- return meta_util_.CreateLocation(std::move(*resp), tn);
- })
- .then([tn, this](std::shared_ptr<RegionLocation> rl) {
- // Make sure that the correct location was found.
- if (rl->region_info().table_name().namespace_() != tn.namespace_() ||
- rl->region_info().table_name().qualifier() != tn.qualifier()) {
- throw TableNotFoundException(folly::to<std::string>(tn));
- }
- return rl;
- })
- .then([this](std::shared_ptr<RegionLocation> rl) {
- auto remote_id =
- std::make_shared<ConnectionId>(rl->server_name().host_name(), rl->server_name().port());
- return rl;
- })
- .then([tn, this](std::shared_ptr<RegionLocation> rl) {
- // now add fetched location to the cache.
- this->CacheLocation(tn, rl);
- return rl;
- });
-}
-
-constexpr const char *MetaUtil::kMetaRegionName;
-
-folly::Future<std::shared_ptr<RegionLocation>> LocationCache::LocateRegion(
- const TableName &tn, const std::string &row, const RegionLocateType locate_type,
- const int64_t locate_ns) {
- // We maybe asked to locate meta itself
- if (MetaUtil::IsMeta(tn)) {
- return LocateMeta().then([this](const ServerName &server_name) {
- auto rl = std::make_shared<RegionLocation>(MetaUtil::kMetaRegionName,
- meta_util_.meta_region_info(), server_name);
- return rl;
- });
- }
-
- // TODO: implement region locate type and timeout
- auto cached_loc = this->GetCachedLocation(tn, row);
- if (cached_loc != nullptr) {
- return cached_loc;
- } else {
- return this->LocateFromMeta(tn, row);
- }
-}
-
-// must hold shared lock on locations_lock_
-std::shared_ptr<RegionLocation> LocationCache::GetCachedLocation(const hbase::pb::TableName &tn,
- const std::string &row) {
- auto t_locs = this->GetTableLocations(tn);
- std::shared_lock<folly::SharedMutexWritePriority> lock(locations_lock_);
-
- // looking for the "floor" key as a start key
- auto possible_region = t_locs->upper_bound(row);
-
- if (t_locs->empty()) {
- VLOG(5) << "Could not find region in cache, table map is empty";
- return nullptr;
- }
-
- if (possible_region == t_locs->begin()) {
- VLOG(5) << "Could not find region in cache, all keys are greater, row:" << row
- << " ,possible_region:" << possible_region->second->DebugString();
- return nullptr;
- }
- --possible_region;
-
- VLOG(5) << "Found possible region in cache for row:" << row
- << " ,possible_region:" << possible_region->second->DebugString();
-
- // found possible start key, now need to check end key
- if (possible_region->second->region_info().end_key() == "" ||
- possible_region->second->region_info().end_key() > row) {
- VLOG(2) << "Found region in cache for row:" << row
- << " ,region:" << possible_region->second->DebugString();
- return possible_region->second;
- } else {
- return nullptr;
- }
-}
-
-// must hold unique lock on locations_lock_
-void LocationCache::CacheLocation(const hbase::pb::TableName &tn,
- const std::shared_ptr<RegionLocation> loc) {
- auto t_locs = this->GetTableLocations(tn);
- std::unique_lock<folly::SharedMutexWritePriority> lock(locations_lock_);
-
- (*t_locs)[loc->region_info().start_key()] = loc;
- VLOG(1) << "Cached location for region:" << loc->DebugString();
-}
-
-// must hold shared lock on locations_lock_
-bool LocationCache::IsLocationCached(const hbase::pb::TableName &tn, const std::string &row) {
- return (this->GetCachedLocation(tn, row) != nullptr);
-}
-
-// shared lock needed for cases when this table has been requested before;
-// in the rare case it hasn't, unique lock will be grabbed to add it to cache
-std::shared_ptr<hbase::PerTableLocationMap> LocationCache::GetTableLocations(
- const hbase::pb::TableName &tn) {
- auto found_locs = this->GetCachedTableLocations(tn);
- if (found_locs == nullptr) {
- found_locs = this->GetNewTableLocations(tn);
- }
- return found_locs;
-}
-
-std::shared_ptr<hbase::PerTableLocationMap> LocationCache::GetCachedTableLocations(
- const hbase::pb::TableName &tn) {
- folly::SharedMutexWritePriority::ReadHolder r_holder{locations_lock_};
-
- auto table_locs = cached_locations_.find(tn);
- if (table_locs != cached_locations_.end()) {
- return table_locs->second;
- } else {
- return nullptr;
- }
-}
-
-std::shared_ptr<hbase::PerTableLocationMap> LocationCache::GetNewTableLocations(
- const hbase::pb::TableName &tn) {
- // double-check locking under upgradable lock
- folly::SharedMutexWritePriority::UpgradeHolder u_holder{locations_lock_};
-
- auto table_locs = cached_locations_.find(tn);
- if (table_locs != cached_locations_.end()) {
- return table_locs->second;
- }
- folly::SharedMutexWritePriority::WriteHolder w_holder{std::move(u_holder)};
-
- auto t_locs_p = std::make_shared<std::map<std::string, std::shared_ptr<RegionLocation>>>();
- cached_locations_.insert(std::make_pair(tn, t_locs_p));
- return t_locs_p;
-}
-
-// must hold unique lock on locations_lock_
-void LocationCache::ClearCache() {
- std::unique_lock<folly::SharedMutexWritePriority> lock(locations_lock_);
- cached_locations_.clear();
-}
-
-// must hold unique lock on locations_lock_
-void LocationCache::ClearCachedLocations(const hbase::pb::TableName &tn) {
- VLOG(1) << "ClearCachedLocations, table:" << folly::to<std::string>(tn);
- std::unique_lock<folly::SharedMutexWritePriority> lock(locations_lock_);
- cached_locations_.erase(tn);
- if (MetaUtil::IsMeta(tn)) {
- InvalidateMeta();
- }
-}
-
-// must hold unique lock on locations_lock_
-void LocationCache::ClearCachedLocation(const hbase::pb::TableName &tn, const std::string &row) {
- VLOG(1) << "ClearCachedLocation, table:" << folly::to<std::string>(tn) << ", row:" << row;
- auto table_locs = this->GetTableLocations(tn);
- std::unique_lock<folly::SharedMutexWritePriority> lock(locations_lock_);
- table_locs->erase(row);
- if (MetaUtil::IsMeta(tn)) {
- InvalidateMeta();
- }
-}
-
-void LocationCache::UpdateCachedLocation(const RegionLocation &loc,
- const folly::exception_wrapper &error) {
- // TODO: just clears the location for now. We can inspect RegionMovedExceptions, etc later.
- ClearCachedLocation(loc.region_info().table_name(), loc.region_info().start_key());
-}
-} // namespace hbase
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/location-cache.h
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/location-cache.h b/hbase-native-client/core/location-cache.h
deleted file mode 100644
index 6eb61ef..0000000
--- a/hbase-native-client/core/location-cache.h
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-#pragma once
-
-#include <folly/ExceptionWrapper.h>
-#include <folly/Executor.h>
-#include <folly/SharedMutex.h>
-#include <folly/futures/Future.h>
-#include <folly/futures/SharedPromise.h>
-#include <wangle/concurrent/CPUThreadPoolExecutor.h>
-#include <wangle/concurrent/IOThreadPoolExecutor.h>
-#include <zookeeper/zookeeper.h>
-
-#include <map>
-#include <memory>
-#include <mutex>
-#include <string>
-#include <unordered_map>
-
-#include "connection/connection-pool.h"
-#include "core/async-region-locator.h"
-#include "core/configuration.h"
-#include "core/meta-utils.h"
-#include "core/region-location.h"
-#include "core/zk-util.h"
-#include "serde/table-name.h"
-
-namespace hbase {
-// Forward
-class Request;
-class Response;
-namespace pb {
-class ServerName;
-class TableName;
-}
-
-/** Equals function for TableName (uses namespace and table name) */
-struct TableNameEquals {
- /** equals */
- bool operator()(const hbase::pb::TableName &lht, const hbase::pb::TableName &rht) const {
- return lht.namespace_() == rht.namespace_() && lht.qualifier() == rht.qualifier();
- }
-};
-
-/** Hash for TableName. */
-struct TableNameHash {
- /** hash */
- std::size_t operator()(hbase::pb::TableName const &t) const {
- std::size_t h = 0;
- boost::hash_combine(h, t.namespace_());
- boost::hash_combine(h, t.qualifier());
- return h;
- }
-};
-
-// typedefs for location cache
-typedef std::map<std::string, std::shared_ptr<RegionLocation>> PerTableLocationMap;
-typedef std::unordered_map<hbase::pb::TableName, std::shared_ptr<PerTableLocationMap>,
- TableNameHash, TableNameEquals>
- RegionLocationMap;
-
-/**
- * Class that can look up and cache locations.
- */
-class LocationCache : public AsyncRegionLocator {
- public:
- /**
- * Constructor.
- * @param conf Configuration instance to fetch Zookeeper Quorum and Zookeeper Znode.
- * @param cpu_executor executor used to run non network IO based
- * continuations.
- * @param io_executor executor used to talk to the network
- */
- LocationCache(std::shared_ptr<hbase::Configuration> conf,
- std::shared_ptr<wangle::IOThreadPoolExecutor> io_executor,
- std::shared_ptr<wangle::CPUThreadPoolExecutor> cpu_executor,
- std::shared_ptr<ConnectionPool> cp);
- /**
- * Destructor.
- * This will clean up the zookeeper connections.
- */
- ~LocationCache();
-
- /**
- * Where is meta hosted.
- *
- * TODO: This should be a RegionLocation.
- */
- folly::Future<hbase::pb::ServerName> LocateMeta();
-
- /**
- * Go read meta and find out where a region is located. Most users should
- * never call this method directly and should use LocateRegion() instead.
- *
- * @param tn Table name of the table to look up. This object must live until
- * after the future is returned
- *
- * @param row of the table to look up. This object must live until after the
- * future is returned
- */
- folly::Future<std::shared_ptr<RegionLocation>> LocateFromMeta(const hbase::pb::TableName &tn,
- const std::string &row);
-
- /**
- * The only method clients should use for meta lookups. If corresponding
- * location is cached, it's returned from the cache, otherwise lookup
- * in meta table is done, location is cached and then returned.
- * It's expected that tiny fraction of invocations incurs meta scan.
- * This method is to look up non-meta regions; use LocateMeta() to get the
- * location of hbase:meta region.
- *
- * @param tn Table name of the table to look up. This object must live until
- * after the future is returned
- *
- * @param row of the table to look up. This object must live until after the
- * future is returned
- */
- folly::Future<std::shared_ptr<RegionLocation>> LocateRegion(
- const hbase::pb::TableName &tn, const std::string &row,
- const RegionLocateType locate_type = RegionLocateType::kCurrent,
- const int64_t locate_ns = 0) override;
-
- /**
- * Remove the cached location of meta.
- */
- std::shared_ptr<folly::SharedPromise<hbase::pb::ServerName>> InvalidateMeta();
-
- /**
- * Return cached region location corresponding to this row,
- * nullptr if this location isn't cached.
- */
- std::shared_ptr<RegionLocation> GetCachedLocation(const hbase::pb::TableName &tn,
- const std::string &row);
-
- /**
- * Add non-meta region location in the cache (location of meta itself
- * is cached separately).
- */
- void CacheLocation(const hbase::pb::TableName &tn, const std::shared_ptr<RegionLocation> loc);
-
- /**
- * Check if location corresponding to this row key is cached.
- */
- bool IsLocationCached(const hbase::pb::TableName &tn, const std::string &row);
-
- /**
- * Return cached location for all region of this table.
- */
- std::shared_ptr<PerTableLocationMap> GetTableLocations(const hbase::pb::TableName &tn);
-
- /**
- * Completely clear location cache.
- */
- void ClearCache();
-
- /**
- * Clear all cached locations for one table.
- */
- void ClearCachedLocations(const hbase::pb::TableName &tn);
-
- /**
- * Clear cached region location.
- */
- void ClearCachedLocation(const hbase::pb::TableName &tn, const std::string &row);
-
- /**
- * Update cached region location, possibly using the information from exception.
- */
- void UpdateCachedLocation(const RegionLocation &loc,
- const folly::exception_wrapper &error) override;
-
- const std::string &zk_quorum() { return zk_quorum_; }
-
- private:
- void CloseZooKeeperConnection();
- void EnsureZooKeeperConnection();
-
- private:
- void RefreshMetaLocation();
- hbase::pb::ServerName ReadMetaLocation();
- std::shared_ptr<RegionLocation> CreateLocation(const Response &resp);
- std::shared_ptr<hbase::PerTableLocationMap> GetCachedTableLocations(
- const hbase::pb::TableName &tn);
- std::shared_ptr<hbase::PerTableLocationMap> GetNewTableLocations(const hbase::pb::TableName &tn);
-
- /* data */
- std::shared_ptr<hbase::Configuration> conf_;
- std::string zk_quorum_;
- std::shared_ptr<wangle::IOThreadPoolExecutor> io_executor_;
- std::shared_ptr<wangle::CPUThreadPoolExecutor> cpu_executor_;
- std::shared_ptr<folly::SharedPromise<hbase::pb::ServerName>> meta_promise_;
- std::recursive_mutex meta_lock_;
- MetaUtil meta_util_;
- std::shared_ptr<ConnectionPool> cp_;
-
- // cached region locations
- RegionLocationMap cached_locations_;
- folly::SharedMutexWritePriority locations_lock_;
-
- // TODO: migrate this to a smart pointer with a deleter.
- zhandle_t *zk_;
-};
-} // namespace hbase
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/meta-utils.cc
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/meta-utils.cc b/hbase-native-client/core/meta-utils.cc
deleted file mode 100644
index 31349a5..0000000
--- a/hbase-native-client/core/meta-utils.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include "core/meta-utils.h"
-
-#include <folly/Conv.h>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "connection/request.h"
-#include "connection/response.h"
-#include "core/response-converter.h"
-#include "exceptions/exception.h"
-#include "if/Client.pb.h"
-#include "serde/region-info.h"
-#include "serde/server-name.h"
-#include "serde/table-name.h"
-
-using hbase::pb::TableName;
-using hbase::pb::RegionInfo;
-using hbase::pb::RegionSpecifier_RegionSpecifierType;
-using hbase::pb::ScanRequest;
-using hbase::pb::ServerName;
-
-namespace hbase {
-
-MetaUtil::MetaUtil() {
- meta_region_info_.set_start_key("");
- meta_region_info_.set_end_key("");
- meta_region_info_.set_offline(false);
- meta_region_info_.set_split(false);
- meta_region_info_.set_replica_id(0);
- meta_region_info_.set_split(false);
- meta_region_info_.set_region_id(1);
- meta_region_info_.mutable_table_name()->set_namespace_(MetaUtil::kSystemNamespace);
- meta_region_info_.mutable_table_name()->set_qualifier(MetaUtil::kMetaTableQualifier);
-}
-
-std::string MetaUtil::RegionLookupRowkey(const TableName &tn, const std::string &row) const {
- return folly::to<std::string>(tn, ",", row, ",", "999999999999999999");
-}
-
-std::unique_ptr<Request> MetaUtil::MetaRequest(const TableName tn, const std::string &row) const {
- auto request = Request::scan();
- auto msg = std::static_pointer_cast<ScanRequest>(request->req_msg());
-
- msg->set_number_of_rows(1);
- msg->set_close_scanner(true);
-
- // Set the region this scan goes to
- auto region = msg->mutable_region();
- region->set_value(MetaUtil::kMetaRegion);
- region->set_type(
- RegionSpecifier_RegionSpecifierType::RegionSpecifier_RegionSpecifierType_ENCODED_REGION_NAME);
-
- auto scan = msg->mutable_scan();
- // We don't care about before, just now.
- scan->set_max_versions(1);
- // Meta should be cached at all times.
- scan->set_cache_blocks(true);
- // We only want one row right now.
- //
- // TODO(eclark): Figure out if we should get more.
- scan->set_caching(1);
- // Close the scan after we have data.
- scan->set_small(true);
- // We know where to start but not where to end.
- scan->set_reversed(true);
- // Give me everything or nothing.
- scan->set_allow_partial_results(false);
-
- // Set the columns that we need
- auto info_col = scan->add_column();
- info_col->set_family(MetaUtil::kCatalogFamily);
- info_col->add_qualifier(MetaUtil::kServerColumn);
- info_col->add_qualifier(MetaUtil::kRegionInfoColumn);
-
- scan->set_start_row(RegionLookupRowkey(tn, row));
- return request;
-}
-
-std::shared_ptr<RegionLocation> MetaUtil::CreateLocation(const Response &resp,
- const TableName &tn) {
- std::vector<std::shared_ptr<Result>> results = ResponseConverter::FromScanResponse(resp);
- if (results.size() == 0) {
- throw TableNotFoundException(folly::to<std::string>(tn));
- }
- if (results.size() != 1) {
- throw std::runtime_error("Was expecting exactly 1 result in meta scan response, got:" +
- std::to_string(results.size()));
- }
- auto result = *results[0];
-
- auto region_info_str = result.Value(MetaUtil::kCatalogFamily, MetaUtil::kRegionInfoColumn);
- auto server_str = result.Value(MetaUtil::kCatalogFamily, MetaUtil::kServerColumn);
- CHECK(region_info_str);
- CHECK(server_str);
-
- auto row = result.Row();
- auto region_info = folly::to<RegionInfo>(*region_info_str);
- auto server_name = folly::to<ServerName>(*server_str);
- return std::make_shared<RegionLocation>(row, std::move(region_info), server_name);
-}
-
-bool MetaUtil::IsMeta(const hbase::pb::TableName &tn) {
- return folly::to<std::string>(tn) == MetaUtil::kMetaTableName;
-}
-} // namespace hbase
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/meta-utils.h
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/meta-utils.h b/hbase-native-client/core/meta-utils.h
deleted file mode 100644
index d178179..0000000
--- a/hbase-native-client/core/meta-utils.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-#pragma once
-
-#include <memory>
-#include <string>
-
-#include "connection/request.h"
-#include "connection/response.h"
-#include "core/region-location.h"
-#include "if/HBase.pb.h"
-#include "serde/table-name.h"
-
-namespace hbase {
-
-/**
- * @brief Utility for meta operations.
- */
-class MetaUtil {
- public:
- static constexpr const char *kSystemNamespace = "hbase";
- static constexpr const char *kMetaTableQualifier = "meta";
- static constexpr const char *kMetaTableName = "hbase:meta";
- static constexpr const char *kMetaRegion = "1588230740";
- static constexpr const char *kMetaRegionName = "hbase:meta,,1";
- static constexpr const char *kCatalogFamily = "info";
- static constexpr const char *kRegionInfoColumn = "regioninfo";
- static constexpr const char *kServerColumn = "server";
-
- MetaUtil();
-
- /**
- * Given a table and a row give the row key from which to start a scan to find
- * region locations.
- */
- std::string RegionLookupRowkey(const hbase::pb::TableName &tn, const std::string &row) const;
-
- /**
- * Given a row we're trying to access create a request to look up the
- * location.
- */
- std::unique_ptr<Request> MetaRequest(const hbase::pb::TableName tn, const std::string &row) const;
-
- /**
- * Return a RegionLocation from the parsed Response
- */
- std::shared_ptr<RegionLocation> CreateLocation(const Response &resp,
- const hbase::pb::TableName &tn);
-
- /**
- * Return whether the table is the meta table.
- */
- static bool IsMeta(const hbase::pb::TableName &tn);
-
- const pb::RegionInfo &meta_region_info() const { return meta_region_info_; }
-
- private:
- pb::RegionInfo meta_region_info_;
-};
-} // namespace hbase
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/multi-response.cc
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/multi-response.cc b/hbase-native-client/core/multi-response.cc
deleted file mode 100644
index a4c2108..0000000
--- a/hbase-native-client/core/multi-response.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include "core/multi-response.h"
-#include <glog/logging.h>
-#include "core/region-result.h"
-
-using hbase::pb::RegionLoadStats;
-
-namespace hbase {
-
-MultiResponse::MultiResponse() {}
-
-int MultiResponse::Size() const {
- int size = 0;
- for (const auto& result : results_) {
- size += result.second->ResultOrExceptionSize();
- }
- return size;
-}
-
-void MultiResponse::AddRegionResult(const std::string& region_name, int32_t original_index,
- std::shared_ptr<Result> result,
- std::shared_ptr<folly::exception_wrapper> exc) {
- auto itr = results_.find(region_name);
- if (itr == results_.end()) {
- auto region_result = std::make_shared<RegionResult>();
- region_result->AddResultOrException(original_index, result, exc);
- results_[region_name] = region_result;
- } else {
- itr->second->AddResultOrException(original_index, result, exc);
- }
-}
-
-void MultiResponse::AddRegionException(const std::string& region_name,
- std::shared_ptr<folly::exception_wrapper> exception) {
- VLOG(8) << "Store Region Exception:- " << exception->what() << "; Region[" << region_name << "];";
- bool region_found = false;
- auto itr = exceptions_.find(region_name);
- if (itr == exceptions_.end()) {
- auto region_result = std::make_shared<folly::exception_wrapper>();
- exceptions_[region_name] = exception;
- } else {
- itr->second = exception;
- }
-}
-
-std::shared_ptr<folly::exception_wrapper> MultiResponse::RegionException(
- const std::string& region_name) const {
- auto find = exceptions_.at(region_name);
- return find;
-}
-
-const std::map<std::string, std::shared_ptr<folly::exception_wrapper> >&
-MultiResponse::RegionExceptions() const {
- return exceptions_;
-}
-
-void MultiResponse::AddStatistic(const std::string& region_name,
- std::shared_ptr<RegionLoadStats> stat) {
- results_[region_name]->set_stat(stat);
-}
-
-const std::map<std::string, std::shared_ptr<RegionResult> >& MultiResponse::RegionResults() const {
- return results_;
-}
-
-MultiResponse::~MultiResponse() {}
-
-} /* namespace hbase */
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/multi-response.h
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/multi-response.h b/hbase-native-client/core/multi-response.h
deleted file mode 100644
index d38cfd6..0000000
--- a/hbase-native-client/core/multi-response.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#pragma once
-
-#include <core/region-result.h>
-#include <folly/ExceptionWrapper.h>
-#include <exception>
-#include <map>
-#include <memory>
-#include <string>
-
-#include "core/result.h"
-#include "if/Client.pb.h"
-
-namespace hbase {
-
-class MultiResponse {
- public:
- MultiResponse();
- /**
- * @brief Returns Number of pairs in this container
- */
- int Size() const;
-
- /**
- * Add the pair to the container, grouped by the regionName
- *
- * @param regionName
- * @param originalIndex the original index of the Action (request).
- * @param resOrEx the result or error; will be empty for successful Put and Delete actions.
- */
- void AddRegionResult(const std::string& region_name, int32_t original_index,
- std::shared_ptr<Result> result,
- std::shared_ptr<folly::exception_wrapper> exc);
-
- void AddRegionException(const std::string& region_name,
- std::shared_ptr<folly::exception_wrapper> exception);
-
- /**
- * @return the exception for the region, if any. Null otherwise.
- */
- std::shared_ptr<folly::exception_wrapper> RegionException(const std::string& region_name) const;
-
- const std::map<std::string, std::shared_ptr<folly::exception_wrapper>>& RegionExceptions() const;
-
- void AddStatistic(const std::string& region_name, std::shared_ptr<pb::RegionLoadStats> stat);
-
- const std::map<std::string, std::shared_ptr<RegionResult>>& RegionResults() const;
-
- ~MultiResponse();
-
- private:
- // map of regionName to map of Results by the original index for that Result
- std::map<std::string, std::shared_ptr<RegionResult>> results_;
- /**
- * The server can send us a failure for the region itself, instead of individual failure.
- * It's a part of the protobuf definition.
- */
- std::map<std::string, std::shared_ptr<folly::exception_wrapper>> exceptions_;
-};
-
-} /* namespace hbase */
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/mutation.cc
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/mutation.cc b/hbase-native-client/core/mutation.cc
deleted file mode 100644
index 7182202..0000000
--- a/hbase-native-client/core/mutation.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include "core/mutation.h"
-#include <algorithm>
-#include <limits>
-#include <stdexcept>
-
-namespace hbase {
-
-Mutation::Mutation(const std::string &row) : Row(row) {}
-Mutation::Mutation(const std::string &row, int64_t timestamp) : Row(row), timestamp_(timestamp) {}
-
-Mutation::Mutation(const Mutation &mutation) {
- row_ = mutation.row_;
- durability_ = mutation.durability_;
- timestamp_ = mutation.timestamp_;
- for (auto const &e : mutation.family_map_) {
- for (auto const &c : e.second) {
- family_map_[e.first].push_back(std::make_unique<Cell>(*c));
- }
- }
-}
-
-Mutation &Mutation::operator=(const Mutation &mutation) {
- row_ = mutation.row_;
- durability_ = mutation.durability_;
- timestamp_ = mutation.timestamp_;
- for (auto const &e : mutation.family_map_) {
- for (auto const &c : e.second) {
- family_map_[e.first].push_back(std::make_unique<Cell>(*c));
- }
- }
- return *this;
-}
-
-pb::MutationProto_Durability Mutation::Durability() const { return durability_; }
-
-Mutation &Mutation::SetDurability(pb::MutationProto_Durability durability) {
- durability_ = durability;
- return *this;
-}
-
-bool Mutation::HasFamilies() const { return !family_map_.empty(); }
-
-std::unique_ptr<Cell> Mutation::CreateCell(const std::string &family, const std::string &qualifier,
- int64_t timestamp, const std::string &value) {
- return std::make_unique<Cell>(row_, family, qualifier, timestamp, value, hbase::CellType::PUT);
-}
-
-} // namespace hbase
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/mutation.h
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/mutation.h b/hbase-native-client/core/mutation.h
deleted file mode 100644
index 496891e..0000000
--- a/hbase-native-client/core/mutation.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#pragma once
-
-#include <cstdint>
-#include <limits>
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-#include "core/cell.h"
-#include "core/row.h"
-#include "if/Client.pb.h"
-
-namespace hbase {
-
-class Mutation : public Row {
- public:
- /**
- * Constructors
- */
- explicit Mutation(const std::string& row);
- Mutation(const std::string& row, int64_t timestamp);
- Mutation(const Mutation& cmutation);
- Mutation& operator=(const Mutation& cmutation);
-
- virtual ~Mutation() = default;
-
- /**
- * @brief Returns the Mutation family map for this operation.
- */
- const std::map<std::string, std::vector<std::unique_ptr<Cell>>>& FamilyMap() const {
- return family_map_;
- }
-
- /**
- * @brief Returns the timerange for this Get
- */
- int64_t TimeStamp() const { return timestamp_; }
-
- /**
- * @brief Get versions of columns with the specified timestamp.
- * @param The timestamp to be set
- */
- Mutation& SetTimeStamp(int64_t timestamp) {
- timestamp_ = timestamp;
- return *this;
- }
-
- /**
- * @brief Returns true if family map is non empty false otherwise
- */
- bool HasFamilies() const;
-
- /**
- * @brief Returns the durability level for this Mutation operation
- */
- pb::MutationProto_Durability Durability() const;
-
- /**
- * @brief Sets the durability level for this Mutation operation
- * @param durability the durability to be set
- */
- Mutation& SetDurability(pb::MutationProto_Durability durability);
-
- public:
- static const constexpr int64_t kLatestTimestamp = std::numeric_limits<int64_t>::max();
-
- protected:
- std::map<std::string, std::vector<std::unique_ptr<Cell>>> family_map_;
- pb::MutationProto_Durability durability_ =
- hbase::pb::MutationProto_Durability::MutationProto_Durability_USE_DEFAULT;
- int64_t timestamp_ = kLatestTimestamp;
-
- std::unique_ptr<Cell> CreateCell(const std::string& family, const std::string& qualifier,
- int64_t timestamp, const std::string& value);
-};
-
-} // namespace hbase
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/put-test.cc
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/put-test.cc b/hbase-native-client/core/put-test.cc
deleted file mode 100644
index d4ed00a..0000000
--- a/hbase-native-client/core/put-test.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-#include <glog/logging.h>
-#include <gtest/gtest.h>
-
-#include "core/mutation.h"
-#include "core/put.h"
-#include "utils/time-util.h"
-
-using hbase::Put;
-using hbase::Cell;
-using hbase::CellType;
-using hbase::Mutation;
-using hbase::TimeUtil;
-
-const constexpr int64_t Mutation::kLatestTimestamp;
-
-TEST(Put, Row) {
- Put put{"foo"};
- EXPECT_EQ("foo", put.row());
-}
-
-TEST(Put, Durability) {
- Put put{"row"};
- EXPECT_EQ(hbase::pb::MutationProto_Durability_USE_DEFAULT, put.Durability());
-
- auto skipWal = hbase::pb::MutationProto_Durability_SKIP_WAL;
- put.SetDurability(skipWal);
- EXPECT_EQ(skipWal, put.Durability());
-}
-
-TEST(Put, Timestamp) {
- Put put{"row"};
-
- // test default timestamp
- EXPECT_EQ(Mutation::kLatestTimestamp, put.TimeStamp());
-
- // set custom timestamp
- auto ts = TimeUtil::ToMillis(TimeUtil::GetNowNanos());
- put.SetTimeStamp(ts);
- EXPECT_EQ(ts, put.TimeStamp());
-
- // Add a column with custom timestamp
- put.AddColumn("f", "q", "v");
- auto &cell = put.FamilyMap().at("f")[0];
- EXPECT_EQ(ts, cell->Timestamp());
-}
-
-TEST(Put, HasFamilies) {
- Put put{"row"};
-
- EXPECT_EQ(false, put.HasFamilies());
-
- put.AddColumn("f", "q", "v");
- EXPECT_EQ(true, put.HasFamilies());
-}
-
-TEST(Put, Add) {
- CellType cell_type = CellType::PUT;
- std::string row = "row";
- std::string family = "family";
- std::string column = "column";
- std::string value = "value";
- int64_t timestamp = std::numeric_limits<int64_t>::max();
- auto cell = std::make_unique<Cell>(row, family, column, timestamp, value, cell_type);
-
- // add first cell
- Put put{"row"};
- put.Add(std::move(cell));
- EXPECT_EQ(1, put.FamilyMap().size());
- EXPECT_EQ(1, put.FamilyMap().at(family).size());
-
- // add a non-matching row
- auto cell2 = std::make_unique<Cell>(row, family, column, timestamp, value, cell_type);
- Put put2{"foo"};
- ASSERT_THROW(put2.Add(std::move(cell2)), std::runtime_error); // rows don't match
-
- // add a second cell with same family
- auto cell3 = std::make_unique<Cell>(row, family, "column-2", timestamp, value, cell_type);
- put.Add(std::move(cell3));
- EXPECT_EQ(1, put.FamilyMap().size());
- EXPECT_EQ(2, put.FamilyMap().at(family).size());
-
- // add a cell to a different family
- auto cell4 = std::make_unique<Cell>(row, "family-2", "column-2", timestamp, value, cell_type);
- put.Add(std::move(cell4));
- EXPECT_EQ(2, put.FamilyMap().size());
- EXPECT_EQ(1, put.FamilyMap().at("family-2").size());
-}
-
-TEST(Put, AddColumn) {
- std::string row = "row";
- std::string family = "family";
- std::string column = "column";
- std::string value = "value";
-
- Put put{"row"};
- put.AddColumn(family, column, value);
- EXPECT_EQ(1, put.FamilyMap().size());
- EXPECT_EQ(1, put.FamilyMap().at(family).size());
-
- // add a second cell with same family
- put.AddColumn(family, "column-2", value);
- EXPECT_EQ(1, put.FamilyMap().size());
- EXPECT_EQ(2, put.FamilyMap().at(family).size());
-
- // add a cell to a different family
- put.AddColumn("family-2", column, value);
- EXPECT_EQ(2, put.FamilyMap().size());
- EXPECT_EQ(1, put.FamilyMap().at("family-2").size());
-
- // use the AddColumn overload
- auto ts = TimeUtil::ToMillis(TimeUtil::GetNowNanos());
- put.AddColumn(family, column, ts, value);
- EXPECT_EQ(2, put.FamilyMap().size());
- EXPECT_EQ(3, put.FamilyMap().at(family).size());
- auto &cell = put.FamilyMap().at(family)[2];
- EXPECT_EQ(ts, cell->Timestamp());
-}
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/put.cc
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/put.cc b/hbase-native-client/core/put.cc
deleted file mode 100644
index bb20c5c..0000000
--- a/hbase-native-client/core/put.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include "core/put.h"
-#include <folly/Conv.h>
-#include <algorithm>
-#include <limits>
-#include <stdexcept>
-#include <utility>
-
-namespace hbase {
-
-/**
- * @brief Add the specified column and value to this Put operation.
- * @param family family name
- * @param qualifier column qualifier
- * @param value column value
- */
-Put& Put::AddColumn(const std::string& family, const std::string& qualifier,
- const std::string& value) {
- return AddColumn(family, qualifier, timestamp_, value);
-}
-
-/**
- * @brief Add the specified column and value to this Put operation.
- * @param family family name
- * @param qualifier column qualifier
- * @param timestamp version timestamp
- * @param value column value
- */
-Put& Put::AddColumn(const std::string& family, const std::string& qualifier, int64_t timestamp,
- const std::string& value) {
- if (timestamp < 0) {
- throw std::runtime_error("Timestamp cannot be negative. ts=" +
- folly::to<std::string>(timestamp));
- }
-
- return Add(CreateCell(family, qualifier, timestamp, value));
-}
-
-Put& Put::Add(std::unique_ptr<Cell> cell) {
- if (cell->Row() != row_) {
- throw std::runtime_error("The row in " + cell->DebugString() +
- " doesn't match the original one " + row_);
- }
-
- family_map_[cell->Family()].push_back(std::move(cell));
- return *this;
-}
-} // namespace hbase
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/put.h
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/put.h b/hbase-native-client/core/put.h
deleted file mode 100644
index 8a43dec..0000000
--- a/hbase-native-client/core/put.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#pragma once
-
-#include <cstdint>
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-#include "core/cell.h"
-#include "core/mutation.h"
-
-namespace hbase {
-
-class Put : public Mutation {
- public:
- /**
- * Constructors
- */
- explicit Put(const std::string& row) : Mutation(row) {}
- Put(const std::string& row, int64_t timestamp) : Mutation(row, timestamp) {}
- Put(const Put& cput) : Mutation(cput) {}
- Put& operator=(const Put& cput) {
- Mutation::operator=(cput);
- return *this;
- }
-
- ~Put() = default;
-
- /**
- * @brief Add the specified column and value to this Put operation.
- * @param family family name
- * @param qualifier column qualifier
- * @param value column value
- */
- Put& AddColumn(const std::string& family, const std::string& qualifier, const std::string& value);
-
- /**
- * @brief Add the specified column and value to this Put operation.
- * @param family family name
- * @param qualifier column qualifier
- * @param timestamp version timestamp
- * @param value column value
- */
- Put& AddColumn(const std::string& family, const std::string& qualifier, int64_t timestamp,
- const std::string& value);
-
- Put& Add(std::unique_ptr<Cell> cell);
-};
-
-} // namespace hbase
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/query.h
----------------------------------------------------------------------
diff --git a/hbase-native-client/core/query.h b/hbase-native-client/core/query.h
deleted file mode 100644
index 301f448..0000000
--- a/hbase-native-client/core/query.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#pragma once
-
-#include <memory>
-
-#include "core/filter.h"
-
-namespace hbase {
-
-/**
- * Base class for read RPC calls (Get / Scan).
- */
-class Query {
- public:
- Query() = default;
- Query(const Query &query) {
- // filter can be a custom subclass of Filter, so we do not do a deep copy here.
- filter_ = query.filter_;
- }
-
- Query &operator=(const Query &query) {
- filter_ = query.filter_;
- return *this;
- }
-
- virtual ~Query() {}
-
- void SetFilter(std::shared_ptr<Filter> filter) { filter_ = filter; }
-
- const std::shared_ptr<Filter> filter() const { return filter_; }
-
- protected:
- std::shared_ptr<Filter> filter_ = nullptr;
-};
-
-} // namespace hbase