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 2022/06/13 16:58:42 UTC

[kudu] branch master updated: [tests] make the startup page tests more robust

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

alexey 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 236a58914 [tests] make the startup page tests more robust
236a58914 is described below

commit 236a589140f46b7a0138c2b26620f596139f2777
Author: Alexey Serbin <al...@apache.org>
AuthorDate: Thu Jun 9 18:17:48 2022 -0700

    [tests] make the startup page tests more robust
    
    I noticed that the startup page tests reliably fail on my test machine.
    It turned out that there was KUDU_HOME variable set in the environment,
    so the embedded webserver rendered the pages according to the Mustache
    mappings found under $KUDU_HOME/www, while the test scenarios expect all
    pages to be pre-rendered.
    
    This patch updates corresponding test scenarios to reliably work even if
    the KUDU_HOME environment is set and points to the directory with
    the Mustache mapping files.
    
    Change-Id: I2e56cd49eb2e00c5666e4214c7ca4246386e8b9e
    Reviewed-on: http://gerrit.cloudera.org:8080/18606
    Tested-by: Kudu Jenkins
    Reviewed-by: Abhishek Chennaka <ac...@cloudera.com>
    Reviewed-by: Attila Bukor <ab...@apache.org>
---
 src/kudu/master/master-test.cc         | 118 ++++++++++++++++++++-------------
 src/kudu/tserver/tablet_server-test.cc |  28 +++++---
 2 files changed, 93 insertions(+), 53 deletions(-)

diff --git a/src/kudu/master/master-test.cc b/src/kudu/master/master-test.cc
index 5e13ed68c..d69003f56 100644
--- a/src/kudu/master/master-test.cc
+++ b/src/kudu/master/master-test.cc
@@ -141,6 +141,7 @@ DECLARE_int64(live_row_count_for_testing);
 DECLARE_int64(on_disk_size_for_testing);
 DECLARE_string(location_mapping_cmd);
 DECLARE_string(log_filename);
+DECLARE_string(webserver_doc_root);
 
 METRIC_DECLARE_histogram(handler_latency_kudu_master_MasterService_GetTableSchema);
 
@@ -392,50 +393,6 @@ TEST_F(MasterTest, TestResetBlockCacheMetricsInSameProcess) {
   });
 }
 
-TEST_F(MasterTest, TestStartupWebPage) {
-  EasyCurl c;
-  faststring buf;
-  string addr = mini_master_->bound_http_addr().ToString();
-  mini_master_->Shutdown();
-  std::atomic<bool> run_status_reader = false;
-  thread read_startup_page([&] {
-    EasyCurl thread_c;
-    faststring thread_buf;
-    while (!run_status_reader) {
-      SleepFor(MonoDelta::FromMilliseconds(10));
-      if (!(thread_c.FetchURL(strings::Substitute("http://$0/startup", addr), &thread_buf)).ok()) {
-        continue;
-      }
-      ASSERT_STR_MATCHES(thread_buf.ToString(), "\"init_status\":(100|0)( |,)");
-      ASSERT_STR_MATCHES(thread_buf.ToString(), "\"read_filesystem_status\":(100|0)( |,)");
-      ASSERT_STR_MATCHES(thread_buf.ToString(), "\"read_instance_metadatafiles_status\""
-                                                    ":(100|0)( |,)");
-      ASSERT_STR_MATCHES(thread_buf.ToString(), "\"read_data_directories_status\":"
-                                                    "([0-9]|[1-9][0-9]|100)( |,)");
-      ASSERT_STR_MATCHES(thread_buf.ToString(), "\"initialize_master_catalog_status\":"
-                                                    "([0-9]|[1-9][0-9]|100)( |,)");
-      ASSERT_STR_MATCHES(thread_buf.ToString(), "\"start_rpc_server_status\":(100|0)( |,)");
-    }
-  });
-  SCOPED_CLEANUP({
-    run_status_reader = true;
-    read_startup_page.join();
-  });
-
-  ASSERT_OK(mini_master_->Restart());
-  ASSERT_OK(mini_master_->WaitForCatalogManagerInit());
-  run_status_reader = true;
-
-  // After all the steps have been completed, ensure every startup step has 100 percent status
-  ASSERT_OK(c.FetchURL(strings::Substitute("http://$0/startup", addr), &buf));
-  ASSERT_STR_CONTAINS(buf.ToString(), "\"init_status\":100");
-  ASSERT_STR_CONTAINS(buf.ToString(), "\"read_filesystem_status\":100");
-  ASSERT_STR_CONTAINS(buf.ToString(), "\"read_instance_metadatafiles_status\":100");
-  ASSERT_STR_CONTAINS(buf.ToString(), "\"read_data_directories_status\":100");
-  ASSERT_STR_CONTAINS(buf.ToString(), "\"initialize_master_catalog_status\":100");
-  ASSERT_STR_CONTAINS(buf.ToString(), "\"start_rpc_server_status\":100");
-}
-
 TEST_F(MasterTest, TestRegisterAndHeartbeat) {
   const char* const kTsUUID = "my-ts-uuid";
 
@@ -2819,8 +2776,79 @@ TEST_P(AuthzTokenMasterTest, TestGenerateAuthzTokens) {
     ASSERT_EQ(supports_authz, resp.has_authz_token());
   }
 }
