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 2017/10/31 01:04:32 UTC

[1/2] kudu git commit: KUDU-2205. Improve error message for failed globs

Repository: kudu
Updated Branches:
  refs/heads/master 9f85f04a9 -> 563f41b5c


KUDU-2205. Improve error message for failed globs

This fixes the Env::Glob function to give a more understandable error
message on typical issues such as permission denied. This can improve
the diagnosability in the case that a server is started with an
inaccessible log directory.

Change-Id: Ib7e487b5f6b24c2a2bd66e33f5b51a31e6585657
Reviewed-on: http://gerrit.cloudera.org:8080/8415
Reviewed-by: Adar Dembo <ad...@cloudera.com>
Tested-by: Kudu Jenkins


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

Branch: refs/heads/master
Commit: cb4b1c090da07c4f1c74c6c97665e564d3af2abe
Parents: 9f85f04
Author: Todd Lipcon <to...@apache.org>
Authored: Mon Oct 30 12:26:51 2017 -0700
Committer: Todd Lipcon <to...@apache.org>
Committed: Mon Oct 30 19:55:58 2017 +0000

----------------------------------------------------------------------
 src/kudu/util/env-test.cc  | 14 ++++++++++++++
 src/kudu/util/env_posix.cc |  8 +++++++-
 2 files changed, 21 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kudu/blob/cb4b1c09/src/kudu/util/env-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/util/env-test.cc b/src/kudu/util/env-test.cc
index 3e0517f..63c0e20 100644
--- a/src/kudu/util/env-test.cc
+++ b/src/kudu/util/env-test.cc
@@ -806,6 +806,20 @@ TEST_F(TestEnv, TestGlob) {
   }
 }
 
