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 2020/03/27 20:01:41 UTC

[kudu] branch master updated (557f070 -> 092cecc)

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

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


    from 557f070  KUDU-3085: Create Scala/SBT integration test example.
     new 458e6ce  iwyu: standardize on libc++
     new 092cecc  iwyu: codebase-wide fixes based on libcpp

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 build-support/iwyu.py                              |  40 ++-----
 build-support/iwyu/iwyu_tool.py                    |  39 +++++++
 build-support/iwyu/mappings/boost-extra.imp        |   1 +
 .../mappings/{libunwind.imp => libcxx-extra.imp}   |  12 ++-
 build-support/iwyu/mappings/libcxx.imp             |  60 +++++++++++
 build-support/iwyu/mappings/openssl.imp            |  39 +++++++
 build-support/iwyu/mappings/system-linux.imp       |  12 ++-
 src/kudu/benchmarks/tpch/rpc_line_item_dao-test.cc |   1 +
 src/kudu/cfile/binary_dict_block.cc                |   3 +-
 src/kudu/cfile/binary_plain_block.cc               |   1 -
 src/kudu/cfile/cfile-test.cc                       |   2 +-
 src/kudu/cfile/cfile_reader.h                      |   1 -
 src/kudu/cfile/cfile_writer.h                      |   9 --
 src/kudu/cfile/index-test.cc                       |   1 +
 src/kudu/cfile/index_btree.cc                      |   4 +-
 src/kudu/cfile/type_encodings.cc                   |   7 +-
 src/kudu/client/authz_token_cache.cc               |   2 +
 src/kudu/client/batcher.cc                         |   1 -
 src/kudu/client/batcher.h                          |   2 +-
 src/kudu/client/client-internal.cc                 |   1 -
 src/kudu/client/client-internal.h                  |  14 +--
 src/kudu/client/client-test-util.cc                |   1 +
 src/kudu/client/client-test-util.h                 |   1 +
 src/kudu/client/client-test.cc                     |  21 +++-
 src/kudu/client/client-unittest.cc                 |   3 +-
 src/kudu/client/client.cc                          |   6 +-
 src/kudu/client/client.h                           |   3 +
 src/kudu/client/meta_cache.cc                      |   1 +
 src/kudu/client/partitioner-internal.cc            |   1 -
 src/kudu/client/partitioner-internal.h             |   1 +
 src/kudu/client/scan_token-internal.cc             |   1 +
 src/kudu/client/schema.cc                          |   1 -
 src/kudu/client/session-internal.cc                |   1 -
 src/kudu/client/shared_ptr.h                       |  24 ++++-
 src/kudu/client/table-internal.h                   |   3 +-
 src/kudu/client/table_alterer-internal.cc          |   1 +
 src/kudu/client/write_op.cc                        |   1 -
 src/kudu/client/write_op.h                         |   1 +
 src/kudu/clock/builtin_ntp-internal.cc             |   3 +-
 src/kudu/clock/builtin_ntp.cc                      |   2 +-
 src/kudu/clock/hybrid_clock.cc                     |   1 +
 src/kudu/clock/logical_clock.cc                    |   2 +-
 src/kudu/clock/ntp-test.cc                         |   1 +
 src/kudu/codegen/codegen-test.cc                   |   1 -
 src/kudu/codegen/compilation_manager.cc            |   1 +
 src/kudu/codegen/module_builder.cc                 |   2 +-
 src/kudu/common/column_predicate-test.cc           |   2 +-
 src/kudu/common/column_predicate.h                 |   1 -
 src/kudu/common/columnblock.h                      |   1 +
 src/kudu/common/encoded_key-test.cc                |  13 ++-
 src/kudu/common/generic_iterators-test.cc          |   4 +-
 src/kudu/common/id_mapping.h                       |   1 -
 src/kudu/common/key_encoder.cc                     |   9 +-
 src/kudu/common/key_util.cc                        |   1 +
 src/kudu/common/partition-test.cc                  |   4 +-
 src/kudu/common/partition.cc                       |   1 -
 src/kudu/common/schema-test.cc                     |   1 -
 src/kudu/common/schema.h                           |  10 +-
 src/kudu/common/types-test.cc                      |   1 +
 src/kudu/common/types.cc                           |   2 +
 src/kudu/consensus/consensus_meta-test.cc          |   1 -
 .../consensus_meta_manager-stress-test.cc          |   1 -
 src/kudu/consensus/consensus_peers-test.cc         |   1 +
 src/kudu/consensus/consensus_peers.cc              |   1 +
 src/kudu/consensus/consensus_queue-test.cc         |   1 -
 src/kudu/consensus/log-test.cc                     |   1 +
 src/kudu/consensus/log.cc                          |   1 +
 src/kudu/consensus/log_util.cc                     |   1 -
 src/kudu/consensus/mt-log-test.cc                  |   1 -
 src/kudu/consensus/opid_util.cc                    |   1 +
 src/kudu/consensus/quorum_util-test.cc             |   1 +
 src/kudu/consensus/quorum_util.cc                  |   1 -
 src/kudu/consensus/raft_consensus_quorum-test.cc   |   1 -
 src/kudu/experiments/merge-test.cc                 |   4 +-
 src/kudu/experiments/rwlock-perf.cc                |   2 +-
 src/kudu/fs/data_dirs.cc                           |   1 +
 src/kudu/fs/dir_manager.cc                         |   1 +
 src/kudu/fs/error_manager.h                        |   4 +-
 src/kudu/fs/fs_manager-test.cc                     |   2 +
 src/kudu/fs/fs_manager.cc                          |   1 -
 src/kudu/fs/fs_manager.h                           |   1 -
 src/kudu/gutil/hash/city.cc                        |   2 +-
 src/kudu/gutil/hash/hash.h                         |   6 +-
 src/kudu/gutil/stringprintf.cc                     |   1 -
 src/kudu/gutil/strings/escaping.h                  |   3 +-
 src/kudu/gutil/strings/split.cc                    |   1 -
 src/kudu/gutil/strings/stringpiece.cc              |   1 -
 src/kudu/gutil/strings/stringpiece.h               |   3 +-
 src/kudu/gutil/strings/util.h                      |   3 +-
 src/kudu/gutil/sysinfo.cc                          |   3 +-
 src/kudu/gutil/utf/rune.c                          |   2 -
 src/kudu/hms/hms_catalog-test.cc                   |   2 +-
 src/kudu/hms/hms_catalog.cc                        |   2 +-
 src/kudu/hms/hms_client-test.cc                    |   2 -
 src/kudu/hms/hms_client.cc                         |   1 +
 .../alter_table-randomized-test.cc                 |   1 -
 src/kudu/integration-tests/alter_table-test.cc     |   1 +
 .../integration-tests/auth_token_expire-itest.cc   |   2 +-
 .../integration-tests/catalog_manager_tsk-itest.cc |   1 -
 .../client-negotiation-failover-itest.cc           |   1 -
 .../integration-tests/client_failover-itest.cc     |   1 -
 src/kudu/integration-tests/cluster_itest_util.cc   |   1 +
 src/kudu/integration-tests/cluster_verifier.cc     |   3 +-
 .../consensus_peer_health_status-itest.cc          |   1 +
 src/kudu/integration-tests/create-table-itest.cc   |   1 +
 src/kudu/integration-tests/delete_table-itest.cc   |   1 +
 src/kudu/integration-tests/delete_tablet-itest.cc  |   1 +
 src/kudu/integration-tests/dense_node-itest.cc     |   1 +
 src/kudu/integration-tests/disk_failure-itest.cc   |   1 +
 .../integration-tests/disk_reservation-itest.cc    |   1 +
 src/kudu/integration-tests/hms_itest-base.cc       |   1 -
 src/kudu/integration-tests/linked_list-test-util.h |   1 +
 .../integration-tests/location_assignment-itest.cc |   1 +
 src/kudu/integration-tests/log-rolling-itest.cc    |   1 +
 .../integration-tests/maintenance_mode-itest.cc    |   1 +
 .../master_cert_authority-itest.cc                 |   1 -
 .../integration-tests/master_failover-itest.cc     |   1 +
 src/kudu/integration-tests/master_hms-itest.cc     |   1 +
 .../integration-tests/master_replication-itest.cc  |   1 +
 src/kudu/integration-tests/memory_gc-itest.cc      |   1 +
 .../integration-tests/mini_cluster_fs_inspector.cc |   2 +
 .../integration-tests/minidump_generation-itest.cc |   1 +
 .../integration-tests/multidir_cluster-itest.cc    |   1 +
 .../integration-tests/raft_config_change-itest.cc  |   1 +
 src/kudu/integration-tests/raft_consensus-itest.cc |   1 +
 .../raft_consensus_election-itest.cc               |   1 +
 .../raft_consensus_failure_detector-imc-itest.cc   |   1 +
 .../raft_consensus_nonvoter-itest.cc               |   1 +
 src/kudu/integration-tests/registration-test.cc    |   2 +-
 .../integration-tests/security-faults-itest.cc     |   1 -
 src/kudu/integration-tests/security-itest.cc       |   1 +
 .../security-master-auth-itest.cc                  |   1 +
 src/kudu/integration-tests/stop_tablet-itest.cc    |   2 +-
 .../integration-tests/table_locations-itest.cc     |   1 -
 src/kudu/integration-tests/tablet_copy-itest.cc    |   1 +
 .../tablet_copy_client_session-itest.cc            |   1 +
 .../integration-tests/tablet_history_gc-itest.cc   |   1 +
 .../integration-tests/tablet_replacement-itest.cc  |   2 +
 .../tablet_server_quiescing-itest.cc               |   2 +
 src/kudu/integration-tests/test_workload.h         |   1 +
 .../timestamp_advancement-itest.cc                 |   1 +
 .../tombstoned_voting-imc-itest.cc                 |   1 +
 .../integration-tests/tombstoned_voting-itest.cc   |   1 +
 .../tombstoned_voting-stress-test.cc               |   2 +-
 src/kudu/integration-tests/ts_itest-base.cc        |   1 +
 src/kudu/integration-tests/ts_recovery-itest.cc    |   2 +-
 .../integration-tests/webserver-crawl-itest.cc     |   2 +
 src/kudu/master/auto_rebalancer-test.cc            |   1 +
 src/kudu/master/auto_rebalancer.cc                 |   1 +
 src/kudu/master/hms_notification_log_listener.cc   |   1 +
 src/kudu/master/location_cache-test.cc             |   1 +
 src/kudu/master/master-test.cc                     |   1 +
 src/kudu/master/master.cc                          |   1 +
 src/kudu/master/master_path_handlers.cc            |   1 -
 src/kudu/master/placement_policy-test.cc           |   1 +
 src/kudu/master/placement_policy.cc                |   2 +-
 src/kudu/master/ranger_authz_provider.cc           |   2 +-
 src/kudu/master/sentry_authz_provider-test.cc      |   4 +-
 src/kudu/master/sentry_authz_provider.cc           |   2 +-
 src/kudu/master/sentry_privileges_fetcher.cc       |   2 +-
 src/kudu/master/sentry_privileges_fetcher.h        |   1 +
 src/kudu/master/ts_descriptor-test.cc              |   1 +
 src/kudu/master/ts_manager.cc                      |   2 +
 src/kudu/mini-cluster/external_mini_cluster.h      |   1 -
 src/kudu/mini-cluster/mini_cluster.cc              |   1 -
 src/kudu/mini-cluster/webui_checker.cc             |   1 +
 src/kudu/rebalance/rebalance_algo-test.cc          |   1 -
 src/kudu/rebalance/rebalancer.h                    |   1 -
 src/kudu/rpc/acceptor_pool.cc                      |   3 +-
 src/kudu/rpc/client_negotiation.cc                 |   8 +-
 src/kudu/rpc/exactly_once_rpc-test.cc              |   1 +
 src/kudu/rpc/messenger.h                           |   1 -
 src/kudu/rpc/negotiation-test.cc                   |   8 +-
 src/kudu/rpc/periodic-test.cc                      |   4 +-
 src/kudu/rpc/proxy.cc                              |   2 +-
 src/kudu/rpc/reactor.cc                            |  20 +++-
 src/kudu/rpc/reactor.h                             |   5 +
 src/kudu/rpc/rpc-bench.cc                          |   1 -
 src/kudu/rpc/rpc-test.cc                           |   2 +-
 src/kudu/rpc/rpc_stub-test.cc                      |   3 +-
 src/kudu/rpc/serialization.cc                      |   3 +-
 src/kudu/rpc/server_negotiation.cc                 |   5 +-
 src/kudu/rpc/transfer.cc                           |   2 +-
 src/kudu/security/ca/cert_management-test.cc       |   1 +
 src/kudu/security/ca/cert_management.cc            |  15 ++-
 src/kudu/security/ca/cert_management.h             |   5 +
 src/kudu/security/cert-test.cc                     |   5 +-
 src/kudu/security/cert.cc                          |  12 ++-
 src/kudu/security/cert.h                           |   5 +-
 src/kudu/security/crypto.cc                        |  19 ++--
 src/kudu/security/crypto.h                         |   6 +-
 src/kudu/security/init.cc                          |   5 +-
 src/kudu/security/openssl_util.cc                  |  11 +-
 src/kudu/security/openssl_util.h                   |  17 ++-
 src/kudu/security/test/mini_kdc-test.cc            |   4 +-
 src/kudu/security/tls_context.cc                   |  14 ++-
 src/kudu/security/tls_context.h                    |   1 +
 src/kudu/security/tls_handshake.cc                 |   8 +-
 src/kudu/security/tls_handshake.h                  |   1 +
 src/kudu/security/tls_socket-test.cc               |   7 +-
 src/kudu/security/tls_socket.cc                    |   6 +-
 src/kudu/security/tls_socket.h                     |   3 +
 src/kudu/security/x509_check_host.cc               |   6 +-
 src/kudu/sentry/sentry_action.h                    |   1 +
 src/kudu/sentry/sentry_client-test.cc              |   1 +
 src/kudu/server/default_path_handlers.cc           |   1 +
 src/kudu/server/tcmalloc_metrics.cc                |   2 +-
 src/kudu/server/webserver.cc                       |  11 +-
 src/kudu/subprocess/server.cc                      |   1 -
 src/kudu/subprocess/subprocess_proxy-test.cc       |   1 +
 src/kudu/subprocess/subprocess_server-test.cc      |   1 +
 src/kudu/tablet/cfile_set-test.cc                  |   1 -
 src/kudu/tablet/cfile_set.cc                       |   1 -
 src/kudu/tablet/compaction-test.cc                 |   1 -
 src/kudu/tablet/compaction_policy-test.cc          |   1 +
 src/kudu/tablet/compaction_policy.cc               |   1 -
 src/kudu/tablet/composite-pushdown-test.cc         |   2 +
 src/kudu/tablet/delta_compaction-test.cc           |   2 +-
 src/kudu/tablet/delta_key.h                        |   6 +-
 src/kudu/tablet/delta_tracker.cc                   |   1 +
 src/kudu/tablet/deltafile.cc                       |   1 +
 src/kudu/tablet/diskrowset-test.cc                 |   1 -
 src/kudu/tablet/memrowset-test.cc                  |   1 -
 src/kudu/tablet/row_op.cc                          |   1 +
 src/kudu/tablet/rowset_info.cc                     |   1 -
 src/kudu/tablet/rowset_tree-test.cc                |   7 +-
 src/kudu/tablet/tablet-pushdown-test.cc            |   2 +
 src/kudu/tablet/tablet.cc                          |   1 +
 src/kudu/tablet/tablet_history_gc-test.cc          |   2 +-
 src/kudu/tablet/tablet_replica-test.cc             |   1 +
 src/kudu/tablet/transactions/transaction.h         |   1 +
 src/kudu/thrift/sasl_client_transport.cc           |   1 +
 src/kudu/thrift/sasl_client_transport.h            |   7 +-
 src/kudu/tools/create-table-tool-test.cc           |   1 +
 src/kudu/tools/ksck.cc                             |   1 +
 src/kudu/tools/ksck_checksum.cc                    |   1 +
 src/kudu/tools/ksck_remote-test.cc                 |   2 +-
 src/kudu/tools/ksck_remote.cc                      |   2 +-
 src/kudu/tools/ksck_results.cc                     |   1 -
 src/kudu/tools/kudu-admin-test.cc                  |   1 +
 src/kudu/tools/kudu-tool-test.cc                   |   2 +-
 src/kudu/tools/kudu-ts-cli-test.cc                 |   1 +
 src/kudu/tools/rebalancer_tool-test.cc             |   3 +-
 src/kudu/tools/tool_action.h                       |   1 -
 src/kudu/tools/tool_action_cluster.cc              |   2 +-
 src/kudu/tools/tool_action_common.cc               |   1 +
 src/kudu/tools/tool_action_diagnose.cc             |   2 +
 src/kudu/tools/tool_action_fs.cc                   |   1 +
 src/kudu/tools/tool_action_hms.cc                  |   1 +
 src/kudu/tools/tool_action_local_replica.cc        |   2 +
 src/kudu/tools/tool_action_master.cc               |   1 +
 src/kudu/tools/tool_action_pbc.cc                  |   4 +-
 src/kudu/tools/tool_action_perf.cc                 |   2 +-
 src/kudu/tools/tool_action_remote_replica.cc       |   2 +-
 src/kudu/tools/tool_action_table.cc                |   2 +
 src/kudu/tools/tool_action_tablet.cc               |   1 +
 src/kudu/tools/tool_action_test.cc                 |   3 +-
 src/kudu/tools/tool_action_tserver.cc              |   1 +
 src/kudu/tools/tool_action_wal.cc                  |   4 +-
 src/kudu/tools/tool_replica_util.cc                |   1 -
 src/kudu/tserver/heartbeater.cc                    |   2 +-
 src/kudu/tserver/scanners.cc                       |   1 +
 src/kudu/tserver/tablet_copy_service.cc            |   1 +
 src/kudu/tserver/tablet_server-stress-test.cc      |   2 +-
 src/kudu/tserver/tablet_server-test.cc             |   2 +
 .../tserver/tablet_server_authorization-test.cc    |   2 +-
 src/kudu/tserver/tablet_server_options.cc          |   1 -
 src/kudu/tserver/tablet_service.cc                 |   2 +-
 src/kudu/tserver/ts_tablet_manager-test.cc         |   1 +
 src/kudu/tserver/tserver_path_handlers.cc          |   1 -
 src/kudu/util/bit-util-test.cc                     |  17 ++-
 src/kudu/util/bitmap-test.cc                       |   1 +
 src/kudu/util/bitmap.cc                            |   1 +
 src/kudu/util/bitmap.h                             |   1 -
 src/kudu/util/bitset-test.cc                       |   2 +
 src/kudu/util/block_bloom_filter-test.cc           |   1 +
 src/kudu/util/cache-test.cc                        |   2 +-
 src/kudu/util/cloud/instance_detector.cc           |   2 +-
 src/kudu/util/compression/compression_codec.cc     |   1 -
 src/kudu/util/countdown_latch-test.cc              |   1 +
 src/kudu/util/curl_util-test.cc                    |   1 +
 src/kudu/util/debug-util-test.cc                   |   1 +
 src/kudu/util/env-test.cc                          |   4 +-
 src/kudu/util/env_posix.cc                         |   4 +-
 src/kudu/util/env_util-test.cc                     |   6 +-
 src/kudu/util/faststring.h                         |   1 +
 src/kudu/util/fault_injection.cc                   |   1 -
 src/kudu/util/file_cache-stress-test.cc            |   1 -
 src/kudu/util/file_cache.cc                        |   1 +
 src/kudu/util/group_varint-test.cc                 |  18 +++-
 src/kudu/util/group_varint.cc                      |   4 +-
 src/kudu/util/hdr_histogram.cc                     |   1 -
 src/kudu/util/kernel_stack_watchdog.cc             |   3 +-
 src/kudu/util/knapsack_solver-test.cc              |   4 +-
 src/kudu/util/logging-test.cc                      |   4 +-
 src/kudu/util/maintenance_manager-test.cc          |   1 +
 src/kudu/util/maintenance_manager.cc               |   1 +
 src/kudu/util/mem_tracker-test.cc                  |   3 +-
 src/kudu/util/metrics-test.cc                      |   2 +-
 src/kudu/util/metrics.h                            |  16 +--
 src/kudu/util/minidump-test.cc                     |   9 +-
 src/kudu/util/minidump.cc                          |   9 +-
 src/kudu/util/monotime-test.cc                     |   1 -
 src/kudu/util/mt-metrics-test.cc                   |   6 +-
 src/kudu/util/net/dns_resolver.h                   |   2 +-
 src/kudu/util/net/sockaddr.h                       |   2 +-
 src/kudu/util/pb_util-internal.cc                  |   1 -
 src/kudu/util/pb_util-test.cc                      |   4 +-
 src/kudu/util/process_memory.cc                    |   6 +-
 src/kudu/util/pstack_watcher.cc                    |   1 +
 src/kudu/util/random_util.h                        |   8 +-
 src/kudu/util/rle-test.cc                          |  19 +++-
 src/kudu/util/rolling_log-test.cc                  |   1 +
 src/kudu/util/slice.h                              |   1 +
 src/kudu/util/spinlock_profiling.cc                |   4 +-
 src/kudu/util/status.h                             |   5 +
 src/kudu/util/subprocess-test.cc                   |   1 +
 src/kudu/util/test_util.cc                         |   3 +-
 src/kudu/util/thread-test.cc                       |   1 +
 src/kudu/util/thread.cc                            |   8 +-
 src/kudu/util/thread_restrictions.cc               |   4 +-
 src/kudu/util/threadlocal.cc                       |   5 +-
 src/kudu/util/threadpool-test.cc                   |   1 +
 src/kudu/util/trace-test.cc                        |   1 +
 src/kudu/util/ttl_cache-test.cc                    |   1 +
 src/kudu/util/version_util.cc                      |   1 +
 src/kudu/util/yamlreader-test.cc                   |   1 +
 src/kudu/util/zlib.cc                              |   9 +-
 thirdparty/build-definitions.sh                    |  16 ++-
 thirdparty/build-thirdparty.sh                     |  25 +++--
 thirdparty/download-thirdparty.sh                  |   5 +-
 .../patches/llvm-iwyu-sized-deallocation.patch     | 116 +++++++++++++++++++++
 332 files changed, 887 insertions(+), 378 deletions(-)
 copy build-support/iwyu/mappings/{libunwind.imp => libcxx-extra.imp} (60%)
 create mode 100644 build-support/iwyu/mappings/libcxx.imp
 create mode 100644 build-support/iwyu/mappings/openssl.imp
 create mode 100644 thirdparty/patches/llvm-iwyu-sized-deallocation.patch


[kudu] 02/02: iwyu: codebase-wide fixes based on libcpp

Posted by ad...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 092cecc26b8725a532a53a4bf50a5e6d19c769c2
Author: Adar Dembo <ad...@cloudera.com>
AuthorDate: Tue Mar 24 02:04:27 2020 -0700

    iwyu: codebase-wide fixes based on libcpp
    
    These were generated by running iwyu.py --fix --all followed by some
    massaging of the IWYU mapping files.
    
    Note: kudu/client/shared_ptr.h handling isn't great:
    - IWYU removes shared_ptr.h unless it is annotated with a "keep" pragma.
    - IWYU adds <memory> if the file references a class from kudu::client::sp.
    
    This appears to be because IWYU, after processing the 'using' statements in
    shared_ptr.h, considers the classes in kudu::client::sp to be exactly the same
    as the equivalent std classes. As such, IWYU concludes that shared_ptr.h
    offers nothing of value and should be removed, and that <memory> should be
    added because e.g. kudu::client::sp::shared_ptr is actually std::shared_ptr.
    
    One might think to address the second issue by adding an "export" pragma to
    shared_ptr.h's inclusion of <memory>. Doing that creates another problem:
    IWYU removes <memory> from any file that includes shared_ptr.h, which is
    unsafe in non-libc++ builds where kudu::client::sp maps to std::tr1.
    
    The only way I can think of safely addressing this is by copying a non-std
    implementation of <memory> into shared_ptr.h, to be used only when running
    IWYU. Excising the necessary STL bits and bringing them into Kudu just for
    this problem seems like overkill, though, so we'll just live with the "keep"
    pragmas and the extra inclusions of <memory>.
    
    Change-Id: Ic248ba1511347d79cc6ea38140de888e5ac13354
    Reviewed-on: http://gerrit.cloudera.org:8080/15543
    Reviewed-by: Alexey Serbin <as...@cloudera.com>
    Tested-by: Kudu Jenkins
