You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by al...@apache.org on 2016/12/09 02:17:57 UTC

kudu git commit: KUDU-1753 continue scan if tablet is being deleted

Repository: kudu
Updated Branches:
  refs/heads/master 4bd36c46c -> 4b4329909


KUDU-1753 continue scan if tablet is being deleted

Updated TabletServiceImpl::HandleContinueScanRequest() to continue
serving in-progress scan requests even if the tablet was deleted
in the middle.

This patch also enables the TestDeleteTableWhileScanInProgress
integration test from the DeleteTableTest suite.

This is intended to fix the following JIRA item:
KUDU-1753 Impala query fails: Unable to advance iterator:
  Illegal state: Tablet is not running

Change-Id: Ica48c52a81862f47a9245003915d18be411bf8b1
Reviewed-on: http://gerrit.cloudera.org:8080/5346
Tested-by: Kudu Jenkins
Reviewed-by: Alexey Serbin <as...@cloudera.com>


Project: http://git-wip-us.apache.org/repos/asf/kudu/repo
Commit: http://git-wip-us.apache.org/repos/asf/kudu/commit/4b432990
Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/4b432990
Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/4b432990

Branch: refs/heads/master
Commit: 4b4329909c39a69f1d9f7b8a0132d34f83a08a7e
Parents: 4bd36c4
Author: Alexey Serbin <as...@cloudera.com>
Authored: Fri Dec 2 19:34:03 2016 -0800
Committer: Alexey Serbin <as...@cloudera.com>
Committed: Fri Dec 9 00:37:37 2016 +0000

----------------------------------------------------------------------
 src/kudu/integration-tests/delete_table-test.cc |  2 +-
 src/kudu/tserver/tablet_service.cc              | 44 +++++++++++++-------
 2 files changed, 30 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kudu/blob/4b432990/src/kudu/integration-tests/delete_table-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/integration-tests/delete_table-test.cc b/src/kudu/integration-tests/delete_table-test.cc
index 34f3556..5f0f58b 100644
--- a/src/kudu/integration-tests/delete_table-test.cc
+++ b/src/kudu/integration-tests/delete_table-test.cc
@@ -1276,7 +1276,7 @@ INSTANTIATE_TEST_CASE_P(FaultFlags, DeleteTableTombstonedParamTest,
 
 // Make sure the tablet server keeps the necessary data to serve scan request in
 // progress if tablet is marked for deletion.
-TEST_F(DeleteTableTest, DISABLED_TestDeleteTableWhileScanInProgress) {
+TEST_F(DeleteTableTest, TestDeleteTableWhileScanInProgress) {
   const KuduScanner::ReadMode read_modes[] = {
     KuduScanner::READ_LATEST,
     KuduScanner::READ_AT_SNAPSHOT,

http://git-wip-us.apache.org/repos/asf/kudu/blob/4b432990/src/kudu/tserver/tablet_service.cc
----------------------------------------------------------------------
diff --git a/src/kudu/tserver/tablet_service.cc b/src/kudu/tserver/tablet_service.cc
index 684209e..bff3400 100644
--- a/src/kudu/tserver/tablet_service.cc
+++ b/src/kudu/tserver/tablet_service.cc
@@ -1709,18 +1709,30 @@ Status TabletServiceImpl::HandleContinueScanRequest(const ScanRequestPB* req,
     }
   }
 
-  // Update metrics based on this scan request.
   scoped_refptr<TabletPeer> tablet_peer = scanner->tablet_peer();
   shared_ptr<Tablet> tablet;
-  RETURN_NOT_OK(GetTabletRef(tablet_peer, &tablet, error_code));
+  TabletServerErrorPB::Code tablet_ref_error_code;
+  const Status s = GetTabletRef(tablet_peer, &tablet, &tablet_ref_error_code);
+  // If the tablet is not running, but the scan operation in progress
+  // has reached this point, the tablet server has the necessary data to
+  // send in response for the scan continuation request.
+  if (PREDICT_FALSE(!s.ok() && tablet_ref_error_code !=
+                        TabletServerErrorPB::TABLET_NOT_RUNNING)) {
+    *error_code = tablet_ref_error_code;
+    return s;
+  }
 
-  // First, the number of rows/cells/bytes actually returned to the user.
-  tablet->metrics()->scanner_rows_returned->IncrementBy(
-      result_collector->NumRowsReturned());
-  tablet->metrics()->scanner_cells_returned->IncrementBy(
-      result_collector->NumRowsReturned() * scanner->client_projection_schema()->num_columns());
-  tablet->metrics()->scanner_bytes_returned->IncrementBy(
-      result_collector->ResponseSize());
+  // Update metrics based on this scan request.
+  if (tablet) {
+    // First, the number of rows/cells/bytes actually returned to the user.
+    tablet->metrics()->scanner_rows_returned->IncrementBy(
+        result_collector->NumRowsReturned());
+    tablet->metrics()->scanner_cells_returned->IncrementBy(
+        result_collector->NumRowsReturned() *
+            scanner->client_projection_schema()->num_columns());
+    tablet->metrics()->scanner_bytes_returned->IncrementBy(
+        result_collector->ResponseSize());
+  }
 
   // Then the number of rows/cells/bytes actually processed. Here we have to dig
   // into the per-column iterator stats, sum them up, and then subtract out the
@@ -1735,12 +1747,14 @@ Status TabletServiceImpl::HandleContinueScanRequest(const ScanRequestPB* req,
   delta_stats.SubtractStats(scanner->already_reported_stats());
   scanner->set_already_reported_stats(total_stats);
 
-  tablet->metrics()->scanner_rows_scanned->IncrementBy(
-      rows_scanned);
-  tablet->metrics()->scanner_cells_scanned_from_disk->IncrementBy(
-      delta_stats.cells_read_from_disk);
-  tablet->metrics()->scanner_bytes_scanned_from_disk->IncrementBy(
-      delta_stats.bytes_read_from_disk);
+  if (tablet) {
+    tablet->metrics()->scanner_rows_scanned->IncrementBy(
+        rows_scanned);
+    tablet->metrics()->scanner_cells_scanned_from_disk->IncrementBy(
+        delta_stats.cells_read_from_disk);
+    tablet->metrics()->scanner_bytes_scanned_from_disk->IncrementBy(
+        delta_stats.bytes_read_from_disk);
+  }
 
   scanner->UpdateAccessTime();
   *has_more_results = !req->close_scanner() && iter->HasNext();