Test CircleCI with CLANG-10 (#7025)

Summary:
It's useful to build RocksDB using a more recent clang version in CI. Add a CircleCI build and fix some issues with it.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/7025

Test Plan: See all tests pass.

Reviewed By: pdillinger

Differential Revision: D22215700

fbshipit-source-id: 914a729c2cd3f3ac4a627cc0ac58d4691dca2168
main
sdong 5 years ago committed by Facebook GitHub Bot
parent 50d6969816
commit 9cc25190e1
  1. 15
      .circleci/config.yml
  2. 11
      db/db_iter_stress_test.cc
  3. 4
      db/db_options_test.cc
  4. 4
      env/env_test.cc
  5. 2
      options/options_helper.cc
  6. 10
      table/table_test.cc
  7. 2
      tools/ldb_cmd_test.cc

@ -57,6 +57,18 @@ jobs:
- run: sudo apt-get install -y clang - run: sudo apt-get install -y clang
- run: CC=clang CXX=clang++ USE_CLANG=1 PORTABLE=1 make all -j32 - run: CC=clang CXX=clang++ USE_CLANG=1 PORTABLE=1 make all -j32
build-linux-clang10-no-test:
machine:
image: ubuntu-1604:201903-01
resource_class: 2xlarge
steps:
- checkout # check out the code in the project directory
- run: sudo sh -c 'echo "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main" >> /etc/apt/sources.list'
- run: sudo sh -c 'echo "deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main" >> /etc/apt/sources.list'
- run: sudo apt-get update -y
- run: sudo apt-get install -y clang-10
- run: CC=clang-10 CXX=clang++-10 ROCKSDB_DISABLE_ALIGNED_NEW=1 USE_CLANG=1 make all -j32 # aligned new doesn't work for reason we haven't figured out
build-linux-cmake: build-linux-cmake:
machine: machine:
image: ubuntu-1604:201903-01 image: ubuntu-1604:201903-01
@ -125,6 +137,9 @@ workflows:
build-linux-clang-no-test: build-linux-clang-no-test:
jobs: jobs:
- build-linux-clang-no-test - build-linux-clang-no-test
build-linux-clang10-no-test:
jobs:
- build-linux-clang10-no-test
build-linux-cmake: build-linux-cmake:
jobs: jobs:
- build-linux-cmake - build-linux-cmake

@ -97,7 +97,8 @@ struct StressTestIterator : public InternalIterator {
bool MaybeFail() { bool MaybeFail() {
if (rnd->Next() >= if (rnd->Next() >=
std::numeric_limits<uint64_t>::max() * error_probability) { static_cast<double>(std::numeric_limits<uint64_t>::max()) *
error_probability) {
return false; return false;
} }
if (rnd->Next() % 2) { if (rnd->Next() % 2) {
@ -114,7 +115,8 @@ struct StressTestIterator : public InternalIterator {
void MaybeMutate() { void MaybeMutate() {
if (rnd->Next() >= if (rnd->Next() >=
std::numeric_limits<uint64_t>::max() * mutation_probability) { static_cast<double>(std::numeric_limits<uint64_t>::max()) *
mutation_probability) {
return; return;
} }
do { do {
@ -126,8 +128,9 @@ struct StressTestIterator : public InternalIterator {
if (data->hidden.empty()) { if (data->hidden.empty()) {
hide_probability = 1; hide_probability = 1;
} }
bool do_hide = bool do_hide = rnd->Next() <
rnd->Next() < std::numeric_limits<uint64_t>::max() * hide_probability; static_cast<double>(std::numeric_limits<uint64_t>::max()) *
hide_probability;
if (do_hide) { if (do_hide) {
// Hide a random entry. // Hide a random entry.
size_t idx = rnd->Next() % data->entries.size(); size_t idx = rnd->Next() % data->entries.size();

@ -39,7 +39,7 @@ class DBOptionsTest : public DBTestBase {
std::unordered_map<std::string, std::string> options_map; std::unordered_map<std::string, std::string> options_map;
StringToMap(options_str, &options_map); StringToMap(options_str, &options_map);
std::unordered_map<std::string, std::string> mutable_map; std::unordered_map<std::string, std::string> mutable_map;
for (const auto opt : db_options_type_info) { for (const auto& opt : db_options_type_info) {
if (opt.second.IsMutable() && opt.second.ShouldSerialize()) { if (opt.second.IsMutable() && opt.second.ShouldSerialize()) {
mutable_map[opt.first] = options_map[opt.first]; mutable_map[opt.first] = options_map[opt.first];
} }
@ -57,7 +57,7 @@ class DBOptionsTest : public DBTestBase {
std::unordered_map<std::string, std::string> options_map; std::unordered_map<std::string, std::string> options_map;
StringToMap(options_str, &options_map); StringToMap(options_str, &options_map);
std::unordered_map<std::string, std::string> mutable_map; std::unordered_map<std::string, std::string> mutable_map;
for (const auto opt : cf_options_type_info) { for (const auto& opt : cf_options_type_info) {
if (opt.second.IsMutable() && opt.second.ShouldSerialize()) { if (opt.second.IsMutable() && opt.second.ShouldSerialize()) {
mutable_map[opt.first] = options_map[opt.first]; mutable_map[opt.first] = options_map[opt.first];
} }

4
env/env_test.cc vendored

@ -1120,7 +1120,7 @@ TEST_P(EnvPosixTestWithParam, RandomAccessUniqueIDConcurrent) {
// Collect and check whether the IDs are unique. // Collect and check whether the IDs are unique.
std::unordered_set<std::string> ids; std::unordered_set<std::string> ids;
for (const std::string fname : fnames) { for (const std::string& fname : fnames) {
std::unique_ptr<RandomAccessFile> file; std::unique_ptr<RandomAccessFile> file;
std::string unique_id; std::string unique_id;
ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions)); ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions));
@ -1134,7 +1134,7 @@ TEST_P(EnvPosixTestWithParam, RandomAccessUniqueIDConcurrent) {
} }
// Delete the files // Delete the files
for (const std::string fname : fnames) { for (const std::string& fname : fnames) {
ASSERT_OK(env_->DeleteFile(fname)); ASSERT_OK(env_->DeleteFile(fname));
} }

@ -656,7 +656,7 @@ Status GetStringFromStruct(
std::string* opt_string) { std::string* opt_string) {
assert(opt_string); assert(opt_string);
opt_string->clear(); opt_string->clear();
for (const auto iter : type_info) { for (const auto& iter : type_info) {
const auto& opt_info = iter.second; const auto& opt_info = iter.second;
// If the option is no longer used in rocksdb and marked as deprecated, // If the option is no longer used in rocksdb and marked as deprecated,
// we skip it in the serialization. // we skip it in the serialization.

@ -228,7 +228,7 @@ class BlockConstructor: public Constructor {
block_ = nullptr; block_ = nullptr;
BlockBuilder builder(table_options.block_restart_interval); BlockBuilder builder(table_options.block_restart_interval);
for (const auto kv : kv_map) { for (const auto& kv : kv_map) {
builder.Add(kv.first, kv.second); builder.Add(kv.first, kv.second);
} }
// Open the block // Open the block
@ -352,7 +352,7 @@ class TableConstructor: public Constructor {
TablePropertiesCollectorFactory::Context::kUnknownColumnFamily, TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
file_writer_.get())); file_writer_.get()));
for (const auto kv : kv_map) { for (const auto& kv : kv_map) {
if (convert_to_internal_key_) { if (convert_to_internal_key_) {
ParsedInternalKey ikey(kv.first, kMaxSequenceNumber, kTypeValue); ParsedInternalKey ikey(kv.first, kMaxSequenceNumber, kTypeValue);
std::string encoded; std::string encoded;
@ -487,7 +487,7 @@ class MemTableConstructor: public Constructor {
kMaxSequenceNumber, 0 /* column_family_id */); kMaxSequenceNumber, 0 /* column_family_id */);
memtable_->Ref(); memtable_->Ref();
int seq = 1; int seq = 1;
for (const auto kv : kv_map) { for (const auto& kv : kv_map) {
memtable_->Add(seq, kTypeValue, kv.first, kv.second); memtable_->Add(seq, kTypeValue, kv.first, kv.second);
seq++; seq++;
} }
@ -548,7 +548,7 @@ class DBConstructor: public Constructor {
delete db_; delete db_;
db_ = nullptr; db_ = nullptr;
NewDB(); NewDB();
for (const auto kv : kv_map) { for (const auto& kv : kv_map) {
WriteBatch batch; WriteBatch batch;
batch.Put(kv.first, kv.second); batch.Put(kv.first, kv.second);
EXPECT_TRUE(db_->Write(WriteOptions(), &batch).ok()); EXPECT_TRUE(db_->Write(WriteOptions(), &batch).ok());
@ -1226,7 +1226,7 @@ class FileChecksumTestHelper {
} }
Status WriteKVAndFlushTable() { Status WriteKVAndFlushTable() {
for (const auto kv : kv_map_) { for (const auto& kv : kv_map_) {
if (convert_to_internal_key_) { if (convert_to_internal_key_) {
ParsedInternalKey ikey(kv.first, kMaxSequenceNumber, kTypeValue); ParsedInternalKey ikey(kv.first, kMaxSequenceNumber, kTypeValue);
std::string encoded; std::string encoded;

@ -76,7 +76,7 @@ TEST_F(LdbCmdTest, HexToStringBadInputs) {
const vector<string> badInputs = { const vector<string> badInputs = {
"0xZZ", "123", "0xx5", "0x111G", "0x123", "Ox12", "0xT", "0x1Q1", "0xZZ", "123", "0xx5", "0x111G", "0x123", "Ox12", "0xT", "0x1Q1",
}; };
for (const auto badInput : badInputs) { for (const auto& badInput : badInputs) {
try { try {
ROCKSDB_NAMESPACE::LDBCommand::HexToString(badInput); ROCKSDB_NAMESPACE::LDBCommand::HexToString(badInput);
std::cerr << "Should fail on bad hex value: " << badInput << "\n"; std::cerr << "Should fail on bad hex value: " << badInput << "\n";

Loading…
Cancel
Save