---
 build-support/iwyu/mappings/boost-extra.imp        |  1 +
 build-support/iwyu/mappings/openssl.imp            | 39 ++++++++++++++++++++++
 build-support/iwyu/mappings/system-linux.imp       | 12 ++++++-
 src/kudu/benchmarks/tpch/rpc_line_item_dao-test.cc |  1 +
 src/kudu/cfile/binary_dict_block.cc                |  3 +-
 src/kudu/cfile/binary_plain_block.cc               |  1 -
 src/kudu/cfile/cfile-test.cc                       |  2 +-
 src/kudu/cfile/cfile_reader.h                      |  1 -
 src/kudu/cfile/cfile_writer.h                      |  9 -----
 src/kudu/cfile/index-test.cc                       |  1 +
 src/kudu/cfile/index_btree.cc                      |  4 +--
 src/kudu/cfile/type_encodings.cc                   |  7 ++--
 src/kudu/client/authz_token_cache.cc               |  2 ++
 src/kudu/client/batcher.cc                         |  1 -
 src/kudu/client/batcher.h                          |  2 +-
 src/kudu/client/client-internal.cc                 |  1 -
 src/kudu/client/client-internal.h                  | 14 +++-----
 src/kudu/client/client-test-util.cc                |  1 +
 src/kudu/client/client-test-util.h                 |  1 +
 src/kudu/client/client-test.cc                     | 21 +++++++++---
 src/kudu/client/client-unittest.cc                 |  3 +-
 src/kudu/client/client.cc                          |  6 ++--
 src/kudu/client/client.h                           |  3 ++
 src/kudu/client/meta_cache.cc                      |  1 +
 src/kudu/client/partitioner-internal.cc            |  1 -
 src/kudu/client/partitioner-internal.h             |  1 +
 src/kudu/client/scan_token-internal.cc             |  1 +
 src/kudu/client/schema.cc                          |  1 -
 src/kudu/client/session-internal.cc                |  1 -
 src/kudu/client/shared_ptr.h                       | 24 ++++++++++---
 src/kudu/client/table-internal.h                   |  3 +-
 src/kudu/client/table_alterer-internal.cc          |  1 +
 src/kudu/client/write_op.cc                        |  1 -
 src/kudu/client/write_op.h                         |  1 +
 src/kudu/clock/builtin_ntp-internal.cc             |  3 +-
 src/kudu/clock/builtin_ntp.cc                      |  2 +-
 src/kudu/clock/hybrid_clock.cc                     |  1 +
 src/kudu/clock/logical_clock.cc                    |  2 +-
 src/kudu/clock/ntp-test.cc                         |  1 +
 src/kudu/codegen/codegen-test.cc                   |  1 -
 src/kudu/codegen/compilation_manager.cc            |  1 +
 src/kudu/codegen/module_builder.cc                 |  2 +-
 src/kudu/common/column_predicate-test.cc           |  2 +-
 src/kudu/common/column_predicate.h                 |  1 -
 src/kudu/common/columnblock.h                      |  1 +
 src/kudu/common/encoded_key-test.cc                | 13 ++++++--
 src/kudu/common/generic_iterators-test.cc          |  4 +--
 src/kudu/common/id_mapping.h                       |  1 -
 src/kudu/common/key_encoder.cc                     |  9 +++--
 src/kudu/common/key_util.cc                        |  1 +
 src/kudu/common/partition-test.cc                  |  4 +--
 src/kudu/common/partition.cc                       |  1 -
 src/kudu/common/schema-test.cc                     |  1 -
 src/kudu/common/schema.h                           | 10 ++++--
 src/kudu/common/types-test.cc                      |  1 +
 src/kudu/common/types.cc                           |  2 ++
 src/kudu/consensus/consensus_meta-test.cc          |  1 -
 .../consensus_meta_manager-stress-test.cc          |  1 -
 src/kudu/consensus/consensus_peers-test.cc         |  1 +
 src/kudu/consensus/consensus_peers.cc              |  1 +
 src/kudu/consensus/consensus_queue-test.cc         |  1 -
 src/kudu/consensus/log-test.cc                     |  1 +
 src/kudu/consensus/log.cc                          |  1 +
 src/kudu/consensus/log_util.cc                     |  1 -
 src/kudu/consensus/mt-log-test.cc                  |  1 -
 src/kudu/consensus/opid_util.cc                    |  1 +
 src/kudu/consensus/quorum_util-test.cc             |  1 +
 src/kudu/consensus/quorum_util.cc                  |  1 -
 src/kudu/consensus/raft_consensus_quorum-test.cc   |  1 -
 src/kudu/experiments/merge-test.cc                 |  4 +--
 src/kudu/experiments/rwlock-perf.cc                |  2 +-
 src/kudu/fs/data_dirs.cc                           |  1 +
 src/kudu/fs/dir_manager.cc                         |  1 +
 src/kudu/fs/error_manager.h                        |  4 +--
 src/kudu/fs/fs_manager-test.cc                     |  2 ++
 src/kudu/fs/fs_manager.cc                          |  1 -
 src/kudu/fs/fs_manager.h                           |  1 -
 src/kudu/gutil/hash/city.cc                        |  2 +-
 src/kudu/gutil/hash/hash.h                         |  6 ++--
 src/kudu/gutil/stringprintf.cc                     |  1 -
 src/kudu/gutil/strings/escaping.h                  |  3 +-
 src/kudu/gutil/strings/split.cc                    |  1 -
 src/kudu/gutil/strings/stringpiece.cc              |  1 -
 src/kudu/gutil/strings/stringpiece.h               |  3 +-
 src/kudu/gutil/strings/util.h                      |  3 +-
 src/kudu/gutil/sysinfo.cc                          |  3 +-
 src/kudu/gutil/utf/rune.c                          |  2 --
 src/kudu/hms/hms_catalog-test.cc                   |  2 +-
 src/kudu/hms/hms_catalog.cc                        |  2 +-
 src/kudu/hms/hms_client-test.cc                    |  2 --
 src/kudu/hms/hms_client.cc                         |  1 +
 .../alter_table-randomized-test.cc                 |  1 -
 src/kudu/integration-tests/alter_table-test.cc     |  1 +
 .../integration-tests/auth_token_expire-itest.cc   |  2 +-
 .../integration-tests/catalog_manager_tsk-itest.cc |  1 -
 .../client-negotiation-failover-itest.cc           |  1 -
 .../integration-tests/client_failover-itest.cc     |  1 -
 src/kudu/integration-tests/cluster_itest_util.cc   |  1 +
 src/kudu/integration-tests/cluster_verifier.cc     |  3 +-
 .../consensus_peer_health_status-itest.cc          |  1 +
 src/kudu/integration-tests/create-table-itest.cc   |  1 +
 src/kudu/integration-tests/delete_table-itest.cc   |  1 +
 src/kudu/integration-tests/delete_tablet-itest.cc  |  1 +
 src/kudu/integration-tests/dense_node-itest.cc     |  1 +
 src/kudu/integration-tests/disk_failure-itest.cc   |  1 +
 .../integration-tests/disk_reservation-itest.cc    |  1 +
 src/kudu/integration-tests/hms_itest-base.cc       |  1 -
 src/kudu/integration-tests/linked_list-test-util.h |  1 +
 .../integration-tests/location_assignment-itest.cc |  1 +
 src/kudu/integration-tests/log-rolling-itest.cc    |  1 +
 .../integration-tests/maintenance_mode-itest.cc    |  1 +
 .../master_cert_authority-itest.cc                 |  1 -
 .../integration-tests/master_failover-itest.cc     |  1 +
 src/kudu/integration-tests/master_hms-itest.cc     |  1 +
 .../integration-tests/master_replication-itest.cc  |  1 +
 src/kudu/integration-tests/memory_gc-itest.cc      |  1 +
 .../integration-tests/mini_cluster_fs_inspector.cc |  2 ++
 .../integration-tests/minidump_generation-itest.cc |  1 +
 .../integration-tests/multidir_cluster-itest.cc    |  1 +
 .../integration-tests/raft_config_change-itest.cc  |  1 +
 src/kudu/integration-tests/raft_consensus-itest.cc |  1 +
 .../raft_consensus_election-itest.cc               |  1 +
 .../raft_consensus_failure_detector-imc-itest.cc   |  1 +
 .../raft_consensus_nonvoter-itest.cc               |  1 +
 src/kudu/integration-tests/registration-test.cc    |  2 +-
 .../integration-tests/security-faults-itest.cc     |  1 -
 src/kudu/integration-tests/security-itest.cc       |  1 +
 .../security-master-auth-itest.cc                  |  1 +
 src/kudu/integration-tests/stop_tablet-itest.cc    |  2 +-
 .../integration-tests/table_locations-itest.cc     |  1 -
 src/kudu/integration-tests/tablet_copy-itest.cc    |  1 +
 .../tablet_copy_client_session-itest.cc            |  1 +
 .../integration-tests/tablet_history_gc-itest.cc   |  1 +
 .../integration-tests/tablet_replacement-itest.cc  |  2 ++
 .../tablet_server_quiescing-itest.cc               |  2 ++
 src/kudu/integration-tests/test_workload.h         |  1 +
 .../timestamp_advancement-itest.cc                 |  1 +
 .../tombstoned_voting-imc-itest.cc                 |  1 +
 .../integration-tests/tombstoned_voting-itest.cc   |  1 +
 .../tombstoned_voting-stress-test.cc               |  2 +-
 src/kudu/integration-tests/ts_itest-base.cc        |  1 +
 src/kudu/integration-tests/ts_recovery-itest.cc    |  2 +-
 .../integration-tests/webserver-crawl-itest.cc     |  2 ++
 src/kudu/master/auto_rebalancer-test.cc            |  1 +
 src/kudu/master/auto_rebalancer.cc                 |  1 +
 src/kudu/master/hms_notification_log_listener.cc   |  1 +
 src/kudu/master/location_cache-test.cc             |  1 +
 src/kudu/master/master-test.cc                     |  1 +
 src/kudu/master/master.cc                          |  1 +
 src/kudu/master/master_path_handlers.cc            |  1 -
 src/kudu/master/placement_policy-test.cc           |  1 +
 src/kudu/master/placement_policy.cc                |  2 +-
 src/kudu/master/ranger_authz_provider.cc           |  2 +-
 src/kudu/master/sentry_authz_provider-test.cc      |  4 ++-
 src/kudu/master/sentry_authz_provider.cc           |  2 +-
 src/kudu/master/sentry_privileges_fetcher.cc       |  2 +-
 src/kudu/master/sentry_privileges_fetcher.h        |  1 +
 src/kudu/master/ts_descriptor-test.cc              |  1 +
 src/kudu/master/ts_manager.cc                      |  2 ++
 src/kudu/mini-cluster/external_mini_cluster.h      |  1 -
 src/kudu/mini-cluster/mini_cluster.cc              |  1 -
 src/kudu/mini-cluster/webui_checker.cc             |  1 +
 src/kudu/rebalance/rebalance_algo-test.cc          |  1 -
 src/kudu/rebalance/rebalancer.h                    |  1 -
 src/kudu/rpc/acceptor_pool.cc                      |  3 +-
 src/kudu/rpc/client_negotiation.cc                 |  8 +++--
 src/kudu/rpc/exactly_once_rpc-test.cc              |  1 +
 src/kudu/rpc/messenger.h                           |  1 -
 src/kudu/rpc/negotiation-test.cc                   |  8 ++---
 src/kudu/rpc/periodic-test.cc                      |  4 ++-
 src/kudu/rpc/proxy.cc                              |  2 +-
 src/kudu/rpc/reactor.cc                            | 20 ++++++++---
 src/kudu/rpc/reactor.h                             |  5 +++
 src/kudu/rpc/rpc-bench.cc                          |  1 -
 src/kudu/rpc/rpc-test.cc                           |  2 +-
 src/kudu/rpc/rpc_stub-test.cc                      |  3 +-
 src/kudu/rpc/serialization.cc                      |  3 +-
 src/kudu/rpc/server_negotiation.cc                 |  5 +--
 src/kudu/rpc/transfer.cc                           |  2 +-
 src/kudu/security/ca/cert_management-test.cc       |  1 +
 src/kudu/security/ca/cert_management.cc            | 15 ++++-----
 src/kudu/security/ca/cert_management.h             |  5 +++
 src/kudu/security/cert-test.cc                     |  5 ++-
 src/kudu/security/cert.cc                          | 12 +++++--
 src/kudu/security/cert.h                           |  5 +--
 src/kudu/security/crypto.cc                        | 19 +++++------
 src/kudu/security/crypto.h                         |  6 ++--
 src/kudu/security/init.cc                          |  5 ++-
 src/kudu/security/openssl_util.cc                  | 11 ++++--
 src/kudu/security/openssl_util.h                   | 17 +++++++---
 src/kudu/security/test/mini_kdc-test.cc            |  4 ++-
 src/kudu/security/tls_context.cc                   | 14 +++++---
 src/kudu/security/tls_context.h                    |  1 +
 src/kudu/security/tls_handshake.cc                 |  8 ++---
 src/kudu/security/tls_handshake.h                  |  1 +
 src/kudu/security/tls_socket-test.cc               |  7 ++--
 src/kudu/security/tls_socket.cc                    |  6 ++--
 src/kudu/security/tls_socket.h                     |  3 ++
 src/kudu/security/x509_check_host.cc               |  6 ++--
 src/kudu/sentry/sentry_action.h                    |  1 +
 src/kudu/sentry/sentry_client-test.cc              |  1 +
 src/kudu/server/default_path_handlers.cc           |  1 +
 src/kudu/server/tcmalloc_metrics.cc                |  2 +-
 src/kudu/server/webserver.cc                       | 11 +++---
 src/kudu/subprocess/server.cc                      |  1 -
 src/kudu/subprocess/subprocess_proxy-test.cc       |  1 +
 src/kudu/subprocess/subprocess_server-test.cc      |  1 +
 src/kudu/tablet/cfile_set-test.cc                  |  1 -
 src/kudu/tablet/cfile_set.cc                       |  1 -
 src/kudu/tablet/compaction-test.cc                 |  1 -
 src/kudu/tablet/compaction_policy-test.cc          |  1 +
 src/kudu/tablet/compaction_policy.cc               |  1 -
 src/kudu/tablet/composite-pushdown-test.cc         |  2 ++
 src/kudu/tablet/delta_compaction-test.cc           |  2 +-
 src/kudu/tablet/delta_key.h                        |  6 ++--
 src/kudu/tablet/delta_tracker.cc                   |  1 +
 src/kudu/tablet/deltafile.cc                       |  1 +
 src/kudu/tablet/diskrowset-test.cc                 |  1 -
 src/kudu/tablet/memrowset-test.cc                  |  1 -
 src/kudu/tablet/row_op.cc                          |  1 +
 src/kudu/tablet/rowset_info.cc                     |  1 -
 src/kudu/tablet/rowset_tree-test.cc                |  7 ++--
 src/kudu/tablet/tablet-pushdown-test.cc            |  2 ++
 src/kudu/tablet/tablet.cc                          |  1 +
 src/kudu/tablet/tablet_history_gc-test.cc          |  2 +-
 src/kudu/tablet/tablet_replica-test.cc             |  1 +
 src/kudu/tablet/transactions/transaction.h         |  1 +
 src/kudu/thrift/sasl_client_transport.cc           |  1 +
 src/kudu/thrift/sasl_client_transport.h            |  7 ++--
 src/kudu/tools/create-table-tool-test.cc           |  1 +
 src/kudu/tools/ksck.cc                             |  1 +
 src/kudu/tools/ksck_checksum.cc                    |  1 +
 src/kudu/tools/ksck_remote-test.cc                 |  2 +-
 src/kudu/tools/ksck_remote.cc                      |  2 +-
 src/kudu/tools/ksck_results.cc                     |  1 -
 src/kudu/tools/kudu-admin-test.cc                  |  1 +
 src/kudu/tools/kudu-tool-test.cc                   |  2 +-
 src/kudu/tools/kudu-ts-cli-test.cc                 |  1 +
 src/kudu/tools/rebalancer_tool-test.cc             |  3 +-
 src/kudu/tools/tool_action.h                       |  1 -
 src/kudu/tools/tool_action_cluster.cc              |  2 +-
 src/kudu/tools/tool_action_common.cc               |  1 +
 src/kudu/tools/tool_action_diagnose.cc             |  2 ++
 src/kudu/tools/tool_action_fs.cc                   |  1 +
 src/kudu/tools/tool_action_hms.cc                  |  1 +
 src/kudu/tools/tool_action_local_replica.cc        |  2 ++
 src/kudu/tools/tool_action_master.cc               |  1 +
 src/kudu/tools/tool_action_pbc.cc                  |  4 +--
 src/kudu/tools/tool_action_perf.cc                 |  2 +-
 src/kudu/tools/tool_action_remote_replica.cc       |  2 +-
 src/kudu/tools/tool_action_table.cc                |  2 ++
 src/kudu/tools/tool_action_tablet.cc               |  1 +
 src/kudu/tools/tool_action_test.cc                 |  3 +-
 src/kudu/tools/tool_action_tserver.cc              |  1 +
 src/kudu/tools/tool_action_wal.cc                  |  4 +--
 src/kudu/tools/tool_replica_util.cc                |  1 -
 src/kudu/tserver/heartbeater.cc                    |  2 +-
 src/kudu/tserver/scanners.cc                       |  1 +
 src/kudu/tserver/tablet_copy_service.cc            |  1 +
 src/kudu/tserver/tablet_server-stress-test.cc      |  2 +-
 src/kudu/tserver/tablet_server-test.cc             |  2 ++
 .../tserver/tablet_server_authorization-test.cc    |  2 +-
 src/kudu/tserver/tablet_server_options.cc          |  1 -
 src/kudu/tserver/tablet_service.cc                 |  2 +-
 src/kudu/tserver/ts_tablet_manager-test.cc         |  1 +
 src/kudu/tserver/tserver_path_handlers.cc          |  1 -
 src/kudu/util/bit-util-test.cc                     | 17 +++++++++-
 src/kudu/util/bitmap-test.cc                       |  1 +
 src/kudu/util/bitmap.cc                            |  1 +
 src/kudu/util/bitmap.h                             |  1 -
 src/kudu/util/bitset-test.cc                       |  2 ++
 src/kudu/util/block_bloom_filter-test.cc           |  1 +
 src/kudu/util/cache-test.cc                        |  2 +-
 src/kudu/util/cloud/instance_detector.cc           |  2 +-
 src/kudu/util/compression/compression_codec.cc     |  1 -
 src/kudu/util/countdown_latch-test.cc              |  1 +
 src/kudu/util/curl_util-test.cc                    |  1 +
 src/kudu/util/debug-util-test.cc                   |  1 +
 src/kudu/util/env-test.cc                          |  4 ++-
 src/kudu/util/env_posix.cc                         |  4 ++-
 src/kudu/util/env_util-test.cc                     |  6 ++--
 src/kudu/util/faststring.h                         |  1 +
 src/kudu/util/fault_injection.cc                   |  1 -
 src/kudu/util/file_cache-stress-test.cc            |  1 -
 src/kudu/util/file_cache.cc                        |  1 +
 src/kudu/util/group_varint-test.cc                 | 18 +++++++++-
 src/kudu/util/group_varint.cc                      |  4 +--
 src/kudu/util/hdr_histogram.cc                     |  1 -
 src/kudu/util/kernel_stack_watchdog.cc             |  3 +-
 src/kudu/util/knapsack_solver-test.cc              |  4 +--
 src/kudu/util/logging-test.cc                      |  4 ++-
 src/kudu/util/maintenance_manager-test.cc          |  1 +
 src/kudu/util/maintenance_manager.cc               |  1 +
 src/kudu/util/mem_tracker-test.cc                  |  3 +-
 src/kudu/util/metrics-test.cc                      |  2 +-
 src/kudu/util/metrics.h                            | 16 ++++-----
 src/kudu/util/minidump-test.cc                     |  9 +++--
 src/kudu/util/minidump.cc                          |  9 +++--
 src/kudu/util/monotime-test.cc                     |  1 -
 src/kudu/util/mt-metrics-test.cc                   |  6 +---
 src/kudu/util/net/dns_resolver.h                   |  2 +-
 src/kudu/util/net/sockaddr.h                       |  2 +-
 src/kudu/util/pb_util-internal.cc                  |  1 -
 src/kudu/util/pb_util-test.cc                      |  4 ++-
 src/kudu/util/process_memory.cc                    |  6 ++--
 src/kudu/util/pstack_watcher.cc                    |  1 +
 src/kudu/util/random_util.h                        |  8 +++--
 src/kudu/util/rle-test.cc                          | 19 +++++++++--
 src/kudu/util/rolling_log-test.cc                  |  1 +
 src/kudu/util/slice.h                              |  1 +
 src/kudu/util/spinlock_profiling.cc                |  4 +--
 src/kudu/util/status.h                             |  5 +++
 src/kudu/util/subprocess-test.cc                   |  1 +
 src/kudu/util/test_util.cc                         |  3 +-
 src/kudu/util/thread-test.cc                       |  1 +
 src/kudu/util/thread.cc                            |  8 ++---
 src/kudu/util/thread_restrictions.cc               |  4 +--
 src/kudu/util/threadlocal.cc                       |  5 ++-
 src/kudu/util/threadpool-test.cc                   |  1 +
 src/kudu/util/trace-test.cc                        |  1 +
 src/kudu/util/ttl_cache-test.cc                    |  1 +
 src/kudu/util/version_util.cc                      |  1 +
 src/kudu/util/yamlreader-test.cc                   |  1 +
 src/kudu/util/zlib.cc                              |  9 +++--
 324 files changed, 623 insertions(+), 329 deletions(-)

diff --git a/build-support/iwyu/mappings/boost-extra.imp b/build-support/iwyu/mappings/boost-extra.imp
index d8badff..56d7030 100644
--- a/build-support/iwyu/mappings/boost-extra.imp
+++ b/build-support/iwyu/mappings/boost-extra.imp
@@ -16,6 +16,7 @@
 # under the License.
 [
     { include: ["<boost/core/explicit_operator_bool.hpp>", private, "<boost/optional/optional.hpp>", public ] },
+    { include: ["<boost/core/ref.hpp>", private, "<boost/ref.hpp>", public ] },
     { include: ["<boost/cstdint.hpp>", private, "<cstdint>", public ] },
     { include: ["<boost/container/detail/std_fwd.hpp>", private, "<utility>", public ] },
     { include: ["<boost/none.hpp>", private, "<boost/optional/optional.hpp>", public ] },
diff --git a/build-support/iwyu/mappings/openssl.imp b/build-support/iwyu/mappings/openssl.imp
new file mode 100644
index 0000000..46f889c
--- /dev/null
+++ b/build-support/iwyu/mappings/openssl.imp
@@ -0,0 +1,39 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+#
+# This file contains OpenSSL-specific mappings for IWYU.
+#
+# The goal is of these mappings is to identify the "public" OpenSSL headers
+# and to force their inclusion instead of the inclusion of various private
+# headers. See the IWYU mapping documentation for additional details.
+#
+
+[
+    { include: ["<openssl/bio.h>", private, "<openssl/ssl.h>", public ] },
+    { include: ["<openssl/evp.h>", private, "<openssl/ssl3.h>", private ] },
+    { include: ["<openssl/opensslconf.h>", private, "<openssl/ssl.h>", public ] },
+    { include: ["<openssl/opensslv.h>", private, "<openssl/crypto.h>", public ] },
+    { include: ["<openssl/ossl_typ.h>", private, "<openssl/ssl.h>", public ] },
+    { include: ["<openssl/rsa.h>", private, "<openssl/x509.h>", public ] },
+    { include: ["<openssl/safestack.h>", private, "<openssl/ssl.h>", public ] },
+    { include: ["<openssl/ssl2.h>", private, "<openssl/ssl.h>", public ] },
+    { include: ["<openssl/ssl23.h>", private, "<openssl/ssl.h>", public ] },
+    { include: ["<openssl/ssl3.h>", private, "<openssl/ssl.h>", public ] },
+    { include: ["<openssl/tls1.h>", private, "<openssl/ssl.h>", public ] },
+    { include: ["<openssl/x509err.h>", private, "<openssl/x509.h>", public ] },
+]
diff --git a/build-support/iwyu/mappings/system-linux.imp b/build-support/iwyu/mappings/system-linux.imp
index 22235f5..1ebdfa8 100644
--- a/build-support/iwyu/mappings/system-linux.imp
+++ b/build-support/iwyu/mappings/system-linux.imp
@@ -30,6 +30,16 @@
   { include: ["<asm-generic/int-l64.h>", private, "<linux/types.h>", public] },
   { include: ["<asm/int-l64.h>", private, "<linux/types.h>", public] },
   { include: ["<asm/ioctl.h>", private, "<linux/ioctl.h>", public] },
+  { include: ["<bits/types/__sigval_t.h>", private, "<signal.h>", public] },
+  { include: ["<bits/types/siginfo_t.h>", private, "<signal.h>", public] },
+  { include: ["<bits/types/struct_rusage.h>", private, "<sys/resource.h>", public] },
+  { include: ["<bits/types/struct_tm.h>", private, "<time.h>", public] },
   { include: ["<linux/sysinfo.h>", private, "<linux/kernel.h>", public] },
-  { symbol: ["statfs", private, "<sys/vfs.h>", public] }
+  { symbol: ["clockid_t", private, "<time.h>", public] },
+  { symbol: ["iovec", private, "<sys/socket.h>", public] },
+  { symbol: ["iovec", private, "<sys/types.h>", public] },
+  { symbol: ["strcasecmp", private, "<strings.h>", public] },
+  { symbol: ["strncasecmp", private, "<strings.h>", public] },
+  { symbol: ["statfs", private, "<sys/vfs.h>", public] },
+  { symbol: ["IOV_MAX", private, "<limits.h>", public] },
 ]
diff --git a/src/kudu/benchmarks/tpch/rpc_line_item_dao-test.cc b/src/kudu/benchmarks/tpch/rpc_line_item_dao-test.cc
index 4ac9c8e..dbba1f1 100644
--- a/src/kudu/benchmarks/tpch/rpc_line_item_dao-test.cc
+++ b/src/kudu/benchmarks/tpch/rpc_line_item_dao-test.cc
@@ -21,6 +21,7 @@
 #include <cstdint>
 #include <memory>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include <boost/bind.hpp>
diff --git a/src/kudu/cfile/binary_dict_block.cc b/src/kudu/cfile/binary_dict_block.cc
index a6a4814..a97c32f 100644
--- a/src/kudu/cfile/binary_dict_block.cc
+++ b/src/kudu/cfile/binary_dict_block.cc
@@ -19,17 +19,16 @@
 
 #include <limits>
 #include <ostream>
-#include <string>
 #include <vector>
 
 #include <glog/logging.h>
 
 #include "kudu/cfile/block_pointer.h"
+#include "kudu/cfile/bshuf_block.h"
 #include "kudu/cfile/cfile.pb.h"
 #include "kudu/cfile/cfile_reader.h"
 #include "kudu/cfile/cfile_util.h"
 #include "kudu/cfile/cfile_writer.h"
-#include "kudu/cfile/bshuf_block.h"
 #include "kudu/common/column_materialization_context.h"
 #include "kudu/common/column_predicate.h"
 #include "kudu/common/columnblock.h"
diff --git a/src/kudu/cfile/binary_plain_block.cc b/src/kudu/cfile/binary_plain_block.cc
index d8b5e68..4c1721c 100644
--- a/src/kudu/cfile/binary_plain_block.cc
+++ b/src/kudu/cfile/binary_plain_block.cc
@@ -20,7 +20,6 @@
 #include <algorithm>
 #include <cstdint>
 #include <ostream>
-#include <string>
 
 #include <glog/logging.h>
 
diff --git a/src/kudu/cfile/cfile-test.cc b/src/kudu/cfile/cfile-test.cc
index dcffc3f..032734d 100644
--- a/src/kudu/cfile/cfile-test.cc
+++ b/src/kudu/cfile/cfile-test.cc
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include <algorithm>
 #include <cstdint>
 #include <cstdlib>
 #include <cstring>
@@ -24,7 +25,6 @@
 #include <memory>
 #include <sstream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <gflags/gflags.h>
diff --git a/src/kudu/cfile/cfile_reader.h b/src/kudu/cfile/cfile_reader.h
index e864dfb..3f1bc6e 100644
--- a/src/kudu/cfile/cfile_reader.h
+++ b/src/kudu/cfile/cfile_reader.h
@@ -19,7 +19,6 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
-#include <mutex>
 #include <string>
 #include <vector>
 
diff --git a/src/kudu/cfile/cfile_writer.h b/src/kudu/cfile/cfile_writer.h
index f741e82..d9cca13 100644
--- a/src/kudu/cfile/cfile_writer.h
+++ b/src/kudu/cfile/cfile_writer.h
@@ -35,18 +35,9 @@
 #include "kudu/util/slice.h"
 #include "kudu/util/status.h"
 