+// Test that the status returned when 'glob' fails with a permission
+// error is reasonable.
+TEST_F(TestEnv, TestGlobPermissionDenied) {
+  string dir = GetTestPath("glob");
+  ASSERT_OK(env_->CreateDir(dir));
+  chmod(dir.c_str(), 0000);
+  auto cleanup = MakeScopedCleanup([&]() {
+      chmod(dir.c_str(), 0700);
+    });
+  vector<string> matches;
+  Status s = env_->Glob(JoinPathSegments(dir, "*"), &matches);
+  ASSERT_STR_MATCHES(s.ToString(), "IO error: glob failed for /.*: Permission denied");
+}
+
 TEST_F(TestEnv, TestGetBlockSize) {
   uint64_t block_size;
 

http://git-wip-us.apache.org/repos/asf/kudu/blob/cb4b1c09/src/kudu/util/env_posix.cc
----------------------------------------------------------------------
diff --git a/src/kudu/util/env_posix.cc b/src/kudu/util/env_posix.cc
index bd552f1..e4d479c 100644
--- a/src/kudu/util/env_posix.cc
+++ b/src/kudu/util/env_posix.cc
@@ -1504,12 +1504,18 @@ class PosixEnv : public Env {
     glob_t result;
     auto cleanup = MakeScopedCleanup([&] { globfree(&result); });
 
+    errno = 0;
     int ret = glob(path_pattern.c_str(), GLOB_TILDE | GLOB_ERR , NULL, &result);
     switch (ret) {
       case 0: break;
       case GLOB_NOMATCH: return Status::OK();
       case GLOB_NOSPACE: return Status::RuntimeError("glob out of memory");
-      default: return Status::IOError("glob failure", std::to_string(ret));
+      default: {
+        string err = (errno != 0) ? ErrnoToString(errno) : "unknown error";
+        return Status::IOError(Substitute("glob failed for $0: $1",
+                                          path_pattern,
+                                          err));
+      }
     }
 
     for (size_t i = 0; i < result.gl_pathc; ++i) {


[2/2] kudu git commit: Add a macro form for ScopedCleanup

Posted by ad...@apache.org.
Add a macro form for ScopedCleanup

This adds a new macro SCOPED_CLEANUP({ ... }) which is a shorter
form of 'auto cleanup = MakeScopedCleanup([&] { ... })

I also changed over a bunch of call sites to use it (those that were
easily discovered by a perl regex). We can switch over the remaining
ones as we run across them.

Change-Id: Idb72c27824def3c6a6d98c56b46cdd620f651e0e
Reviewed-on: http://gerrit.cloudera.org:8080/8416
Tested-by: Kudu Jenkins
Reviewed-by: Adar Dembo <ad...@cloudera.com>


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

Branch: refs/heads/master
Commit: 563f41b5cb2c3b490377d1c1cf6a26c24811d035
Parents: cb4b1c0
Author: Todd Lipcon <to...@apache.org>
Authored: Mon Oct 30 12:53:18 2017 -0700
Committer: Adar Dembo <ad...@cloudera.com>
Committed: Tue Oct 31 01:04:11 2017 +0000

----------------------------------------------------------------------
 src/kudu/fs/log_block_manager.cc                    |  2 +-
 src/kudu/integration-tests/alter_table-test.cc      |  2 +-
 .../client-negotiation-failover-itest.cc            |  4 ++--
 .../raft_consensus_nonvoter-itest.cc                |  2 +-
 .../integration-tests/security-unknown-tsk-itest.cc |  2 +-
 .../tombstoned_voting-stress-test.cc                |  2 +-
 src/kudu/master/catalog_manager.cc                  |  2 +-
 src/kudu/security/ca/cert_management.cc             |  2 +-
 src/kudu/security/init.cc                           | 14 +++++++-------
 src/kudu/security/openssl_util.cc                   |  2 +-
 src/kudu/util/env-test.cc                           |  4 ++--
 src/kudu/util/maintenance_manager.cc                |  2 +-
 src/kudu/util/net/net_util.cc                       |  2 +-
 src/kudu/util/scoped_cleanup-test.cc                | 11 +++++++++++
 src/kudu/util/scoped_cleanup.h                      | 16 ++++++++++++++++
 src/kudu/util/threadpool-test.cc                    | 10 +++++-----
 16 files changed, 53 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/fs/log_block_manager.cc
----------------------------------------------------------------------
diff --git a/src/kudu/fs/log_block_manager.cc b/src/kudu/fs/log_block_manager.cc
index 2dc1a1a..41f9b3e 100644
--- a/src/kudu/fs/log_block_manager.cc
+++ b/src/kudu/fs/log_block_manager.cc
@@ -1482,7 +1482,7 @@ Status LogWritableBlock::Finalize() {
     return Status::OK();
   }
 
-  auto cleanup = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
     container_->FinalizeBlock(block_offset_, block_length_);
     state_ = FINALIZED;
   });

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/integration-tests/alter_table-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/integration-tests/alter_table-test.cc b/src/kudu/integration-tests/alter_table-test.cc
index 815ed34..f771209 100644
--- a/src/kudu/integration-tests/alter_table-test.cc
+++ b/src/kudu/integration-tests/alter_table-test.cc
@@ -2082,7 +2082,7 @@ TEST_F(AlterTableTest, TestRenameStillCreatingTable) {
              .num_replicas(1)
              .Create());
   });
-  auto cleanup = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
     creator_thread.join();
   });
 

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/integration-tests/client-negotiation-failover-itest.cc
----------------------------------------------------------------------
diff --git a/src/kudu/integration-tests/client-negotiation-failover-itest.cc b/src/kudu/integration-tests/client-negotiation-failover-itest.cc
index 5ff646d..bc21e8a 100644
--- a/src/kudu/integration-tests/client-negotiation-failover-itest.cc
+++ b/src/kudu/integration-tests/client-negotiation-failover-itest.cc
@@ -173,7 +173,7 @@ TEST_F(ClientFailoverOnNegotiationTimeoutITest, Kudu1580ConnectToTServer) {
       });
     // An automatic clean-up to handle both success and failure cases
     // in the code below.
