From de651035535b6d66276edc97c121cb507e9138cb Mon Sep 17 00:00:00 2001 From: Yanqin Jin Date: Tue, 13 Nov 2018 20:02:08 -0800 Subject: [PATCH] Improve result report of scan (#4648) Summary: When iterator becomes invalid, there are two possibilities. First, all data in the column family have been scanned and there is nothing more to scan. Second, an underlying error has occurred, causing `status()` to be !ok. Therefore, we need to check for both cases when `!iter->Valid()`. Pull Request resolved: https://github.com/facebook/rocksdb/pull/4648 Differential Revision: D12959601 Pulled By: riversand963 fbshipit-source-id: 49c9382c9ea9e78f2e2b6f3708f0670b822ca8dd --- tools/db_stress.cc | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/tools/db_stress.cc b/tools/db_stress.cc index a05ce426f..20b2899e9 100644 --- a/tools/db_stress.cc +++ b/tools/db_stress.cc @@ -3600,31 +3600,52 @@ class AtomicFlushStressTest : public StressTest { } size_t num = column_families_.size(); assert(num == iters.size()); + std::vector statuses(num, Status::OK()); do { size_t valid_cnt = 0; + size_t idx = 0; for (auto& iter : iters) { if (iter->Valid()) { ++valid_cnt; + } else { + statuses[idx] = iter->status(); } + ++idx; } if (valid_cnt == 0) { - break; - } else if (valid_cnt != iters.size()) { - fprintf(stderr, "Finished iterating the following column families:\n"); + Status status; for (size_t i = 0; i != num; ++i) { - if (!iters[i]->Valid()) { - fprintf(stderr, "%s ", column_families_[i]->GetName().c_str()); + const auto& s = statuses[i]; + if (!s.ok()) { + status = s; + fprintf(stderr, "Iterator on cf %s has error: %s\n", + column_families_[i]->GetName().c_str(), + s.ToString().c_str()); + shared->SetVerificationFailure(); } } - fprintf(stderr, - "\nThe following column families have data that have not been " - "scanned:\n"); + if (status.ok()) { + fprintf(stdout, "Finished scanning all column families.\n"); + } + break; + } else if (valid_cnt != iters.size()) { for (size_t i = 0; i != num; ++i) { - if (iters[i]->Valid()) { - fprintf(stderr, "%s ", column_families_[i]->GetName().c_str()); + if (!iters[i]->Valid()) { + if (statuses[i].ok()) { + fprintf(stderr, "Finished scanning cf %s\n", + column_families_[i]->GetName().c_str()); + } else { + fprintf(stderr, "Iterator on cf %s has error: %s\n", + column_families_[i]->GetName().c_str(), + statuses[i].ToString().c_str()); + } + } else { + fprintf(stderr, "cf %s has remaining data to scan\n", + column_families_[i]->GetName().c_str()); } } - fprintf(stderr, "\n"); + shared->SetVerificationFailure(); + break; } // If the program reaches here, then all column families' iterators are // still valid.