-namespace google {
-namespace protobuf {
-template <typename Element>
-class RepeatedPtrField; // IWYU pragma: keep
-}
-}
-
 namespace kudu {
 
 class TypeInfo;
-template <typename Buffer>
-class KeyEncoder;
 
 namespace cfile {
 
diff --git a/src/kudu/cfile/index-test.cc b/src/kudu/cfile/index-test.cc
index 7dcee38..e676d75 100644
--- a/src/kudu/cfile/index-test.cc
+++ b/src/kudu/cfile/index-test.cc
@@ -19,6 +19,7 @@
 #include <cstdio>
 #include <cstring>
 #include <memory>
+#include <ostream>
 #include <string>
 
 #include <glog/logging.h>
diff --git a/src/kudu/cfile/index_btree.cc b/src/kudu/cfile/index_btree.cc
index 533655e..a3ce07c 100644
--- a/src/kudu/cfile/index_btree.cc
+++ b/src/kudu/cfile/index_btree.cc
@@ -15,10 +15,11 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/cfile/index_btree.h"
+
 #include <cstddef>
 #include <memory>
 #include <ostream>
-#include <string>
 #include <vector>
 
 #include <glog/logging.h>
@@ -30,7 +31,6 @@
 #include "kudu/cfile/cfile_util.h"
 #include "kudu/cfile/cfile_writer.h"
 #include "kudu/cfile/index_block.h"
-#include "kudu/cfile/index_btree.h"
 #include "kudu/fs/block_id.h"
 #include "kudu/gutil/strings/substitute.h"
 #include "kudu/util/debug-util.h"
diff --git a/src/kudu/cfile/type_encodings.cc b/src/kudu/cfile/type_encodings.cc
index 55c258d..037c5a9 100644
--- a/src/kudu/cfile/type_encodings.cc
+++ b/src/kudu/cfile/type_encodings.cc
@@ -20,14 +20,15 @@
 #include <memory>
 #include <unordered_map>
 #include <utility>
+#include <vector>
 
+#include "kudu/cfile/binary_dict_block.h"
+#include "kudu/cfile/binary_plain_block.h"
+#include "kudu/cfile/binary_prefix_block.h"
 #include "kudu/cfile/bshuf_block.h"
 #include "kudu/cfile/plain_bitmap_block.h"
 #include "kudu/cfile/plain_block.h"
 #include "kudu/cfile/rle_block.h"
-#include "kudu/cfile/binary_dict_block.h"
-#include "kudu/cfile/binary_plain_block.h"
-#include "kudu/cfile/binary_prefix_block.h"
 #include "kudu/common/types.h"
 #include "kudu/gutil/port.h"
 #include "kudu/gutil/singleton.h"
diff --git a/src/kudu/client/authz_token_cache.cc b/src/kudu/client/authz_token_cache.cc
index 1051bac..67d82c0 100644
--- a/src/kudu/client/authz_token_cache.cc
+++ b/src/kudu/client/authz_token_cache.cc
@@ -18,7 +18,9 @@
 #include "kudu/client/authz_token_cache.h"
 
 #include <cstdint>
+#include <functional>
 #include <mutex>
+#include <ostream>
 #include <string>
 #include <unordered_map>
 #include <vector>
diff --git a/src/kudu/client/batcher.cc b/src/kudu/client/batcher.cc
index da2e217..2fe9e8a 100644
--- a/src/kudu/client/batcher.cc
+++ b/src/kudu/client/batcher.cc
@@ -18,7 +18,6 @@
 #include "kudu/client/batcher.h"
 
 #include <cstddef>
-#include <memory>
 #include <mutex>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/client/batcher.h b/src/kudu/client/batcher.h
index 9523dca..0086869 100644
--- a/src/kudu/client/batcher.h
+++ b/src/kudu/client/batcher.h
@@ -17,9 +17,9 @@
 #pragma once
 
 #include <cstdint>
+#include <memory>
 #include <mutex>
 #include <unordered_map>
-#include <utility>
 #include <vector>
 
 #include <sparsehash/dense_hash_set>
diff --git a/src/kudu/client/client-internal.cc b/src/kudu/client/client-internal.cc
index 66de143..783bd4d 100644
--- a/src/kudu/client/client-internal.cc
+++ b/src/kudu/client/client-internal.cc
@@ -27,7 +27,6 @@
 #include <mutex>
 #include <ostream>
 #include <string>
-#include <unordered_map>
 #include <utility>
 #include <vector>
 
diff --git a/src/kudu/client/client-internal.h b/src/kudu/client/client-internal.h
index 4d5a533..9626ff6 100644
--- a/src/kudu/client/client-internal.h
+++ b/src/kudu/client/client-internal.h
@@ -16,15 +16,11 @@
 // under the License.
 #pragma once
 
-#include <algorithm>
-#include <cmath>
 #include <cstdint>
-#include <cstdlib>
 #include <map>
 #include <memory>
 #include <set>
 #include <string>
-#include <unordered_map>
 #include <unordered_set>
 #include <utility>
 #include <vector>
@@ -33,12 +29,8 @@
 #include "kudu/client/client.h"
 #include "kudu/gutil/macros.h"
 #include "kudu/gutil/ref_counted.h"
-#include "kudu/master/master.pb.h"
-#include "kudu/rpc/response_callback.h"
-#include "kudu/rpc/rpc.h"
 #include "kudu/rpc/rpc_controller.h"
 #include "kudu/rpc/user_credentials.h"
-#include "kudu/security/token.pb.h"
 #include "kudu/util/atomic.h"
 #include "kudu/util/locks.h"
 #include "kudu/util/monotime.h"
@@ -57,13 +49,16 @@ class DnsResolver;
 class PartitionSchema;
 class Sockaddr;
 
+namespace security {
+class SignedTokenPB;
+}  // namespace security
+
 namespace master {
 class AlterTableRequestPB;
 class AlterTableResponsePB;
 class ConnectToMasterResponsePB;
 class CreateTableRequestPB;
 class CreateTableResponsePB;
-class GetTableSchemaResponsePB;
 class ListTabletServersRequestPB;
 class ListTabletServersResponsePB;
 class MasterServiceProxy;
@@ -80,7 +75,6 @@ namespace client {
 class KuduSchema;
 
 namespace internal {
-class AuthzTokenCache;
 class ConnectToClusterRpc;
 class MetaCache;
 class RemoteTablet;
diff --git a/src/kudu/client/client-test-util.cc b/src/kudu/client/client-test-util.cc
index 4e65af5..e6cb940 100644
--- a/src/kudu/client/client-test-util.cc
+++ b/src/kudu/client/client-test-util.cc
@@ -20,6 +20,7 @@
 #include <algorithm>
 #include <ostream>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include <glog/logging.h>
diff --git a/src/kudu/client/client-test-util.h b/src/kudu/client/client-test-util.h
index d8b580d..1b8fc5a 100644
--- a/src/kudu/client/client-test-util.h
+++ b/src/kudu/client/client-test-util.h
@@ -19,6 +19,7 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <memory>
 #include <string>
 #include <vector>
 
diff --git a/src/kudu/client/client-test.cc b/src/kudu/client/client-test.cc
index fff963f..f8bca5d 100644
--- a/src/kudu/client/client-test.cc
+++ b/src/kudu/client/client-test.cc
@@ -15,11 +15,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/client/client.h"
+
 #include <algorithm>
 #include <atomic>
+#include <cstddef>
 #include <cstdint>
 #include <cstdlib>
 #include <functional>
+#include <initializer_list>
 #include <iterator>
 #include <map>
 #include <memory>
@@ -36,16 +40,16 @@
 #include <boost/function.hpp>
 #include <boost/optional/optional.hpp>
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 #include <glog/stl_logging.h>
+#include <gmock/gmock-generated-matchers.h>
+#include <gmock/gmock-matchers.h>
 #include <google/protobuf/util/message_differencer.h>
 #include <gtest/gtest.h>
 
 #include "kudu/client/callbacks.h"
 #include "kudu/client/client-internal.h"
 #include "kudu/client/client-test-util.h"
-#include "kudu/client/client.h"
 #include "kudu/client/client.pb.h"
 #include "kudu/client/error_collector.h"
 #include "kudu/client/meta_cache.h"
@@ -62,6 +66,7 @@
 #include "kudu/client/write_op.h"
 #include "kudu/clock/clock.h"
 #include "kudu/clock/hybrid_clock.h"
+#include "kudu/common/common.pb.h"
 #include "kudu/common/partial_row.h"
 #include "kudu/common/row.h"
 #include "kudu/common/schema.h"
@@ -84,11 +89,11 @@
 #include "kudu/master/master.pb.h"
 #include "kudu/master/mini_master.h"
 #include "kudu/mini-cluster/internal_mini_cluster.h"
+#include "kudu/mini-cluster/mini_cluster.h"
 #include "kudu/rpc/messenger.h"
 #include "kudu/rpc/service_pool.h"
 #include "kudu/security/tls_context.h"
 #include "kudu/security/token.pb.h"
-#include "kudu/security/token_signer.h"
 #include "kudu/server/rpc_server.h"
 #include "kudu/tablet/tablet.h"
 #include "kudu/tablet/tablet_metadata.h"
@@ -106,7 +111,7 @@
 #include "kudu/util/metrics.h"
 #include "kudu/util/monotime.h"
 #include "kudu/util/net/sockaddr.h"
-#include "kudu/util/pb_util.h"
+#include "kudu/util/path_util.h"
 #include "kudu/util/random.h"
 #include "kudu/util/random_util.h"
 #include "kudu/util/semaphore.h"
@@ -115,7 +120,6 @@
 #include "kudu/util/stopwatch.h"
 #include "kudu/util/test_macros.h"
 #include "kudu/util/test_util.h"
-#include "kudu/util/thread.h"
 #include "kudu/util/thread_restrictions.h"
 
 DECLARE_bool(allow_unsafe_replication_factor);
@@ -188,7 +192,14 @@ using std::unordered_set;
 using std::vector;
 using strings::Substitute;
 
+namespace boost {
+template <typename Signature> class function;
+}  // namespace boost
+
 namespace kudu {
+
+class RWMutex;
+
 namespace client {
 
 class ClientTest : public KuduTest {
diff --git a/src/kudu/client/client-unittest.cc b/src/kudu/client/client-unittest.cc
index ca52595..70b90ab 100644
--- a/src/kudu/client/client-unittest.cc
+++ b/src/kudu/client/client-unittest.cc
@@ -19,6 +19,8 @@
 
 #include "kudu/client/client.h"
 
+#include <openssl/crypto.h>
+
 #include <cstddef>
 #include <string>
 #include <vector>
@@ -26,7 +28,6 @@
 #include <boost/bind.hpp>
 #include <boost/function.hpp>
 #include <gtest/gtest.h>
-#include <openssl/opensslv.h>
 
 #include "kudu/client/client-internal.h"
 #include "kudu/client/error_collector.h"
diff --git a/src/kudu/client/client.cc b/src/kudu/client/client.cc
index c3cb8e6..67976e0 100644
--- a/src/kudu/client/client.cc
+++ b/src/kudu/client/client.cc
@@ -20,8 +20,8 @@
 #include <algorithm>
 #include <cstdint>
 #include <cstdlib>
+#include <functional>
 #include <map>
-#include <memory>
 #include <mutex>
 #include <ostream>
 #include <set>
@@ -92,7 +92,6 @@
 #include "kudu/tserver/tserver.pb.h"
 #include "kudu/tserver/tserver_service.proxy.h"
 #include "kudu/util/async_util.h"
-#include "kudu/util/block_bloom_filter.h"
 #include "kudu/util/debug-util.h"
 #include "kudu/util/init.h"
 #include "kudu/util/logging.h"
@@ -157,6 +156,9 @@ MAKE_ENUM_LIMITS(kudu::client::KuduScanner::OrderMode,
 struct tm;
 
 namespace kudu {
+
+class BlockBloomFilter;
+class BlockBloomFilterBufferAllocatorIf;
 class simple_spinlock;
 
 namespace client {
diff --git a/src/kudu/client/client.h b/src/kudu/client/client.h
index 582abc9..5c59ac7 100644
--- a/src/kudu/client/client.h
+++ b/src/kudu/client/client.h
@@ -29,6 +29,9 @@
 
 #include <cstddef>
 #include <map>
+// Not safe to include <memory>; this header must remain compatible with C++98.
+//
+// IWYU pragma: no_include <memory>
 #include <string>
 #include <vector>
 
diff --git a/src/kudu/client/meta_cache.cc b/src/kudu/client/meta_cache.cc
index 531ef76..1b7ff51 100644
--- a/src/kudu/client/meta_cache.cc
+++ b/src/kudu/client/meta_cache.cc
@@ -18,6 +18,7 @@
 #include "kudu/client/meta_cache.h"
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <mutex>
 #include <ostream>
diff --git a/src/kudu/client/partitioner-internal.cc b/src/kudu/client/partitioner-internal.cc
index 826d402..9b89d2e 100644
--- a/src/kudu/client/partitioner-internal.cc
+++ b/src/kudu/client/partitioner-internal.cc
@@ -18,7 +18,6 @@
 #include "kudu/client/partitioner-internal.h"
 
 #include <map>
-#include <memory>
 #include <string>
 
 #include "kudu/client/client-internal.h"
diff --git a/src/kudu/client/partitioner-internal.h b/src/kudu/client/partitioner-internal.h
index 19a3840..71f252e 100644
--- a/src/kudu/client/partitioner-internal.h
+++ b/src/kudu/client/partitioner-internal.h
@@ -17,6 +17,7 @@
 #pragma once
 
 #include <map>
+#include <memory>
 #include <string>
 #include <utility>
 
diff --git a/src/kudu/client/scan_token-internal.cc b/src/kudu/client/scan_token-internal.cc
index aa94c10..477ee8b 100644
--- a/src/kudu/client/scan_token-internal.cc
+++ b/src/kudu/client/scan_token-internal.cc
@@ -19,6 +19,7 @@
 
 #include <cstdint>
 #include <memory>
+#include <ostream>
 #include <string>
 #include <unordered_map>
 #include <utility>
diff --git a/src/kudu/client/schema.cc b/src/kudu/client/schema.cc
index 9ac9f95..66085bb 100644
--- a/src/kudu/client/schema.cc
+++ b/src/kudu/client/schema.cc
@@ -17,7 +17,6 @@
 
 #include "kudu/client/schema.h"
 
-#include <cstdint>
 #include <memory>
 #include <ostream>
 #include <unordered_map>
diff --git a/src/kudu/client/session-internal.cc b/src/kudu/client/session-internal.cc
index f124596..9792f57 100644
--- a/src/kudu/client/session-internal.cc
+++ b/src/kudu/client/session-internal.cc
@@ -17,7 +17,6 @@
 
 #include "kudu/client/session-internal.h"
 
-#include <memory>
 #include <mutex>
 #include <utility>
 
diff --git a/src/kudu/client/shared_ptr.h b/src/kudu/client/shared_ptr.h
index 3a7cbd5..13feb82 100644
--- a/src/kudu/client/shared_ptr.h
+++ b/src/kudu/client/shared_ptr.h
@@ -29,9 +29,10 @@
 /// are not implemented. As a workaround, we use std::shared_ptr with libc++.
 ///
 /// In order to allow applications to compile against Kudu with libstdc++ as
-/// well as with libc++, macros are provided that will resolve to the correct
-/// namespace in either case. Clients are encouraged to use these macros in
-/// order to ensure that applications compile universally.
+/// well as with libc++, the kudu::client::sp namespace "alias" is provided,
+/// whose classes will resolve to the correct namespace in either case. Clients
+/// are encouraged to use this alias in order to ensure that applications
+/// compile universally.
 
 // This include is not used directly, but we need to include some C++ header in
 // order to ensure the _LIBCPP_VERSION macro is defined appropriately.
@@ -39,6 +40,21 @@
 
 #if defined(_LIBCPP_VERSION)
 
+// TODO(adar): our IWYU runs with libc++ and misbehaves with this header:
+//
+// 1. All inclusions must append "// IWYU pragma: keep" otherwise IWYU removes them.
+// 2. IWYU adds <memory> to every file that includes this header.
+//
+// In theory, the second problem can be addressed by adding
+// "// IWYU pragma: export" to the inclusion of <memory> just below. However,
+// that actually inverts the effect: IWYU removes <memory> from every file that
+// includes this header. This is unsafe because if we're doing a regular Kudu
+// build, this header includes <tr1/memory>, leaving the source file without any
+// inclusion of <memory> and unable to satisfy references to e.g. std::unique_ptr.
+//
+// There must be a way to convince IWYU that the classes in kudu::client::sp are
+// "real" and not just aliases of std classes. One way to do that would be to
+// insert complete copies of those classes just for IWYU, but that seems like overkill.
 #include <memory>
 
 namespace kudu {
@@ -52,7 +68,7 @@ namespace sp {
 }
 
 #else
-#include <tr1/memory> // IWYU pragma: export
+#include <tr1/memory>
 
 namespace kudu {
 namespace client {
diff --git a/src/kudu/client/table-internal.h b/src/kudu/client/table-internal.h
index 724e4fd..8e332d8 100644
--- a/src/kudu/client/table-internal.h
+++ b/src/kudu/client/table-internal.h
@@ -18,11 +18,12 @@
 #define KUDU_CLIENT_TABLE_INTERNAL_H
 
 #include <map>
+#include <memory>
 #include <string>
 
 #include "kudu/client/client.h"
-#include "kudu/client/scan_predicate.h"
 #include "kudu/client/scan_predicate-internal.h"
+#include "kudu/client/scan_predicate.h"
 #include "kudu/client/schema.h"
 #include "kudu/client/shared_ptr.h" // IWYU pragma: keep
 #include "kudu/common/partition.h"
diff --git a/src/kudu/client/table_alterer-internal.cc b/src/kudu/client/table_alterer-internal.cc
index fd77fcc..846150a 100644
--- a/src/kudu/client/table_alterer-internal.cc
+++ b/src/kudu/client/table_alterer-internal.cc
@@ -22,6 +22,7 @@
 #include <utility>
 
 #include <glog/logging.h>
+#include <google/protobuf/stubs/common.h>
 
 #include "kudu/client/schema-internal.h"
 #include "kudu/client/schema.h"
diff --git a/src/kudu/client/write_op.cc b/src/kudu/client/write_op.cc
index 18b8581..d553733 100644
--- a/src/kudu/client/write_op.cc
+++ b/src/kudu/client/write_op.cc
@@ -17,7 +17,6 @@
 
 #include "kudu/client/write_op.h"
 
-#include <memory>
 #include <ostream>
 
 #include <glog/logging.h>
diff --git a/src/kudu/client/write_op.h b/src/kudu/client/write_op.h
index 73265f4..1f7d57c 100644
--- a/src/kudu/client/write_op.h
+++ b/src/kudu/client/write_op.h
@@ -19,6 +19,7 @@
 
 #include <stdint.h>
 
+// IWYU pragma: no_include <memory>
 #include <string>
 
 #include "kudu/client/shared_ptr.h" // IWYU pragma: keep
diff --git a/src/kudu/clock/builtin_ntp-internal.cc b/src/kudu/clock/builtin_ntp-internal.cc
index f555c04..eebde38 100644
--- a/src/kudu/clock/builtin_ntp-internal.cc
+++ b/src/kudu/clock/builtin_ntp-internal.cc
@@ -19,8 +19,7 @@
 
 #include <algorithm>
 #include <cstdint>
-#include <memory>
-#include <string>
+#include <ostream>
 #include <utility>
 #include <vector>
 
diff --git a/src/kudu/clock/builtin_ntp.cc b/src/kudu/clock/builtin_ntp.cc
index 3331eda..9b309cf 100644
--- a/src/kudu/clock/builtin_ntp.cc
+++ b/src/kudu/clock/builtin_ntp.cc
@@ -22,11 +22,11 @@
 #include <sys/socket.h>
 #include <sys/types.h>
 
-#include <algorithm>
 #include <cerrno>
 #include <cstdint>
 #include <cstring>
 #include <deque>
+#include <functional>
 #include <limits>
 #include <memory>
 #include <mutex>
diff --git a/src/kudu/clock/hybrid_clock.cc b/src/kudu/clock/hybrid_clock.cc
index 08cc2fd..9721d41 100644
--- a/src/kudu/clock/hybrid_clock.cc
+++ b/src/kudu/clock/hybrid_clock.cc
@@ -18,6 +18,7 @@
 #include "kudu/clock/hybrid_clock.h"
 
 #include <algorithm>
+#include <functional>
 #include <limits>
 #include <memory>
 #include <mutex>
diff --git a/src/kudu/clock/logical_clock.cc b/src/kudu/clock/logical_clock.cc
index fa46611..1cd8f26 100644
--- a/src/kudu/clock/logical_clock.cc
+++ b/src/kudu/clock/logical_clock.cc
@@ -17,10 +17,10 @@
 
 #include "kudu/clock/logical_clock.h"
 
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
-#include <utility>
 
 #include <glog/logging.h>
 
diff --git a/src/kudu/clock/ntp-test.cc b/src/kudu/clock/ntp-test.cc
index 5403144..8227409 100644
--- a/src/kudu/clock/ntp-test.cc
+++ b/src/kudu/clock/ntp-test.cc
@@ -21,6 +21,7 @@
 #include <cstdint>
 #include <ctime>
 #endif
+#include <functional>
 #include <iterator>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/codegen/codegen-test.cc b/src/kudu/codegen/codegen-test.cc
index 76af76a..c42e095 100644
--- a/src/kudu/codegen/codegen-test.cc
+++ b/src/kudu/codegen/codegen-test.cc
@@ -21,7 +21,6 @@
 #include <memory>
 #include <ostream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <gflags/gflags_declare.h>
diff --git a/src/kudu/codegen/compilation_manager.cc b/src/kudu/codegen/compilation_manager.cc
index 2dd97f5..1f76392 100644
--- a/src/kudu/codegen/compilation_manager.cc
+++ b/src/kudu/codegen/compilation_manager.cc
@@ -18,6 +18,7 @@
 #include "kudu/codegen/compilation_manager.h"
 
 #include <cstdlib>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/codegen/module_builder.cc b/src/kudu/codegen/module_builder.cc
index aa03431..e0818de 100644
--- a/src/kudu/codegen/module_builder.cc
+++ b/src/kudu/codegen/module_builder.cc
@@ -18,13 +18,13 @@
 #include "kudu/codegen/module_builder.h"
 
 #include <cstdint>
+#include <functional>
 #include <sstream>
 #include <string>
 #include <unordered_set>
 #include <utility>
 #include <vector>
 
-
 // NOTE: among the headers below, the MCJIT.h header file is needed
 //       for successful run-time operation of the code generator.
 #include <glog/logging.h>
diff --git a/src/kudu/common/column_predicate-test.cc b/src/kudu/common/column_predicate-test.cc
index 34f8341..8b1a9b1 100644
--- a/src/kudu/common/column_predicate-test.cc
+++ b/src/kudu/common/column_predicate-test.cc
@@ -22,8 +22,8 @@
 #include <cstdlib>
 #include <functional>
 #include <initializer_list>
+#include <ostream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/common/column_predicate.h b/src/kudu/common/column_predicate.h
index ce5aa78..e8233ec 100644
--- a/src/kudu/common/column_predicate.h
+++ b/src/kudu/common/column_predicate.h
@@ -22,7 +22,6 @@
 #include <cstdint>
 #include <ostream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/common/columnblock.h b/src/kudu/common/columnblock.h
index fdaba37..a91074c 100644
--- a/src/kudu/common/columnblock.h
+++ b/src/kudu/common/columnblock.h
@@ -18,6 +18,7 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <memory>
 #include <ostream>
 #include <string>
 
diff --git a/src/kudu/common/encoded_key-test.cc b/src/kudu/common/encoded_key-test.cc
index 7ef10f4..e58a270 100644
--- a/src/kudu/common/encoded_key-test.cc
+++ b/src/kudu/common/encoded_key-test.cc
@@ -23,9 +23,9 @@
 
 #include <gtest/gtest.h>
 
-#include "kudu/common/schema.h"
 #include "kudu/common/common.pb.h"
 #include "kudu/common/key_encoder.h"
+#include "kudu/common/schema.h"
 #include "kudu/gutil/strings/substitute.h" // IWYU pragma: keep
 #include "kudu/util/faststring.h"
 #include "kudu/util/int128.h"
@@ -34,15 +34,20 @@
 #include "kudu/util/random_util.h"
 #include "kudu/util/slice.h"
 #include "kudu/util/stopwatch.h" // IWYU pragma: keep
-#include "kudu/util/test_util.h"
 #include "kudu/util/test_macros.h"
+#include "kudu/util/test_util.h"
 
 using std::string;
 using std::unique_ptr;
 
 namespace kudu {
+class EncodedKeyTest;
+class EncodedKeyTest_TestConstructFromEncodedString_Test;
+class EncodedKeyTest_TestDecodeCompoundKeys_Test;
+class EncodedKeyTest_TestDecodeSimpleKeys_Test;
+} // namespace kudu
 
-#define EXPECT_ROWKEY_EQ(schema, expected, enc_key)  \
+#define EXPECT_ROWKEY_EQ(schema, expected, enc_key)     \
   do { \
     SCOPED_TRACE(""); \
     EXPECT_NO_FATAL_FAILURE(ExpectRowKeyEq((schema), (expected), (enc_key))); \
@@ -54,6 +59,8 @@ namespace kudu {
     EXPECT_NO_FATAL_FAILURE(ExpectDecodedKeyEq<(type)>((expected), (encoded_form), (val))); \
   } while (0)
 
+namespace kudu {
+
 class EncodedKeyTest : public KuduTest {
  public:
   EncodedKeyTest()
diff --git a/src/kudu/common/generic_iterators-test.cc b/src/kudu/common/generic_iterators-test.cc
index 190dff4..0222f07 100644
--- a/src/kudu/common/generic_iterators-test.cc
+++ b/src/kudu/common/generic_iterators-test.cc
@@ -32,7 +32,6 @@
 
 #include <boost/optional/optional.hpp>
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 #include <glog/stl_logging.h>
 #include <gtest/gtest.h>
@@ -42,6 +41,7 @@
 #include "kudu/common/columnblock.h"
 #include "kudu/common/common.pb.h"
 #include "kudu/common/iterator.h"
+#include "kudu/common/iterator_stats.h"
 #include "kudu/common/key_encoder.h"
 #include "kudu/common/rowblock.h"
 #include "kudu/common/scan_spec.h"
@@ -72,8 +72,6 @@ using strings::Substitute;
 
 namespace kudu {
 
-struct IteratorStats;
-
 static const int kValColIdx = 0; // Index of 'val' column in these test schemas.
 static const Schema kIntSchema({ ColumnSchema("val", INT64) },
                                /*key_columns=*/1);
diff --git a/src/kudu/common/id_mapping.h b/src/kudu/common/id_mapping.h
index f762b75..caec450 100644
--- a/src/kudu/common/id_mapping.h
+++ b/src/kudu/common/id_mapping.h
@@ -19,7 +19,6 @@
 
 #include <cstddef>
 #include <cstdint>
-#include <memory>
 #include <ostream>
 #include <utility>
 #include <vector>
diff --git a/src/kudu/common/key_encoder.cc b/src/kudu/common/key_encoder.cc
index 288f43e..cd0439a 100644
--- a/src/kudu/common/key_encoder.cc
+++ b/src/kudu/common/key_encoder.cc
@@ -15,21 +15,20 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/common/key_encoder.h"
+
 #include <memory>
-#include <string>
 #include <vector>
 
 #include "kudu/common/common.pb.h"
-#include "kudu/common/key_encoder.h"
 #include "kudu/gutil/singleton.h"
+#include "kudu/util/faststring.h"
 
 using std::unique_ptr;
 using std::vector;
 
 namespace kudu {
 
-class faststring;
-
 // A resolver for Encoders
 template <typename Buffer>
 class EncoderResolver {
@@ -90,7 +89,7 @@ const bool IsTypeAllowableInKey(const TypeInfo* typeinfo) {
 ////------------------------------------------------------------
 
 template
-const KeyEncoder<std::string>& GetKeyEncoder(const TypeInfo* typeinfo);
+const KeyEncoder<std::string>& GetKeyEncoder(const TypeInfo* typeinfo); // NOLINT
 
 template
 const KeyEncoder<faststring>& GetKeyEncoder(const TypeInfo* typeinfo);
diff --git a/src/kudu/common/key_util.cc b/src/kudu/common/key_util.cc
index ac4b8b8..ab53830 100644
--- a/src/kudu/common/key_util.cc
+++ b/src/kudu/common/key_util.cc
@@ -17,6 +17,7 @@
 
 #include "kudu/common/key_util.h"
 
+#include <cmath>
 #include <cstring>
 #include <iterator>
 #include <limits>
diff --git a/src/kudu/common/partition-test.cc b/src/kudu/common/partition-test.cc
index 9091eed..fa1eda2 100644
--- a/src/kudu/common/partition-test.cc
+++ b/src/kudu/common/partition-test.cc
@@ -15,9 +15,10 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/common/partition.h"
+
 #include <algorithm>
 #include <cstdint>
-#include <memory>
 #include <string>
 #include <utility>
 #include <vector>
@@ -29,7 +30,6 @@
 
 #include "kudu/common/common.pb.h"
 #include "kudu/common/partial_row.h"
-#include "kudu/common/partition.h"
 #include "kudu/common/schema.h"
 #include "kudu/gutil/strings/join.h"
 #include "kudu/util/slice.h"
diff --git a/src/kudu/common/partition.cc b/src/kudu/common/partition.cc
index 0797a98..756f180 100644
--- a/src/kudu/common/partition.cc
+++ b/src/kudu/common/partition.cc
@@ -19,7 +19,6 @@
 
 #include <algorithm>
 #include <cstring>
-#include <memory>
 #include <set>
 #include <string>
 #include <unordered_set>
diff --git a/src/kudu/common/schema-test.cc b/src/kudu/common/schema-test.cc
index 71bbbdc..3c66496 100644
--- a/src/kudu/common/schema-test.cc
+++ b/src/kudu/common/schema-test.cc
@@ -19,7 +19,6 @@
 
 #include <cstddef>
 #include <cstdint>
-#include <memory>
 #include <string>
 #include <tuple>  // IWYU pragma: keep
 #include <unordered_map>
diff --git a/src/kudu/common/schema.h b/src/kudu/common/schema.h
index ab19174..d6e48dd 100644
--- a/src/kudu/common/schema.h
+++ b/src/kudu/common/schema.h
@@ -23,13 +23,14 @@
 #include <memory>
 #include <ostream>
 #include <string>
+#include <type_traits>
 #include <unordered_set>
 #include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
-#include <sparsehash/dense_hash_map>
 #include <glog/logging.h>
+#include <sparsehash/dense_hash_map>
 
 #include "kudu/common/common.pb.h"
 #include "kudu/common/id_mapping.h"
@@ -37,7 +38,6 @@
 #include "kudu/common/types.h"
 #include "kudu/gutil/macros.h"
 #include "kudu/gutil/port.h"
-#include "kudu/gutil/stl_util.h"
 #include "kudu/gutil/strings/strcat.h"
 #include "kudu/gutil/strings/stringpiece.h"
 #include "kudu/gutil/strings/substitute.h"
@@ -46,6 +46,10 @@
 #include "kudu/util/slice.h"
 #include "kudu/util/status.h"
 
+namespace kudu {
+class Schema;
+}  // namespace kudu
+
 // Check that two schemas are equal, yielding a useful error message in the case that
 // they are not.
 #define DCHECK_SCHEMA_EQ(s1, s2) \
@@ -61,6 +65,8 @@
                                  << (s2).ToString(); \
   } while (0)
 
+template <class X> struct GoodFastHash;
+
 namespace kudu {
 
 class Arena;
diff --git a/src/kudu/common/types-test.cc b/src/kudu/common/types-test.cc
index 805abe8..a662e03 100644
--- a/src/kudu/common/types-test.cc
+++ b/src/kudu/common/types-test.cc
@@ -22,6 +22,7 @@
 #include <limits>
 #include <string>
 #include <tuple>  // IWYU pragma: keep
+#include <utility>
 #include <vector>
 
 #include <gflags/gflags.h>
diff --git a/src/kudu/common/types.cc b/src/kudu/common/types.cc
index df57db4..3ff9507 100644
--- a/src/kudu/common/types.cc
+++ b/src/kudu/common/types.cc
@@ -17,8 +17,10 @@
 
 #include "kudu/common/types.h"
 
+#include <cstddef>
 #include <memory>
 #include <unordered_map>
+#include <utility>
 
 #include "kudu/gutil/singleton.h"
 #include "kudu/gutil/strings/substitute.h"
diff --git a/src/kudu/consensus/consensus_meta-test.cc b/src/kudu/consensus/consensus_meta-test.cc
index 96aab15..37624c9 100644
--- a/src/kudu/consensus/consensus_meta-test.cc
+++ b/src/kudu/consensus/consensus_meta-test.cc
@@ -23,7 +23,6 @@
 #include <memory>
 #include <ostream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <glog/logging.h>
diff --git a/src/kudu/consensus/consensus_meta_manager-stress-test.cc b/src/kudu/consensus/consensus_meta_manager-stress-test.cc
index c0622de..bff2be4 100644
--- a/src/kudu/consensus/consensus_meta_manager-stress-test.cc
+++ b/src/kudu/consensus/consensus_meta_manager-stress-test.cc
@@ -19,7 +19,6 @@
 
 #include <atomic>
 #include <cstdint>
-#include <memory>
 #include <mutex>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/consensus/consensus_peers-test.cc b/src/kudu/consensus/consensus_peers-test.cc
index 81ec3b5..5773cfe 100644
--- a/src/kudu/consensus/consensus_peers-test.cc
+++ b/src/kudu/consensus/consensus_peers-test.cc
@@ -17,6 +17,7 @@
 
 #include "kudu/consensus/consensus_peers.h"
 
+#include <functional>
 #include <memory>
 #include <string>
 #include <utility>
diff --git a/src/kudu/consensus/consensus_peers.cc b/src/kudu/consensus/consensus_peers.cc
index 8e34bec..81ab29d 100644
--- a/src/kudu/consensus/consensus_peers.cc
+++ b/src/kudu/consensus/consensus_peers.cc
@@ -19,6 +19,7 @@
 
 #include <algorithm>
 #include <cstdlib>
+#include <functional>
 #include <memory>
 #include <mutex>
 #include <ostream>
diff --git a/src/kudu/consensus/consensus_queue-test.cc b/src/kudu/consensus/consensus_queue-test.cc
index c929c1d..cf6fc68 100644
--- a/src/kudu/consensus/consensus_queue-test.cc
+++ b/src/kudu/consensus/consensus_queue-test.cc
@@ -17,7 +17,6 @@
 
 #include "kudu/consensus/consensus_queue.h"
 
-#include <algorithm>
 #include <atomic>
 #include <cstdint>
 #include <deque>
diff --git a/src/kudu/consensus/log-test.cc b/src/kudu/consensus/log-test.cc
index f3f2b2f..2efe492 100644
--- a/src/kudu/consensus/log-test.cc
+++ b/src/kudu/consensus/log-test.cc
@@ -20,6 +20,7 @@
 #include <algorithm>
 #include <cerrno>
 #include <cstdint>
+#include <functional>
 #include <limits>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/consensus/log.cc b/src/kudu/consensus/log.cc
index 7079003..a5db193 100644
--- a/src/kudu/consensus/log.cc
+++ b/src/kudu/consensus/log.cc
@@ -19,6 +19,7 @@
 
 #include <cerrno>
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <mutex>
 #include <ostream>
diff --git a/src/kudu/consensus/log_util.cc b/src/kudu/consensus/log_util.cc
index 7fcfc1e..6060c2a 100644
--- a/src/kudu/consensus/log_util.cc
+++ b/src/kudu/consensus/log_util.cc
@@ -21,7 +21,6 @@
 #include <cstring>
 #include <iostream>
 #include <memory>
-#include <utility>
 
 #include <gflags/gflags.h>
 #include <glog/logging.h>
diff --git a/src/kudu/consensus/mt-log-test.cc b/src/kudu/consensus/mt-log-test.cc
index 0620d82..46bf9ab 100644
--- a/src/kudu/consensus/mt-log-test.cc
+++ b/src/kudu/consensus/mt-log-test.cc
@@ -22,7 +22,6 @@
 #include <memory>
 #include <mutex>
 #include <ostream>
-#include <utility>
 #include <thread>
 #include <vector>
 
diff --git a/src/kudu/consensus/opid_util.cc b/src/kudu/consensus/opid_util.cc
index a64e852..c76fcc2 100644
--- a/src/kudu/consensus/opid_util.cc
+++ b/src/kudu/consensus/opid_util.cc
@@ -18,6 +18,7 @@
 #include "kudu/consensus/opid_util.h"
 
 #include <limits>
+#include <ostream>
 #include <utility>
 
 #include <glog/logging.h>
diff --git a/src/kudu/consensus/quorum_util-test.cc b/src/kudu/consensus/quorum_util-test.cc
index b4d5f65..152d83f 100644
--- a/src/kudu/consensus/quorum_util-test.cc
+++ b/src/kudu/consensus/quorum_util-test.cc
@@ -17,6 +17,7 @@
 
 #include "kudu/consensus/quorum_util.h"
 
+#include <initializer_list>
 #include <memory>
 #include <string>
 #include <utility>
diff --git a/src/kudu/consensus/quorum_util.cc b/src/kudu/consensus/quorum_util.cc
index 0b7300e..07e3fd9 100644
--- a/src/kudu/consensus/quorum_util.cc
+++ b/src/kudu/consensus/quorum_util.cc
@@ -17,7 +17,6 @@
 #include "kudu/consensus/quorum_util.h"
 
 #include <map>
-#include <memory>
 #include <ostream>
 #include <queue>
 #include <set>
diff --git a/src/kudu/consensus/raft_consensus_quorum-test.cc b/src/kudu/consensus/raft_consensus_quorum-test.cc
index ff21436..d00e226 100644
--- a/src/kudu/consensus/raft_consensus_quorum-test.cc
+++ b/src/kudu/consensus/raft_consensus_quorum-test.cc
@@ -22,7 +22,6 @@
 #include <string>
 #include <unordered_map>
 #include <unordered_set>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/experiments/merge-test.cc b/src/kudu/experiments/merge-test.cc
index 3f1f736..fc3cfc8 100644
--- a/src/kudu/experiments/merge-test.cc
+++ b/src/kudu/experiments/merge-test.cc
@@ -15,9 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include <algorithm>
+#include <cstddef>
 #include <cstdlib>
-#include <memory>
-#include <queue>
 #include <string>
 #include <vector>
 
diff --git a/src/kudu/experiments/rwlock-perf.cc b/src/kudu/experiments/rwlock-perf.cc
index d51cb9a..29ca01f 100644
--- a/src/kudu/experiments/rwlock-perf.cc
+++ b/src/kudu/experiments/rwlock-perf.cc
@@ -26,7 +26,7 @@
 #include <thread>
 #include <vector>
 
-#include <boost/smart_ptr/detail/spinlock.hpp>
+#include <boost/smart_ptr/shared_array.hpp>
 #include <gflags/gflags.h>
 #include <glog/logging.h>
 
diff --git a/src/kudu/fs/data_dirs.cc b/src/kudu/fs/data_dirs.cc
index 92f8df1..ea13b1a 100644
--- a/src/kudu/fs/data_dirs.cc
+++ b/src/kudu/fs/data_dirs.cc
@@ -23,6 +23,7 @@
 #include <cstdint>
 #include <memory>
 #include <mutex>
+#include <ostream>
 #include <random>
 #include <set>
 #include <string>
diff --git a/src/kudu/fs/dir_manager.cc b/src/kudu/fs/dir_manager.cc
index 8f7de67..c76f773 100644
--- a/src/kudu/fs/dir_manager.cc
+++ b/src/kudu/fs/dir_manager.cc
@@ -20,6 +20,7 @@
 #include <errno.h>
 
 #include <algorithm>
+#include <functional>
 #include <iterator>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/fs/error_manager.h b/src/kudu/fs/error_manager.h
index f3f08f5..6348971 100644
--- a/src/kudu/fs/error_manager.h
+++ b/src/kudu/fs/error_manager.h
@@ -19,12 +19,12 @@
 
 #include <string>
 #include <unordered_map>
+#include <utility>
 
 #include <glog/logging.h>
 
-#include "kudu/fs/data_dirs.h"
+#include "kudu/fs/dir_manager.h"
 #include "kudu/fs/dir_util.h"
-#include "kudu/fs/fs.pb.h"
 #include "kudu/gutil/callback.h"
 #include "kudu/gutil/port.h"
 #include "kudu/util/mutex.h"
diff --git a/src/kudu/fs/fs_manager-test.cc b/src/kudu/fs/fs_manager-test.cc
index 03c2bc1..7019b8d 100644
--- a/src/kudu/fs/fs_manager-test.cc
+++ b/src/kudu/fs/fs_manager-test.cc
@@ -21,12 +21,14 @@
 #include <unistd.h>
 
 #include <cstdint>
+#include <functional>
 #include <initializer_list>
 #include <iostream>
 #include <iterator>
 #include <memory>
 #include <set>
 #include <string>
+#include <type_traits>
 #include <unordered_map>
 #include <unordered_set>
 #include <utility>
diff --git a/src/kudu/fs/fs_manager.cc b/src/kudu/fs/fs_manager.cc
index 127f0ba..09f623a 100644
--- a/src/kudu/fs/fs_manager.cc
+++ b/src/kudu/fs/fs_manager.cc
@@ -17,7 +17,6 @@
 
 #include "kudu/fs/fs_manager.h"
 
-#include <algorithm>
 #include <cinttypes>
 #include <ctime>
 #include <initializer_list>
diff --git a/src/kudu/fs/fs_manager.h b/src/kudu/fs/fs_manager.h
index 7577d06..82c3bbc 100644
--- a/src/kudu/fs/fs_manager.h
+++ b/src/kudu/fs/fs_manager.h
@@ -21,7 +21,6 @@
 #include <iosfwd>
 #include <memory>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/gutil/hash/city.cc b/src/kudu/gutil/hash/city.cc
index 1d58acf..65086ae 100644
--- a/src/kudu/gutil/hash/city.cc
+++ b/src/kudu/gutil/hash/city.cc
@@ -19,8 +19,8 @@
 #include <sys/types.h>
 
 #include <algorithm>
-#include <iterator>
 #include <utility>
+#include <vector>
 
 #include <glog/logging.h>
 
diff --git a/src/kudu/gutil/hash/hash.h b/src/kudu/gutil/hash/hash.h
index 6d4c6fc..c9467ba 100644
--- a/src/kudu/gutil/hash/hash.h
+++ b/src/kudu/gutil/hash/hash.h
@@ -76,17 +76,17 @@
 #include <cstddef>
 #include <cstring>
 #include <string>
-#include <unordered_map>
+#include <type_traits>
 #include <utility>
 
-#include "kudu/gutil/int128.h"
-#include "kudu/gutil/integral_types.h"
 #include "kudu/gutil/hash/builtin_type_hash.h"
 #include "kudu/gutil/hash/hash128to64.h"
 #include "kudu/gutil/hash/jenkins.h"
 #include "kudu/gutil/hash/jenkins_lookup2.h"
 #include "kudu/gutil/hash/legacy_hash.h"
 #include "kudu/gutil/hash/string_hash.h"
+#include "kudu/gutil/int128.h"
+#include "kudu/gutil/integral_types.h"
 
 // ----------------------------------------------------------------------
 // Fingerprint()
diff --git a/src/kudu/gutil/stringprintf.cc b/src/kudu/gutil/stringprintf.cc
index f083f2b..5e2c9c0 100644
--- a/src/kudu/gutil/stringprintf.cc
+++ b/src/kudu/gutil/stringprintf.cc
@@ -3,7 +3,6 @@
 #include "kudu/gutil/stringprintf.h"
 
 #include <cstdio> // MSVC requires this for _vsnprintf
-#include <memory>
 #include <ostream>
 #include <vector>
 
diff --git a/src/kudu/gutil/strings/escaping.h b/src/kudu/gutil/strings/escaping.h
index 1f40f68..3b0fb4d 100644
--- a/src/kudu/gutil/strings/escaping.h
+++ b/src/kudu/gutil/strings/escaping.h
@@ -21,7 +21,8 @@
 #ifndef STRINGS_ESCAPING_H_
 #define STRINGS_ESCAPING_H_
 
-#include <stddef.h>
+#include <cstddef>
+#include <ostream>
 #include <string>
 #include <vector>
 
diff --git a/src/kudu/gutil/strings/split.cc b/src/kudu/gutil/strings/split.cc
index 67ddefb..f4a71d9 100644
--- a/src/kudu/gutil/strings/split.cc
+++ b/src/kudu/gutil/strings/split.cc
@@ -10,7 +10,6 @@
 #include <cstring>
 #include <iterator>
 #include <limits>
-#include <memory>
 #include <ostream>
 
 #include <glog/logging.h>
diff --git a/src/kudu/gutil/strings/stringpiece.cc b/src/kudu/gutil/strings/stringpiece.cc
index 0da3ea5..fa92047 100644
--- a/src/kudu/gutil/strings/stringpiece.cc
+++ b/src/kudu/gutil/strings/stringpiece.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 #include <climits>
 #include <cstring>
-#include <ostream>
 #include <string>
 
 #include <glog/logging.h>
diff --git a/src/kudu/gutil/strings/stringpiece.h b/src/kudu/gutil/strings/stringpiece.h
index 23d1483..233cf31 100644
--- a/src/kudu/gutil/strings/stringpiece.h
+++ b/src/kudu/gutil/strings/stringpiece.h
@@ -116,12 +116,11 @@
 #include <cassert>
 #include <cstddef>
 #include <cstring>
-
-#include <functional>
 #include <iosfwd>
 #include <iterator>
 #include <limits>
 #include <string>
+#include <type_traits>
 
 #include "kudu/gutil/hash/string_hash.h"
 #include "kudu/gutil/strings/fastmem.h"
diff --git a/src/kudu/gutil/strings/util.h b/src/kudu/gutil/strings/util.h
index a465773..e7f9c49 100644
--- a/src/kudu/gutil/strings/util.h
+++ b/src/kudu/gutil/strings/util.h
@@ -26,10 +26,11 @@
 #ifndef STRINGS_UTIL_H_
 #define STRINGS_UTIL_H_
 
+#include <strings.h>
+
 #include <cstddef>
 #include <cstdio>
 #include <cstring>
-
 #include <functional>
 #include <string>
 #include <vector>
diff --git a/src/kudu/gutil/sysinfo.cc b/src/kudu/gutil/sysinfo.cc
index dbdb207..539d37a 100644
--- a/src/kudu/gutil/sysinfo.cc
+++ b/src/kudu/gutil/sysinfo.cc
@@ -32,8 +32,8 @@
 # define PLATFORM_WINDOWS 1
 #endif
 
-#include <ctype.h>
 #include <fcntl.h>    // for open()
+#include <strings.h>
 #include <unistd.h>   // for read()
 
 #if defined __MACH__          // Mac OS X, almost certainly
@@ -52,6 +52,7 @@
 #include "kudu/gutil/sysinfo.h"
 
 #include <algorithm>
+#include <cctype>
 #include <cerrno>    // for errno
 #include <cstdio>    // for snprintf(), sscanf()
 #include <cstdlib>   // for getenv()
diff --git a/src/kudu/gutil/utf/rune.c b/src/kudu/gutil/utf/rune.c
index 061535a..3a7daf8 100644
--- a/src/kudu/gutil/utf/rune.c
+++ b/src/kudu/gutil/utf/rune.c
@@ -11,8 +11,6 @@
  * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  */
-#include <stdarg.h>
-#include <string.h>
 #include "kudu/gutil/utf/utf.h"
 #include "kudu/gutil/utf/utfdef.h"
 
diff --git a/src/kudu/hms/hms_catalog-test.cc b/src/kudu/hms/hms_catalog-test.cc
index b2d48b7..f7a5f6e 100644
--- a/src/kudu/hms/hms_catalog-test.cc
+++ b/src/kudu/hms/hms_catalog-test.cc
@@ -17,10 +17,10 @@
 
 #include "kudu/hms/hms_catalog.h"
 
+#include <functional>
 #include <map>
 #include <memory>
 #include <string>
-#include <type_traits>
 #include <utility>
 #include <vector>
 
diff --git a/src/kudu/hms/hms_catalog.cc b/src/kudu/hms/hms_catalog.cc
index da0e5cd..69805a7 100644
--- a/src/kudu/hms/hms_catalog.cc
+++ b/src/kudu/hms/hms_catalog.cc
@@ -17,12 +17,12 @@
 
 #include "kudu/hms/hms_catalog.h"
 
+#include <functional>
 #include <iostream>
 #include <iterator>
 #include <map>
 #include <mutex>
 #include <string>
-#include <type_traits>
 #include <utility>
 #include <vector>
 
diff --git a/src/kudu/hms/hms_client-test.cc b/src/kudu/hms/hms_client-test.cc
index dfcddb2..6343427 100644
--- a/src/kudu/hms/hms_client-test.cc
+++ b/src/kudu/hms/hms_client-test.cc
@@ -20,9 +20,7 @@
 #include <algorithm>
 #include <cstdint>
 #include <map>
-#include <memory>
 #include <string>
-#include <type_traits>
 #include <utility>
 #include <vector>
 
diff --git a/src/kudu/hms/hms_client.cc b/src/kudu/hms/hms_client.cc
index 9aa9127..9f37528 100644
--- a/src/kudu/hms/hms_client.cc
+++ b/src/kudu/hms/hms_client.cc
@@ -19,6 +19,7 @@
 
 #include <algorithm>
 #include <exception>
+#include <initializer_list>
 #include <map>
 #include <memory>
 #include <string>
diff --git a/src/kudu/integration-tests/alter_table-randomized-test.cc b/src/kudu/integration-tests/alter_table-randomized-test.cc
index c80dafa..f845358 100644
--- a/src/kudu/integration-tests/alter_table-randomized-test.cc
+++ b/src/kudu/integration-tests/alter_table-randomized-test.cc
@@ -23,7 +23,6 @@
 #include <memory>
 #include <ostream>
 #include <string>
-#include <type_traits>
 #include <utility>
 #include <vector>
 
diff --git a/src/kudu/integration-tests/alter_table-test.cc b/src/kudu/integration-tests/alter_table-test.cc
index 269a452..1a40a8b 100644
--- a/src/kudu/integration-tests/alter_table-test.cc
+++ b/src/kudu/integration-tests/alter_table-test.cc
@@ -19,6 +19,7 @@
 #include <atomic>
 #include <cstddef>
 #include <cstdint>
+#include <functional>
 #include <map>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/integration-tests/auth_token_expire-itest.cc b/src/kudu/integration-tests/auth_token_expire-itest.cc
index 61f6091..6c0806c 100644
--- a/src/kudu/integration-tests/auth_token_expire-itest.cc
+++ b/src/kudu/integration-tests/auth_token_expire-itest.cc
@@ -17,10 +17,10 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <gflags/gflags_declare.h>
diff --git a/src/kudu/integration-tests/catalog_manager_tsk-itest.cc b/src/kudu/integration-tests/catalog_manager_tsk-itest.cc
index 567539a..0445342 100644
--- a/src/kudu/integration-tests/catalog_manager_tsk-itest.cc
+++ b/src/kudu/integration-tests/catalog_manager_tsk-itest.cc
@@ -24,7 +24,6 @@
 #include <ostream>
 #include <string>
 #include <thread>
-#include <utility>
 #include <vector>
 
 #include <glog/logging.h>
diff --git a/src/kudu/integration-tests/client-negotiation-failover-itest.cc b/src/kudu/integration-tests/client-negotiation-failover-itest.cc
index b659543..5b0c893 100644
--- a/src/kudu/integration-tests/client-negotiation-failover-itest.cc
+++ b/src/kudu/integration-tests/client-negotiation-failover-itest.cc
@@ -20,7 +20,6 @@
 #include <ostream>
 #include <string>
 #include <thread>
-#include <utility>
 #include <vector>
 
 #include <gflags/gflags_declare.h>
diff --git a/src/kudu/integration-tests/client_failover-itest.cc b/src/kudu/integration-tests/client_failover-itest.cc
index ec54ef4..9bc0525 100644
--- a/src/kudu/integration-tests/client_failover-itest.cc
+++ b/src/kudu/integration-tests/client_failover-itest.cc
@@ -20,7 +20,6 @@
 #include <set>
 #include <string>
 #include <unordered_map>
-#include <utility>
 #include <vector>
 
 #include <glog/logging.h>
diff --git a/src/kudu/integration-tests/cluster_itest_util.cc b/src/kudu/integration-tests/cluster_itest_util.cc
index 7e12c56..8e53fe7 100644
--- a/src/kudu/integration-tests/cluster_itest_util.cc
+++ b/src/kudu/integration-tests/cluster_itest_util.cc
@@ -18,6 +18,7 @@
 #include "kudu/integration-tests/cluster_itest_util.h"
 
 #include <algorithm>
+#include <functional>
 #include <ostream>
 #include <set>
 #include <utility>
diff --git a/src/kudu/integration-tests/cluster_verifier.cc b/src/kudu/integration-tests/cluster_verifier.cc
index bc038fb..dea427a 100644
--- a/src/kudu/integration-tests/cluster_verifier.cc
+++ b/src/kudu/integration-tests/cluster_verifier.cc
@@ -17,9 +17,10 @@
 
 #include "kudu/integration-tests/cluster_verifier.h"
 
+#include <functional>
 #include <memory>
+#include <ostream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <glog/logging.h>
diff --git a/src/kudu/integration-tests/consensus_peer_health_status-itest.cc b/src/kudu/integration-tests/consensus_peer_health_status-itest.cc
index 7139640..bf328e1 100644
--- a/src/kudu/integration-tests/consensus_peer_health_status-itest.cc
+++ b/src/kudu/integration-tests/consensus_peer_health_status-itest.cc
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include <functional>
 #include <initializer_list>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/integration-tests/create-table-itest.cc b/src/kudu/integration-tests/create-table-itest.cc
index e5547fc..9042252 100644
--- a/src/kudu/integration-tests/create-table-itest.cc
+++ b/src/kudu/integration-tests/create-table-itest.cc
@@ -19,6 +19,7 @@
 #include <cmath>
 #include <cstdint>
 #include <cstdlib>
+#include <functional>
 #include <map>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/integration-tests/delete_table-itest.cc b/src/kudu/integration-tests/delete_table-itest.cc
index fae8132..047f0e7 100644
--- a/src/kudu/integration-tests/delete_table-itest.cc
+++ b/src/kudu/integration-tests/delete_table-itest.cc
@@ -19,6 +19,7 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <functional>
 #include <initializer_list>
 #include <limits>
 #include <memory>
diff --git a/src/kudu/integration-tests/delete_tablet-itest.cc b/src/kudu/integration-tests/delete_tablet-itest.cc
index 513d5aa..0123ddc 100644
--- a/src/kudu/integration-tests/delete_tablet-itest.cc
+++ b/src/kudu/integration-tests/delete_tablet-itest.cc
@@ -17,6 +17,7 @@
 
 #include <atomic>
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <string>
 #include <thread>
diff --git a/src/kudu/integration-tests/dense_node-itest.cc b/src/kudu/integration-tests/dense_node-itest.cc
index 44210d8..b75cd09 100644
--- a/src/kudu/integration-tests/dense_node-itest.cc
+++ b/src/kudu/integration-tests/dense_node-itest.cc
@@ -19,6 +19,7 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <initializer_list>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/integration-tests/disk_failure-itest.cc b/src/kudu/integration-tests/disk_failure-itest.cc
index 680baff..e749103 100644
--- a/src/kudu/integration-tests/disk_failure-itest.cc
+++ b/src/kudu/integration-tests/disk_failure-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/integration-tests/disk_reservation-itest.cc b/src/kudu/integration-tests/disk_reservation-itest.cc
index fc4f0b8..7bc29f0 100644
--- a/src/kudu/integration-tests/disk_reservation-itest.cc
+++ b/src/kudu/integration-tests/disk_reservation-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/integration-tests/hms_itest-base.cc b/src/kudu/integration-tests/hms_itest-base.cc
index 6ba11ff..1566554 100644
--- a/src/kudu/integration-tests/hms_itest-base.cc
+++ b/src/kudu/integration-tests/hms_itest-base.cc
@@ -20,7 +20,6 @@
 #include <map>
 #include <memory>
 #include <string>
-#include <type_traits>
 #include <utility>
 #include <vector>
 
diff --git a/src/kudu/integration-tests/linked_list-test-util.h b/src/kudu/integration-tests/linked_list-test-util.h
index 6000566..a3d60f3 100644
--- a/src/kudu/integration-tests/linked_list-test-util.h
+++ b/src/kudu/integration-tests/linked_list-test-util.h
@@ -37,6 +37,7 @@
 #include "kudu/client/write_op.h"
 #include "kudu/clock/hybrid_clock.h"
 #include "kudu/gutil/port.h"
+#include "kudu/gutil/stl_util.h"
 #include "kudu/gutil/strings/join.h"
 #include "kudu/gutil/strings/split.h"
 #include "kudu/gutil/strings/substitute.h"
diff --git a/src/kudu/integration-tests/location_assignment-itest.cc b/src/kudu/integration-tests/location_assignment-itest.cc
index be4129e..880a276 100644
--- a/src/kudu/integration-tests/location_assignment-itest.cc
+++ b/src/kudu/integration-tests/location_assignment-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/integration-tests/log-rolling-itest.cc b/src/kudu/integration-tests/log-rolling-itest.cc
index a23719b..b49abb8 100644
--- a/src/kudu/integration-tests/log-rolling-itest.cc
+++ b/src/kudu/integration-tests/log-rolling-itest.cc
@@ -19,6 +19,7 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <functional>
 #include <string>
 #include <vector>
 
diff --git a/src/kudu/integration-tests/maintenance_mode-itest.cc b/src/kudu/integration-tests/maintenance_mode-itest.cc
index 648802c..fb56824 100644
--- a/src/kudu/integration-tests/maintenance_mode-itest.cc
+++ b/src/kudu/integration-tests/maintenance_mode-itest.cc
@@ -18,6 +18,7 @@
 #include <cstdint>
 #include <functional>
 #include <memory>
+#include <ostream>
 #include <string>
 #include <thread>
 #include <unordered_map>
diff --git a/src/kudu/integration-tests/master_cert_authority-itest.cc b/src/kudu/integration-tests/master_cert_authority-itest.cc
index 15e02dd..29fcde9 100644
--- a/src/kudu/integration-tests/master_cert_authority-itest.cc
+++ b/src/kudu/integration-tests/master_cert_authority-itest.cc
@@ -21,7 +21,6 @@
 #include <ostream>
 #include <string>
 #include <thread>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/integration-tests/master_failover-itest.cc b/src/kudu/integration-tests/master_failover-itest.cc
index e50b2ff..60a1d8e 100644
--- a/src/kudu/integration-tests/master_failover-itest.cc
+++ b/src/kudu/integration-tests/master_failover-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint> // IWYU pragma: keep
+#include <functional>
 #include <memory>
 #include <ostream> // IWYU pragma: keep
 #include <set>
diff --git a/src/kudu/integration-tests/master_hms-itest.cc b/src/kudu/integration-tests/master_hms-itest.cc
index 67732ac..5f5c343 100644
--- a/src/kudu/integration-tests/master_hms-itest.cc
+++ b/src/kudu/integration-tests/master_hms-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <algorithm>
+#include <functional>
 #include <initializer_list>
 #include <map>
 #include <memory>
diff --git a/src/kudu/integration-tests/master_replication-itest.cc b/src/kudu/integration-tests/master_replication-itest.cc
index c0d5cfd..b7732ea 100644
--- a/src/kudu/integration-tests/master_replication-itest.cc
+++ b/src/kudu/integration-tests/master_replication-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/integration-tests/memory_gc-itest.cc b/src/kudu/integration-tests/memory_gc-itest.cc
index 03119c3..0525085 100644
--- a/src/kudu/integration-tests/memory_gc-itest.cc
+++ b/src/kudu/integration-tests/memory_gc-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <string>
 #include <utility>
diff --git a/src/kudu/integration-tests/mini_cluster_fs_inspector.cc b/src/kudu/integration-tests/mini_cluster_fs_inspector.cc
index b6bd65f..b2cbd42 100644
--- a/src/kudu/integration-tests/mini_cluster_fs_inspector.cc
+++ b/src/kudu/integration-tests/mini_cluster_fs_inspector.cc
@@ -19,6 +19,8 @@
 
 #include <algorithm>
 #include <set>
+#include <type_traits>
+#include <utility>
 
 #include <glog/logging.h>
 
diff --git a/src/kudu/integration-tests/minidump_generation-itest.cc b/src/kudu/integration-tests/minidump_generation-itest.cc
index 6dccc45..432af5d 100644
--- a/src/kudu/integration-tests/minidump_generation-itest.cc
+++ b/src/kudu/integration-tests/minidump_generation-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <csignal>
+#include <functional>
 #include <memory>
 #include <string>
 #include <vector>
diff --git a/src/kudu/integration-tests/multidir_cluster-itest.cc b/src/kudu/integration-tests/multidir_cluster-itest.cc
index 25dd253..501f467 100644
--- a/src/kudu/integration-tests/multidir_cluster-itest.cc
+++ b/src/kudu/integration-tests/multidir_cluster-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <map>
 #include <memory>
 #include <string>
diff --git a/src/kudu/integration-tests/raft_config_change-itest.cc b/src/kudu/integration-tests/raft_config_change-itest.cc
index 5d540fe..83b7900 100644
--- a/src/kudu/integration-tests/raft_config_change-itest.cc
+++ b/src/kudu/integration-tests/raft_config_change-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <initializer_list>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/integration-tests/raft_consensus-itest.cc b/src/kudu/integration-tests/raft_consensus-itest.cc
index 627b952..3641d5b 100644
--- a/src/kudu/integration-tests/raft_consensus-itest.cc
+++ b/src/kudu/integration-tests/raft_consensus-itest.cc
@@ -17,6 +17,7 @@
 
 #include <cstdint>
 #include <cstdlib>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/integration-tests/raft_consensus_election-itest.cc b/src/kudu/integration-tests/raft_consensus_election-itest.cc
index 78fab3b..71d835c 100644
--- a/src/kudu/integration-tests/raft_consensus_election-itest.cc
+++ b/src/kudu/integration-tests/raft_consensus_election-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <initializer_list>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/integration-tests/raft_consensus_failure_detector-imc-itest.cc b/src/kudu/integration-tests/raft_consensus_failure_detector-imc-itest.cc
index 21d76e2..33af873 100644
--- a/src/kudu/integration-tests/raft_consensus_failure_detector-imc-itest.cc
+++ b/src/kudu/integration-tests/raft_consensus_failure_detector-imc-itest.cc
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/integration-tests/raft_consensus_nonvoter-itest.cc b/src/kudu/integration-tests/raft_consensus_nonvoter-itest.cc
index 3b8a981..8e11136 100644
--- a/src/kudu/integration-tests/raft_consensus_nonvoter-itest.cc
+++ b/src/kudu/integration-tests/raft_consensus_nonvoter-itest.cc
@@ -17,6 +17,7 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <numeric>
 #include <ostream>
diff --git a/src/kudu/integration-tests/registration-test.cc b/src/kudu/integration-tests/registration-test.cc
index bae2843..ad47366 100644
--- a/src/kudu/integration-tests/registration-test.cc
+++ b/src/kudu/integration-tests/registration-test.cc
@@ -18,10 +18,10 @@
 #include <stdint.h>
 
 #include <algorithm>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/integration-tests/security-faults-itest.cc b/src/kudu/integration-tests/security-faults-itest.cc
index 5607fd8..a27c722 100644
--- a/src/kudu/integration-tests/security-faults-itest.cc
+++ b/src/kudu/integration-tests/security-faults-itest.cc
@@ -21,7 +21,6 @@
 #include <memory>
 #include <ostream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <gflags/gflags_declare.h>
diff --git a/src/kudu/integration-tests/security-itest.cc b/src/kudu/integration-tests/security-itest.cc
index 6ea9fe4..1dc43ae 100644
--- a/src/kudu/integration-tests/security-itest.cc
+++ b/src/kudu/integration-tests/security-itest.cc
@@ -19,6 +19,7 @@
 
 #include <cstdio>
 #include <cstdlib>
+#include <functional>
 #include <initializer_list>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/integration-tests/security-master-auth-itest.cc b/src/kudu/integration-tests/security-master-auth-itest.cc
index ffe0d02..6e98e1c 100644
--- a/src/kudu/integration-tests/security-master-auth-itest.cc
+++ b/src/kudu/integration-tests/security-master-auth-itest.cc
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include <functional>
 #include <memory>
 
 #include <gflags/gflags_declare.h>
diff --git a/src/kudu/integration-tests/stop_tablet-itest.cc b/src/kudu/integration-tests/stop_tablet-itest.cc
index 8afce12..571ff6d 100644
--- a/src/kudu/integration-tests/stop_tablet-itest.cc
+++ b/src/kudu/integration-tests/stop_tablet-itest.cc
@@ -16,10 +16,10 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <gflags/gflags_declare.h>
diff --git a/src/kudu/integration-tests/table_locations-itest.cc b/src/kudu/integration-tests/table_locations-itest.cc
index 63adf1b..e8da64b 100644
--- a/src/kudu/integration-tests/table_locations-itest.cc
+++ b/src/kudu/integration-tests/table_locations-itest.cc
@@ -23,7 +23,6 @@
 #include <vector>
 
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 #include <gtest/gtest.h>
 
diff --git a/src/kudu/integration-tests/tablet_copy-itest.cc b/src/kudu/integration-tests/tablet_copy-itest.cc
index 838826f..f136f02 100644
--- a/src/kudu/integration-tests/tablet_copy-itest.cc
+++ b/src/kudu/integration-tests/tablet_copy-itest.cc
@@ -17,6 +17,7 @@
 
 #include <atomic>
 #include <cstdint>
+#include <functional>
 #include <initializer_list>
 #include <limits>
 #include <memory>
diff --git a/src/kudu/integration-tests/tablet_copy_client_session-itest.cc b/src/kudu/integration-tests/tablet_copy_client_session-itest.cc
index b1a1c4d..b2f7c47 100644
--- a/src/kudu/integration-tests/tablet_copy_client_session-itest.cc
+++ b/src/kudu/integration-tests/tablet_copy_client_session-itest.cc
@@ -17,6 +17,7 @@
 
 #include <cstdint>
 #include <cstdlib>
+#include <functional>
 #include <limits>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/integration-tests/tablet_history_gc-itest.cc b/src/kudu/integration-tests/tablet_history_gc-itest.cc
index 205d793..1f5b684 100644
--- a/src/kudu/integration-tests/tablet_history_gc-itest.cc
+++ b/src/kudu/integration-tests/tablet_history_gc-itest.cc
@@ -17,6 +17,7 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <functional>
 #include <iterator>
 #include <map>
 #include <memory>
diff --git a/src/kudu/integration-tests/tablet_replacement-itest.cc b/src/kudu/integration-tests/tablet_replacement-itest.cc
index b71f771..fa92085 100644
--- a/src/kudu/integration-tests/tablet_replacement-itest.cc
+++ b/src/kudu/integration-tests/tablet_replacement-itest.cc
@@ -16,11 +16,13 @@
 // under the License.
 
 #include <algorithm>
+#include <functional>
 #include <map>
 #include <memory>
 #include <ostream>
 #include <set>
 #include <string>
+#include <type_traits>
 #include <unordered_map>
 #include <utility>
 #include <vector>
diff --git a/src/kudu/integration-tests/tablet_server_quiescing-itest.cc b/src/kudu/integration-tests/tablet_server_quiescing-itest.cc
index f8158cc..5ece984 100644
--- a/src/kudu/integration-tests/tablet_server_quiescing-itest.cc
+++ b/src/kudu/integration-tests/tablet_server_quiescing-itest.cc
@@ -17,7 +17,9 @@
 
 #include <atomic>
 #include <cstdio>
+#include <functional>
 #include <memory>
+#include <ostream>
 #include <string>
 #include <unordered_map>
 #include <utility>
diff --git a/src/kudu/integration-tests/test_workload.h b/src/kudu/integration-tests/test_workload.h
index 3c2c362..3f5ffb0 100644
--- a/src/kudu/integration-tests/test_workload.h
+++ b/src/kudu/integration-tests/test_workload.h
@@ -18,6 +18,7 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <memory>
 #include <mutex>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/integration-tests/timestamp_advancement-itest.cc b/src/kudu/integration-tests/timestamp_advancement-itest.cc
index fc09628..cc161cc 100644
--- a/src/kudu/integration-tests/timestamp_advancement-itest.cc
+++ b/src/kudu/integration-tests/timestamp_advancement-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <initializer_list>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/integration-tests/tombstoned_voting-imc-itest.cc b/src/kudu/integration-tests/tombstoned_voting-imc-itest.cc
index 20c9df8..6027cd8 100644
--- a/src/kudu/integration-tests/tombstoned_voting-imc-itest.cc
+++ b/src/kudu/integration-tests/tombstoned_voting-imc-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/integration-tests/tombstoned_voting-itest.cc b/src/kudu/integration-tests/tombstoned_voting-itest.cc
index 6e958ef..388ac1b 100644
--- a/src/kudu/integration-tests/tombstoned_voting-itest.cc
+++ b/src/kudu/integration-tests/tombstoned_voting-itest.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <set>
 #include <string>
diff --git a/src/kudu/integration-tests/tombstoned_voting-stress-test.cc b/src/kudu/integration-tests/tombstoned_voting-stress-test.cc
index 43de038..1018215 100644
--- a/src/kudu/integration-tests/tombstoned_voting-stress-test.cc
+++ b/src/kudu/integration-tests/tombstoned_voting-stress-test.cc
@@ -17,13 +17,13 @@
 
 #include <atomic>
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <mutex>
 #include <ostream>
 #include <string>
 #include <thread>
 #include <unordered_map>
-#include <utility>
 #include <vector>
 
 #include <gflags/gflags.h>
diff --git a/src/kudu/integration-tests/ts_itest-base.cc b/src/kudu/integration-tests/ts_itest-base.cc
index 2013e5e..4fb183b 100644
--- a/src/kudu/integration-tests/ts_itest-base.cc
+++ b/src/kudu/integration-tests/ts_itest-base.cc
@@ -22,6 +22,7 @@
 #include <ostream>
 #include <set>
 #include <string>
+#include <type_traits>
 #include <unordered_map>
 #include <unordered_set>
 #include <utility>
diff --git a/src/kudu/integration-tests/ts_recovery-itest.cc b/src/kudu/integration-tests/ts_recovery-itest.cc
index 23f989e..c1cb77c 100644
--- a/src/kudu/integration-tests/ts_recovery-itest.cc
+++ b/src/kudu/integration-tests/ts_recovery-itest.cc
@@ -17,6 +17,7 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <functional>
 #include <iterator>
 #include <memory>
 #include <ostream>
@@ -24,7 +25,6 @@
 #include <thread>
 #include <unordered_map>
 #include <unordered_set>
-#include <utility>
 #include <vector>
 
 #include <glog/logging.h>
diff --git a/src/kudu/integration-tests/webserver-crawl-itest.cc b/src/kudu/integration-tests/webserver-crawl-itest.cc
index 2ed35e7..077d57b 100644
--- a/src/kudu/integration-tests/webserver-crawl-itest.cc
+++ b/src/kudu/integration-tests/webserver-crawl-itest.cc
@@ -19,7 +19,9 @@
 #include <deque>
 #include <ostream>
 #include <string>
+#include <type_traits>
 #include <unordered_set>
+#include <utility>
 #include <vector>
 
 #include <glog/logging.h>
diff --git a/src/kudu/master/auto_rebalancer-test.cc b/src/kudu/master/auto_rebalancer-test.cc
index 722ba55..1000237 100644
--- a/src/kudu/master/auto_rebalancer-test.cc
+++ b/src/kudu/master/auto_rebalancer-test.cc
@@ -17,6 +17,7 @@
 #include "kudu/master/auto_rebalancer.h"
 
 #include <atomic>
+#include <functional>
 #include <memory>
 #include <set>
 #include <string>
diff --git a/src/kudu/master/auto_rebalancer.cc b/src/kudu/master/auto_rebalancer.cc
index 3faca43..122dd14 100644
--- a/src/kudu/master/auto_rebalancer.cc
+++ b/src/kudu/master/auto_rebalancer.cc
@@ -18,6 +18,7 @@
 #include "kudu/master/auto_rebalancer.h"
 
 #include <atomic>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <random>
diff --git a/src/kudu/master/hms_notification_log_listener.cc b/src/kudu/master/hms_notification_log_listener.cc
index 8198651..c49b484 100644
--- a/src/kudu/master/hms_notification_log_listener.cc
+++ b/src/kudu/master/hms_notification_log_listener.cc
@@ -18,6 +18,7 @@
 #include "kudu/master/hms_notification_log_listener.h"
 
 #include <cstdint>
+#include <functional>
 #include <map>
 #include <mutex>
 #include <ostream>
diff --git a/src/kudu/master/location_cache-test.cc b/src/kudu/master/location_cache-test.cc
index 81d3f27..4fd9551 100644
--- a/src/kudu/master/location_cache-test.cc
+++ b/src/kudu/master/location_cache-test.cc
@@ -18,6 +18,7 @@
 #include "kudu/master/location_cache.h"
 
 #include <cstdint>
+#include <ostream>
 #include <string>
 #include <thread>
 #include <vector>
diff --git a/src/kudu/master/master-test.cc b/src/kudu/master/master-test.cc
index 79bd17a..56434ce 100644
--- a/src/kudu/master/master-test.cc
+++ b/src/kudu/master/master-test.cc
@@ -21,6 +21,7 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <functional>
 #include <map>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/master/master.cc b/src/kudu/master/master.cc
index e612f84..0226a72 100644
--- a/src/kudu/master/master.cc
+++ b/src/kudu/master/master.cc
@@ -18,6 +18,7 @@
 #include "kudu/master/master.h"
 
 #include <algorithm>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/master/master_path_handlers.cc b/src/kudu/master/master_path_handlers.cc
index 385aa0a..2e6837a 100644
--- a/src/kudu/master/master_path_handlers.cc
+++ b/src/kudu/master/master_path_handlers.cc
@@ -20,7 +20,6 @@
 #include <algorithm>
 #include <array>
 #include <cstdint>
-#include <iosfwd>
 #include <limits>
 #include <map>
 #include <memory>
diff --git a/src/kudu/master/placement_policy-test.cc b/src/kudu/master/placement_policy-test.cc
index f1569c6..7b076aa 100644
--- a/src/kudu/master/placement_policy-test.cc
+++ b/src/kudu/master/placement_policy-test.cc
@@ -24,6 +24,7 @@
 #include <memory>
 #include <set>
 #include <string>
+#include <type_traits>
 #include <utility>
 #include <vector>
 
diff --git a/src/kudu/master/placement_policy.cc b/src/kudu/master/placement_policy.cc
index 4b78076..a8a0e11 100644
--- a/src/kudu/master/placement_policy.cc
+++ b/src/kudu/master/placement_policy.cc
@@ -17,12 +17,12 @@
 
 #include "kudu/master/placement_policy.h"
 
-#include <cstdint>
 #include <iterator>
 #include <limits>
 #include <map>
 #include <memory>
 #include <numeric>
+#include <ostream>
 #include <set>
 #include <string>
 #include <unordered_map>
diff --git a/src/kudu/master/ranger_authz_provider.cc b/src/kudu/master/ranger_authz_provider.cc
index 0944284..f33d8f7 100644
--- a/src/kudu/master/ranger_authz_provider.cc
+++ b/src/kudu/master/ranger_authz_provider.cc
@@ -17,7 +17,6 @@
 
 #include "kudu/master/ranger_authz_provider.h"
 
-#include <algorithm>
 #include <ostream>
 
 #include <gflags/gflags.h>
@@ -33,6 +32,7 @@ DECLARE_string(ranger_config_path);
 
 namespace kudu {
 class MetricEntity;
+
 namespace master {
 
 using kudu::security::ColumnPrivilegePB;
diff --git a/src/kudu/master/sentry_authz_provider-test.cc b/src/kudu/master/sentry_authz_provider-test.cc
index 7efe19d..71a087b 100644
--- a/src/kudu/master/sentry_authz_provider-test.cc
+++ b/src/kudu/master/sentry_authz_provider-test.cc
@@ -19,16 +19,18 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <functional>
+#include <initializer_list>
 #include <memory>
 #include <ostream>
 #include <string>
 #include <thread>
 #include <unordered_map>
 #include <unordered_set>
+#include <utility>
 #include <vector>
 
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 #include <google/protobuf/stubs/port.h>
 #include <google/protobuf/util/message_differencer.h>
diff --git a/src/kudu/master/sentry_authz_provider.cc b/src/kudu/master/sentry_authz_provider.cc
index 7a0bb89..702ef2f 100644
--- a/src/kudu/master/sentry_authz_provider.cc
+++ b/src/kudu/master/sentry_authz_provider.cc
@@ -17,7 +17,7 @@
 
 #include "kudu/master/sentry_authz_provider.h"
 
-#include <algorithm>
+#include <ostream>
 #include <unordered_map>
 #include <unordered_set>
 #include <utility>
diff --git a/src/kudu/master/sentry_privileges_fetcher.cc b/src/kudu/master/sentry_privileges_fetcher.cc
index f293610..74364db 100644
--- a/src/kudu/master/sentry_privileges_fetcher.cc
+++ b/src/kudu/master/sentry_privileges_fetcher.cc
@@ -23,13 +23,13 @@
 #include <iterator>
 #include <memory>
 #include <mutex>
+#include <set>
 #include <type_traits>
 #include <unordered_map>
 #include <vector>
 
 #include <boost/algorithm/string/predicate.hpp>
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 
 #include "kudu/common/table_util.h"
diff --git a/src/kudu/master/sentry_privileges_fetcher.h b/src/kudu/master/sentry_privileges_fetcher.h
index a43732c..5bdf51e 100644
--- a/src/kudu/master/sentry_privileges_fetcher.h
+++ b/src/kudu/master/sentry_privileges_fetcher.h
@@ -18,6 +18,7 @@
 #pragma once
 
 #include <cstddef>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/master/ts_descriptor-test.cc b/src/kudu/master/ts_descriptor-test.cc
index dc8acc2..70dab1b 100644
--- a/src/kudu/master/ts_descriptor-test.cc
+++ b/src/kudu/master/ts_descriptor-test.cc
@@ -17,6 +17,7 @@
 
 #include "kudu/master/ts_descriptor.h"
 
+#include <initializer_list>
 #include <memory>
 #include <string>
 
diff --git a/src/kudu/master/ts_manager.cc b/src/kudu/master/ts_manager.cc
index 6a80b22..928e352 100644
--- a/src/kudu/master/ts_manager.cc
+++ b/src/kudu/master/ts_manager.cc
@@ -20,8 +20,10 @@
 #include <time.h>
 
 #include <algorithm>
+#include <functional>
 #include <limits>
 #include <mutex>
+#include <ostream>
 #include <utility>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/mini-cluster/external_mini_cluster.h b/src/kudu/mini-cluster/external_mini_cluster.h
index 379a157..a117c68 100644
--- a/src/kudu/mini-cluster/external_mini_cluster.h
+++ b/src/kudu/mini-cluster/external_mini_cluster.h
@@ -26,7 +26,6 @@
 #include <ostream>
 #include <string>
 #include <thread>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/mini-cluster/mini_cluster.cc b/src/kudu/mini-cluster/mini_cluster.cc
index 5c9ee23..ffc97eb 100644
--- a/src/kudu/mini-cluster/mini_cluster.cc
+++ b/src/kudu/mini-cluster/mini_cluster.cc
@@ -17,7 +17,6 @@
 
 #include "kudu/mini-cluster/mini_cluster.h"
 
-#include <ostream>
 #include <string>
 #include <utility>
 
diff --git a/src/kudu/mini-cluster/webui_checker.cc b/src/kudu/mini-cluster/webui_checker.cc
index e195093..eda0019 100644
--- a/src/kudu/mini-cluster/webui_checker.cc
+++ b/src/kudu/mini-cluster/webui_checker.cc
@@ -24,6 +24,7 @@
 #include <random>
 #include <string>
 #include <thread>
+#include <utility>
 #include <vector>
 
 #include <glog/logging.h>
diff --git a/src/kudu/rebalance/rebalance_algo-test.cc b/src/kudu/rebalance/rebalance_algo-test.cc
index 8cfd3b2..adb9c5e 100644
--- a/src/kudu/rebalance/rebalance_algo-test.cc
+++ b/src/kudu/rebalance/rebalance_algo-test.cc
@@ -23,7 +23,6 @@
 #include <iostream>
 #include <iterator>
 #include <map>
-#include <memory>
 #include <set>
 #include <string>
 #include <unordered_map>
diff --git a/src/kudu/rebalance/rebalancer.h b/src/kudu/rebalance/rebalancer.h
index 5b2d0e8..edf292c 100644
--- a/src/kudu/rebalance/rebalancer.h
+++ b/src/kudu/rebalance/rebalancer.h
@@ -22,7 +22,6 @@
 #include <string>
 #include <unordered_map>
 #include <unordered_set>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/rpc/acceptor_pool.cc b/src/kudu/rpc/acceptor_pool.cc
index 9971557..f1f2270 100644
--- a/src/kudu/rpc/acceptor_pool.cc
+++ b/src/kudu/rpc/acceptor_pool.cc
@@ -17,8 +17,9 @@
 
 #include "kudu/rpc/acceptor_pool.h"
 
-#include <string>
+#include <functional>
 #include <ostream>
+#include <string>
 #include <vector>
 
 #include <gflags/gflags.h>
diff --git a/src/kudu/rpc/client_negotiation.cc b/src/kudu/rpc/client_negotiation.cc
index 4129193..f0edb07 100644
--- a/src/kudu/rpc/client_negotiation.cc
+++ b/src/kudu/rpc/client_negotiation.cc
@@ -17,8 +17,13 @@
 
 #include "kudu/rpc/client_negotiation.h"
 
+#include <gssapi/gssapi.h>
+#include <gssapi/gssapi_krb5.h>
+#include <sasl/sasl.h>
+
 #include <cstdint>
 #include <cstring>
+#include <functional>
 #include <map>
 #include <memory>
 #include <ostream>
@@ -27,9 +32,6 @@
 
 #include <gflags/gflags_declare.h>
 #include <glog/logging.h>
-#include <gssapi/gssapi.h>
-#include <gssapi/gssapi_krb5.h>
-#include <sasl/sasl.h>
 
 #include "kudu/gutil/basictypes.h"
 #include "kudu/gutil/map-util.h"
diff --git a/src/kudu/rpc/exactly_once_rpc-test.cc b/src/kudu/rpc/exactly_once_rpc-test.cc
index 986ac69..4d7a0fd 100644
--- a/src/kudu/rpc/exactly_once_rpc-test.cc
+++ b/src/kudu/rpc/exactly_once_rpc-test.cc
@@ -20,6 +20,7 @@
 #include <atomic>
 #include <cstdint>
 #include <cstdlib>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/rpc/messenger.h b/src/kudu/rpc/messenger.h
index 6d95615..5a5f885 100644
--- a/src/kudu/rpc/messenger.h
+++ b/src/kudu/rpc/messenger.h
@@ -21,7 +21,6 @@
 #include <mutex>
 #include <string>
 #include <unordered_map>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/rpc/negotiation-test.cc b/src/kudu/rpc/negotiation-test.cc
index bebc5e9..50e226b 100644
--- a/src/kudu/rpc/negotiation-test.cc
+++ b/src/kudu/rpc/negotiation-test.cc
@@ -15,8 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include "kudu/rpc/rpc-test-base.h"
+#include "kudu/rpc/negotiation.h"
 
+#include <sasl/sasl.h>
 #include <sys/stat.h>
 #include <unistd.h>
 
@@ -30,12 +31,11 @@
 #include <utility>
 #include <vector>
 
+#include <krb5/krb5.h> // IWYU pragma: keep
 #include <boost/optional/optional.hpp>
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 #include <gtest/gtest.h>
-#include <sasl/sasl.h>
 
 #include "kudu/gutil/ref_counted.h"
 #include "kudu/gutil/strings/join.h"
@@ -43,8 +43,8 @@
 #include "kudu/gutil/walltime.h"
 #include "kudu/rpc/client_negotiation.h"
 #include "kudu/rpc/messenger.h"
-#include "kudu/rpc/negotiation.h"
 #include "kudu/rpc/remote_user.h"
+#include "kudu/rpc/rpc-test-base.h"
 #include "kudu/rpc/sasl_common.h"
 #include "kudu/rpc/server_negotiation.h"
 #include "kudu/security/cert.h"
diff --git a/src/kudu/rpc/periodic-test.cc b/src/kudu/rpc/periodic-test.cc
index cd793bd..ea21994 100644
--- a/src/kudu/rpc/periodic-test.cc
+++ b/src/kudu/rpc/periodic-test.cc
@@ -15,8 +15,11 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/rpc/periodic.h"
+
 #include <atomic>
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
@@ -27,7 +30,6 @@
 #include <gtest/gtest.h>
 
 #include "kudu/rpc/messenger.h"
-#include "kudu/rpc/periodic.h"
 #include "kudu/util/monotime.h"
 #include "kudu/util/scoped_cleanup.h"
 #include "kudu/util/stopwatch.h"
diff --git a/src/kudu/rpc/proxy.cc b/src/kudu/rpc/proxy.cc
index 1dfac01..85babdb 100644
--- a/src/kudu/rpc/proxy.cc
+++ b/src/kudu/rpc/proxy.cc
@@ -22,7 +22,7 @@
 #include <utility>
 
 #include <boost/bind.hpp> // IWYU pragma: keep
-#include <boost/core/ref.hpp>
+#include <boost/ref.hpp>
 #include <glog/logging.h>
 
 #include "kudu/gutil/strings/substitute.h"
diff --git a/src/kudu/rpc/reactor.cc b/src/kudu/rpc/reactor.cc
index e77488c..dc87286 100644
--- a/src/kudu/rpc/reactor.cc
+++ b/src/kudu/rpc/reactor.cc
@@ -17,31 +17,37 @@
 
 #include "kudu/rpc/reactor.h"
 
+#include <openssl/crypto.h>
+#include <openssl/err.h> // IWYU pragma: keep
+
 #include <cerrno>
+#include <functional>
 #include <memory>
 #include <mutex>
 #include <ostream>
 #include <string>
 #include <utility>
 
-#include <boost/bind.hpp> // IWYU pragma: keep
+#include <boost/bind.hpp>
 #include <boost/intrusive/list.hpp>
-#include <boost/optional.hpp>
+#include <boost/ref.hpp>
 #include <ev++.h>
+#include <ev.h>
 #include <gflags/gflags.h>
 #include <glog/logging.h>
 
-#include "kudu/gutil/bind.h"
+#include "kudu/gutil/port.h"
 #include "kudu/gutil/ref_counted.h"
 #include "kudu/gutil/stringprintf.h"
 #include "kudu/gutil/strings/substitute.h"
-#include "kudu/rpc/client_negotiation.h"
+#include "kudu/gutil/sysinfo.h"
+#include "kudu/gutil/walltime.h"
 #include "kudu/rpc/connection.h"
 #include "kudu/rpc/messenger.h"
 #include "kudu/rpc/negotiation.h"
 #include "kudu/rpc/outbound_call.h"
+#include "kudu/rpc/rpc_controller.h"
 #include "kudu/rpc/rpc_introspection.pb.h"
-#include "kudu/rpc/server_negotiation.h"
 #include "kudu/util/countdown_latch.h"
 #include "kudu/util/debug/sanitizer_scopes.h"
 #include "kudu/util/flag_tags.h"
@@ -56,6 +62,10 @@
 #include "kudu/util/threadpool.h"
 #include "kudu/util/trace.h"
 
+namespace boost {
+template <typename Signature> class function;
+}  // namespace boost
+
 // When compiling on Mac OS X, use 'kqueue' instead of the default, 'select', for the event loop.
 // Otherwise we run into problems because 'select' can't handle connections when more than 1024
 // file descriptors are open by the process.
diff --git a/src/kudu/rpc/reactor.h b/src/kudu/rpc/reactor.h
index 1767357..9d9f860 100644
--- a/src/kudu/rpc/reactor.h
+++ b/src/kudu/rpc/reactor.h
@@ -40,6 +40,10 @@
 #include "kudu/util/status.h"
 #include "kudu/util/thread.h"
 
+namespace boost {
+template <typename Signature> class function;
+}  // namespace boost
+
 namespace kudu {
 
 class Sockaddr;
@@ -54,6 +58,7 @@ class DumpConnectionsResponsePB;
 class OutboundCall;
 class Reactor;
 class ReactorThread;
+
 enum class CredentialsPolicy;
 
 // Simple metrics information from within a reactor.
diff --git a/src/kudu/rpc/rpc-bench.cc b/src/kudu/rpc/rpc-bench.cc
index a825900..782cb9c 100644
--- a/src/kudu/rpc/rpc-bench.cc
+++ b/src/kudu/rpc/rpc-bench.cc
@@ -25,7 +25,6 @@
 #include <vector>
 
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 #include <gtest/gtest.h>
 
diff --git a/src/kudu/rpc/rpc-test.cc b/src/kudu/rpc/rpc-test.cc
index 005b660..15ee5c4 100644
--- a/src/kudu/rpc/rpc-test.cc
+++ b/src/kudu/rpc/rpc-test.cc
@@ -30,7 +30,7 @@
 #include <vector>
 
 #include <boost/bind.hpp>
-#include <boost/core/ref.hpp>
+#include <boost/ref.hpp>
 #include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 #include <gtest/gtest.h>
diff --git a/src/kudu/rpc/rpc_stub-test.cc b/src/kudu/rpc/rpc_stub-test.cc
index 8c5a8a1..e199b23 100644
--- a/src/kudu/rpc/rpc_stub-test.cc
+++ b/src/kudu/rpc/rpc_stub-test.cc
@@ -21,6 +21,7 @@
 #include <cstdio>
 #include <cstdlib>
 #include <cstring>
+#include <functional>
 #include <limits>
 #include <memory>
 #include <ostream>
@@ -29,8 +30,8 @@
 #include <vector>
 
 #include <boost/bind.hpp>
-#include <boost/core/ref.hpp>
 #include <boost/function.hpp>
+#include <boost/ref.hpp>
 #include <gflags/gflags.h>
 #include <glog/logging.h>
 #include <glog/stl_logging.h>
diff --git a/src/kudu/rpc/serialization.cc b/src/kudu/rpc/serialization.cc
index 78ea295..7551465 100644
--- a/src/kudu/rpc/serialization.cc
+++ b/src/kudu/rpc/serialization.cc
@@ -19,12 +19,11 @@
 
 #include <limits>
 #include <ostream>
-#include <string>
 
 #include <gflags/gflags_declare.h>
 #include <glog/logging.h>
-#include <google/protobuf/message_lite.h>
 #include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/message_lite.h>
 
 #include "kudu/gutil/endian.h"
 #include "kudu/gutil/port.h"
diff --git a/src/kudu/rpc/server_negotiation.cc b/src/kudu/rpc/server_negotiation.cc
index 79d9925..c4babc3 100644
--- a/src/kudu/rpc/server_negotiation.cc
+++ b/src/kudu/rpc/server_negotiation.cc
@@ -17,9 +17,12 @@
 
 #include "kudu/rpc/server_negotiation.h"
 
+#include <sasl/sasl.h>
+
 #include <algorithm>
 #include <cstdint>
 #include <cstdlib>
+#include <functional>
 #include <memory>
 #include <mutex>
 #include <ostream>
@@ -28,9 +31,7 @@
 
 #include <boost/optional/optional.hpp>
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
-#include <sasl/sasl.h>
 
 #include "kudu/gutil/macros.h"
 #include "kudu/gutil/map-util.h"
diff --git a/src/kudu/rpc/transfer.cc b/src/kudu/rpc/transfer.cc
index 422e448..0c4104f 100644
--- a/src/kudu/rpc/transfer.cc
+++ b/src/kudu/rpc/transfer.cc
@@ -17,7 +17,7 @@
 
 #include "kudu/rpc/transfer.h"
 
-#include <sys/uio.h>
+#include <sys/socket.h>
 
 #include <algorithm>
 #include <cstddef>
diff --git a/src/kudu/security/ca/cert_management-test.cc b/src/kudu/security/ca/cert_management-test.cc
index 0c8abc8..e91d8c0 100644
--- a/src/kudu/security/ca/cert_management-test.cc
+++ b/src/kudu/security/ca/cert_management-test.cc
@@ -17,6 +17,7 @@
 
 #include "kudu/security/ca/cert_management.h"
 
+#include <initializer_list>
 #include <string>
 #include <utility>
 #include <vector>
diff --git a/src/kudu/security/ca/cert_management.cc b/src/kudu/security/ca/cert_management.cc
index 7ccc376..32f0fba 100644
--- a/src/kudu/security/ca/cert_management.cc
+++ b/src/kudu/security/ca/cert_management.cc
@@ -17,26 +17,25 @@
 
 #include "kudu/security/ca/cert_management.h"
 
+#include <openssl/bn.h>
+#include <openssl/obj_mac.h>
+#include <openssl/ssl.h>
+#include <openssl/x509.h>
+#include <openssl/x509v3.h>
+
 #include <algorithm>
 #include <cstdio>
+#include <functional>
 #include <memory>
 #include <mutex>
 #include <string>
 
 #include <glog/logging.h>
-#include <openssl/conf.h>
-#ifndef OPENSSL_NO_ENGINE
-#include <openssl/engine.h>
-#endif
-#include <openssl/pem.h>
-#include <openssl/x509.h>
-#include <openssl/x509v3.h>
 
 #include "kudu/gutil/strings/substitute.h"
 #include "kudu/security/cert.h"
 #include "kudu/security/crypto.h"
 #include "kudu/security/openssl_util.h"
-#include "kudu/util/net/socket.h"
 #include "kudu/util/scoped_cleanup.h"
 #include "kudu/util/status.h"
 
diff --git a/src/kudu/security/ca/cert_management.h b/src/kudu/security/ca/cert_management.h
index fb2bd0e..fdf3b71 100644
--- a/src/kudu/security/ca/cert_management.h
+++ b/src/kudu/security/ca/cert_management.h
@@ -17,6 +17,11 @@
 
 #pragma once
 
+#include <openssl/asn1.h>
+#include <openssl/crypto.h>
+#include <openssl/ssl.h>
+#include <openssl/x509.h>
+
 #include <cstdint>
 #include <memory>
 #include <string>
diff --git a/src/kudu/security/cert-test.cc b/src/kudu/security/cert-test.cc
index 12205e1..016a8ff 100644
--- a/src/kudu/security/cert-test.cc
+++ b/src/kudu/security/cert-test.cc
@@ -15,6 +15,10 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/security/cert.h"
+
+#include <openssl/obj_mac.h>
+
 #include <string>
 #include <thread>
 #include <utility>
@@ -25,7 +29,6 @@
 #include <gtest/gtest.h>
 
 #include "kudu/gutil/strings/strip.h"
-#include "kudu/security/cert.h"
 #include "kudu/security/crypto.h"
 #include "kudu/security/openssl_util.h"
 #include "kudu/security/test/test_certs.h"
diff --git a/src/kudu/security/cert.cc b/src/kudu/security/cert.cc
index b81d263..c98bc07 100644
--- a/src/kudu/security/cert.cc
+++ b/src/kudu/security/cert.cc
@@ -17,6 +17,15 @@
 
 #include "kudu/security/cert.h"
 
+#include <openssl/asn1.h>
+#include <openssl/crypto.h>
+#include <openssl/obj_mac.h>
+#include <openssl/objects.h>
+#include <openssl/ssl.h>
+#include <openssl/x509.h>
+#include <openssl/x509v3.h>
+
+#include <functional>
 #include <memory>
 #include <mutex>
 #include <ostream>
@@ -24,9 +33,6 @@
 
 #include <boost/optional/optional.hpp>
 #include <glog/logging.h>
-#include <openssl/evp.h>
-#include <openssl/x509.h>
-#include <openssl/x509v3.h>
 
 #include "kudu/gutil/macros.h"
 #include "kudu/security/crypto.h"
diff --git a/src/kudu/security/cert.h b/src/kudu/security/cert.h
index 4629883..f47d713 100644
--- a/src/kudu/security/cert.h
+++ b/src/kudu/security/cert.h
@@ -17,12 +17,13 @@
 
 #pragma once
 
+#include <openssl/ssl.h>
+#include <openssl/x509.h>
+
 #include <memory>
 #include <string>
 #include <vector>
 
-#include <openssl/asn1.h>
-
 #include "kudu/gutil/port.h"
 #include "kudu/security/openssl_util.h"
 
diff --git a/src/kudu/security/crypto.cc b/src/kudu/security/crypto.cc
index 234d193..2deb348 100644
--- a/src/kudu/security/crypto.cc
+++ b/src/kudu/security/crypto.cc
@@ -17,22 +17,21 @@
 
 #include "kudu/security/crypto.h"
 
-#include <memory>
-#include <ostream>
-#include <string>
-
-#include <glog/logging.h>
-#include <openssl/bio.h>
 #include <openssl/bn.h>
+#include <openssl/crypto.h>
 #include <openssl/err.h>
-#include <openssl/evp.h>
-#include <openssl/opensslv.h>
-#include <openssl/ossl_typ.h>
 #include <openssl/pem.h>
 #include <openssl/rand.h>
-#include <openssl/rsa.h>
+#include <openssl/ssl.h>
 #include <openssl/x509.h>
 
+#include <functional>
+#include <memory>
+#include <ostream>
+#include <string>
+
+#include <glog/logging.h>
+
 #include "kudu/gutil/strings/substitute.h"
 #include "kudu/security/openssl_util.h"
 #include "kudu/security/openssl_util_bio.h"
diff --git a/src/kudu/security/crypto.h b/src/kudu/security/crypto.h
index 145c405..850d215 100644
--- a/src/kudu/security/crypto.h
+++ b/src/kudu/security/crypto.h
@@ -17,17 +17,15 @@
 
 #pragma once
 
+#include <openssl/ssl.h>
+
 #include <cstddef>
 #include <string>
 
-#include <openssl/bio.h>
-#include <openssl/rsa.h>
-
 #include "kudu/gutil/port.h"
 #include "kudu/security/openssl_util.h"
 
 // Forward declarations for the OpenSSL typedefs.
-typedef struct rsa_st RSA;
 typedef struct bio_st BIO;
 
 namespace kudu {
diff --git a/src/kudu/security/init.cc b/src/kudu/security/init.cc
index 1268386..235a24a 100644
--- a/src/kudu/security/init.cc
+++ b/src/kudu/security/init.cc
@@ -17,6 +17,8 @@
 
 #include "kudu/security/init.h"
 
+#include <krb5/krb5.h>
+
 #include <algorithm>
 #include <cctype>
 #include <cstdint>
@@ -29,13 +31,10 @@
 #include <ostream>
 #include <random>
 #include <string>
-#include <type_traits>
-#include <utility>
 
 #include <boost/optional/optional.hpp>
 #include <gflags/gflags.h>
 #include <glog/logging.h>
-#include <krb5/krb5.h>
 
 #include "kudu/gutil/macros.h"
 #include "kudu/gutil/ref_counted.h"
diff --git a/src/kudu/security/openssl_util.cc b/src/kudu/security/openssl_util.cc
index e96fcb3..e6a693b 100644
--- a/src/kudu/security/openssl_util.cc
+++ b/src/kudu/security/openssl_util.cc
@@ -17,6 +17,10 @@
 
 #include "kudu/security/openssl_util.h"
 
+#include <openssl/crypto.h>
+#include <openssl/err.h>
+#include <openssl/rand.h> // IWYU pragma: keep
+
 #include <cerrno>
 #include <cstdint>
 #include <cstdio>
@@ -25,16 +29,17 @@
 #include <vector>
 
 #include <glog/logging.h>
-#include <openssl/crypto.h>
-#include <openssl/err.h>
-#include <openssl/rand.h>
 
 #include "kudu/gutil/strings/split.h"
 #include "kudu/gutil/strings/strip.h"
 #include "kudu/gutil/strings/substitute.h"
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
 #include "kudu/util/debug/leakcheck_disabler.h"
+#endif
 #include "kudu/util/errno.h"
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
 #include "kudu/util/mutex.h"
+#endif
 #include "kudu/util/scoped_cleanup.h"
 #include "kudu/util/status.h"
 #include "kudu/util/subprocess.h"
diff --git a/src/kudu/security/openssl_util.h b/src/kudu/security/openssl_util.h
index 00c4ebf..e5b522e 100644
--- a/src/kudu/security/openssl_util.h
+++ b/src/kudu/security/openssl_util.h
@@ -17,20 +17,29 @@
 
 #pragma once
 
+#include <openssl/err.h>
+#include <openssl/pem.h>
+#include <openssl/ssl.h>
+#include <openssl/x509.h>
+
 #include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
 
 #include <glog/logging.h>
-#include <openssl/err.h>
-#include <openssl/pem.h>
-#include <openssl/ssl.h>
-#include <openssl/x509.h>
 
 #include "kudu/gutil/port.h"
 #include "kudu/util/status.h"
 
+namespace kudu {
+namespace security {
+namespace internal {
+struct ScopedCheckNoPendingSSLErrors;
+}  // namespace internal
+}  // namespace security
+}  // namespace kudu
+
 // Forward declarations for the OpenSSL typedefs.
 typedef struct X509_req_st X509_REQ;
 typedef struct bio_st BIO;
diff --git a/src/kudu/security/test/mini_kdc-test.cc b/src/kudu/security/test/mini_kdc-test.cc
index ec137eb..4b5fe2f 100644
--- a/src/kudu/security/test/mini_kdc-test.cc
+++ b/src/kudu/security/test/mini_kdc-test.cc
@@ -15,13 +15,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/security/test/mini_kdc.h"
+
+#include <initializer_list>
 #include <string>
 
 #include <boost/optional/optional.hpp>
 #include <gtest/gtest.h>
 
 #include "kudu/security/init.h"
-#include "kudu/security/test/mini_kdc.h"
 #include "kudu/util/status.h"
 #include "kudu/util/test_macros.h"
 #include "kudu/util/test_util.h"
diff --git a/src/kudu/security/tls_context.cc b/src/kudu/security/tls_context.cc
index 466b72f..45d1c0a 100644
--- a/src/kudu/security/tls_context.cc
+++ b/src/kudu/security/tls_context.cc
@@ -17,6 +17,16 @@
 
 #include "kudu/security/tls_context.h"
 
+#include <openssl/crypto.h>
+#ifndef OPENSSL_NO_ECDH
+#include <openssl/ec.h> // IWYU pragma: keep
+#endif
+#include <openssl/err.h>
+#include <openssl/obj_mac.h> // IWYU pragma: keep
+#include <openssl/ssl.h>
+#include <openssl/x509.h>
+#include <openssl/x509v3.h>
+
 #include <algorithm>
 #include <mutex>
 #include <ostream>
@@ -26,10 +36,6 @@
 #include <boost/algorithm/string/predicate.hpp>
 #include <gflags/gflags.h>
 #include <glog/logging.h>
-#include <openssl/err.h>
-#include <openssl/ssl.h>
-#include <openssl/x509.h>
-#include <openssl/x509v3.h>
 
 #include "kudu/gutil/basictypes.h"
 #include "kudu/gutil/macros.h"
diff --git a/src/kudu/security/tls_context.h b/src/kudu/security/tls_context.h
index 786ab6e..edf37f3 100644
--- a/src/kudu/security/tls_context.h
+++ b/src/kudu/security/tls_context.h
@@ -18,6 +18,7 @@
 #pragma once
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <string>
 #include <vector>
diff --git a/src/kudu/security/tls_handshake.cc b/src/kudu/security/tls_handshake.cc
index 5a89592..52162c1 100644
--- a/src/kudu/security/tls_handshake.cc
+++ b/src/kudu/security/tls_handshake.cc
@@ -17,12 +17,12 @@
 
 #include "kudu/security/tls_handshake.h"
 
-#include <memory>
-#include <string>
-
+#include <openssl/crypto.h>
 #include <openssl/ssl.h>
 #include <openssl/x509.h>
-#include <openssl/x509v3.h>
+
+#include <memory>
+#include <string>
 
 #include "kudu/gutil/strings/strip.h"
 #include "kudu/gutil/strings/substitute.h"
diff --git a/src/kudu/security/tls_handshake.h b/src/kudu/security/tls_handshake.h
index 56020c4..da70331 100644
--- a/src/kudu/security/tls_handshake.h
+++ b/src/kudu/security/tls_handshake.h
@@ -17,6 +17,7 @@
 
 #pragma once
 
+#include <functional>
 #include <memory>
 #include <string>
 #include <utility>
diff --git a/src/kudu/security/tls_socket-test.cc b/src/kudu/security/tls_socket-test.cc
index b88cdf4..b39c25c 100644
--- a/src/kudu/security/tls_socket-test.cc
+++ b/src/kudu/security/tls_socket-test.cc
@@ -15,13 +15,11 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include "kudu/security/tls_handshake.h"
-
-#include <algorithm>
 #include <pthread.h>
 #include <sched.h>
-#include <sys/uio.h>
+#include <sys/socket.h>
 
+#include <algorithm>
 #include <atomic>
 #include <csignal>
 #include <cstdint>
@@ -38,6 +36,7 @@
 
 #include "kudu/gutil/macros.h"
 #include "kudu/security/tls_context.h"
+#include "kudu/security/tls_handshake.h"
 #include "kudu/util/countdown_latch.h"
 #include "kudu/util/monotime.h"
 #include "kudu/util/net/sockaddr.h"
diff --git a/src/kudu/security/tls_socket.cc b/src/kudu/security/tls_socket.cc
index a586315..5ae6c74 100644
--- a/src/kudu/security/tls_socket.cc
+++ b/src/kudu/security/tls_socket.cc
@@ -17,14 +17,16 @@
 
 #include "kudu/security/tls_socket.h"
 
-#include <sys/uio.h>
+#include <openssl/err.h>
+#include <openssl/ssl.h>
+#include <sys/socket.h>
 
 #include <cerrno>
+#include <functional>
 #include <string>
 #include <utility>
 
 #include <glog/logging.h>
-#include <openssl/err.h>
 
 #include "kudu/gutil/basictypes.h"
 #include "kudu/gutil/strings/substitute.h"
diff --git a/src/kudu/security/tls_socket.h b/src/kudu/security/tls_socket.h
index a0d716c..bf5693d 100644
--- a/src/kudu/security/tls_socket.h
+++ b/src/kudu/security/tls_socket.h
@@ -17,6 +17,8 @@
 
 #pragma once
 
+#include <openssl/ssl.h>
+
 #include <cstdint>
 #include <memory>
 
@@ -26,6 +28,7 @@
 #include "kudu/util/status.h"
 
 struct iovec;
+
 typedef struct ssl_st SSL;
 
 namespace kudu {
diff --git a/src/kudu/security/x509_check_host.cc b/src/kudu/security/x509_check_host.cc
index 4f54ca1..6930b4d 100644
--- a/src/kudu/security/x509_check_host.cc
+++ b/src/kudu/security/x509_check_host.cc
@@ -11,15 +11,17 @@
 // of the functions are for the most part the same except where mentioned in special
 // comments. Explicit casts were also added to bypass compilation errors.
 
-#include <string.h>
+#include "kudu/security/x509_check_host.h"
 
 #include <openssl/asn1.h>
 #include <openssl/crypto.h>
 #include <openssl/obj_mac.h>
+#include <openssl/ssl.h>
 #include <openssl/x509.h>
 #include <openssl/x509v3.h>
+#include <strings.h>
 
-#include "kudu/security/x509_check_host.h"
+#include <cstring>
 
 // Ported from include/openssl/crypto.h from OpenSSL-1.1.0b
 // Modifed to use __FILE__ and __LINE__ instead of OPENSSL_FILE and OPENSSL_LINE.
diff --git a/src/kudu/sentry/sentry_action.h b/src/kudu/sentry/sentry_action.h
index 882e7ff..0793352 100644
--- a/src/kudu/sentry/sentry_action.h
+++ b/src/kudu/sentry/sentry_action.h
@@ -17,6 +17,7 @@
 
 #pragma once
 
+#include <cstddef>
 #include <iosfwd>
 #include <string>
 
diff --git a/src/kudu/sentry/sentry_client-test.cc b/src/kudu/sentry/sentry_client-test.cc
index 67e821b..a284568 100644
--- a/src/kudu/sentry/sentry_client-test.cc
+++ b/src/kudu/sentry/sentry_client-test.cc
@@ -17,6 +17,7 @@
 
 #include "kudu/sentry/sentry_client.h"
 
+#include <functional>
 #include <memory>
 #include <set>
 #include <string>
diff --git a/src/kudu/server/default_path_handlers.cc b/src/kudu/server/default_path_handlers.cc
index 6b2de66..712a5b4 100644
--- a/src/kudu/server/default_path_handlers.cc
+++ b/src/kudu/server/default_path_handlers.cc
@@ -22,6 +22,7 @@
 #include <cstddef>
 #include <cstdint>
 #include <fstream>
+#include <functional>
 #include <memory>
 #include <string>
 #include <unordered_map>
diff --git a/src/kudu/server/tcmalloc_metrics.cc b/src/kudu/server/tcmalloc_metrics.cc
index 0e9f147..bcf2320 100644
--- a/src/kudu/server/tcmalloc_metrics.cc
+++ b/src/kudu/server/tcmalloc_metrics.cc
@@ -18,8 +18,8 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <functional>
 #include <ostream>
-#include <utility>
 
 #include <glog/logging.h>
 #ifdef TCMALLOC_ENABLED
diff --git a/src/kudu/server/webserver.cc b/src/kudu/server/webserver.cc
index f0c9861..fbd13b9 100644
--- a/src/kudu/server/webserver.cc
+++ b/src/kudu/server/webserver.cc
@@ -17,6 +17,9 @@
 
 #include "kudu/server/webserver.h"
 
+#include <netinet/in.h>
+#include <sys/socket.h>
+
 #include <algorithm>
 #include <csignal>
 #include <cstdint>
@@ -24,16 +27,16 @@
 #include <cstring>
 #include <functional>
 #include <map>
-#include <memory>
 #include <mutex>
 #include <sstream>
 #include <string>
+#include <unordered_map>
 #include <unordered_set>
 #include <utility>
 #include <vector>
 
-#include <boost/algorithm/string.hpp> // IWYU pragma: keep
-#include <boost/optional.hpp>
+#include <boost/algorithm/string/case_conv.hpp>
+#include <boost/function.hpp>
 #include <gflags/gflags.h>
 #include <glog/logging.h>
 #include <mustache.h>
@@ -63,8 +66,6 @@
 #include "kudu/util/version_info.h"
 #include "kudu/util/zlib.h"
 
-struct sockaddr_in;
-
 #if defined(__APPLE__)
 typedef sig_t sighandler_t;
 #endif
diff --git a/src/kudu/subprocess/server.cc b/src/kudu/subprocess/server.cc
index 1b961e0..1b76610 100644
--- a/src/kudu/subprocess/server.cc
+++ b/src/kudu/subprocess/server.cc
@@ -21,7 +21,6 @@
 #include <memory>
 #include <ostream>
 #include <string>
-#include <type_traits>
 #include <utility>
 #include <vector>
 
diff --git a/src/kudu/subprocess/subprocess_proxy-test.cc b/src/kudu/subprocess/subprocess_proxy-test.cc
index ff612e4..ac03cc5 100644
--- a/src/kudu/subprocess/subprocess_proxy-test.cc
+++ b/src/kudu/subprocess/subprocess_proxy-test.cc
@@ -18,6 +18,7 @@
 #include "kudu/subprocess/subprocess_proxy.h"
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <string>
 #include <utility>
diff --git a/src/kudu/subprocess/subprocess_server-test.cc b/src/kudu/subprocess/subprocess_server-test.cc
index 857d61f..90decac 100644
--- a/src/kudu/subprocess/subprocess_server-test.cc
+++ b/src/kudu/subprocess/subprocess_server-test.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <memory>
+#include <ostream>
 #include <string>
 #include <thread>
 #include <utility>
diff --git a/src/kudu/tablet/cfile_set-test.cc b/src/kudu/tablet/cfile_set-test.cc
index 638cb0c..7e2dfc5 100644
--- a/src/kudu/tablet/cfile_set-test.cc
+++ b/src/kudu/tablet/cfile_set-test.cc
@@ -24,7 +24,6 @@
 #include <memory>
 #include <ostream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <gflags/gflags.h>
diff --git a/src/kudu/tablet/cfile_set.cc b/src/kudu/tablet/cfile_set.cc
index e1b7881..fa27226 100644
--- a/src/kudu/tablet/cfile_set.cc
+++ b/src/kudu/tablet/cfile_set.cc
@@ -27,7 +27,6 @@
 #include <boost/container/vector.hpp>
 #include <boost/optional/optional.hpp>
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 
 #include "kudu/cfile/bloomfile.h"
diff --git a/src/kudu/tablet/compaction-test.cc b/src/kudu/tablet/compaction-test.cc
index 451e4a4..757c140 100644
--- a/src/kudu/tablet/compaction-test.cc
+++ b/src/kudu/tablet/compaction-test.cc
@@ -26,7 +26,6 @@
 #include <ostream>
 #include <string>
 #include <thread>
-#include <utility>
 #include <vector>
 
 #include <gflags/gflags.h>
diff --git a/src/kudu/tablet/compaction_policy-test.cc b/src/kudu/tablet/compaction_policy-test.cc
index 69c1bdf..eb2e398 100644
--- a/src/kudu/tablet/compaction_policy-test.cc
+++ b/src/kudu/tablet/compaction_policy-test.cc
@@ -18,6 +18,7 @@
 #include "kudu/tablet/compaction_policy.h"
 
 #include <algorithm>
+#include <initializer_list>
 #include <limits>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/tablet/compaction_policy.cc b/src/kudu/tablet/compaction_policy.cc
index 0d96cfc..0b88001 100644
--- a/src/kudu/tablet/compaction_policy.cc
+++ b/src/kudu/tablet/compaction_policy.cc
@@ -20,7 +20,6 @@
 #include <algorithm>
 #include <limits>
 #include <ostream>
-#include <queue>
 #include <string>
 #include <unordered_set>
 #include <utility>
diff --git a/src/kudu/tablet/composite-pushdown-test.cc b/src/kudu/tablet/composite-pushdown-test.cc
index 7a7c32f..4b5e7d3 100644
--- a/src/kudu/tablet/composite-pushdown-test.cc
+++ b/src/kudu/tablet/composite-pushdown-test.cc
@@ -18,8 +18,10 @@
 #include <algorithm>
 #include <cstdint>
 #include <memory>
+#include <ostream>
 #include <string>
 #include <unordered_map>
+#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/tablet/delta_compaction-test.cc b/src/kudu/tablet/delta_compaction-test.cc
index 77f9f20..fec1aae 100644
--- a/src/kudu/tablet/delta_compaction-test.cc
+++ b/src/kudu/tablet/delta_compaction-test.cc
@@ -19,8 +19,8 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <ostream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <gflags/gflags.h>
diff --git a/src/kudu/tablet/delta_key.h b/src/kudu/tablet/delta_key.h
index 96767f2..2856b08 100644
--- a/src/kudu/tablet/delta_key.h
+++ b/src/kudu/tablet/delta_key.h
@@ -14,9 +14,9 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-#ifndef KUDU_TABLET_DELTA_KEY_H
-#define KUDU_TABLET_DELTA_KEY_H
+#pragma once
 
+#include <cstddef>
 #include <string>
 
 #include "kudu/common/rowid.h"
@@ -177,5 +177,3 @@ struct DeltaKeyHashFunctor {
 
 } // namespace tablet
 } // namespace kudu
-
-#endif
diff --git a/src/kudu/tablet/delta_tracker.cc b/src/kudu/tablet/delta_tracker.cc
index 8b975a5..2f8bbcf 100644
--- a/src/kudu/tablet/delta_tracker.cc
+++ b/src/kudu/tablet/delta_tracker.cc
@@ -22,6 +22,7 @@
 #include <ostream>
 #include <set>
 #include <string>
+#include <type_traits>
 #include <utility>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/tablet/deltafile.cc b/src/kudu/tablet/deltafile.cc
index 864c20c..d1aa712 100644
--- a/src/kudu/tablet/deltafile.cc
+++ b/src/kudu/tablet/deltafile.cc
@@ -17,6 +17,7 @@
 
 #include "kudu/tablet/deltafile.h"
 
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/tablet/diskrowset-test.cc b/src/kudu/tablet/diskrowset-test.cc
index 947c5a5..1120f56 100644
--- a/src/kudu/tablet/diskrowset-test.cc
+++ b/src/kudu/tablet/diskrowset-test.cc
@@ -24,7 +24,6 @@
 #include <ostream>
 #include <string>
 #include <unordered_set>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/tablet/memrowset-test.cc b/src/kudu/tablet/memrowset-test.cc
index 773a543..85b3e06 100644
--- a/src/kudu/tablet/memrowset-test.cc
+++ b/src/kudu/tablet/memrowset-test.cc
@@ -24,7 +24,6 @@
 #include <ostream>
 #include <string>
 #include <unordered_set>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/tablet/row_op.cc b/src/kudu/tablet/row_op.cc
index 989ebfa..e9aa02d 100644
--- a/src/kudu/tablet/row_op.cc
+++ b/src/kudu/tablet/row_op.cc
@@ -18,6 +18,7 @@
 #include "kudu/tablet/row_op.h"
 
 #include <memory>
+#include <ostream>
 #include <utility>
 
 #include <glog/logging.h>
diff --git a/src/kudu/tablet/rowset_info.cc b/src/kudu/tablet/rowset_info.cc
index f276125..1337ce4 100644
--- a/src/kudu/tablet/rowset_info.cc
+++ b/src/kudu/tablet/rowset_info.cc
@@ -27,7 +27,6 @@
 #include <utility>
 
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 
 #include "kudu/common/key_range.h"
diff --git a/src/kudu/tablet/rowset_tree-test.cc b/src/kudu/tablet/rowset_tree-test.cc
index 7b62efc..400f2dc 100644
--- a/src/kudu/tablet/rowset_tree-test.cc
+++ b/src/kudu/tablet/rowset_tree-test.cc
@@ -15,11 +15,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/tablet/rowset_tree.h"
+
 #include <algorithm>
 #include <cstdlib>
+#include <cstring>
+#include <functional>
 #include <memory>
+#include <ostream>
 #include <string>
-#include <string.h>
 #include <unordered_set>
 #include <utility>
 #include <vector>
@@ -33,7 +37,6 @@
 #include "kudu/gutil/strings/substitute.h"
 #include "kudu/tablet/mock-rowsets.h"
 #include "kudu/tablet/rowset.h"
-#include "kudu/tablet/rowset_tree.h"
 #include "kudu/util/slice.h"
 #include "kudu/util/stopwatch.h"
 #include "kudu/util/test_macros.h"
diff --git a/src/kudu/tablet/tablet-pushdown-test.cc b/src/kudu/tablet/tablet-pushdown-test.cc
index caeb227..7402584 100644
--- a/src/kudu/tablet/tablet-pushdown-test.cc
+++ b/src/kudu/tablet/tablet-pushdown-test.cc
@@ -19,8 +19,10 @@
 #include <cinttypes>
 #include <cstdint>
 #include <memory>
+#include <ostream>
 #include <string>
 #include <unordered_map>
+#include <utility>
 #include <vector>
 
 #include <glog/logging.h>
diff --git a/src/kudu/tablet/tablet.cc b/src/kudu/tablet/tablet.cc
index d638284..a05f1eb 100644
--- a/src/kudu/tablet/tablet.cc
+++ b/src/kudu/tablet/tablet.cc
@@ -18,6 +18,7 @@
 #include "kudu/tablet/tablet.h"
 
 #include <algorithm>
+#include <functional>
 #include <iterator>
 #include <memory>
 #include <mutex>
diff --git a/src/kudu/tablet/tablet_history_gc-test.cc b/src/kudu/tablet/tablet_history_gc-test.cc
index 857ea89..b92ee85 100644
--- a/src/kudu/tablet/tablet_history_gc-test.cc
+++ b/src/kudu/tablet/tablet_history_gc-test.cc
@@ -18,10 +18,10 @@
 #include <algorithm>
 #include <atomic>
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/tablet/tablet_replica-test.cc b/src/kudu/tablet/tablet_replica-test.cc
index baad47c..1139b66 100644
--- a/src/kudu/tablet/tablet_replica-test.cc
+++ b/src/kudu/tablet/tablet_replica-test.cc
@@ -18,6 +18,7 @@
 #include "kudu/tablet/tablet_replica.h"
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/tablet/transactions/transaction.h b/src/kudu/tablet/transactions/transaction.h
index 1a3125d..4227c71 100644
--- a/src/kudu/tablet/transactions/transaction.h
+++ b/src/kudu/tablet/transactions/transaction.h
@@ -21,6 +21,7 @@
 #include <memory>
 #include <mutex>
 #include <string>
+#include <utility>
 
 #include <glog/logging.h>
 
diff --git a/src/kudu/thrift/sasl_client_transport.cc b/src/kudu/thrift/sasl_client_transport.cc
index efb2db6..5dd05ef 100644
--- a/src/kudu/thrift/sasl_client_transport.cc
+++ b/src/kudu/thrift/sasl_client_transport.cc
@@ -19,6 +19,7 @@
 
 #include <algorithm>
 #include <cstring>
+#include <functional>
 #include <limits>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/thrift/sasl_client_transport.h b/src/kudu/thrift/sasl_client_transport.h
index 360e41f..b5c4dcb 100644
--- a/src/kudu/thrift/sasl_client_transport.h
+++ b/src/kudu/thrift/sasl_client_transport.h
@@ -17,6 +17,8 @@
 
 #pragma once
 
+#include <sasl/sasl.h>
+
 #include <cstddef>
 #include <cstdint>
 #include <memory>
@@ -24,10 +26,10 @@
 #include <utility>
 #include <vector>
 
-#include <sasl/sasl.h>
 #include <thrift/transport/TTransportException.h>
 #include <thrift/transport/TVirtualTransport.h>
 
+#include "kudu/rpc/sasl_common.h"
 #include "kudu/rpc/sasl_helper.h"
 #include "kudu/util/faststring.h"
 #include "kudu/util/slice.h"
@@ -42,9 +44,6 @@ class TTransport;
 } // namespace apache
 
 namespace kudu {
-namespace rpc {
-struct SaslDeleter;
-} // namespace rpc
 namespace thrift {
 
 // An exception representing a SASL or Kerberos failure.
diff --git a/src/kudu/tools/create-table-tool-test.cc b/src/kudu/tools/create-table-tool-test.cc
index 7b38292..d592638 100644
--- a/src/kudu/tools/create-table-tool-test.cc
+++ b/src/kudu/tools/create-table-tool-test.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdio>
+#include <functional>
 #include <map>
 #include <memory>
 #include <string>
diff --git a/src/kudu/tools/ksck.cc b/src/kudu/tools/ksck.cc
index e9208fc..32a2af5 100644
--- a/src/kudu/tools/ksck.cc
+++ b/src/kudu/tools/ksck.cc
@@ -21,6 +21,7 @@
 #include <atomic>
 #include <cstddef>
 #include <cstdint>
+#include <functional>
 #include <iostream>
 #include <iterator>
 #include <map>
diff --git a/src/kudu/tools/ksck_checksum.cc b/src/kudu/tools/ksck_checksum.cc
index cf9802a..20df7aa 100644
--- a/src/kudu/tools/ksck_checksum.cc
+++ b/src/kudu/tools/ksck_checksum.cc
@@ -19,6 +19,7 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <functional>
 #include <iostream>
 #include <map>
 #include <set>
diff --git a/src/kudu/tools/ksck_remote-test.cc b/src/kudu/tools/ksck_remote-test.cc
index b2c940c..a4dfe73 100644
--- a/src/kudu/tools/ksck_remote-test.cc
+++ b/src/kudu/tools/ksck_remote-test.cc
@@ -18,11 +18,11 @@
 #include "kudu/tools/ksck_remote.h"
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <sstream>
 #include <string>
 #include <thread>
-#include <utility>
 #include <vector>
 
 #include <gflags/gflags.h>
diff --git a/src/kudu/tools/ksck_remote.cc b/src/kudu/tools/ksck_remote.cc
index 29083a8..69e24b3 100644
--- a/src/kudu/tools/ksck_remote.cc
+++ b/src/kudu/tools/ksck_remote.cc
@@ -19,10 +19,10 @@
 
 #include <atomic>
 #include <cstdint>
+#include <functional>
 #include <map>
 #include <mutex>
 #include <ostream>
-#include <unordered_map>
 
 #include <boost/bind.hpp> // IWYU pragma: keep
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/tools/ksck_results.cc b/src/kudu/tools/ksck_results.cc
index eebd5e7..9ac9a35 100644
--- a/src/kudu/tools/ksck_results.cc
+++ b/src/kudu/tools/ksck_results.cc
@@ -26,7 +26,6 @@
 #include <set>
 #include <string>
 #include <tuple>
-#include <type_traits>
 #include <unordered_map>
 #include <utility>
 
diff --git a/src/kudu/tools/kudu-admin-test.cc b/src/kudu/tools/kudu-admin-test.cc
index 466c9b2..4f6dde9 100644
--- a/src/kudu/tools/kudu-admin-test.cc
+++ b/src/kudu/tools/kudu-admin-test.cc
@@ -20,6 +20,7 @@
 #include <cstdint>
 #include <cstdio>
 #include <deque>
+#include <functional>
 #include <iterator>
 #include <limits>
 #include <memory>
diff --git a/src/kudu/tools/kudu-tool-test.cc b/src/kudu/tools/kudu-tool-test.cc
index a3ec3c6..6755183 100644
--- a/src/kudu/tools/kudu-tool-test.cc
+++ b/src/kudu/tools/kudu-tool-test.cc
@@ -22,6 +22,7 @@
 #include <cstdint>
 #include <cstdio>
 #include <fstream>
+#include <functional>
 #include <initializer_list>
 #include <iterator>
 #include <map>
@@ -29,7 +30,6 @@
 #include <set>
 #include <string>
 #include <tuple>  // IWYU pragma: keep
-#include <type_traits>
 #include <unordered_map>
 #include <unordered_set>
 #include <utility>
diff --git a/src/kudu/tools/kudu-ts-cli-test.cc b/src/kudu/tools/kudu-ts-cli-test.cc
index f1d9e7a..c633b1c 100644
--- a/src/kudu/tools/kudu-ts-cli-test.cc
+++ b/src/kudu/tools/kudu-ts-cli-test.cc
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include <functional>
 #include <memory>
 #include <string>
 #include <unordered_map>
diff --git a/src/kudu/tools/rebalancer_tool-test.cc b/src/kudu/tools/rebalancer_tool-test.cc
index 70990f7..6e8b508 100644
--- a/src/kudu/tools/rebalancer_tool-test.cc
+++ b/src/kudu/tools/rebalancer_tool-test.cc
@@ -19,9 +19,10 @@
 #include <atomic>
 #include <cstdint>
 #include <cstdlib>
+#include <functional>
 #include <iterator>
-#include <memory>
 #include <map>
+#include <memory>
 #include <numeric>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/tools/tool_action.h b/src/kudu/tools/tool_action.h
index 8c78fb2..b8fea5a 100644
--- a/src/kudu/tools/tool_action.h
+++ b/src/kudu/tools/tool_action.h
@@ -21,7 +21,6 @@
 #include <memory>
 #include <string>
 #include <unordered_map>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/tools/tool_action_cluster.cc b/src/kudu/tools/tool_action_cluster.cc
index 81316b2..152361b 100644
--- a/src/kudu/tools/tool_action_cluster.cc
+++ b/src/kudu/tools/tool_action_cluster.cc
@@ -17,13 +17,13 @@
 
 #include <algorithm>
 #include <cstdlib>
+#include <functional>
 #include <initializer_list>
 #include <iostream>
 #include <iterator>
 #include <memory>
 #include <string>
 #include <tuple>
-#include <utility>
 #include <vector>
 
 #include <boost/algorithm/string/predicate.hpp>
diff --git a/src/kudu/tools/tool_action_common.cc b/src/kudu/tools/tool_action_common.cc
index 161b696..c725448 100644
--- a/src/kudu/tools/tool_action_common.cc
+++ b/src/kudu/tools/tool_action_common.cc
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 
 #include <algorithm>
+#include <cstddef>
 #include <iomanip>
 #include <iostream>
 #include <iterator>
diff --git a/src/kudu/tools/tool_action_diagnose.cc b/src/kudu/tools/tool_action_diagnose.cc
index 932c608..d6abb9c 100644
--- a/src/kudu/tools/tool_action_diagnose.cc
+++ b/src/kudu/tools/tool_action_diagnose.cc
@@ -18,9 +18,11 @@
 #include <algorithm>
 #include <cerrno>
 #include <fstream> // IWYU pragma: keep
+#include <functional>
 #include <memory>
 #include <string>
 #include <unordered_map>
+#include <utility>
 #include <vector>
 
 #include <gflags/gflags_declare.h>
diff --git a/src/kudu/tools/tool_action_fs.cc b/src/kudu/tools/tool_action_fs.cc
index 2a1e903..da193ad 100644
--- a/src/kudu/tools/tool_action_fs.cc
+++ b/src/kudu/tools/tool_action_fs.cc
@@ -17,6 +17,7 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <functional>
 #include <iostream>
 #include <iterator>
 #include <memory>
diff --git a/src/kudu/tools/tool_action_hms.cc b/src/kudu/tools/tool_action_hms.cc
index 349a4b6..12172ad 100644
--- a/src/kudu/tools/tool_action_hms.cc
+++ b/src/kudu/tools/tool_action_hms.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <algorithm>
+#include <functional>
 #include <iostream>
 #include <iterator>
 #include <map>
diff --git a/src/kudu/tools/tool_action_local_replica.cc b/src/kudu/tools/tool_action_local_replica.cc
index 07858e2..12b197a 100644
--- a/src/kudu/tools/tool_action_local_replica.cc
+++ b/src/kudu/tools/tool_action_local_replica.cc
@@ -18,10 +18,12 @@
 #include <algorithm>
 #include <cstddef>
 #include <cstdint>
+#include <functional>
 #include <iostream>
 #include <map>
 #include <memory>
 #include <string>
+#include <type_traits>
 #include <unordered_map>
 #include <utility>
 #include <vector>
diff --git a/src/kudu/tools/tool_action_master.cc b/src/kudu/tools/tool_action_master.cc
index 8ed5db1..4a8f105 100644
--- a/src/kudu/tools/tool_action_master.cc
+++ b/src/kudu/tools/tool_action_master.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <algorithm>
+#include <functional>
 #include <iostream>
 #include <iterator>
 #include <map>
diff --git a/src/kudu/tools/tool_action_pbc.cc b/src/kudu/tools/tool_action_pbc.cc
index cc0e3b6..2ce652a 100644
--- a/src/kudu/tools/tool_action_pbc.cc
+++ b/src/kudu/tools/tool_action_pbc.cc
@@ -15,11 +15,10 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include "kudu/tools/tool_action.h"
-
 #include <cstdlib>
 #include <exception>
 #include <fstream>  // IWYU pragma: keep
+#include <functional>
 #include <iostream>
 #include <memory>
 #include <string>
@@ -38,6 +37,7 @@
 #include "kudu/gutil/map-util.h"
 #include "kudu/gutil/strings/substitute.h"
 #include "kudu/gutil/walltime.h"
+#include "kudu/tools/tool_action.h"
 #include "kudu/util/env.h"
 #include "kudu/util/flag_tags.h"
 #include "kudu/util/path_util.h"
diff --git a/src/kudu/tools/tool_action_perf.cc b/src/kudu/tools/tool_action_perf.cc
index fefa5e4..4a88105 100644
--- a/src/kudu/tools/tool_action_perf.cc
+++ b/src/kudu/tools/tool_action_perf.cc
@@ -166,6 +166,7 @@
 #include <algorithm>
 #include <cstdint>
 #include <cstdlib>
+#include <functional>
 #include <iomanip>
 #include <iostream>
 #include <limits>
@@ -175,7 +176,6 @@
 #include <string>
 #include <thread>
 #include <unordered_map>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
diff --git a/src/kudu/tools/tool_action_remote_replica.cc b/src/kudu/tools/tool_action_remote_replica.cc
index e3b12b1..4a30000 100644
--- a/src/kudu/tools/tool_action_remote_replica.cc
+++ b/src/kudu/tools/tool_action_remote_replica.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <cstdint>
+#include <functional>
 #include <iostream>
 #include <limits>
 #include <memory>
@@ -26,7 +27,6 @@
 #include <vector>
 
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 
 #include "kudu/client/client.h"
diff --git a/src/kudu/tools/tool_action_table.cc b/src/kudu/tools/tool_action_table.cc
index 5f4b350..c6552f4 100644
--- a/src/kudu/tools/tool_action_table.cc
+++ b/src/kudu/tools/tool_action_table.cc
@@ -17,11 +17,13 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <functional>
 #include <iostream>
 #include <map>
 #include <memory>
 #include <set>
 #include <string>
+#include <type_traits>
 #include <unordered_map>
 #include <utility>
 #include <vector>
diff --git a/src/kudu/tools/tool_action_tablet.cc b/src/kudu/tools/tool_action_tablet.cc
index 2ec8588..92fb7f5 100644
--- a/src/kudu/tools/tool_action_tablet.cc
+++ b/src/kudu/tools/tool_action_tablet.cc
@@ -16,6 +16,7 @@
 // under the License.
 
 #include <fstream>  // IWYU pragma: keep
+#include <functional>
 #include <iostream>
 #include <memory>
 #include <string>
diff --git a/src/kudu/tools/tool_action_test.cc b/src/kudu/tools/tool_action_test.cc
index c2ed9c9..3a56c0b 100644
--- a/src/kudu/tools/tool_action_test.cc
+++ b/src/kudu/tools/tool_action_test.cc
@@ -19,11 +19,12 @@
 
 #include <unistd.h>
 
-#include <algorithm>
 #include <cstdlib>
 #include <map>
 #include <memory>
+#include <ostream>
 #include <string>
+#include <utility>
 
 #include <boost/algorithm/string/predicate.hpp>
 #include <gflags/gflags.h>
diff --git a/src/kudu/tools/tool_action_tserver.cc b/src/kudu/tools/tool_action_tserver.cc
index 84a82bc..3c85bd2 100644
--- a/src/kudu/tools/tool_action_tserver.cc
+++ b/src/kudu/tools/tool_action_tserver.cc
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include <functional>
 #include <iostream>
 #include <memory>
 #include <string>
diff --git a/src/kudu/tools/tool_action_wal.cc b/src/kudu/tools/tool_action_wal.cc
index a27ab91..466ec79 100644
--- a/src/kudu/tools/tool_action_wal.cc
+++ b/src/kudu/tools/tool_action_wal.cc
@@ -15,8 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include "kudu/tools/tool_action.h"
-
+#include <functional>
 #include <memory>
 #include <string>
 #include <unordered_map>
@@ -25,6 +24,7 @@
 #include "kudu/consensus/log_util.h"
 #include "kudu/gutil/map-util.h"
 #include "kudu/gutil/ref_counted.h"
+#include "kudu/tools/tool_action.h"
 #include "kudu/tools/tool_action_common.h"
 #include "kudu/util/env.h"
 #include "kudu/util/status.h"
diff --git a/src/kudu/tools/tool_replica_util.cc b/src/kudu/tools/tool_replica_util.cc
index 895c739..97cad58 100644
--- a/src/kudu/tools/tool_replica_util.cc
+++ b/src/kudu/tools/tool_replica_util.cc
@@ -22,7 +22,6 @@
 #include <iostream>
 #include <memory>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include <glog/logging.h>
diff --git a/src/kudu/tserver/heartbeater.cc b/src/kudu/tserver/heartbeater.cc
index c212bfa..f3e6025 100644
--- a/src/kudu/tserver/heartbeater.cc
+++ b/src/kudu/tserver/heartbeater.cc
@@ -17,9 +17,9 @@
 
 #include "kudu/tserver/heartbeater.h"
 
-#include <algorithm>
 #include <atomic>
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <mutex>
 #include <ostream>
diff --git a/src/kudu/tserver/scanners.cc b/src/kudu/tserver/scanners.cc
index db46c38..8d90567 100644
--- a/src/kudu/tserver/scanners.cc
+++ b/src/kudu/tserver/scanners.cc
@@ -18,6 +18,7 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <mutex>
 #include <ostream>
diff --git a/src/kudu/tserver/tablet_copy_service.cc b/src/kudu/tserver/tablet_copy_service.cc
index b9088ea..55ef98a 100644
--- a/src/kudu/tserver/tablet_copy_service.cc
+++ b/src/kudu/tserver/tablet_copy_service.cc
@@ -17,6 +17,7 @@
 #include "kudu/tserver/tablet_copy_service.h"
 
 #include <cstdint>
+#include <functional>
 #include <ostream>
 #include <string>
 #include <utility>
diff --git a/src/kudu/tserver/tablet_server-stress-test.cc b/src/kudu/tserver/tablet_server-stress-test.cc
index 5069d26..385b0c2 100644
--- a/src/kudu/tserver/tablet_server-stress-test.cc
+++ b/src/kudu/tserver/tablet_server-stress-test.cc
@@ -15,8 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 #include <cstdint>
+#include <functional>
 #include <ostream>
-#include <string>
 #include <thread>
 #include <vector>
 
diff --git a/src/kudu/tserver/tablet_server-test.cc b/src/kudu/tserver/tablet_server-test.cc
index b6afdce..65446cb 100644
--- a/src/kudu/tserver/tablet_server-test.cc
+++ b/src/kudu/tserver/tablet_server-test.cc
@@ -23,6 +23,7 @@
 #include <algorithm>
 #include <atomic>
 #include <cstdint>
+#include <functional>
 #include <initializer_list>
 #include <map>
 #include <memory>
@@ -30,6 +31,7 @@
 #include <sstream>
 #include <string>
 #include <thread>
+#include <type_traits>
 #include <unordered_set>
 #include <utility>
 #include <vector>
diff --git a/src/kudu/tserver/tablet_server_authorization-test.cc b/src/kudu/tserver/tablet_server_authorization-test.cc
index 9209ac1..3e775ac 100644
--- a/src/kudu/tserver/tablet_server_authorization-test.cc
+++ b/src/kudu/tserver/tablet_server_authorization-test.cc
@@ -24,13 +24,13 @@
 #include <ostream>
 #include <set>
 #include <string>
+#include <type_traits>
 #include <unordered_map>
 #include <unordered_set>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 #include <google/protobuf/stubs/port.h>
 #include <gtest/gtest.h>
diff --git a/src/kudu/tserver/tablet_server_options.cc b/src/kudu/tserver/tablet_server_options.cc
index c99779a..897b824 100644
--- a/src/kudu/tserver/tablet_server_options.cc
+++ b/src/kudu/tserver/tablet_server_options.cc
@@ -18,7 +18,6 @@
 #include "kudu/tserver/tablet_server_options.h"
 
 #include <ostream>
-#include <string>
 
 #include <gflags/gflags.h>
 #include <glog/logging.h>
diff --git a/src/kudu/tserver/tablet_service.cc b/src/kudu/tserver/tablet_service.cc
index c69e0b3..3015734 100644
--- a/src/kudu/tserver/tablet_service.cc
+++ b/src/kudu/tserver/tablet_service.cc
@@ -27,7 +27,6 @@
 #include <ostream>
 #include <string>
 #include <unordered_set>
-#include <utility>
 #include <vector>
 
 #include <boost/optional/optional.hpp>
@@ -91,6 +90,7 @@
 #include "kudu/tserver/tserver_admin.pb.h"
 #include "kudu/tserver/tserver_service.pb.h"
 #include "kudu/util/auto_release_pool.h"
+#include "kudu/util/bitset.h"
 #include "kudu/util/crc.h"
 #include "kudu/util/debug/trace_event.h"
 #include "kudu/util/faststring.h"
diff --git a/src/kudu/tserver/ts_tablet_manager-test.cc b/src/kudu/tserver/ts_tablet_manager-test.cc
index 9a0b9e9..e82fd20 100644
--- a/src/kudu/tserver/ts_tablet_manager-test.cc
+++ b/src/kudu/tserver/ts_tablet_manager-test.cc
@@ -18,6 +18,7 @@
 #include "kudu/tserver/ts_tablet_manager.h"
 
 #include <cstdint>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/tserver/tserver_path_handlers.cc b/src/kudu/tserver/tserver_path_handlers.cc
index 5ccc41f..c93cbba 100644
--- a/src/kudu/tserver/tserver_path_handlers.cc
+++ b/src/kudu/tserver/tserver_path_handlers.cc
@@ -25,7 +25,6 @@
 #include <memory>
 #include <sstream>
 #include <string>
-#include <type_traits>
 #include <unordered_map>
 #include <utility>
 #include <vector>
diff --git a/src/kudu/util/bit-util-test.cc b/src/kudu/util/bit-util-test.cc
index 0d8eab4..8f8b3df 100644
--- a/src/kudu/util/bit-util-test.cc
+++ b/src/kudu/util/bit-util-test.cc
@@ -14,9 +14,24 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
+#include "kudu/util/bit-util.h"
+
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/list/fold_left.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/bool.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/seq/fold_left.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/tti/has_template.hpp>
 #include <boost/utility/binary.hpp>
 #include <gtest/gtest.h>
-#include "kudu/util/bit-util.h"
 
 namespace kudu {
 
diff --git a/src/kudu/util/bitmap-test.cc b/src/kudu/util/bitmap-test.cc
index c897736..dd71750 100644
--- a/src/kudu/util/bitmap-test.cc
+++ b/src/kudu/util/bitmap-test.cc
@@ -17,6 +17,7 @@
 
 #include "kudu/util/bitmap.h"
 
+#include <cstddef>
 #include <cstdint>
 #include <cstring>
 #include <set>
diff --git a/src/kudu/util/bitmap.cc b/src/kudu/util/bitmap.cc
index 370f361..e7e872e 100644
--- a/src/kudu/util/bitmap.cc
+++ b/src/kudu/util/bitmap.cc
@@ -18,6 +18,7 @@
 #include "kudu/util/bitmap.h"
 
 #include <cstring>
+#include <ostream>
 #include <string>
 
 #include <glog/logging.h>
diff --git a/src/kudu/util/bitmap.h b/src/kudu/util/bitmap.h
index 54a2409..c87a60b 100644
--- a/src/kudu/util/bitmap.h
+++ b/src/kudu/util/bitmap.h
@@ -21,7 +21,6 @@
 
 #include <cstddef>
 #include <cstdint>
-#include <ostream>
 #include <string>
 
 #include <glog/logging.h>
diff --git a/src/kudu/util/bitset-test.cc b/src/kudu/util/bitset-test.cc
index b12fd16..26193f1 100644
--- a/src/kudu/util/bitset-test.cc
+++ b/src/kudu/util/bitset-test.cc
@@ -18,6 +18,8 @@
 #include "kudu/util/bitset.h"
 
 #include <cstddef>
+#include <initializer_list>
+#include <ostream>
 #include <set>
 #include <string>
 #include <utility>
diff --git a/src/kudu/util/block_bloom_filter-test.cc b/src/kudu/util/block_bloom_filter-test.cc
index 8815680..72974a3 100644
--- a/src/kudu/util/block_bloom_filter-test.cc
+++ b/src/kudu/util/block_bloom_filter-test.cc
@@ -22,6 +22,7 @@
 #include <cstdlib>
 #include <cstring>
 #include <memory>
+#include <type_traits>
 #include <unordered_set>
 #include <utility>
 #include <vector>
diff --git a/src/kudu/util/cache-test.cc b/src/kudu/util/cache-test.cc
index 6ba34b2..9ec9bfa 100644
--- a/src/kudu/util/cache-test.cc
+++ b/src/kudu/util/cache-test.cc
@@ -5,13 +5,13 @@
 #include "kudu/util/cache.h"
 
 #include <cstring>
+#include <functional>
 #include <memory>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 #include <gtest/gtest.h>
 
diff --git a/src/kudu/util/cloud/instance_detector.cc b/src/kudu/util/cloud/instance_detector.cc
index 92523cf..8396864 100644
--- a/src/kudu/util/cloud/instance_detector.cc
+++ b/src/kudu/util/cloud/instance_detector.cc
@@ -18,9 +18,9 @@
 #include "kudu/util/cloud/instance_detector.h"
 
 #include <algorithm>
+#include <functional>
 #include <limits>
 #include <ostream>
-#include <string>
 
 #include <glog/logging.h>
 
diff --git a/src/kudu/util/compression/compression_codec.cc b/src/kudu/util/compression/compression_codec.cc
index dc69311..3758806 100644
--- a/src/kudu/util/compression/compression_codec.cc
+++ b/src/kudu/util/compression/compression_codec.cc
@@ -17,7 +17,6 @@
 
 #include "kudu/util/compression/compression_codec.h"
 
-#include <memory>
 #include <ostream>
 #include <string>
 #include <vector>
diff --git a/src/kudu/util/countdown_latch-test.cc b/src/kudu/util/countdown_latch-test.cc
index 0cb8eee..d63a100 100644
--- a/src/kudu/util/countdown_latch-test.cc
+++ b/src/kudu/util/countdown_latch-test.cc
@@ -17,6 +17,7 @@
 
 #include "kudu/util/countdown_latch.h"
 
+#include <functional>
 #include <memory>
 #include <thread>
 
diff --git a/src/kudu/util/curl_util-test.cc b/src/kudu/util/curl_util-test.cc
index 59ed975..4e15f99 100644
--- a/src/kudu/util/curl_util-test.cc
+++ b/src/kudu/util/curl_util-test.cc
@@ -17,6 +17,7 @@
 
 #include "kudu/util/curl_util.h"
 
+#include <functional>
 #include <memory>
 
 #include <gtest/gtest.h>
diff --git a/src/kudu/util/debug-util-test.cc b/src/kudu/util/debug-util-test.cc
index 1c498f2..5175f46 100644
--- a/src/kudu/util/debug-util-test.cc
+++ b/src/kudu/util/debug-util-test.cc
@@ -27,6 +27,7 @@
 #include <csignal>
 #include <cstddef>
 #include <cstdint>
+#include <functional>
 #include <initializer_list>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/util/env-test.cc b/src/kudu/util/env-test.cc
index 3c77443..364a7ba 100644
--- a/src/kudu/util/env-test.cc
+++ b/src/kudu/util/env-test.cc
@@ -34,9 +34,11 @@
 #include <unistd.h>
 
 #include <cerrno>
+#include <climits>
+#include <cstddef>
 #include <cstdint>
-#include <cstdio>
 #include <cstdlib>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/util/env_posix.cc b/src/kudu/util/env_posix.cc
index e820d44..1fd4507 100644
--- a/src/kudu/util/env_posix.cc
+++ b/src/kudu/util/env_posix.cc
@@ -9,6 +9,7 @@
 #include <glob.h>
 #include <pthread.h>
 #include <sys/resource.h>
+#include <sys/socket.h>
 #include <sys/stat.h>
 #include <sys/statvfs.h>
 #include <sys/time.h>
@@ -18,6 +19,8 @@
 
 #include <algorithm>
 #include <cerrno>
+#include <climits>
+#include <cstddef>
 #include <cstdint>
 #include <cstdio>
 #include <cstdlib>
@@ -29,7 +32,6 @@
 #include <ostream>
 #include <string>
 #include <type_traits>
-#include <utility>
 #include <vector>
 
 #include <gflags/gflags.h>
diff --git a/src/kudu/util/env_util-test.cc b/src/kudu/util/env_util-test.cc
index 9c8266f..32c69b4 100644
--- a/src/kudu/util/env_util-test.cc
+++ b/src/kudu/util/env_util-test.cc
@@ -15,12 +15,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/util/env_util.h"
+
 #include <sys/time.h>
 #include <unistd.h>
 
 #include <algorithm>
-#include <cstdint>
 #include <cerrno>
+#include <cstdint>
+#include <functional>
 #include <memory>
 #include <string>
 #include <unordered_set>
@@ -34,7 +37,6 @@
 #include "kudu/gutil/strings/substitute.h"
 #include "kudu/gutil/walltime.h"
 #include "kudu/util/env.h"
-#include "kudu/util/env_util.h"
 #include "kudu/util/path_util.h"
 #include "kudu/util/status.h"
 #include "kudu/util/test_macros.h"
diff --git a/src/kudu/util/faststring.h b/src/kudu/util/faststring.h
index 5484f9b..1357eab 100644
--- a/src/kudu/util/faststring.h
+++ b/src/kudu/util/faststring.h
@@ -20,6 +20,7 @@
 #include <cstdint>
 #include <cstring>
 #include <string>
+#include <utility>
 
 #include <glog/logging.h>
 
diff --git a/src/kudu/util/fault_injection.cc b/src/kudu/util/fault_injection.cc
index 2432872..5918c9c 100644
--- a/src/kudu/util/fault_injection.cc
+++ b/src/kudu/util/fault_injection.cc
@@ -20,7 +20,6 @@
 #include <unistd.h>
 
 #include <ostream>
-#include <string>
 
 #include <gflags/gflags.h>
 #include <glog/logging.h>
diff --git a/src/kudu/util/file_cache-stress-test.cc b/src/kudu/util/file_cache-stress-test.cc
index bd3fd22..35afd0f 100644
--- a/src/kudu/util/file_cache-stress-test.cc
+++ b/src/kudu/util/file_cache-stress-test.cc
@@ -15,7 +15,6 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include <algorithm>
 #include <cstddef>
 #include <cstdint>
 #include <deque>
diff --git a/src/kudu/util/file_cache.cc b/src/kudu/util/file_cache.cc
index 4e39b71..c992f2f 100644
--- a/src/kudu/util/file_cache.cc
+++ b/src/kudu/util/file_cache.cc
@@ -20,6 +20,7 @@
 #include <atomic>
 #include <cstdint>
 #include <cstring>
+#include <functional>
 #include <memory>
 #include <mutex>
 #include <ostream>
diff --git a/src/kudu/util/group_varint-test.cc b/src/kudu/util/group_varint-test.cc
index 983fb0f..505da77 100644
--- a/src/kudu/util/group_varint-test.cc
+++ b/src/kudu/util/group_varint-test.cc
@@ -23,10 +23,26 @@
 #include <vector>
 #endif
 
+#include "kudu/util/group_varint-inl.h"
+
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/list/fold_left.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/bool.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/seq/fold_left.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/tti/has_template.hpp>
+#include <boost/utility/binary.hpp>
 #include <gtest/gtest.h>
 
 #include "kudu/util/faststring.h"
-#include "kudu/util/group_varint-inl.h"
 #ifdef NDEBUG
 #include "kudu/util/stopwatch.h"
 #endif
diff --git a/src/kudu/util/group_varint.cc b/src/kudu/util/group_varint.cc
index 47fbeb4..8aeaea4 100644
--- a/src/kudu/util/group_varint.cc
+++ b/src/kudu/util/group_varint.cc
@@ -15,15 +15,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/util/group_varint-inl.h"
+
 #include <cstdint>
 #include <cstring>
 #include <ostream>
-#include <string>
 
 #include <boost/utility/binary.hpp>
 #include <glog/logging.h>
 
-#include "kudu/util/group_varint-inl.h"
 #include "kudu/util/hexdump.h"
 #include "kudu/util/slice.h"
 
diff --git a/src/kudu/util/hdr_histogram.cc b/src/kudu/util/hdr_histogram.cc
index 6bf0487..f8d2bd2 100644
--- a/src/kudu/util/hdr_histogram.cc
+++ b/src/kudu/util/hdr_histogram.cc
@@ -27,7 +27,6 @@
 #include <cmath>
 #include <limits>
 #include <ostream>
-#include <string>
 
 #include <glog/logging.h>
 
diff --git a/src/kudu/util/kernel_stack_watchdog.cc b/src/kudu/util/kernel_stack_watchdog.cc
index 4fa6de8..c920e4e 100644
--- a/src/kudu/util/kernel_stack_watchdog.cc
+++ b/src/kudu/util/kernel_stack_watchdog.cc
@@ -19,13 +19,14 @@
 
 #include <cstdint>
 #include <cstring>
+#include <functional>
 #include <mutex>
 #include <ostream>
 #include <string>
 #include <utility>
 
-#include <glog/logging.h>
 #include <gflags/gflags.h>
+#include <glog/logging.h>
 
 #include "kudu/gutil/dynamic_annotations.h"
 #include "kudu/gutil/map-util.h"
diff --git a/src/kudu/util/knapsack_solver-test.cc b/src/kudu/util/knapsack_solver-test.cc
index 9f717c4..df048f3 100644
--- a/src/kudu/util/knapsack_solver-test.cc
+++ b/src/kudu/util/knapsack_solver-test.cc
@@ -15,14 +15,14 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/util/knapsack_solver.h"
+
 #include <cstdlib>
-#include <memory>
 #include <string>
 #include <vector>
 
 #include <gtest/gtest.h>
 
-#include "kudu/util/knapsack_solver.h"
 #include "kudu/util/stopwatch.h"  // IWYU pragma: keep
 #include "kudu/util/test_util.h"
 
diff --git a/src/kudu/util/logging-test.cc b/src/kudu/util/logging-test.cc
index 9562919..760cda3 100644
--- a/src/kudu/util/logging-test.cc
+++ b/src/kudu/util/logging-test.cc
@@ -15,9 +15,12 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/util/logging.h"
+
 #include <atomic>
 #include <cstdint>
 #include <ctime>
+#include <functional>
 #include <ostream>
 #include <string>
 #include <thread>
@@ -31,7 +34,6 @@
 #include "kudu/gutil/strings/substitute.h"
 #include "kudu/util/async_logger.h"
 #include "kudu/util/barrier.h"
-#include "kudu/util/logging.h"
 #include "kudu/util/logging_test_util.h"
 #include "kudu/util/monotime.h"
 #include "kudu/util/stopwatch.h"
diff --git a/src/kudu/util/maintenance_manager-test.cc b/src/kudu/util/maintenance_manager-test.cc
index 9bda48c..c2d6301 100644
--- a/src/kudu/util/maintenance_manager-test.cc
+++ b/src/kudu/util/maintenance_manager-test.cc
@@ -21,6 +21,7 @@
 #include <atomic>
 #include <cmath>
 #include <cstdint>
+#include <functional>
 #include <list>
 #include <memory>
 #include <mutex>
diff --git a/src/kudu/util/maintenance_manager.cc b/src/kudu/util/maintenance_manager.cc
index 4495077..6327048 100644
--- a/src/kudu/util/maintenance_manager.cc
+++ b/src/kudu/util/maintenance_manager.cc
@@ -19,6 +19,7 @@
 
 #include <algorithm>
 #include <cinttypes>
+#include <cmath>
 #include <cstdint>
 #include <memory>
 #include <mutex>
diff --git a/src/kudu/util/mem_tracker-test.cc b/src/kudu/util/mem_tracker-test.cc
index 900f2f9..b6fa16f 100644
--- a/src/kudu/util/mem_tracker-test.cc
+++ b/src/kudu/util/mem_tracker-test.cc
@@ -20,9 +20,10 @@
 #include <atomic>
 #include <functional>
 #include <memory>
+#include <ostream>
 #include <string>
-#include <system_error>
 #include <thread>
+#include <type_traits>
 #include <unordered_map>
 #include <utility>
 #include <vector>
diff --git a/src/kudu/util/metrics-test.cc b/src/kudu/util/metrics-test.cc
index b34dbde..136ba72 100644
--- a/src/kudu/util/metrics-test.cc
+++ b/src/kudu/util/metrics-test.cc
@@ -17,8 +17,8 @@
 
 #include "kudu/util/metrics.h"
 
-#include <algorithm>
 #include <cstdint>
+#include <functional>
 #include <map>
 #include <memory>
 #include <ostream>
diff --git a/src/kudu/util/metrics.h b/src/kudu/util/metrics.h
index 1ea48a9..7a1ed07 100644
--- a/src/kudu/util/metrics.h
+++ b/src/kudu/util/metrics.h
@@ -234,12 +234,14 @@
 #include <limits>
 #include <memory>
 #include <mutex>
+#include <ostream>
 #include <string>
 #include <unordered_map>
 #include <unordered_set>
 #include <utility>
 #include <vector>
 
+#include <glog/logging.h>
 #include <gtest/gtest_prod.h>
 
 #include "kudu/gutil/casts.h"
@@ -278,7 +280,7 @@
   ::kudu::GaugePrototype<std::string> METRIC_##name(                 \
       ::kudu::MetricPrototype::CtorArgs(#entity, #name, label, unit, desc, level, ## __VA_ARGS__))
 #define METRIC_DEFINE_gauge_bool(entity, name, label, unit, desc, level, ...) \
-  ::kudu::GaugePrototype<bool> METRIC_##  name(                    \
+  ::kudu::GaugePrototype<bool> METRIC_##name(                    \
       ::kudu::MetricPrototype::CtorArgs(#entity, #name, label, unit, desc, level, ## __VA_ARGS__))
 #define METRIC_DEFINE_gauge_int32(entity, name, label, unit, desc, level, ...) \
   ::kudu::GaugePrototype<int32_t> METRIC_##name(                   \
@@ -295,7 +297,9 @@
 #define METRIC_DEFINE_gauge_double(entity, name, label, unit, desc, level, ...) \
   ::kudu::GaugePrototype<double> METRIC_##name(                      \
       ::kudu::MetricPrototype::CtorArgs(#entity, #name, label, unit, desc, level, ## __VA_ARGS__))
-
+#define METRIC_DEFINE_gauge_size(entity, name, label, unit, desc, level, ...) \
+  ::kudu::GaugePrototype<size_t> METRIC_##name(                    \
+      ::kudu::MetricPrototype::CtorArgs(#entity, #name, label, unit, desc, level, ## __VA_ARGS__))
 #define METRIC_DEFINE_histogram(entity, name, label, unit, desc, level, max_val, num_sig_digits) \
   ::kudu::HistogramPrototype METRIC_##name(                                       \
       ::kudu::MetricPrototype::CtorArgs(#entity, #name, label, unit, desc, level), \
@@ -320,14 +324,10 @@
   extern ::kudu::GaugePrototype<uint64_t> METRIC_##name
 #define METRIC_DECLARE_gauge_double(name) \
   extern ::kudu::GaugePrototype<double> METRIC_##name
-#define METRIC_DECLARE_histogram(name) \
-  extern ::kudu::HistogramPrototype METRIC_##name
-
-#define METRIC_DEFINE_gauge_size(entity, name, label, unit, desc, level, ...) \
-  ::kudu::GaugePrototype<size_t> METRIC_##name(                    \
-      ::kudu::MetricPrototype::CtorArgs(#entity, #name, label, unit, desc, level, ## __VA_ARGS__))
 #define METRIC_DECLARE_gauge_size(name) \
   extern ::kudu::GaugePrototype<size_t> METRIC_##name
+#define METRIC_DECLARE_histogram(name) \
+  extern ::kudu::HistogramPrototype METRIC_##name
 
 template <typename Type> class Singleton;
 
diff --git a/src/kudu/util/minidump-test.cc b/src/kudu/util/minidump-test.cc
index 5c756b6..5d02918 100644
--- a/src/kudu/util/minidump-test.cc
+++ b/src/kudu/util/minidump-test.cc
@@ -15,11 +15,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/util/minidump.h"
+
 #include <unistd.h>
 
 #include <csignal>
 #include <cstdlib>
 #include <cstring>
+#include <functional>
+#include <initializer_list>
 #include <ostream>
 #include <string>
 #include <vector>
@@ -28,11 +32,10 @@
 #include <glog/logging.h>
 #include <gtest/gtest.h>
 
-#include "kudu/util/minidump.h"
-#include "kudu/util/path_util.h"
-#include "kudu/util/test_macros.h"
 #include "kudu/util/env.h"
+#include "kudu/util/path_util.h"
 #include "kudu/util/status.h"
+#include "kudu/util/test_macros.h"
 #include "kudu/util/test_util.h"
 
 using std::string;
diff --git a/src/kudu/util/minidump.cc b/src/kudu/util/minidump.cc
index 0a9c417..ef91797 100644
--- a/src/kudu/util/minidump.cc
+++ b/src/kudu/util/minidump.cc
@@ -23,25 +23,28 @@
 #include <csignal>
 #include <cstdint>
 #include <cstdlib>
+#include <functional>
+#include <initializer_list>
 #include <memory>
 #include <ostream>
 #include <string>
 
 #if defined(__linux__)
 #include <breakpad/client/linux/handler/exception_handler.h>
+#include <breakpad/client/linux/handler/minidump_descriptor.h>
 #include <breakpad/common/linux/linux_libc_support.h>
+#include <breakpad/common/using_std_string.h>
+#include <breakpad/third_party/lss/linux_syscall_support.h>
 #endif // defined(__linux__)
 
 #include <gflags/gflags.h>
-#include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 
 #include "kudu/gutil/macros.h"
-#include "kudu/gutil/linux_syscall_support.h"
 #include "kudu/gutil/strings/human_readable.h"
-#include "kudu/util/errno.h"
 #include "kudu/util/env.h"
 #include "kudu/util/env_util.h"
+#include "kudu/util/errno.h"
 #include "kudu/util/flag_tags.h"
 #include "kudu/util/path_util.h"
 #include "kudu/util/status.h"
diff --git a/src/kudu/util/monotime-test.cc b/src/kudu/util/monotime-test.cc
index 0fba667..4711f1f 100644
--- a/src/kudu/util/monotime-test.cc
+++ b/src/kudu/util/monotime-test.cc
@@ -23,7 +23,6 @@
 #include <cstdint>
 #include <ctime>
 #include <ostream>
-#include <string>
 
 #include <glog/logging.h>
 #include <gtest/gtest.h>
diff --git a/src/kudu/util/mt-metrics-test.cc b/src/kudu/util/mt-metrics-test.cc
index 5816737..1277534 100644
--- a/src/kudu/util/mt-metrics-test.cc
+++ b/src/kudu/util/mt-metrics-test.cc
@@ -17,23 +17,19 @@
 
 #include <cstdint>
 #include <cstring>
-#include <memory>
+#include <functional>
 #include <string>
 #include <thread>
 #include <vector>
 
 #include <gflags/gflags.h>
-#include <glog/logging.h>
 #include <gtest/gtest.h>
 
 #include "kudu/gutil/ref_counted.h"
-#include "kudu/gutil/stringprintf.h"
 #include "kudu/gutil/strings/substitute.h"
 #include "kudu/util/debug/leakcheck_disabler.h"
 #include "kudu/util/env.h"
 #include "kudu/util/metrics.h"
-#include "kudu/util/status.h"
-#include "kudu/util/test_macros.h"
 #include "kudu/util/test_util.h"
 
 DEFINE_int32(mt_metrics_test_num_threads, 4,
diff --git a/src/kudu/util/net/dns_resolver.h b/src/kudu/util/net/dns_resolver.h
index 3b44943..93cf130 100644
--- a/src/kudu/util/net/dns_resolver.h
+++ b/src/kudu/util/net/dns_resolver.h
@@ -18,9 +18,9 @@
 #pragma once
 
 #include <cstddef>
+#include <functional>
 #include <memory>
 #include <string>
-#include <utility>
 #include <vector>
 
 #include "kudu/gutil/macros.h"
diff --git a/src/kudu/util/net/sockaddr.h b/src/kudu/util/net/sockaddr.h
index e968212..f61cc9d 100644
--- a/src/kudu/util/net/sockaddr.h
+++ b/src/kudu/util/net/sockaddr.h
@@ -20,8 +20,8 @@
 #include <netinet/in.h>
 
 #include <cstdint>
-#include <functional>
 #include <string>
+#include <type_traits>
 #include <vector>
 
 #include "kudu/util/status.h"
diff --git a/src/kudu/util/pb_util-internal.cc b/src/kudu/util/pb_util-internal.cc
index 380072c..22e486e 100644
--- a/src/kudu/util/pb_util-internal.cc
+++ b/src/kudu/util/pb_util-internal.cc
@@ -17,7 +17,6 @@
 #include "kudu/util/pb_util-internal.h"
 
 #include <ostream>
-#include <string>
 
 namespace kudu {
 namespace pb_util {
diff --git a/src/kudu/util/pb_util-test.cc b/src/kudu/util/pb_util-test.cc
index ec873bf..a1635b4 100644
--- a/src/kudu/util/pb_util-test.cc
+++ b/src/kudu/util/pb_util-test.cc
@@ -15,7 +15,10 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/util/pb_util.h"
+
 #include <cstdint>
+#include <initializer_list>
 #include <memory>
 #include <ostream>
 #include <string>
@@ -32,7 +35,6 @@
 #include "kudu/util/env_util.h"
 #include "kudu/util/faststring.h"
 #include "kudu/util/pb_util-internal.h"
-#include "kudu/util/pb_util.h"
 #include "kudu/util/pb_util_test.pb.h"
 #include "kudu/util/proto_container_test.pb.h"
 #include "kudu/util/proto_container_test2.pb.h"
diff --git a/src/kudu/util/process_memory.cc b/src/kudu/util/process_memory.cc
index 8742bd6..68bf748 100644
--- a/src/kudu/util/process_memory.cc
+++ b/src/kudu/util/process_memory.cc
@@ -16,8 +16,8 @@
 // under the License.
 
 #include <cstddef>
+#include <memory>
 #include <ostream>
-#include <string>
 
 #include <gflags/gflags.h>
 #include <glog/logging.h>
@@ -25,11 +25,12 @@
 #include <gperftools/malloc_extension.h>  // IWYU pragma: keep
 #endif
 
+#include "kudu/util/process_memory.h"
+
 #include "kudu/gutil/atomicops.h"
 #include "kudu/gutil/macros.h"
 #include "kudu/gutil/once.h"
 #include "kudu/gutil/port.h"
-#include "kudu/gutil/stringprintf.h"
 #include "kudu/gutil/strings/substitute.h"
 #include "kudu/gutil/walltime.h"          // IWYU pragma: keep
 #include "kudu/util/debug/trace_event.h"  // IWYU pragma: keep
@@ -37,7 +38,6 @@
 #include "kudu/util/flag_tags.h"
 #include "kudu/util/locks.h"
 #include "kudu/util/mem_tracker.h"        // IWYU pragma: keep
-#include "kudu/util/process_memory.h"
 #include "kudu/util/random.h"
 #include "kudu/util/status.h"
 
diff --git a/src/kudu/util/pstack_watcher.cc b/src/kudu/util/pstack_watcher.cc
index f1e97c4..3b43eda 100644
--- a/src/kudu/util/pstack_watcher.cc
+++ b/src/kudu/util/pstack_watcher.cc
@@ -21,6 +21,7 @@
 
 #include <cerrno>
 #include <cstdio>
+#include <functional>
 #include <initializer_list>
 #include <string>
 #include <vector>
diff --git a/src/kudu/util/random_util.h b/src/kudu/util/random_util.h
index 3998cb6..b89ea3c 100644
--- a/src/kudu/util/random_util.h
+++ b/src/kudu/util/random_util.h
@@ -14,17 +14,19 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-
 #pragma once
 
+#include <cstdint>
 #include <cstdlib>
-#include <stdint.h>
-
 #include <set>
 #include <string>
+#include <type_traits>
 #include <unordered_set>
 #include <vector>
 
+#include <glog/logging.h>
+
+#include "kudu/gutil/map-util.h"
 #include "kudu/util/random.h"
 
 namespace kudu {
diff --git a/src/kudu/util/rle-test.cc b/src/kudu/util/rle-test.cc
index 536c69b..9295a0f 100644
--- a/src/kudu/util/rle-test.cc
+++ b/src/kudu/util/rle-test.cc
@@ -19,17 +19,30 @@
 #include <cstdint>
 #include <cstdlib>
 #include <cstring>
+#include <limits>
 #include <ostream>
 #include <string>
 #include <vector>
 
-// Must come before gtest.h.
-#include "kudu/gutil/mathlimits.h"
-
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/list/fold_left.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/bool.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/seq/fold_left.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/tti/has_template.hpp>
 #include <boost/utility/binary.hpp>
 #include <glog/logging.h>
 #include <gtest/gtest.h>
 
+#include "kudu/gutil/mathlimits.h"
 #include "kudu/util/bit-stream-utils.h"
 #include "kudu/util/bit-stream-utils.inline.h"
 #include "kudu/util/bit-util.h"
diff --git a/src/kudu/util/rolling_log-test.cc b/src/kudu/util/rolling_log-test.cc
index 9327ac7..a9ae829 100644
--- a/src/kudu/util/rolling_log-test.cc
+++ b/src/kudu/util/rolling_log-test.cc
@@ -22,6 +22,7 @@
 #include <algorithm>
 #include <cstdint>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include <glog/stl_logging.h>
diff --git a/src/kudu/util/slice.h b/src/kudu/util/slice.h
index d34c744..bc6f9da 100644
--- a/src/kudu/util/slice.h
+++ b/src/kudu/util/slice.h
@@ -16,6 +16,7 @@
 #include <cstring>
 #include <iosfwd>
 #include <map>
+#include <ostream>
 #include <string>
 
 #ifdef KUDU_HEADERS_USE_RICH_SLICE
diff --git a/src/kudu/util/spinlock_profiling.cc b/src/kudu/util/spinlock_profiling.cc
index ca1437a..a20f5ee 100644
--- a/src/kudu/util/spinlock_profiling.cc
+++ b/src/kudu/util/spinlock_profiling.cc
@@ -17,11 +17,11 @@
 
 #include "kudu/util/spinlock_profiling.h"
 
+#include <functional>
 #include <sstream>
-#include <string>
 
-#include <glog/logging.h>
 #include <gflags/gflags.h>
+#include <glog/logging.h>
 
 #include "kudu/gutil/atomicops.h"
 #include "kudu/gutil/casts.h"
diff --git a/src/kudu/util/status.h b/src/kudu/util/status.h
index 07b1417..6a2b756 100644
--- a/src/kudu/util/status.h
+++ b/src/kudu/util/status.h
@@ -21,6 +21,11 @@
 #include <cstddef>
 #include <string>
 
+// This macro is not defined when status.h is consumed by third party applications.
+#ifdef KUDU_HEADERS_USE_SHORT_STATUS_MACROS
+#include <glog/logging.h>
+#endif
+
 #ifdef KUDU_HEADERS_NO_STUBS
 #include "kudu/gutil/macros.h"
 #include "kudu/gutil/port.h"
diff --git a/src/kudu/util/subprocess-test.cc b/src/kudu/util/subprocess-test.cc
index 3d32a6f..f7058ae 100644
--- a/src/kudu/util/subprocess-test.cc
+++ b/src/kudu/util/subprocess-test.cc
@@ -26,6 +26,7 @@
 #include <csignal>
 #include <cstdio>
 #include <cstdlib>
+#include <functional>
 #include <memory>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/util/test_util.cc b/src/kudu/util/test_util.cc
index 76fe872..693123e 100644
--- a/src/kudu/util/test_util.cc
+++ b/src/kudu/util/test_util.cc
@@ -17,10 +17,11 @@
 
 #include "kudu/util/test_util.h"
 
-#include <errno.h>
 #include <limits.h>
+#include <strings.h>
 #include <unistd.h>
 
+#include <cerrno>
 #include <cstdlib>
 #include <cstring>
 #include <limits>
diff --git a/src/kudu/util/thread-test.cc b/src/kudu/util/thread-test.cc
index bea5007..4da7223 100644
--- a/src/kudu/util/thread-test.cc
+++ b/src/kudu/util/thread-test.cc
@@ -19,6 +19,7 @@
 
 #include <unistd.h>
 
+#include <functional>
 #include <ostream>
 #include <string>
 #include <vector>
diff --git a/src/kudu/util/thread.cc b/src/kudu/util/thread.cc
index 24301c9..ddf2f95 100644
--- a/src/kudu/util/thread.cc
+++ b/src/kudu/util/thread.cc
@@ -119,25 +119,25 @@ TAG_FLAG(thread_inject_start_latency_ms, unsafe);
 namespace kudu {
 
 static uint64_t GetCpuUTime() {
-  rusage ru;
+  struct rusage ru;
   CHECK_ERR(getrusage(RUSAGE_SELF, &ru));
   return ru.ru_utime.tv_sec * 1000UL + ru.ru_utime.tv_usec / 1000UL;
 }
 
 static uint64_t GetCpuSTime() {
-  rusage ru;
+  struct rusage ru;
   CHECK_ERR(getrusage(RUSAGE_SELF, &ru));
   return ru.ru_stime.tv_sec * 1000UL + ru.ru_stime.tv_usec / 1000UL;
 }
 
 static uint64_t GetVoluntaryContextSwitches() {
-  rusage ru;
+  struct rusage ru;
   CHECK_ERR(getrusage(RUSAGE_SELF, &ru));
   return ru.ru_nvcsw;
 }
 
 static uint64_t GetInVoluntaryContextSwitches() {
-  rusage ru;
+  struct rusage ru;
   CHECK_ERR(getrusage(RUSAGE_SELF, &ru));
   return ru.ru_nivcsw;
 }
diff --git a/src/kudu/util/thread_restrictions.cc b/src/kudu/util/thread_restrictions.cc
index f956fd9..4a791c4 100644
--- a/src/kudu/util/thread_restrictions.cc
+++ b/src/kudu/util/thread_restrictions.cc
@@ -15,15 +15,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "kudu/util/thread_restrictions.h"
+
 #include <ostream>
-#include <string>
 
 #include <glog/logging.h>
 
 #include "kudu/util/debug/leakcheck_disabler.h"
 #include "kudu/util/thread.h"
 #include "kudu/util/threadlocal.h"
-#include "kudu/util/thread_restrictions.h"
 
 #ifdef ENABLE_THREAD_RESTRICTIONS
 
diff --git a/src/kudu/util/threadlocal.cc b/src/kudu/util/threadlocal.cc
index 444ed15..a5200c2 100644
--- a/src/kudu/util/threadlocal.cc
+++ b/src/kudu/util/threadlocal.cc
@@ -16,11 +16,10 @@
 // under the License.
 #include "kudu/util/threadlocal.h"
 
+#include <pthread.h>
+
 #include <memory>
 #include <ostream>
-#include <string>
-
-#include <pthread.h>
 
 #include <glog/logging.h>
 
diff --git a/src/kudu/util/threadpool-test.cc b/src/kudu/util/threadpool-test.cc
index 6ab39dc..374b1bc 100644
--- a/src/kudu/util/threadpool-test.cc
+++ b/src/kudu/util/threadpool-test.cc
@@ -21,6 +21,7 @@
 
 #include <atomic>
 #include <cstdint>
+#include <functional>
 #include <iterator>
 #include <limits>
 #include <memory>
diff --git a/src/kudu/util/trace-test.cc b/src/kudu/util/trace-test.cc
index 90679d6..4e97c63 100644
--- a/src/kudu/util/trace-test.cc
+++ b/src/kudu/util/trace-test.cc
@@ -20,6 +20,7 @@
 #include <cctype>
 #include <cstdint>
 #include <cstring>
+#include <functional>
 #include <map>
 #include <ostream>
 #include <string>
diff --git a/src/kudu/util/ttl_cache-test.cc b/src/kudu/util/ttl_cache-test.cc
index bdd35b3..d1293c4 100644
--- a/src/kudu/util/ttl_cache-test.cc
+++ b/src/kudu/util/ttl_cache-test.cc
@@ -21,6 +21,7 @@
 #include <cstddef>
 #include <cstdint>
 #include <cstdlib>
+#include <functional>
 #include <memory>
 #include <set>
 #include <string>
diff --git a/src/kudu/util/version_util.cc b/src/kudu/util/version_util.cc
index 316d326..e9dc9fb 100644
--- a/src/kudu/util/version_util.cc
+++ b/src/kudu/util/version_util.cc
@@ -20,6 +20,7 @@
 #include <regex.h>
 
 #include <mutex>
+#include <ostream>
 #include <string>
 #include <utility>
 
diff --git a/src/kudu/util/yamlreader-test.cc b/src/kudu/util/yamlreader-test.cc
index 8394cf4..bfae8c3 100644
--- a/src/kudu/util/yamlreader-test.cc
+++ b/src/kudu/util/yamlreader-test.cc
@@ -17,6 +17,7 @@
 
 #include "kudu/util/yamlreader.h"
 
+#include <exception>
 #include <memory>
 #include <string>
 #include <vector>
diff --git a/src/kudu/util/zlib.cc b/src/kudu/util/zlib.cc
index 702e6f6..c025953 100644
--- a/src/kudu/util/zlib.cc
+++ b/src/kudu/util/zlib.cc
@@ -17,14 +17,13 @@
 
 #include "kudu/util/zlib.h"
 
-#include <zconf.h>
-#include <zlib.h>
-
 #include <cstdint>
 #include <cstring>
-#include <string>
 #include <memory>
-#include <ostream>
+#include <string>
+
+#include <zconf.h>
+#include <zlib.h>
 
 #include "kudu/gutil/macros.h"
 #include "kudu/gutil/strings/substitute.h"


[kudu] 01/02: iwyu: standardize on libc++

Posted by ad...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 458e6ced2f7c092c403d5d6ef3502fe94d0d98cc
Author: Adar Dembo <ad...@cloudera.com>
AuthorDate: Wed Mar 18 14:45:22 2020 -0700

    iwyu: standardize on libc++
    
    A common IWYU pain point is that the set of recommendations you get for C++
    standard library headers differs depending on the system you run on.
    Pre-commit currently uses Ubuntu 14.10, so to guarantee a pass in pre-commit
    one must run IWYU on an Ubuntu 14.10 VM.
    
    Instead, let's standardize on libc++ for C++ standard library headers. Even
    though Kudu itself is built against the system's libstdc++, the standard
    library classes we use should be available in the same "public" headers
    regardless of implementation. And this way, all runs of IWYU will produce
    the same recommendations. A more comprehensive solution would be to
    standardize _all_ of Kudu on clang and libc++. That's a larger piece of work
    with its own issues (e.g. is it safe to statically link libc++ into the C++
    client library?).
    
    This patch also introduces mappings for libc++. Some are from the IWYU repo
    while others are new for Kudu. I also included a patch to fix a bug in IWYU
    dealing with false <new> recommendations when processing a codebase using
    -fsized-deallocation[1]. Finally, I removed almost all of the "muted" files
    from iwyu.py; the few remaining instances trip up IWYU without recourse.
    
    Note: strictly speaking we don't need to _build_ libc++, but it's a quick
    build and this is the easiest way to get the appropriate set of headers into
    thirdparty/installed/<prefix>/include.
    
    1. https://github.com/include-what-you-use/include-what-you-use/issues/777
    
    Change-Id: Ic807745271642b3d5d80ea0ad9bc413bdb0e34b5
    Reviewed-on: http://gerrit.cloudera.org:8080/15492
    Reviewed-by: Alexey Serbin <as...@cloudera.com>
    Tested-by: Kudu Jenkins
---
 build-support/iwyu.py                              |  40 ++-----
 build-support/iwyu/iwyu_tool.py                    |  39 +++++++
 build-support/iwyu/mappings/libcxx-extra.imp       |  27 +++++
 build-support/iwyu/mappings/libcxx.imp             |  60 +++++++++++
 thirdparty/build-definitions.sh                    |  16 ++-
 thirdparty/build-thirdparty.sh                     |  25 +++--
 thirdparty/download-thirdparty.sh                  |   5 +-
 .../patches/llvm-iwyu-sized-deallocation.patch     | 116 +++++++++++++++++++++
 8 files changed, 283 insertions(+), 45 deletions(-)

diff --git a/build-support/iwyu.py b/build-support/iwyu.py
index bef4296..ce965d5 100755
--- a/build-support/iwyu.py
+++ b/build-support/iwyu.py
@@ -54,37 +54,9 @@ _RE_SOURCE_FILE = re.compile(r'\.(c|cc|h)$')
 _RE_CLANG_ERROR = re.compile(r'^.+?:\d+:\d+:\s*'
                              r'(fatal )?error:', re.MULTILINE)
 
-# Files that we don't want to ever run IWYU on, because they aren't clean yet.
+# Files that we don't want to ever run IWYU on because it doesn't handle them properly.
 _MUTED_FILES = set([
-  "src/kudu/cfile/cfile_reader.h",
-  "src/kudu/cfile/cfile_writer.h",
-  "src/kudu/client/client-internal.h",
-  "src/kudu/client/client-test.cc",
-  "src/kudu/common/encoded_key-test.cc",
-  "src/kudu/common/schema.h",
-  "src/kudu/experiments/rwlock-perf.cc",
-  "src/kudu/rpc/reactor.cc",
-  "src/kudu/rpc/reactor.h",
-  "src/kudu/security/ca/cert_management.cc",
-  "src/kudu/security/ca/cert_management.h",
-  "src/kudu/security/cert-test.cc",
-  "src/kudu/security/cert.cc",
-  "src/kudu/security/cert.h",
-  "src/kudu/security/openssl_util.cc",
-  "src/kudu/security/openssl_util.h",
-  "src/kudu/security/tls_context.cc",
-  "src/kudu/security/tls_handshake.cc",
-  "src/kudu/security/tls_socket.h",
-  "src/kudu/security/x509_check_host.cc",
-  "src/kudu/server/default-path-handlers.cc",
-  "src/kudu/server/webserver.cc",
-  "src/kudu/util/bit-util-test.cc",
-  "src/kudu/util/group_varint-test.cc",
   "src/kudu/util/metrics.h",
-  "src/kudu/util/minidump.cc",
-  "src/kudu/util/mt-metrics-test.cc",
-  "src/kudu/util/process_memory.cc",
-  "src/kudu/util/rle-test.cc"
 ])
 
 # Flags to pass to iwyu/fix_includes.py for Kudu-specific style.
@@ -95,7 +67,7 @@ _FIX_INCLUDES_STYLE_FLAGS = [
   '--reorder'
 ]
 
-# Directory containin the compilation database
+# Directory containing the compilation database.
 _BUILD_DIR = os.path.join(ROOT, 'build/latest')
 
 def _get_file_list_from_git():
@@ -109,12 +81,14 @@ def _get_paths_from_compilation_db():
     compilation_db = json.load(fileobj)
   return [entry['file'] for entry in compilation_db]
 
-def _run_iwyu_tool(paths):
+def _run_iwyu_tool(verbose, paths):
   iwyu_args = ['--max_line_length=256']
   for m in glob.glob(os.path.join(_MAPPINGS_DIR, "*.imp")):
     iwyu_args.append("--mapping_file=%s" % os.path.abspath(m))
 
   cmdline = [_IWYU_TOOL, '-p', _BUILD_DIR]
+  if verbose:
+    cmdline.append('--verbose')
   cmdline.extend(paths)
   cmdline.append('--')
   cmdline.extend(iwyu_args)
@@ -172,7 +146,7 @@ def _get_fixer_flags(flags):
 
 
 def _do_iwyu(flags, paths):
-  iwyu_output = _run_iwyu_tool(paths)
+  iwyu_output = _run_iwyu_tool(flags.verbose, paths)
   if flags.dump_iwyu_output:
     logging.info("Dumping iwyu output to %s", flags.dump_iwyu_output)
     with open(flags.dump_iwyu_output, "w") as f:
@@ -220,6 +194,8 @@ def main(argv):
                     help=('Just sort #includes of files listed on cmdline;'
                           ' do not add or remove any #includes'))
 
+  parser.add_option('--verbose', action='store_true',
+                    help=('Run iwyu_tool.py in verbose mode. Useful for debugging'))
   parser.add_option('--dump-iwyu-output', type='str',
                     help=('A path to dump the raw IWYU output to. This can be useful for '
                           'debugging this tool.'))
diff --git a/build-support/iwyu/iwyu_tool.py b/build-support/iwyu/iwyu_tool.py
index 7d74900..d2a15ea 100755
--- a/build-support/iwyu/iwyu_tool.py
+++ b/build-support/iwyu/iwyu_tool.py
@@ -76,6 +76,7 @@ See iwyu_tool.py -h for more details on command-line arguments.
 """
 
 import argparse
+import glob
 import json
 import multiprocessing
 from multiprocessing.pool import ThreadPool
@@ -210,6 +211,42 @@ class RelativeIncludeTest(unittest.TestCase):
         self.assertEquals(f('/foo/bar', 'gcc -I/abs/dir'),
                           'gcc -I/abs/dir')
 
+def workaround_add_libcpp(build_dir, command):
+    """
+    Modify 'command' to include C++ standard library headers from the libc++
+    found in Kudu's thirdparty tree.
+
+    By default, IWYU will use the system's libstdc++ for standard library
+    headers. This is problematic as every system has a different version of
+    libstdc++, leading to differing recommendations depending on the host system.
+
+    If we standardize on libc++ from Kudu's thirdparty tree, we can ensure the
+    same recommendations regardless of system, though those recommendations will
+    change when libc++ is upgraded.
+    """
+    nostdinc = "-nostdinc++"
+    if nostdinc not in command:
+        command += " " + nostdinc
+
+    # Check for and add any dynamic (path-based) flags.
+    #
+    # Some sanitizer builds (like TSAN) already include libc++; if the command
+    # already has a flag including libc++, we don't want to add it again.
+    path_to_libcpp_prefix = os.path.join(build_dir, "..", "..", "thirdparty", "installed")
+    path_to_libcpp_suffix = os.path.join("include", "c++", "v1")
+    tp_pattern = os.path.join(path_to_libcpp_prefix, "*", path_to_libcpp_suffix)
+    found = False
+    for path in glob.glob(tp_pattern):
+        search_string = "-isystem " + path
+        if search_string in command:
+            found = True
+            break
+    if not found:
+        path_to_libcpp = os.path.join(path_to_libcpp_prefix, "uninstrumented",
+                                      path_to_libcpp_suffix)
+        command += " -isystem " + os.path.abspath(path_to_libcpp)
+
+    return command
 
 def main(compilation_db_path, source_files, verbose, formatter, iwyu_args):
     """ Entry point. """
@@ -249,10 +286,12 @@ def main(compilation_db_path, source_files, verbose, formatter, iwyu_args):
                       source)
 
     # Run analysis
+    build_dir = os.path.dirname(compilation_db_path)
     def run_iwyu_task(entry):
         cwd, compile_command = entry['directory'], entry['command']
         compile_command = workaround_parent_dir_relative_includes(
             cwd, compile_command)
+        compile_command = workaround_add_libcpp(build_dir, compile_command)
         return run_iwyu(cwd, compile_command, iwyu_args, verbose)
     pool = ThreadPool(multiprocessing.cpu_count())
     try:
diff --git a/build-support/iwyu/mappings/libcxx-extra.imp b/build-support/iwyu/mappings/libcxx-extra.imp
new file mode 100644
index 0000000..16f20cc
--- /dev/null
+++ b/build-support/iwyu/mappings/libcxx-extra.imp
@@ -0,0 +1,27 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# More libc++ mappings not already present in include-what-you-use.
+[
+  { include: ["<__bit_reference>", private, "<vector>", public ] },
+  { include: ["<__threading_support>", private, "<thread>", public ] },
+  { include: ["<__tree>", private, "<map>", public ] },
+  { include: ["<__tree>", private, "<set>", public ] },
+  { include: ["<__tuple>", private, "<tuple>", public ] },
+  { include: ["<__hash_table>", private, "<unordered_set>", public ] },
+  { include: ["<__hash_table>", private, "<unordered_map>", public ] },
+]
diff --git a/build-support/iwyu/mappings/libcxx.imp b/build-support/iwyu/mappings/libcxx.imp
new file mode 100644
index 0000000..687e97f
--- /dev/null
+++ b/build-support/iwyu/mappings/libcxx.imp
@@ -0,0 +1,60 @@
+# This file has been imported into the Kudu source tree from the IWYU source
+# tree as of version 0.13:
+#   https://github.com/include-what-you-use/include-what-you-use/blob/master/libcxx.imp
+# and corresponding license has been added:
+#   https://github.com/include-what-you-use/include-what-you-use/blob/master/LICENSE.TXT
+#
+# ==============================================================================
+# LLVM Release License
+# ==============================================================================
+# University of Illinois/NCSA
+# Open Source License
+# 
+# Copyright (c) 2003-2010 University of Illinois at Urbana-Champaign.
+# All rights reserved.
+# 
+# Developed by:
+# 
+#     LLVM Team
+# 
+#     University of Illinois at Urbana-Champaign
+# 
+#     http://llvm.org
+# 
+# Permission is hereby granted, free of charge, to any person obtaining a copy of
+# this software and associated documentation files (the "Software"), to deal with
+# the Software without restriction, including without limitation the rights to
+# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+# of the Software, and to permit persons to whom the Software is furnished to do
+# so, subject to the following conditions:
+# 
+#     * Redistributions of source code must retain the above copyright notice,
+#       this list of conditions and the following disclaimers.
+# 
+#     * Redistributions in binary form must reproduce the above copyright notice,
+#       this list of conditions and the following disclaimers in the
+#       documentation and/or other materials provided with the distribution.
+# 
+#     * Neither the names of the LLVM Team, University of Illinois at
+#       Urbana-Champaign, nor the names of its contributors may be used to
+#       endorse or promote products derived from this Software without specific
+#       prior written permission.
+# 
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+# SOFTWARE.
+
+# libc++ headers
+[
+  { include: ["<__functional_base>", private, "<functional>", public ] },
+  { include: ["<__mutex_base>", private, "<mutex>", public ] },
+  { symbol: [ "std::declval", private, "<utility>", public ] },
+  { symbol: [ "std::forward", private, "<utility>", public ] },
+  { symbol: [ "std::move", private, "<utility>", public ] },
+  { symbol: [ "std::nullptr_t", private, "<cstddef>", public ] },
+  { symbol: [ "std::string", private, "<string>", public ] },
+]
diff --git a/thirdparty/build-definitions.sh b/thirdparty/build-definitions.sh
index 0f88333..b28e7c5 100644
--- a/thirdparty/build-definitions.sh
+++ b/thirdparty/build-definitions.sh
@@ -107,7 +107,10 @@ build_libcxxabi() {
   mkdir -p $LIBCXXABI_BDIR
   pushd $LIBCXXABI_BDIR
   rm -Rf CMakeCache.txt CMakeFiles/
-  cmake \
+
+  # libcxxabi requires gcc5 or newer. Since we can't guarantee that universally,
+  # let's always build it with clang.
+  CC="$CLANG" CXX="$CLANGXX" cmake \
     -DCMAKE_BUILD_TYPE=Release \
     -DCMAKE_INSTALL_PREFIX=$PREFIX \
     -DCMAKE_CXX_FLAGS="$EXTRA_CXXFLAGS $EXTRA_LDFLAGS" \
@@ -121,8 +124,11 @@ build_libcxxabi() {
 build_libcxx() {
   local BUILD_TYPE=$1
   case $BUILD_TYPE in
+    "normal")
+      SANITIZER_ARG=
+      ;;
     "tsan")
-      SANITIZER_TYPE=Thread
+      SANITIZER_ARG="-DLLVM_USE_SANITIZER=Thread"
       ;;
     *)
       echo "Unknown build type: $BUILD_TYPE"
@@ -134,7 +140,9 @@ build_libcxx() {
   mkdir -p $LIBCXX_BDIR
   pushd $LIBCXX_BDIR
   rm -Rf CMakeCache.txt CMakeFiles/
-  cmake \
+  # Since libcxxabi requires gcc5 or newer, we build it with clang. As libcxx is
+  # a dependency, let's also always use clang to build it.
+  CC="$CLANG" CXX="$CLANGXX" cmake \
     -DCMAKE_BUILD_TYPE=Release \
     -DCMAKE_INSTALL_PREFIX=$PREFIX \
     -DCMAKE_CXX_FLAGS="$EXTRA_CXXFLAGS" \
@@ -145,7 +153,7 @@ build_libcxx() {
     -DLIBCXX_CXX_ABI=libcxxabi \
     -DLIBCXX_CXX_ABI_INCLUDE_PATHS=$LLVM_SOURCE/projects/libcxxabi/include \
     -DLIBCXX_CXX_ABI_LIBRARY_PATH=$PREFIX/lib \
-    -DLLVM_USE_SANITIZER=$SANITIZER_TYPE \
+    $SANITIZER_ARG \
     $EXTRA_CMAKE_FLAGS \
     $LLVM_SOURCE/projects/libcxx
   ${NINJA:-make} -j$PARALLEL $EXTRA_MAKEFLAGS install
diff --git a/thirdparty/build-thirdparty.sh b/thirdparty/build-thirdparty.sh
index 6f3ab98..404da46 100755
--- a/thirdparty/build-thirdparty.sh
+++ b/thirdparty/build-thirdparty.sh
@@ -347,6 +347,15 @@ if [ -n "$F_COMMON" -o -n "$F_LLVM" ]; then
   build_llvm normal
 fi
 
+# From this point forward, clang is available for us to use if needed.
+if which ccache >/dev/null ; then
+  CLANG="$TP_DIR/../build-support/ccache-clang/clang"
+  CLANGXX="$TP_DIR/../build-support/ccache-clang/clang++"
+else
+  CLANG="$TP_DIR/clang-toolchain/bin/clang"
+  CLANGXX="$TP_DIR/clang-toolchain/bin/clang++"
+fi
+
 save_env
 
 # Enable debug symbols so that stacktraces and linenumbers are available at
@@ -355,6 +364,15 @@ save_env
 EXTRA_CFLAGS="-g $EXTRA_CFLAGS"
 EXTRA_CXXFLAGS="-g $EXTRA_CXXFLAGS"
 
+# Build libc++abi first as it is a dependency for libc++.
+if [ -n "$F_UNINSTRUMENTED" -o -n "$F_LLVM" ]; then
+  build_libcxxabi
+fi
+
+if [ -n "$F_UNINSTRUMENTED" -o -n "$F_LLVM" ]; then
+  build_libcxx normal
+fi
+
 if [ -n "$F_UNINSTRUMENTED" -o -n "$F_GFLAGS" ]; then
   build_gflags
 fi
@@ -447,13 +465,6 @@ fi
 #   * -Wl,-rpath,... - Add instrumented libc++ location to the rpath so that it
 #                      can be found at runtime.
 
-if which ccache >/dev/null ; then
-  CLANG="$TP_DIR/../build-support/ccache-clang/clang"
-  CLANGXX="$TP_DIR/../build-support/ccache-clang/clang++"
-else
-  CLANG="$TP_DIR/clang-toolchain/bin/clang"
-  CLANGXX="$TP_DIR/clang-toolchain/bin/clang++"
-fi
 export CC=$CLANG
 export CXX=$CLANGXX
 
diff --git a/thirdparty/download-thirdparty.sh b/thirdparty/download-thirdparty.sh
index 45f8649..244d012 100755
--- a/thirdparty/download-thirdparty.sh
+++ b/thirdparty/download-thirdparty.sh
@@ -320,13 +320,14 @@ fetch_and_patch \
  $PYTHON_SOURCE \
  $PYTHON_PATCHLEVEL
 
-LLVM_PATCHLEVEL=4
+LLVM_PATCHLEVEL=5
 fetch_and_patch \
  llvm-${LLVM_VERSION}-iwyu-${IWYU_VERSION}.src.tar.gz \
  $LLVM_SOURCE \
  $LLVM_PATCHLEVEL \
   "patch -p1 < $TP_DIR/patches/llvm-add-iwyu.patch" \
-  "patch -p1 < $TP_DIR/patches/llvm-iwyu-include-picker.patch"
+  "patch -p1 < $TP_DIR/patches/llvm-iwyu-include-picker.patch" \
+  "patch -p0 < $TP_DIR/patches/llvm-iwyu-sized-deallocation.patch"
 
 LZ4_PATCHLEVEL=0
 fetch_and_patch \
diff --git a/thirdparty/patches/llvm-iwyu-sized-deallocation.patch b/thirdparty/patches/llvm-iwyu-sized-deallocation.patch
new file mode 100644
index 0000000..5af6398
--- /dev/null
+++ b/thirdparty/patches/llvm-iwyu-sized-deallocation.patch
@@ -0,0 +1,116 @@
+--- tools/clang/tools/include-what-you-use/iwyu_ast_util.cc.orig	2020-03-23 14:03:01.060932783 -0700
++++ tools/clang/tools/include-what-you-use/iwyu_ast_util.cc	2020-03-23 14:04:37.056235116 -0700
+@@ -47,6 +47,7 @@
+ class FileEntry;
+ }  // namespace clang
+ 
++using clang::ASTContext;
+ using clang::BlockPointerType;
+ using clang::CXXConstructExpr;
+ using clang::CXXConstructorDecl;
+@@ -78,6 +79,7 @@
+ using clang::FullSourceLoc;
+ using clang::FunctionDecl;
+ using clang::FunctionType;
++using clang::IdentifierInfo;
+ using clang::ImplicitCastExpr;
+ using clang::InjectedClassNameType;
+ using clang::LValueReferenceType;
+@@ -929,13 +931,81 @@
+       !StartsWith(decl_name, "operator delete"))
+     return false;
+ 
+-  // Placement-new/delete has 2 args, second is void*.  The only other
+-  // 2-arg overloads of new/delete in <new> take a const nothrow_t&.
+-  if (decl->getNumParams() == 2 &&
+-      !decl->getParamDecl(1)->getType().isConstQualified())
+-    return false;
+-
+-  return true;
++  // The following variants of operator new[1] are implicitly defined in every
++  // translation unit and should not require including <new>.
++  //
++  // void* operator new  ( std::size_t count );
++  // void* operator new[]( std::size_t count );
++  // void* operator new  ( std::size_t count, std::align_val_t al ); (since C++17)
++  // void* operator new[]( std::size_t count, std::align_val_t al ); (since C++17)
++  //  
++  // Likewise, the following variants of operator delete[2] are implicitly
++  // defined in every translation unit and should not require including <new>.
++  //
++  // void operator delete  ( void* ptr ) throw(); (until C++11)
++  // void operator delete  ( void* ptr ) noexcept; (since C++11)
++  // void operator delete[]( void* ptr ) throw(); (until C++11)
++  // void operator delete[]( void* ptr ) noexcept; (since C++11)
++  // void operator delete  ( void* ptr, std::align_val_t al ) noexcept; (since C++17)
++  // void operator delete[]( void* ptr, std::align_val_t al ) noexcept; (since C++17)
++  // void operator delete  ( void* ptr, std::size_t sz ) noexcept; (since C++14)
++  // void operator delete[]( void* ptr, std::size_t sz ) noexcept; (since C++14)
++  // void operator delete  ( void* ptr, std::size_t sz,
++  //                         std::align_val_t al ) noexcept; (since C++17)
++  // void operator delete[]( void* ptr, std::size_t sz,
++  //                         std::align_val_t al ) noexcept; (since C++17)
++  // void operator delete  ( void* ptr, const std::nothrow_t& tag ) throw(); (until C++11)
++  // void operator delete  ( void* ptr, const std::nothrow_t& tag ) noexcept; (since C++11)
++  // void operator delete[]( void* ptr, const std::nothrow_t& tag ) throw(); (until C++11)
++  // void operator delete[]( void* ptr, const std::nothrow_t& tag ) noexcept; (since C++11)
++  //
++  // The below code attempts to return true for these variants while returning
++  // false for all others. FunctionDecl::isReplaceableGlobalAllocationFunction
++  // comes very very close, but returns true for nothrow new, which is not
++  // implicitly defined.
++  //
++  // 1. https://en.cppreference.com/w/cpp/memory/new/operator_new
++  // 2. https://en.cppreference.com/w/cpp/memory/new/operator_delete
++  switch (decl->getNumParams()) {
++    case 1:
++      // All 1-arg variants are implicitly declared.
++      return true;
++    case 2: {
++      // Amongst 2-arg variants, aligned (C++17) new/delete, sized delete (C++14), and
++      // nothrow delete are implicitly declared.
++      ASTContext& ctx = decl->getASTContext();
++      QualType t = decl->getParamDecl(1)->getType();
++      if (t->isAlignValT() ||                     // aligned new/delete
++          ctx.hasSameType(t, ctx.getSizeType()))  // sized delete
++        return true;
++      // We have to work a bit harder to figure out if it's a nothrow delete.
++      //
++      // This cribs from FunctionDecl::isReplaceableGlobalAllocationFunction.
++      if (StartsWith(decl_name, "operator delete") && t->isReferenceType()) {
++        t = t->getPointeeType();
++        if (t.isConstQualified()) {
++          const CXXRecordDecl* recordDecl = t->getAsCXXRecordDecl();
++          if (recordDecl) {
++            const IdentifierInfo* iInfo = recordDecl->getIdentifier();
++            if (iInfo && iInfo->isStr("nothrow_t") && recordDecl->isInStdNamespace())
++              return true;
++          }
++        }
++      }
++      return false;
++    }
++    case 3: {
++      // Amongst 3-arg variants, only sized aligned delete (C++17) is implicitly
++      // declared.
++      ASTContext& ctx = decl->getASTContext();
++      QualType t = decl->getParamDecl(1)->getType();
++      return ctx.hasSameType(t, ctx.getSizeType()) &&
++             decl->getParamDecl(2)->getType()->isAlignValT();
++    }
++    default:
++      return false;
++    return true;
++  }
+ }
+ 
+ bool IsFriendDecl(const Decl* decl) {
+@@ -1082,7 +1152,7 @@
+ 
+ bool IsBuiltinFunction(const clang::NamedDecl* decl,
+                        const std::string& symbol_name) {
+-  if (const clang::IdentifierInfo* iden = decl->getIdentifier()) {
++  if (const IdentifierInfo* iden = decl->getIdentifier()) {
+     return iden->getBuiltinID() != 0 &&
+            !clang::Builtin::Context::isBuiltinFunc(symbol_name.c_str());
+   }