-
 INSTANTIATE_TEST_SUITE_P(SupportsAuthzTokens, AuthzTokenMasterTest, ::testing::Bool());
 
+class MasterStartupTest : public KuduTest {
+ protected:
+  void SetUp() override {
+    KuduTest::SetUp();
+
+    // The embedded webserver renders the contents of the generated pages
+    // according to mustache's mappings found under the directory pointed to by
+    // the --webserver_doc_root flag, which is set to $KUDU_HOME/www by default.
+    // Since this test assumes to fetch the pre-rendered output for the startup
+    // page, it would fail if the KUDU_HOME environment variable were set and
+    // pointed to the location where 'www' subdirectory contained the required
+    // mustache mappings. Let's explicitly point the document root to nowhere,
+    // so no mustache-based rendering is done.
+    FLAGS_webserver_doc_root = "";
+
+    mini_master_.reset(new MiniMaster(GetTestPath("Master"), HostPort("127.0.0.1", 0)));
+    ASSERT_OK(mini_master_->Start());
+  }
+
+  void TearDown() override {
+    mini_master_->Shutdown();
+    KuduTest::TearDown();
+  }
+
+  unique_ptr<MiniMaster> mini_master_;
+};
+
+TEST_F(MasterStartupTest, StartupWebPage) {
+  const string addr = mini_master_->bound_http_addr().ToString();
+  mini_master_->Shutdown();
+
+  std::atomic<bool> run_status_reader = true;
+  thread status_reader([&] {
+    EasyCurl c;
+    faststring buf;
+    while (run_status_reader) {
+      SleepFor(MonoDelta::FromMilliseconds(10));
+      if (!c.FetchURL(strings::Substitute("http://$0/startup", addr), &buf).ok()) {
+        continue;
+      }
+      ASSERT_STR_MATCHES(buf.ToString(), "\"init_status\":(100|0)( |,)");
+      ASSERT_STR_MATCHES(buf.ToString(), "\"read_filesystem_status\":(100|0)( |,)");
+      ASSERT_STR_MATCHES(buf.ToString(), "\"read_instance_metadatafiles_status\""
+                                             ":(100|0)( |,)");
+      ASSERT_STR_MATCHES(buf.ToString(), "\"read_data_directories_status\":"
+                                             "([0-9]|[1-9][0-9]|100)( |,)");
+      ASSERT_STR_MATCHES(buf.ToString(), "\"initialize_master_catalog_status\":"
+                                             "([0-9]|[1-9][0-9]|100)( |,)");
+      ASSERT_STR_MATCHES(buf.ToString(), "\"start_rpc_server_status\":(100|0)( |,)");
+    }
+  });
+  SCOPED_CLEANUP({
+    run_status_reader = false;
+    status_reader.join();
+  });
+
+  ASSERT_OK(mini_master_->Restart());
+  ASSERT_OK(mini_master_->WaitForCatalogManagerInit());
+  run_status_reader = false;
+
+  // After all the steps have been completed, ensure every startup step has 100 percent status
+  EasyCurl c;
+  faststring buf;
+  ASSERT_OK(c.FetchURL(strings::Substitute("http://$0/startup", addr), &buf));
+  ASSERT_STR_CONTAINS(buf.ToString(), "\"init_status\":100");
+  ASSERT_STR_CONTAINS(buf.ToString(), "\"read_filesystem_status\":100");
+  ASSERT_STR_CONTAINS(buf.ToString(), "\"read_instance_metadatafiles_status\":100");
+  ASSERT_STR_CONTAINS(buf.ToString(), "\"read_data_directories_status\":100");
+  ASSERT_STR_CONTAINS(buf.ToString(), "\"initialize_master_catalog_status\":100");
+  ASSERT_STR_CONTAINS(buf.ToString(), "\"start_rpc_server_status\":100");
+}
+
 } // namespace master
 } // namespace kudu
