You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by ad...@apache.org on 2019/07/18 22:20:38 UTC

[kudu] branch master updated: KUDU-2797 p1: expose the tablet's live row count

This is an automated email from the ASF dual-hosted git repository.

adar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git


The following commit(s) were added to refs/heads/master by this push:
     new 786d45d  KUDU-2797 p1: expose the tablet's live row count
786d45d is described below

commit 786d45d2ba76230ccd25e7fe24dcebb3828b48c2
Author: helifu <hz...@corp.netease.com>
AuthorDate: Wed Jul 17 20:07:11 2019 +0800

    KUDU-2797 p1: expose the tablet's live row count
    
    The tablet's live row count is exposed in below ways:
    1) be exposed as metrics on the tablet server;
    2) be exposed on the tablet server's Web-UI;
    
    Change-Id: I2b15d7d2a5c84a3716215608b2444395ca94e64c
    Reviewed-on: http://gerrit.cloudera.org:8080/13877
    Reviewed-by: Adar Dembo <ad...@cloudera.com>
    Tested-by: Adar Dembo <ad...@cloudera.com>
---
 src/kudu/tablet/tablet_replica-test.cc    | 26 +++++++++++++++++++++++++-
 src/kudu/tablet/tablet_replica.cc         | 24 +++++++++++++++++++++++-
 src/kudu/tablet/tablet_replica.h          |  4 ++++
 src/kudu/tserver/tserver_path_handlers.cc |  8 ++++++++
 www/tablet.mustache                       |  1 +
 5 files changed, 61 insertions(+), 2 deletions(-)

diff --git a/src/kudu/tablet/tablet_replica-test.cc b/src/kudu/tablet/tablet_replica-test.cc
index 9cf08d7..376fb89 100644
--- a/src/kudu/tablet/tablet_replica-test.cc
+++ b/src/kudu/tablet/tablet_replica-test.cc
@@ -50,6 +50,7 @@
 #include "kudu/fs/fs_manager.h"
 #include "kudu/gutil/bind.h"
 #include "kudu/gutil/bind_helpers.h"
+#include "kudu/gutil/callback.h"
 #include "kudu/gutil/gscoped_ptr.h"
 #include "kudu/gutil/macros.h"
 #include "kudu/gutil/ref_counted.h"
@@ -73,14 +74,17 @@
 #include "kudu/util/monotime.h"
 #include "kudu/util/net/dns_resolver.h"
 #include "kudu/util/pb_util.h"
+#include "kudu/util/random.h"
 #include "kudu/util/status.h"
 #include "kudu/util/test_macros.h"
 #include "kudu/util/test_util.h"
 #include "kudu/util/threadpool.h"
 
+DECLARE_int32(flush_threshold_mb);
+
 METRIC_DECLARE_entity(tablet);
 
-DECLARE_int32(flush_threshold_mb);
+METRIC_DECLARE_gauge_int64(live_row_count);
 
 using kudu::consensus::CommitMsg;
 using kudu::consensus::ConsensusBootstrapInfo;
@@ -771,5 +775,25 @@ TEST_F(TabletReplicaTest, Kudu2690Test) {
   NO_FATALS(RestartReplica());
 }
 
+TEST_F(TabletReplicaTest, TestLiveRowCountMetric) {
+  ConsensusBootstrapInfo info;
+  ASSERT_OK(StartReplicaAndWaitUntilLeader(info));
+
+  auto live_row_count = METRIC_live_row_count.InstantiateFunctionGauge(
+      tablet_replica_->tablet()->GetMetricEntity(), Callback<int64_t(void)>());
+  ASSERT_EQ(0, live_row_count->value());
+
+  // Insert some rows.
+  Random rand(SeedRandom());
+  const int kNumInsert = rand.Next() % 100 + 1;
+  ASSERT_OK(ExecuteInsertsAndRollLogs(kNumInsert));
+  ASSERT_EQ(kNumInsert, live_row_count->value());
+
+  // Delete some rows.
+  const int kNumDelete = rand.Next() % kNumInsert;
+  ASSERT_OK(ExecuteDeletesAndRollLogs(kNumDelete));
+  ASSERT_EQ(kNumInsert - kNumDelete, live_row_count->value());
+}
+
 } // namespace tablet
 } // namespace kudu