-    auto cleanup = MakeScopedCleanup([&]() {
+    SCOPED_CLEANUP({
         resume_thread.join();
       });
 
@@ -268,7 +268,7 @@ TEST_F(ClientFailoverOnNegotiationTimeoutITest, Kudu2021NegotiateWithMaster) {
       CHECK_OK(m->Pause())
     });
   // An automatic clean-up to handle both success and failure cases.
-  auto pause_thread_cleanup = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
       pause_thread.join();
       CHECK_OK(m->Resume());
     });

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/integration-tests/raft_consensus_nonvoter-itest.cc
----------------------------------------------------------------------
diff --git a/src/kudu/integration-tests/raft_consensus_nonvoter-itest.cc b/src/kudu/integration-tests/raft_consensus_nonvoter-itest.cc
index 6b68914..4722185 100644
--- a/src/kudu/integration-tests/raft_consensus_nonvoter-itest.cc
+++ b/src/kudu/integration-tests/raft_consensus_nonvoter-itest.cc
@@ -504,7 +504,7 @@ TEST_F(RaftConsensusNonVoterITest, NonVoterReplicasDoNotVote) {
     ASSERT_OK(GetTermMetricValue(leader_ts, &term_leader));
 
     ASSERT_OK(leader_ts->Pause());
-    auto cleanup = MakeScopedCleanup([&]() {
+    SCOPED_CLEANUP({
       ASSERT_OK(leader_ts->Resume());
     });
     TServerDetails* new_leader;

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/integration-tests/security-unknown-tsk-itest.cc
----------------------------------------------------------------------
diff --git a/src/kudu/integration-tests/security-unknown-tsk-itest.cc b/src/kudu/integration-tests/security-unknown-tsk-itest.cc
index 2c13977..bf6416f 100644
--- a/src/kudu/integration-tests/security-unknown-tsk-itest.cc
+++ b/src/kudu/integration-tests/security-unknown-tsk-itest.cc
@@ -324,7 +324,7 @@ TEST_F(SecurityUnknownTskTest, ErrorUnavailableCommonOperations) {
     });
 
   // An automatic clean-up to handle failure cases in the code below.
-  auto importer_cleanup = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
       importer.join();
     });
 

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/integration-tests/tombstoned_voting-stress-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/integration-tests/tombstoned_voting-stress-test.cc b/src/kudu/integration-tests/tombstoned_voting-stress-test.cc
index f12ba59..ba71f8e 100644
--- a/src/kudu/integration-tests/tombstoned_voting-stress-test.cc
+++ b/src/kudu/integration-tests/tombstoned_voting-stress-test.cc
@@ -272,7 +272,7 @@ TEST_F(TombstonedVotingStressTest, TestTombstonedVotingUnderStress) {
   // Startup the voting thread.
   LOG(INFO) << "starting stress thread...";
   thread voter_thread([this] { RunVoteRequestLoop(); });
-  auto cleanup = MakeScopedCleanup([&] {
+  SCOPED_CLEANUP({
     SetState(kTestComplete);
     voter_thread.join();
   });

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/master/catalog_manager.cc
----------------------------------------------------------------------
diff --git a/src/kudu/master/catalog_manager.cc b/src/kudu/master/catalog_manager.cc
index 4f0a6d5..6702750 100644
--- a/src/kudu/master/catalog_manager.cc
+++ b/src/kudu/master/catalog_manager.cc
@@ -1359,7 +1359,7 @@ Status CatalogManager::CreateTable(const CreateTableRequestPB* orig_req,
   }
 
   // Ensure that we drop the name reservation upon return.
-  auto cleanup = MakeScopedCleanup([&] () {
+  SCOPED_CLEANUP({
     std::lock_guard<LockType> l(lock_);
     CHECK_EQ(1, reserved_table_names_.erase(req.name()));
   });

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/security/ca/cert_management.cc
----------------------------------------------------------------------
diff --git a/src/kudu/security/ca/cert_management.cc b/src/kudu/security/ca/cert_management.cc
index 3647e8c..5144216 100644
--- a/src/kudu/security/ca/cert_management.cc
+++ b/src/kudu/security/ca/cert_management.cc
@@ -315,7 +315,7 @@ Status CertSigner::CopyExtensions(X509_REQ* req, X509* x) {
   CHECK(req);
   CHECK(x);
   STACK_OF(X509_EXTENSION)* exts = X509_REQ_get_extensions(req);
-  auto exts_cleanup = MakeScopedCleanup([&exts]() {
+  SCOPED_CLEANUP({
     sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
   });
   for (size_t i = 0; i < sk_X509_EXTENSION_num(exts); ++i) {

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/security/init.cc
----------------------------------------------------------------------
diff --git a/src/kudu/security/init.cc b/src/kudu/security/init.cc
index 47c2c42..6ce2135 100644
--- a/src/kudu/security/init.cc
+++ b/src/kudu/security/init.cc
@@ -213,7 +213,7 @@ Status Krb5UnparseName(krb5_principal princ, string* name) {
   char* c_name;
   KRB5_RETURN_NOT_OK_PREPEND(krb5_unparse_name(g_krb5_ctx, princ, &c_name),
                              "krb5_unparse_name");
-  auto cleanup_name = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
       krb5_free_unparsed_name(g_krb5_ctx, c_name);
     });
   *name = c_name;
@@ -278,7 +278,7 @@ Status KinitContext::DoRenewal() {
   // Setup a cursor to iterate through the credential cache.
   KRB5_RETURN_NOT_OK_PREPEND(krb5_cc_start_seq_get(g_krb5_ctx, ccache_, &cursor),
                              "Failed to peek into ccache");
-  auto cleanup_cursor = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
       krb5_cc_end_seq_get(g_krb5_ctx, ccache_, &cursor); });
 
   krb5_creds creds;
@@ -287,7 +287,7 @@ Status KinitContext::DoRenewal() {
   krb5_error_code rc;
   // Iterate through the credential cache.
   while (!(rc = krb5_cc_next_cred(g_krb5_ctx, ccache_, &cursor, &creds))) {
-    auto cleanup_creds = MakeScopedCleanup([&]() {
+    SCOPED_CLEANUP({
         krb5_free_cred_contents(g_krb5_ctx, &creds); });
     if (krb5_is_config_principal(g_krb5_ctx, creds.server)) continue;
 
@@ -302,7 +302,7 @@ Status KinitContext::DoRenewal() {
 
     krb5_creds new_creds;
     memset(&new_creds, 0, sizeof(krb5_creds));
-    auto cleanup_new_creds = MakeScopedCleanup([&]() {
+    SCOPED_CLEANUP({
         krb5_free_cred_contents(g_krb5_ctx, &new_creds); });
     // Acquire a new ticket using the keytab. This ticket will automatically be put into the
     // credential cache.
@@ -356,7 +356,7 @@ Status KinitContext::Kinit(const string& keytab_path, const string& principal) {
                                                         0 /* valid from now */,
                                                         nullptr /* TKT service name */, opts_),
                              "unable to login from keytab");
-  auto cleanup_creds = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
       krb5_free_cred_contents(g_krb5_ctx, &creds); });
 
   ticket_end_timestamp_ = creds.times.endtime;
@@ -413,7 +413,7 @@ Status CanonicalizeKrb5Principal(std::string* principal) {
   krb5_principal princ;
   KRB5_RETURN_NOT_OK_PREPEND(krb5_parse_name(g_krb5_ctx, principal->c_str(), &princ),
                              "could not parse principal");
-  auto cleanup = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
       krb5_free_principal(g_krb5_ctx, princ);
     });
   RETURN_NOT_OK_PREPEND(Krb5UnparseName(princ, principal),
@@ -426,7 +426,7 @@ Status MapPrincipalToLocalName(const std::string& principal, std::string* local_
   krb5_principal princ;
   KRB5_RETURN_NOT_OK_PREPEND(krb5_parse_name(g_krb5_ctx, principal.c_str(), &princ),
                              "could not parse principal");
-  auto cleanup = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
       krb5_free_principal(g_krb5_ctx, princ);
     });
   char buf[1024];

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/security/openssl_util.cc
----------------------------------------------------------------------
diff --git a/src/kudu/security/openssl_util.cc b/src/kudu/security/openssl_util.cc
index 98ee245..3309ca6 100644
--- a/src/kudu/security/openssl_util.cc
+++ b/src/kudu/security/openssl_util.cc
@@ -146,7 +146,7 @@ STACK_OF(X509)* PEM_read_STACK_OF_X509(BIO* bio, void* /* unused */, pem_passwor
   // Extract information from the chain certificate.
   STACK_OF(X509_INFO)* info = PEM_X509_INFO_read_bio(bio, nullptr, nullptr, nullptr);
   if (!info) return nullptr;
-  auto cleanup = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
     sk_X509_INFO_pop_free(info, X509_INFO_free);
   });
 

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/util/env-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/util/env-test.cc b/src/kudu/util/env-test.cc
index 63c0e20..c152b87 100644
--- a/src/kudu/util/env-test.cc
+++ b/src/kudu/util/env-test.cc
@@ -747,7 +747,7 @@ TEST_F(TestEnv, TestWalkBadPermissions) {
   struct stat stat_buf;
   PCHECK(stat(kTestPath.c_str(), &stat_buf) == 0);
   PCHECK(chmod(kTestPath.c_str(), 0000) == 0);
-  auto cleanup = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
     // Restore the old permissions so the path can be successfully deleted.
     PCHECK(chmod(kTestPath.c_str(), stat_buf.st_mode) == 0);
   });
@@ -812,7 +812,7 @@ TEST_F(TestEnv, TestGlobPermissionDenied) {
   string dir = GetTestPath("glob");
   ASSERT_OK(env_->CreateDir(dir));
   chmod(dir.c_str(), 0000);
-  auto cleanup = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
       chmod(dir.c_str(), 0700);
     });
   vector<string> matches;

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/util/maintenance_manager.cc
----------------------------------------------------------------------
diff --git a/src/kudu/util/maintenance_manager.cc b/src/kudu/util/maintenance_manager.cc
index cf5bbf9..8984de8 100644
--- a/src/kudu/util/maintenance_manager.cc
+++ b/src/kudu/util/maintenance_manager.cc
@@ -462,7 +462,7 @@ void MaintenanceManager::LaunchOp(MaintenanceOp* op) {
     InsertOrDie(&running_instances_, thread_id, &op_instance);
   }
 
-  auto cleanup = MakeScopedCleanup([&] {
+  SCOPED_CLEANUP({
     op->RunningGauge()->Decrement();
 
     std::lock_guard<Mutex> l(lock_);

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/util/net/net_util.cc
----------------------------------------------------------------------
diff --git a/src/kudu/util/net/net_util.cc b/src/kudu/util/net/net_util.cc
index 3f9273b..520882f 100644
--- a/src/kudu/util/net/net_util.cc
+++ b/src/kudu/util/net/net_util.cc
@@ -290,7 +290,7 @@ Status GetLocalNetworks(std::vector<Network>* net) {
   struct ifaddrs *ifap = nullptr;
 
   int ret = getifaddrs(&ifap);
-  auto cleanup = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
     if (ifap) freeifaddrs(ifap);
   });
 

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/util/scoped_cleanup-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/util/scoped_cleanup-test.cc b/src/kudu/util/scoped_cleanup-test.cc
index fad50a0..2e77705 100644
--- a/src/kudu/util/scoped_cleanup-test.cc
+++ b/src/kudu/util/scoped_cleanup-test.cc
@@ -31,6 +31,17 @@ TEST(ScopedCleanup, TestCleanup) {
   ASSERT_EQ(0, var);
 }
 
+TEST(ScopedCleanup, TestCleanupMacro) {
+  int var = 0;
+  {
+    auto saved = var;
+    SCOPED_CLEANUP({ var = saved; });
+    var = 42;
+  }
+  ASSERT_EQ(0, var);
+}
+
+
 TEST(ScopedCleanup, TestCancelCleanup) {
   int var = 0;
   {

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/util/scoped_cleanup.h
----------------------------------------------------------------------
diff --git a/src/kudu/util/scoped_cleanup.h b/src/kudu/util/scoped_cleanup.h
index e989331..8ecfbcb 100644
--- a/src/kudu/util/scoped_cleanup.h
+++ b/src/kudu/util/scoped_cleanup.h
@@ -19,10 +19,26 @@
 
 #include <utility>
 
+#include "kudu/gutil/macros.h"
+
+// Run the given function body (which is typically a block of code surrounded by
+// curly-braces) when the current scope exits.
+//
+// Example:
+//   int fd = open(...);
+//   SCOPED_CLEANUP({ close(fd); });
+//
+// NOTE: in the case that you want to cancel the cleanup, use the more verbose
+// (non-macro) form below.
+#define SCOPED_CLEANUP(func_body) \
+  auto VARNAME_LINENUM(scoped_cleanup) = MakeScopedCleanup([&] { func_body });
+
 namespace kudu {
 
 // A scoped object which runs a cleanup function when going out of scope. Can
 // be used for scoped resource cleanup.
+//
+// Use 'MakeScopedCleanup()' below to instantiate.
 template<typename F>
 class ScopedCleanup {
  public:

http://git-wip-us.apache.org/repos/asf/kudu/blob/563f41b5/src/kudu/util/threadpool-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/util/threadpool-test.cc b/src/kudu/util/threadpool-test.cc
index c3d5c94..b92407b 100644
--- a/src/kudu/util/threadpool-test.cc
+++ b/src/kudu/util/threadpool-test.cc
@@ -192,7 +192,7 @@ TEST_F(ThreadPoolTest, TestThreadPoolWithNoMinimum) {
   ASSERT_TRUE(pool_->num_threads() == 0);
   // We get up to 3 threads when submitting work.
   CountDownLatch latch(1);
-  auto cleanup = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
     latch.CountDown();
   });
   ASSERT_OK(pool_->Submit(SlowTask::NewSlowTask(&latch)));
@@ -565,7 +565,7 @@ TEST_P(ThreadPoolTestTokenTypes, TestTokenSubmitsProcessedConcurrently) {
   // A violation to the tested invariant would yield a deadlock, so let's set
   // up an alarm to bail us out.
   alarm(60);
-  auto cleanup = MakeScopedCleanup([&] {
+  SCOPED_CLEANUP({
       alarm(0); // Disable alarm on test exit.
   });
   shared_ptr<Barrier> b = std::make_shared<Barrier>(kNumTokens + 1);
@@ -588,7 +588,7 @@ TEST_F(ThreadPoolTest, TestTokenSubmitsNonSequential) {
   // A violation to the tested invariant would yield a deadlock, so let's set
   // up an alarm to bail us out.
   alarm(60);
-  auto cleanup = MakeScopedCleanup([&] {
+  SCOPED_CLEANUP({
       alarm(0); // Disable alarm on test exit.
   });
   shared_ptr<Barrier> b = std::make_shared<Barrier>(kNumSubmissions + 1);
@@ -615,7 +615,7 @@ TEST_P(ThreadPoolTestTokenTypes, TestTokenShutdown) {
   // A violation to the tested invariant would yield a deadlock, so let's set
   // up an alarm to bail us out.
   alarm(60);
-  auto cleanup = MakeScopedCleanup([&] {
+  SCOPED_CLEANUP({
       alarm(0); // Disable alarm on test exit.
   });
 
@@ -764,7 +764,7 @@ TEST_P(ThreadPoolTestTokenTypes, TestTokenSubmissionsAdhereToMaxQueueSize) {
 
   CountDownLatch latch(1);
   unique_ptr<ThreadPoolToken> t = pool_->NewToken(GetParam());
-  auto cleanup = MakeScopedCleanup([&]() {
+  SCOPED_CLEANUP({
     latch.CountDown();
   });
   // We will be able to submit two tasks: one for max_threads == 1 and one for