kudu git commit: [scripts] run gradlew from $KUDU_ROOT/java
Repository: kudu Updated Branches: refs/heads/master a33e5733c -> 4aabf46b4 [scripts] run gradlew from $KUDU_ROOT/java Fixed mistake in the jepsen.sh script. This is a follow-up to 7a4caf9660617c8dad2f95b939adec9eb1f9fd04. Change-Id: I5a5f4cf83dce7e1f604fb59cd308cffc8b4151e4 Reviewed-on: http://gerrit.cloudera.org:8080/11738 Reviewed-by: Adar Dembo Tested-by: Kudu Jenkins Project: http://git-wip-us.apache.org/repos/asf/kudu/repo Commit: http://git-wip-us.apache.org/repos/asf/kudu/commit/4aabf46b Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/4aabf46b Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/4aabf46b Branch: refs/heads/master Commit: 4aabf46b4299dd46d6a4744f15b2a7b0c711ab9e Parents: a33e573 Author: Alexey Serbin Authored: Fri Oct 19 13:14:54 2018 -0700 Committer: Alexey Serbin Committed: Sat Oct 20 01:31:25 2018 + -- src/kudu/scripts/jepsen.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) -- http://git-wip-us.apache.org/repos/asf/kudu/blob/4aabf46b/src/kudu/scripts/jepsen.sh -- diff --git a/src/kudu/scripts/jepsen.sh b/src/kudu/scripts/jepsen.sh index 870e8dd..4ec9791 100755 --- a/src/kudu/scripts/jepsen.sh +++ b/src/kudu/scripts/jepsen.sh @@ -118,13 +118,11 @@ echo "" echo echo "Building and running kudu-jepsen consistency tests" echo "" -pushd kudu-jepsen -./gradlew runJepsen \ +./gradlew :kudu-jepsen:runJepsen \ -DmasterNodes="$KUDU_MASTER_NODES" \ -DtserverNodes="$KUDU_TSERVER_NODES" \ -DsshKeyPath="$SSH_KEY" \ -DiterNum="$ITER_NUM" popd -popd set +x
[1/2] kudu git commit: [tools] Add locate_row support for unsupported key column types
Repository: kudu Updated Branches: refs/heads/master ef714838a -> a33e5733c [tools] Add locate_row support for unsupported key column types BOOL, FLOAT, and DOUBLE are not supported as types for key columns. But there's actually no reason why the tool can't pre-emptively support them in case they are ever permitted as key column types. There's no additional tests because it's not possible to create a table with these types in the primary key. Change-Id: Id1ba6de90feef4c2c565d9033ff442b723a51d7b Reviewed-on: http://gerrit.cloudera.org:8080/11729 Tested-by: Will Berkeley Reviewed-by: Alexey Serbin Project: http://git-wip-us.apache.org/repos/asf/kudu/repo Commit: http://git-wip-us.apache.org/repos/asf/kudu/commit/8a0d1602 Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/8a0d1602 Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/8a0d1602 Branch: refs/heads/master Commit: 8a0d1602c0097b55e8fc9047bc659397e75f29d3 Parents: ef71483 Author: Will Berkeley Authored: Thu Oct 18 13:49:38 2018 -0700 Committer: Will Berkeley Committed: Fri Oct 19 21:28:08 2018 + -- src/kudu/tools/tool_action_table.cc | 32 1 file changed, 32 insertions(+) -- http://git-wip-us.apache.org/repos/asf/kudu/blob/8a0d1602/src/kudu/tools/tool_action_table.cc -- diff --git a/src/kudu/tools/tool_action_table.cc b/src/kudu/tools/tool_action_table.cc index dbdf31f..097b9b0 100644 --- a/src/kudu/tools/tool_action_table.cc +++ b/src/kudu/tools/tool_action_table.cc @@ -257,6 +257,38 @@ Status LocateRow(const RunnerContext& context) { client::KuduValue::CopyString(value))); break; } + case KuduColumnSchema::BOOL: { +// As of the writing of this tool, BOOL is not a supported key column +// type, but just in case it becomes one, we pre-load support for it. +bool value; +RETURN_NOT_OK_PREPEND( +reader.ExtractBool(values[i], /*field=*/nullptr, ), +Substitute("unable to parse value for column '$0' of type $1", + col_name, + KuduColumnSchema::DataTypeToString(type))); +predicates.emplace_back( +table->NewComparisonPredicate(col_name, + client::KuduPredicate::EQUAL, + client::KuduValue::FromBool(value))); +break; + } + case KuduColumnSchema::FLOAT: + case KuduColumnSchema::DOUBLE: { +// Like BOOL, as of the writing of this tool, floating point types are +// not supported for key columns, but we can pre-load support for them +// in case they become supported. +double value; +RETURN_NOT_OK_PREPEND( +reader.ExtractDouble(values[i], /*field=*/nullptr, ), +Substitute("unable to parse value for column '$0' of type $1", + col_name, + KuduColumnSchema::DataTypeToString(type))); +predicates.emplace_back( +table->NewComparisonPredicate(col_name, + client::KuduPredicate::EQUAL, + client::KuduValue::FromDouble(value))); +break; + } case KuduColumnSchema::DECIMAL: return Status::NotSupported( Substitute("unsupported type $0 for key column '$1': "
[2/2] kudu git commit: thread: show thread limit info when thread creation fails
thread: show thread limit info when thread creation fails It seems useful to return the number of outstanding threads and the ulimit nproc when thread creation fails, to help an administrator diagnose the cause of the fork()/clone() failure. This patch adds that info to the error Status returned from Thread::Create(). That necessitated making the ReadThreadsRunning() method of ThreadManager public. Tested manually on Linux. Example: $ ps -efwwwL | grep mpercy | wc -l 2357 $ ulimit -u 2370 $ ./bin/kudu-tserver --fs-wal-dir $(pwd)/wal --logtostderr ... F1018 14:16:00.312577 21557 service_pool.cc:93] Check failed: _s.ok() Bad status: Runtime error: Could not create thread (63 Kudu-managed threads running in this process, 2370 max processes allowed for current user): Resource temporarily unavailable (error 11) *** Check failure stack trace: *** *** Aborted at 1539897360 (unix time) try "date -d @1539897360" if you are using GNU date *** PC: @ 0x7f503d9d9e97 gsignal *** SIGABRT (@0x3e85435) received by PID 21557 (TID 0x7f503cf34900) from PID 21557; stack trace: *** @ 0x7f5042455890 (unknown) @ 0x7f503d9d9e97 gsignal @ 0x7f503d9db801 abort @ 0x7f504024c309 kudu::AbortFailureFunction() @ 0x7f503f645d0d google::LogMessage::Fail() @ 0x7f503f647ce4 google::LogMessage::SendToLog() @ 0x7f503f64582d google::LogMessage::Flush() @ 0x7f503f6486b9 google::LogMessageFatal::~LogMessageFatal() @ 0x7f504172688e kudu::rpc::ServicePool::Init() @ 0x7f50456b3eed kudu::RpcServer::RegisterService() @ 0x7f50456bfc59 kudu::server::ServerBase::RegisterService() @ 0x7f50459004ac kudu::tserver::TabletServer::Start() @ 0x40683e kudu::tserver::TabletServerMain() @ 0x4060a2 main @ 0x7f503d9bcb97 __libc_start_main @ 0x405fba _start Aborted (core dumped) Change-Id: I8e0bd0d0776142e8feff18bffe15e61ca1ba5816 Reviewed-on: http://gerrit.cloudera.org:8080/11726 Reviewed-by: Andrew Wong Reviewed-by: Adar Dembo Tested-by: Mike Percy Project: http://git-wip-us.apache.org/repos/asf/kudu/repo Commit: http://git-wip-us.apache.org/repos/asf/kudu/commit/a33e5733 Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/a33e5733 Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/a33e5733 Branch: refs/heads/master Commit: a33e5733c16bf7da7eae2b813086faf7d01b0e2f Parents: 8a0d160 Author: Mike Percy Authored: Thu Oct 18 13:19:12 2018 -0700 Committer: Mike Percy Committed: Fri Oct 19 23:16:35 2018 + -- src/kudu/util/thread.cc | 26 +++--- 1 file changed, 19 insertions(+), 7 deletions(-) -- http://git-wip-us.apache.org/repos/asf/kudu/blob/a33e5733/src/kudu/util/thread.cc -- diff --git a/src/kudu/util/thread.cc b/src/kudu/util/thread.cc index 4abc7c1..bb53f5a 100644 --- a/src/kudu/util/thread.cc +++ b/src/kudu/util/thread.cc @@ -48,6 +48,7 @@ #include "kudu/gutil/once.h" #include "kudu/gutil/port.h" #include "kudu/gutil/strings/substitute.h" +#include "kudu/util/env.h" #include "kudu/util/flag_tags.h" #include "kudu/util/kernel_stack_watchdog.h" #include "kudu/util/logging.h" @@ -139,7 +140,7 @@ static uint64_t GetInVoluntaryContextSwitches() { class ThreadMgr; -__thread Thread* Thread::tls_ = NULL; +__thread Thread* Thread::tls_ = nullptr; // Singleton instance of ThreadMgr. Only visible in this file, used only by Thread. // The Thread class adds a reference to thread_manager while it is supervising a thread so @@ -178,6 +179,9 @@ class ThreadMgr { // already been removed, this is a no-op. void RemoveThread(const pthread_t& pthread_id, const string& category); + // Metric callback for number of threads running. Also used for error messages. + uint64_t ReadThreadsRunning(); + private: // Container class for any details we want to capture about a thread // TODO: Add start-time. @@ -219,9 +223,8 @@ class ThreadMgr { uint64_t threads_started_metric_; uint64_t threads_running_metric_; - // Metric callbacks. + // Metric callback for number of threads started. uint64_t ReadThreadsStarted(); - uint64_t ReadThreadsRunning(); // Webpage callback; prints all threads by category. void ThreadPathHandler(const WebCallbackRegistry::WebRequest& req, @@ -475,7 +478,7 @@ Status ThreadJoiner::Join() { // Unconditionally join before returning, to guarantee that any TLS // has been destroyed (pthread_key_create() destructors only run // after a pthread's user method has returned). - int ret = pthread_join(thread_->thread_, NULL); + int ret = pthread_join(thread_->thread_, nullptr); CHECK_EQ(ret, 0); thread_->joinable_ = false; return Status::OK(); @@ -553,9 +556,18 @@ Status
kudu git commit: Use preferred private client API method for a couple of tools functions
Repository: kudu Updated Branches: refs/heads/master b3486d99a -> ef714838a Use preferred private client API method for a couple of tools functions Change-Id: Ic5bc5e59c9e8a77faa99ca0be11db19eb04dbcb9 Reviewed-on: http://gerrit.cloudera.org:8080/11736 Reviewed-by: Adar Dembo Tested-by: Will Berkeley Project: http://git-wip-us.apache.org/repos/asf/kudu/repo Commit: http://git-wip-us.apache.org/repos/asf/kudu/commit/ef714838 Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/ef714838 Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/ef714838 Branch: refs/heads/master Commit: ef714838a8ba4e2a0dbf1d2f7998f8909d591402 Parents: b3486d9 Author: Will Berkeley Authored: Fri Oct 19 10:28:20 2018 -0700 Committer: Will Berkeley Committed: Fri Oct 19 20:19:44 2018 + -- src/kudu/client/client.cc| 38 ++ src/kudu/client/client.h | 32 -- src/kudu/tools/tool_action_common.cc | 45 --- src/kudu/tools/tool_action_common.h | 9 --- src/kudu/tools/tool_action_hms.cc| 2 +- src/kudu/tools/tool_action_table.cc | 4 +-- 6 files changed, 65 insertions(+), 65 deletions(-) -- http://git-wip-us.apache.org/repos/asf/kudu/blob/ef714838/src/kudu/client/client.cc -- diff --git a/src/kudu/client/client.cc b/src/kudu/client/client.cc index 1986257..d301105 100644 --- a/src/kudu/client/client.cc +++ b/src/kudu/client/client.cc @@ -85,6 +85,7 @@ #include "kudu/security/token.pb.h" #include "kudu/tserver/tserver.pb.h" #include "kudu/tserver/tserver_service.proxy.h" +#include "kudu/util/async_util.h" #include "kudu/util/debug-util.h" #include "kudu/util/init.h" #include "kudu/util/logging.h" @@ -598,6 +599,10 @@ Status KuduClient::GetTablet(const string& tablet_id, KuduTablet** tablet) { return Status::OK(); } +string KuduClient::GetMasterAddresses() const { + return HostPort::ToCommaSeparatedString(data_->master_hostports()); +} + bool KuduClient::IsMultiMaster() const { return data_->master_server_addrs_.size() > 1; } @@ -926,6 +931,39 @@ KuduPredicate* KuduTable::NewIsNullPredicate(const Slice& col_name) { }); } +// The strategy for retrieving the partitions from the metacache is adapted +// from KuduScanTokenBuilder::Data::Build. +Status KuduTable::ListPartitions(vector* partitions) { + DCHECK(partitions); + partitions->clear(); + auto& client = data_->client_; + const auto deadline = MonoTime::Now() + client->default_admin_operation_timeout(); + PartitionPruner pruner; + pruner.Init(*data_->schema_.schema_, data_->partition_schema_, ScanSpec()); + while (pruner.HasMorePartitionKeyRanges()) { +scoped_refptr tablet; +Synchronizer sync; +const string& partition_key = pruner.NextPartitionKey(); +client->data_->meta_cache_->LookupTabletByKey( +this, +partition_key, +deadline, +client::internal::MetaCache::LookupType::kLowerBound, +, +sync.AsStatusCallback()); +Status s = sync.Wait(); +if (s.IsNotFound()) { + // No more tablets. + break; +} +RETURN_NOT_OK(s); + +partitions->emplace_back(tablet->partition()); +pruner.RemovePartitionKeyRange(tablet->partition().partition_key_end()); + } + return Status::OK(); +} + // Error http://git-wip-us.apache.org/repos/asf/kudu/blob/ef714838/src/kudu/client/client.h -- diff --git a/src/kudu/client/client.h b/src/kudu/client/client.h index 79153a0..5335e00 100644 --- a/src/kudu/client/client.h +++ b/src/kudu/client/client.h @@ -63,9 +63,6 @@ class KuduTable; namespace tools { class LeaderMasterProxy; -Status ListPartitions(const client::sp::shared_ptr& table, - std::vector* partitions); -std::string GetMasterAddresses(const client::KuduClient&); } // namespace tools namespace client { @@ -77,7 +74,6 @@ class KuduPartitioner; class KuduScanBatch; class KuduSession; class KuduStatusCallback; -class KuduTable; class KuduTableAlterer; class KuduTableCreator; class KuduTablet; @@ -452,6 +448,15 @@ class KUDU_EXPORT KuduClient : public sp::enable_shared_from_this { Status GetTablet(const std::string& tablet_id, KuduTablet** tablet) KUDU_NO_EXPORT; + /// Get the master RPC addresses as configured on the last leader master this + /// client connected to, as a CSV. If the client has not connected to a leader + /// master, an empty string is returned. + /// + /// Private API. + /// + /// @return The master addresses as a CSV. + std::string GetMasterAddresses() const KUDU_NO_EXPORT; + ///
[1/2] kudu git commit: Add ExtractDouble method to JsonReader and small improvements
Repository: kudu Updated Branches: refs/heads/master 785490ce5 -> b3486d99a Add ExtractDouble method to JsonReader and small improvements Change-Id: Iccbdc2467746b68ac871f5feeb01e610610b13d6 Reviewed-on: http://gerrit.cloudera.org:8080/11728 Tested-by: Kudu Jenkins Reviewed-by: Alexey Serbin Project: http://git-wip-us.apache.org/repos/asf/kudu/repo Commit: http://git-wip-us.apache.org/repos/asf/kudu/commit/0a7940d6 Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/0a7940d6 Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/0a7940d6 Branch: refs/heads/master Commit: 0a7940d687980d1451cd70f7a4b5b80e62797808 Parents: 785490c Author: Will Berkeley Authored: Thu Oct 18 14:24:35 2018 -0700 Committer: Will Berkeley Committed: Fri Oct 19 18:34:46 2018 + -- src/kudu/tools/kudu-admin-test.cc | 2 +- src/kudu/util/jsonreader-test.cc | 42 src/kudu/util/jsonreader.cc | 72 ++ src/kudu/util/jsonreader.h| 4 ++ 4 files changed, 103 insertions(+), 17 deletions(-) -- http://git-wip-us.apache.org/repos/asf/kudu/blob/0a7940d6/src/kudu/tools/kudu-admin-test.cc -- diff --git a/src/kudu/tools/kudu-admin-test.cc b/src/kudu/tools/kudu-admin-test.cc index 22612ac..78adeeb 100644 --- a/src/kudu/tools/kudu-admin-test.cc +++ b/src/kudu/tools/kudu-admin-test.cc @@ -1976,7 +1976,7 @@ TEST_F(AdminCliTest, TestLocateRowMore) { // Test providing valid JSON that's not an array. NO_FATALS(check_bad_input( "{ \"key_hash\" : \"foo\", \"key_range\" : 2 }", - "Wrong type during field extraction: expected object array")); + "wrong type during field extraction: expected object array")); } TEST_F(AdminCliTest, TestLocateRowAndCheckRowPresence) { http://git-wip-us.apache.org/repos/asf/kudu/blob/0a7940d6/src/kudu/util/jsonreader-test.cc -- diff --git a/src/kudu/util/jsonreader-test.cc b/src/kudu/util/jsonreader-test.cc index 50e1fc6..250091f 100644 --- a/src/kudu/util/jsonreader-test.cc +++ b/src/kudu/util/jsonreader-test.cc @@ -56,6 +56,9 @@ TEST(JsonReaderTest, Empty) { ASSERT_TRUE(r.ExtractBool(r.root(), "foo", nullptr).IsNotFound()); ASSERT_TRUE(r.ExtractInt32(r.root(), "foo", nullptr).IsNotFound()); ASSERT_TRUE(r.ExtractInt64(r.root(), "foo", nullptr).IsNotFound()); + ASSERT_TRUE(r.ExtractUint32(r.root(), "foo", nullptr).IsNotFound()); + ASSERT_TRUE(r.ExtractUint64(r.root(), "foo", nullptr).IsNotFound()); + ASSERT_TRUE(r.ExtractDouble(r.root(), "foo", nullptr).IsNotFound()); ASSERT_TRUE(r.ExtractString(r.root(), "foo", nullptr).IsNotFound()); ASSERT_TRUE(r.ExtractObject(r.root(), "foo", nullptr).IsNotFound()); ASSERT_TRUE(r.ExtractObjectArray(r.root(), "foo", nullptr).IsNotFound()); @@ -72,6 +75,9 @@ TEST(JsonReaderTest, Basic) { ASSERT_TRUE(r.ExtractBool(r.root(), "foo", nullptr).IsInvalidArgument()); ASSERT_TRUE(r.ExtractInt32(r.root(), "foo", nullptr).IsInvalidArgument()); ASSERT_TRUE(r.ExtractInt64(r.root(), "foo", nullptr).IsInvalidArgument()); + ASSERT_TRUE(r.ExtractUint32(r.root(), "foo", nullptr).IsInvalidArgument()); + ASSERT_TRUE(r.ExtractUint64(r.root(), "foo", nullptr).IsInvalidArgument()); + ASSERT_TRUE(r.ExtractDouble(r.root(), "foo", nullptr).IsInvalidArgument()); ASSERT_TRUE(r.ExtractObject(r.root(), "foo", nullptr).IsInvalidArgument()); ASSERT_TRUE(r.ExtractObjectArray(r.root(), "foo", nullptr).IsInvalidArgument()); } @@ -112,17 +118,26 @@ TEST(JsonReaderTest, LessBasic) { ASSERT_TRUE(r.ExtractBool(r.root(), "null", nullptr).IsInvalidArgument()); ASSERT_TRUE(r.ExtractInt32(r.root(), "null", nullptr).IsInvalidArgument()); ASSERT_TRUE(r.ExtractInt64(r.root(), "null", nullptr).IsInvalidArgument()); + ASSERT_TRUE(r.ExtractUint32(r.root(), "null", nullptr).IsInvalidArgument()); + ASSERT_TRUE(r.ExtractUint64(r.root(), "null", nullptr).IsInvalidArgument()); + ASSERT_TRUE(r.ExtractDouble(r.root(), "null", nullptr).IsInvalidArgument()); ASSERT_TRUE(r.ExtractObject(r.root(), "null", nullptr).IsInvalidArgument()); ASSERT_TRUE(r.ExtractObjectArray(r.root(), "null", nullptr).IsInvalidArgument()); ASSERT_TRUE(r.ExtractBool(r.root(), "empty", nullptr).IsInvalidArgument()); ASSERT_TRUE(r.ExtractInt32(r.root(), "empty", nullptr).IsInvalidArgument()); ASSERT_TRUE(r.ExtractInt64(r.root(), "empty", nullptr).IsInvalidArgument()); + ASSERT_TRUE(r.ExtractUint32(r.root(), "empty", nullptr).IsInvalidArgument()); + ASSERT_TRUE(r.ExtractUint64(r.root(), "empty", nullptr).IsInvalidArgument()); + ASSERT_TRUE(r.ExtractDouble(r.root(), "empty", nullptr).IsInvalidArgument()); ASSERT_TRUE(r.ExtractObject(r.root(), "empty", nullptr).IsInvalidArgument());
[2/2] kudu git commit: Add missing test dependency for Hive tests
Add missing test dependency for Hive tests The HMS client internally calls into the JobConf class, which is provided by the org.apache.hadoop.hadoop-mapreduce-client-core artifact. The HMS only specifies an optional dependency on hadoop-mapreduce-client-core, so we are forced to depend on it explicitly. Change-Id: I33187880247b3fe930ff521b0671345646e0fbf4 Reviewed-on: http://gerrit.cloudera.org:8080/11733 Reviewed-by: Hao Hao Reviewed-by: Andrew Wong Tested-by: Dan Burkert Project: http://git-wip-us.apache.org/repos/asf/kudu/repo Commit: http://git-wip-us.apache.org/repos/asf/kudu/commit/b3486d99 Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/b3486d99 Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/b3486d99 Branch: refs/heads/master Commit: b3486d99a1e1bb5debef82912728d522f58621b7 Parents: 0a7940d Author: Dan Burkert Authored: Thu Oct 18 17:18:32 2018 -0700 Committer: Dan Burkert Committed: Fri Oct 19 19:23:54 2018 + -- java/gradle/dependencies.gradle | 1 + java/kudu-client/build.gradle | 4 2 files changed, 5 insertions(+) -- http://git-wip-us.apache.org/repos/asf/kudu/blob/b3486d99/java/gradle/dependencies.gradle -- diff --git a/java/gradle/dependencies.gradle b/java/gradle/dependencies.gradle index 267e452..52a5079 100755 --- a/java/gradle/dependencies.gradle +++ b/java/gradle/dependencies.gradle @@ -83,6 +83,7 @@ libs += [ hadoopClient : "org.apache.hadoop:hadoop-client:$versions.hadoop", hadoopCommon : "org.apache.hadoop:hadoop-common:$versions.hadoop", hadoopMRClientCommon : "org.apache.hadoop:hadoop-mapreduce-client-common:$versions.hadoop", +hadoopMRClientCore : "org.apache.hadoop:hadoop-mapreduce-client-core:$versions.hadoop", hamcrestCore : "org.hamcrest:hamcrest-core:$versions.hamcrest", hiveMetastore: "org.apache.hive:hive-metastore:$versions.hive", hiveMetastoreTest: "org.apache.hive:hive-metastore:$versions.hive:tests", http://git-wip-us.apache.org/repos/asf/kudu/blob/b3486d99/java/kudu-client/build.gradle -- diff --git a/java/kudu-client/build.gradle b/java/kudu-client/build.gradle index 363135b..2b99355 100644 --- a/java/kudu-client/build.gradle +++ b/java/kudu-client/build.gradle @@ -38,6 +38,10 @@ dependencies { testCompile project(":kudu-test-utils") testCompile libs.hamcrestCore testCompile libs.hiveMetastore + // The HMS client relies on the MR client-core artifact for JobConf, but only + // specifies it as an optional dependency. Gradle doesn't pull in optional + // dependencies, so we have to depend on it directly. + testCompile libs.hadoopMRClientCore testCompile libs.junit testCompile libs.log4j testCompile libs.mockitoCore