diff --git a/src/kudu/tablet/tablet_replica.cc b/src/kudu/tablet/tablet_replica.cc
index f9c4000..9a58352 100644
--- a/src/kudu/tablet/tablet_replica.cc
+++ b/src/kudu/tablet/tablet_replica.cc
@@ -89,6 +89,11 @@ METRIC_DEFINE_gauge_size(tablet, on_disk_size, "Tablet Size On Disk",
 METRIC_DEFINE_gauge_string(tablet, state, "Tablet State",
                            kudu::MetricUnit::kState,
                            "State of this tablet.");
+METRIC_DEFINE_gauge_int64(tablet, live_row_count, "Tablet Live Row Count",
+                          kudu::MetricUnit::kRows,
+                          "Number of live rows in this tablet, excludes deleted rows."
+                          "When the tablet doesn't support live row counting, -1 will "
+                          "be returned.");
 
 namespace kudu {
 namespace tablet {
@@ -199,11 +204,14 @@ Status TabletReplica::Start(const ConsensusBootstrapInfo& bootstrap_info,
         txn_tracker_.StartInstrumentation(tablet_->GetMetricEntity());
 
         METRIC_on_disk_size.InstantiateFunctionGauge(
-                tablet_->GetMetricEntity(), Bind(&TabletReplica::OnDiskSize, Unretained(this)))
+            tablet_->GetMetricEntity(), Bind(&TabletReplica::OnDiskSize, Unretained(this)))
             ->AutoDetach(&metric_detacher_);
         METRIC_state.InstantiateFunctionGauge(
             tablet_->GetMetricEntity(), Bind(&TabletReplica::StateName, Unretained(this)))
             ->AutoDetach(&metric_detacher_);
+        METRIC_live_row_count.InstantiateFunctionGauge(
+            tablet_->GetMetricEntity(), Bind(&TabletReplica::CountLiveRows, Unretained(this)))
+            ->AutoDetach(&metric_detacher_);
       }
       txn_tracker_.StartMemoryTracking(tablet_->mem_tracker());
 
@@ -797,6 +805,20 @@ size_t TabletReplica::OnDiskSize() const {
   return ret;
 }
 
+int64_t TabletReplica::CountLiveRows() const {
+  int64_t ret = -1;
+  shared_ptr<Tablet> tablet;
+  {
+    std::lock_guard<simple_spinlock> l(lock_);
+    tablet = tablet_;
+  }
+
+  if (tablet) {
+    ignore_result(tablet->CountLiveRows(&ret));
+  }
+  return ret;
+}
+
 void TabletReplica::MakeUnavailable(const Status& error) {
   std::shared_ptr<Tablet> tablet;
   {
diff --git a/src/kudu/tablet/tablet_replica.h b/src/kudu/tablet/tablet_replica.h
index 044f6a8..f27faed 100644
--- a/src/kudu/tablet/tablet_replica.h
+++ b/src/kudu/tablet/tablet_replica.h
@@ -300,6 +300,10 @@ class TabletReplica : public RefCountedThreadSafe<TabletReplica>,
   // Return the total on-disk size of this tablet replica, in bytes.
   size_t OnDiskSize() const;
 
+  // Return the number of live rows of this tablet replica.
+  // -1 will be returned if the tablet doesn't support live row counting.
+  int64_t CountLiveRows() const;
+
  private:
   friend class kudu::AlterTableTest;
   friend class RefCountedThreadSafe<TabletReplica>;
diff --git a/src/kudu/tserver/tserver_path_handlers.cc b/src/kudu/tserver/tserver_path_handlers.cc
index eb858e3..d0e7951 100644
--- a/src/kudu/tserver/tserver_path_handlers.cc
+++ b/src/kudu/tserver/tserver_path_handlers.cc
@@ -17,6 +17,8 @@
 
 #include "kudu/tserver/tserver_path_handlers.h"
 
+#include <stdint.h>
+
 #include <algorithm>
 #include <iosfwd>
 #include <map>
@@ -415,6 +417,12 @@ void TabletServerPathHandlers::HandleTabletPage(const Webserver::WebRequest& req
   output->Set("partition",
               tmeta->partition_schema().PartitionDebugString(tmeta->partition(), schema));
   output->Set("on_disk_size", HumanReadableNumBytes::ToString(replica->OnDiskSize()));
+  int64_t live_row_count = replica->CountLiveRows();
+  if (live_row_count >= 0) {
+    output->Set("tablet_live_row_count", live_row_count);
+  } else {
+    output->Set("tablet_live_row_count", "N/A");
+  }
 
   SchemaToJson(schema, output);
 }
diff --git a/www/tablet.mustache b/www/tablet.mustache
index 739dc0b..2483d0f 100644
--- a/www/tablet.mustache
+++ b/www/tablet.mustache
@@ -25,6 +25,7 @@ under the License.
 
   <table class='table'>
     <tr><td>Partition</td><td>{{partition}}</td></tr>
+    <tr><td>Live Row Count</td><td>{{tablet_live_row_count}}</td></tr>
     <tr><td>On-disk Size</td><td>{{on_disk_size}}</td></tr>
   </table>