Marton Greber created KUDU-3755:
-----------------------------------

             Summary: Python/Java test scaffolding: preserve cluster data on 
test failure
                 Key: KUDU-3755
                 URL: https://issues.apache.org/jira/browse/KUDU-3755
             Project: Kudu
          Issue Type: Bug
            Reporter: Marton Greber


The C++ test scaffolding preserves the cluster data directory when a test 
fails, controlled by --test_leave_files=on_failure (the default). See 
src/kudu/util/test_util.cc:
{code:java}
KuduTest::~KuduTest() {
  // Reset the flags first to prevent them from affecting test directory 
cleanup.
  flag_saver_.reset();  // Clean up the test directory in the destructor 
instead of a TearDown
  // method. This is better because it ensures that the child-class
  // dtor runs first -- so, if the child class is using a minicluster, etc,
  // we will shut that down before we remove files underneath.
  if (FLAGS_test_leave_files == "always") {
    LOG(INFO) << "-----------------------------------------------";
    LOG(INFO) << "--test_leave_files specified, leaving files in " << test_dir_;
  } else if (FLAGS_test_leave_files == "on_failure" && HasFailure()) {
    LOG(INFO) << "-----------------------------------------------";
    LOG(INFO) << "Had failures, leaving test files at " << test_dir_;
  } else {
    VLOG(1) << "Cleaning up temporary test files...";
    WARN_NOT_OK(env_->DeleteRecursively(test_dir_),
                "Couldn't remove test files");
  }
}{code}
The Python and Java test scaffolding do not follow this convention. Both 
delegate cluster data cleanup entirely to the kudu test mini_cluster control 
shell, which unconditionally deletes the cluster root on exit regardless of 
test outcome (src/kudu/tools/tool_action_test.cc):
{code:java}
  // Normal exit, clean up cluster root.
  if (cluster) {
    cluster->Shutdown();
    WARN_NOT_OK(Env::Default()->DeleteRecursively(cluster->cluster_root()),
                "Could not delete cluster root");
  }
  return Status::OK(); {code}

Java explicitly documents this delegation 
(java/kudu-test-utils/src/main/java/org/apache/kudu/test/cluster/MiniKuduCluster.java):


{code:java}
// If a cluster root was not set, create a unique temp directory to use.// The 
mini cluster will clean this directory up on exit.File tempRoot = 
TempDirUtils.makeTempDirectory("mini-kudu-cluster", 
TempDirUtils.DeleteOnExit.NO_DELETE_ON_EXIT);
 {code}
What needs to be done:
 # Add a leave_files boolean field to CreateClusterRequestPB in 
src/kudu/tools/tool.proto so callers can opt out of the unconditional cleanup 
in the control shell

 # Implement the opt-out in tool_action_test.cc

 # Python (python/kudu/tests/common.py): detect test failure (Python 3: 
self._outcome.errors; Python 2: result.failures), pass leaveFiles: true to the 
control shell, and manage directory lifetime based on a KUDU_TEST_LEAVE_FILES 
env var (on_failure/always/never) mirroring the C++ flag

 # Java (KuduTestHarness.java / MiniKuduCluster.java): same, using JUnit 4's 
TestWatcher.failed()/succeeded() callbacks to detect outcome

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to