diff --git a/src/kudu/tserver/tablet_server-test.cc b/src/kudu/tserver/tablet_server-test.cc
index ce7fb6178..68fde5aad 100644
--- a/src/kudu/tserver/tablet_server-test.cc
+++ b/src/kudu/tserver/tablet_server-test.cc
@@ -206,6 +206,7 @@ DECLARE_int32(workload_stats_metric_collection_interval_ms);
 DECLARE_string(block_manager);
 DECLARE_string(env_inject_eio_globs);
 DECLARE_string(env_inject_full_globs);
+DECLARE_string(webserver_doc_root);
 DECLARE_uint32(tablet_apply_pool_overload_threshold_ms);
 
 // Declare these metrics prototypes for simpler unit testing of their behavior.
@@ -771,6 +772,16 @@ enum class ErrorType {
 class TabletServerStartupWebPageTest : public TabletServerTestBase {
  public:
   void SetUp() override {
+    // The embedded webserver renders the contents of the generated pages
+    // according to mustache's mappings found under the directory pointed to by
+    // the --webserver_doc_root flag, which is set to $KUDU_HOME/www by default.
+    // Since this test assumes to fetch the pre-rendered output for the startup
+    // page, it would fail if the KUDU_HOME environment variable were set and
+    // pointed to the location where 'www' subdirectory contained the required
+    // mustache mappings. Let's explicitly point the document root to nowhere,
+    // so no mustache-based rendering is done.
+    FLAGS_webserver_doc_root = "";
+
     NO_FATALS(TabletServerTestBase::SetUp());
     NO_FATALS(StartTabletServer(kNumDirs));
     // Create a bunch of tablets with a bunch of rowsets.
@@ -824,12 +835,13 @@ class TabletServerStartupWebPageTest : public TabletServerTestBase {
 };
 
 TEST_F(TabletServerStartupWebPageTest, TestStartupWebPage) {
-  EasyCurl c;
-  faststring buf;
   const string url = Substitute("http://$0/startup", mini_server_->bound_http_addr().ToString());
 
   // Verify if the startup status is complete.
   mini_server_->WaitStarted();
+
+  EasyCurl c;
+  faststring buf;
   ASSERT_OK(c.FetchURL(url, &buf));
   NO_FATALS(IsStatusComplete(buf.ToString()));
 
@@ -841,13 +853,13 @@ TEST_F(TabletServerStartupWebPageTest, TestStartupWebPage) {
   // Restart the tablet server and monitor the startup page contents.
   tablet_replica_.reset();
   mini_server_->Shutdown();
-  std::atomic<bool> run_status_reader = false;
+  std::atomic<bool> run_status_reader = true;
 
   // Hammer the webpage and validate the status percentages.
-  thread read_startup_page([&] {
+  thread status_reader([&] {
     EasyCurl thread_c;
     faststring thread_buf;
-    while (!run_status_reader) {
+    while (run_status_reader) {
       if (!thread_c.FetchURL(url, &thread_buf).ok()) {
         continue;
       }
@@ -855,13 +867,13 @@ TEST_F(TabletServerStartupWebPageTest, TestStartupWebPage) {
     }
   });
   SCOPED_CLEANUP({
-    run_status_reader = true;
-    read_startup_page.join();
+    run_status_reader = false;
+    status_reader.join();
   });
 
   mini_server_->Start();
   mini_server_->WaitStarted();
-  run_status_reader = true;
+  run_status_reader = false;
 
   // After the server has startup up, ensure every startup step has 100 percent status.
   ASSERT_OK(c.FetchURL(url, &buf));