You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by ab...@apache.org on 2020/04/02 21:54:04 UTC

[kudu] 03/04: [postgres] Deflake MiniPostgres tests

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

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

commit 73934d2bbfa476261845e2817cc65b38f7cfc832
Author: Attila Bukor <ab...@apache.org>
AuthorDate: Wed Apr 1 22:59:13 2020 +0200

    [postgres] Deflake MiniPostgres tests
    
    Tests depending on MiniPostgres were flaky as in some cases Postgres
    takes longer than expected to start. This commit introduces checking if
    psql can connect to MiniPostgres as part of start-up and retries every
    100ms for 5 seconds.
    
    Ran MiniRangerTest 1000 times on dist-test with no failures with this
    fix.
    
    Change-Id: I5106b3e2aeb9dabad9a7ee0b17059c1df2042bb4
    Reviewed-on: http://gerrit.cloudera.org:8080/15629
    Tested-by: Kudu Jenkins
    Reviewed-by: Adar Dembo <ad...@cloudera.com>
---
 src/kudu/postgres/mini_postgres.cc | 27 ++++++++++++++++++++++++---
 src/kudu/postgres/mini_postgres.h  |  4 ++++
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/src/kudu/postgres/mini_postgres.cc b/src/kudu/postgres/mini_postgres.cc
index 5b0e60d..ab739d5 100644
--- a/src/kudu/postgres/mini_postgres.cc
+++ b/src/kudu/postgres/mini_postgres.cc
@@ -91,10 +91,11 @@ Status MiniPostgres::Start() {
   if (!wait.ok()) {
     // TODO(abukor): implement retry with a different port if it can't bind
     WARN_NOT_OK(process_->Kill(SIGINT), "failed to send SIGINT to Postgres");
-  } else {
-    LOG(INFO) << "Postgres bound to " << port_;
+    return wait;
   }
-  return wait;
+
+  LOG(INFO) << "Postgres bound to " << port_;
+  return WaitForReady();
 }
 
 Status MiniPostgres::Stop() {
@@ -142,5 +143,25 @@ Status MiniPostgres::CreateConfigs() {
   return file->Close();
 }
 
+Status MiniPostgres::WaitForReady() const {
+  Status s;
+  MonoTime deadline = MonoTime::Now() + MonoDelta::FromSeconds(5);
+  while (MonoTime::Now() < deadline) {
+    Subprocess psql({
+        JoinPathSegments(bin_dir_, "postgres/pg_isready"),
+        "-p", SimpleItoa(port_),
+        "-h", host_,
+    });
+    RETURN_NOT_OK(psql.Start());
+    s = psql.WaitAndCheckExitCode();
+    if (s.ok()) {
+      return s;
+    }
+    SleepFor(MonoDelta::FromMilliseconds(100));
+  }
+
+  return Status::TimedOut(s.ToString());
+}
+
 } // namespace postgres
 } // namespace kudu
diff --git a/src/kudu/postgres/mini_postgres.h b/src/kudu/postgres/mini_postgres.h
index c60a824..67ac085 100644
--- a/src/kudu/postgres/mini_postgres.h
+++ b/src/kudu/postgres/mini_postgres.h
@@ -23,6 +23,7 @@
 
 #include <glog/logging.h>
 
+#include "kudu/gutil/port.h"
 #include "kudu/util/env.h"
 #include "kudu/util/path_util.h"
 #include "kudu/util/status.h"
@@ -84,6 +85,9 @@ class MiniPostgres {
     return DirName(exe);
   }
 
+  // Tests connection to Postgres, blocking until success or it times out.
+  Status WaitForReady() const WARN_UNUSED_RESULT;
+
   // 'pg_root' is the subdirectory in which the Postgres data files will live.
   Status CreateConfigs();