From a79ae63508e92ee18a790b37e1a57532a3c0ce22 Mon Sep 17 00:00:00 2001 From: Adam Retter Date: Sun, 24 Nov 2019 19:23:49 +0100 Subject: [PATCH 1/4] Fix Transaction MultiGet virtual function override for VS2015, needs to be consistently const or non-const --- utilities/transactions/transaction_base.cc | 2 +- utilities/transactions/transaction_base.h | 2 +- utilities/transactions/write_prepared_txn.cc | 2 +- utilities/transactions/write_prepared_txn.h | 2 +- utilities/transactions/write_unprepared_txn.cc | 2 +- utilities/transactions/write_unprepared_txn.h | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/utilities/transactions/transaction_base.cc b/utilities/transactions/transaction_base.cc index 04e664f6fcf..54b5b6204ac 100644 --- a/utilities/transactions/transaction_base.cc +++ b/utilities/transactions/transaction_base.cc @@ -323,7 +323,7 @@ void TransactionBaseImpl::MultiGet(const ReadOptions& read_options, ColumnFamilyHandle* column_family, const size_t num_keys, const Slice* keys, PinnableSlice* values, Status* statuses, - bool sorted_input) { + const bool sorted_input) { write_batch_.MultiGetFromBatchAndDB(db_, read_options, column_family, num_keys, keys, values, statuses, sorted_input); diff --git a/utilities/transactions/transaction_base.h b/utilities/transactions/transaction_base.h index 72fa9d26af4..082b0b4f5b9 100644 --- a/utilities/transactions/transaction_base.h +++ b/utilities/transactions/transaction_base.h @@ -98,7 +98,7 @@ class TransactionBaseImpl : public Transaction { void MultiGet(const ReadOptions& options, ColumnFamilyHandle* column_family, const size_t num_keys, const Slice* keys, PinnableSlice* values, - Status* statuses, bool sorted_input = false) override; + Status* statuses, const bool sorted_input = false) override; using Transaction::MultiGetForUpdate; std::vector MultiGetForUpdate( diff --git a/utilities/transactions/write_prepared_txn.cc b/utilities/transactions/write_prepared_txn.cc index 8dfc0d1d4ac..f8eef361b82 100644 --- a/utilities/transactions/write_prepared_txn.cc +++ b/utilities/transactions/write_prepared_txn.cc @@ -44,7 +44,7 @@ void WritePreparedTxn::MultiGet(const ReadOptions& options, ColumnFamilyHandle* column_family, const size_t num_keys, const Slice* keys, PinnableSlice* values, Status* statuses, - bool sorted_input) { + const bool sorted_input) { SequenceNumber min_uncommitted, snap_seq; const SnapshotBackup backed_by_snapshot = wpt_db_->AssignMinMaxSeqs(options.snapshot, &min_uncommitted, &snap_seq); diff --git a/utilities/transactions/write_prepared_txn.h b/utilities/transactions/write_prepared_txn.h index e5dadabc483..aaebaf48afd 100644 --- a/utilities/transactions/write_prepared_txn.h +++ b/utilities/transactions/write_prepared_txn.h @@ -61,7 +61,7 @@ class WritePreparedTxn : public PessimisticTransaction { ColumnFamilyHandle* column_family, const size_t num_keys, const Slice* keys, PinnableSlice* values, Status* statuses, - bool sorted_input = false) override; + const bool sorted_input = false) override; // Note: The behavior is undefined in presence of interleaved writes to the // same transaction. diff --git a/utilities/transactions/write_unprepared_txn.cc b/utilities/transactions/write_unprepared_txn.cc index 9b58d8bc87c..bcaeb1eae24 100644 --- a/utilities/transactions/write_unprepared_txn.cc +++ b/utilities/transactions/write_unprepared_txn.cc @@ -837,7 +837,7 @@ void WriteUnpreparedTxn::MultiGet(const ReadOptions& options, ColumnFamilyHandle* column_family, const size_t num_keys, const Slice* keys, PinnableSlice* values, Status* statuses, - bool sorted_input) { + const bool sorted_input) { SequenceNumber min_uncommitted, snap_seq; const SnapshotBackup backed_by_snapshot = wupt_db_->AssignMinMaxSeqs(options.snapshot, &min_uncommitted, &snap_seq); diff --git a/utilities/transactions/write_unprepared_txn.h b/utilities/transactions/write_unprepared_txn.h index e2a5399c3b0..f39f39891f1 100644 --- a/utilities/transactions/write_unprepared_txn.h +++ b/utilities/transactions/write_unprepared_txn.h @@ -194,7 +194,7 @@ class WriteUnpreparedTxn : public WritePreparedTxn { ColumnFamilyHandle* column_family, const size_t num_keys, const Slice* keys, PinnableSlice* values, Status* statuses, - bool sorted_input = false) override; + const bool sorted_input = false) override; using Transaction::GetIterator; virtual Iterator* GetIterator(const ReadOptions& options) override; From 1707f7791672948b13967dd4f13fa9464db13a45 Mon Sep 17 00:00:00 2001 From: Adam Retter Date: Sun, 24 Nov 2019 19:28:36 +0100 Subject: [PATCH 2/4] Cast should not assume unsigned int on all platforms, use std type alias instead --- tools/block_cache_analyzer/block_cache_trace_analyzer.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/block_cache_analyzer/block_cache_trace_analyzer.cc b/tools/block_cache_analyzer/block_cache_trace_analyzer.cc index 891af9a52ef..7857109b5c4 100644 --- a/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +++ b/tools/block_cache_analyzer/block_cache_trace_analyzer.cc @@ -650,7 +650,7 @@ void BlockCacheTraceAnalyzer::WriteCorrelationFeaturesToFile( const std::map& label_features, const std::map& label_predictions, uint32_t max_number_of_values) const { - std::default_random_engine rand_engine(static_cast(env_->NowMicros())); + std::default_random_engine rand_engine(static_cast(env_->NowMicros())); for (auto const& label_feature_vectors : label_features) { const Features& past = label_feature_vectors.second; auto it = label_predictions.find(label_feature_vectors.first); From 6f81a43bb2b353109e0154de71d2bfd3cf22cec0 Mon Sep 17 00:00:00 2001 From: Adam Retter Date: Sun, 24 Nov 2019 19:30:08 +0100 Subject: [PATCH 3/4] Statically allocating dynamic arrays on the static is a gcc/clang extension, not supported on all platforms e.g. msvc --- .../block_cache_trace_analyzer.cc | 13 +++++++------ .../block_cache_trace_analyzer.h | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/tools/block_cache_analyzer/block_cache_trace_analyzer.cc b/tools/block_cache_analyzer/block_cache_trace_analyzer.cc index 7857109b5c4..55f3989c830 100644 --- a/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +++ b/tools/block_cache_analyzer/block_cache_trace_analyzer.cc @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -1170,7 +1171,7 @@ void BlockCacheTraceAnalyzer::WriteReuseLifetime( } void BlockCacheTraceAnalyzer::WriteBlockReuseTimeline( - uint64_t reuse_window, bool user_access_only, TraceType block_type) const { + const uint64_t reuse_window, bool user_access_only, TraceType block_type) const { // A map from block key to an array of bools that states whether a block is // accessed in a time window. std::map> block_accessed; @@ -1209,11 +1210,11 @@ void BlockCacheTraceAnalyzer::WriteBlockReuseTimeline( TraverseBlocks(block_callback); // A cell is the number of blocks accessed in a reuse window. - uint64_t reuse_table[reuse_vector_size][reuse_vector_size]; + std::unique_ptr reuse_table(new uint64_t[reuse_vector_size * reuse_vector_size]); for (uint64_t start_time = 0; start_time < reuse_vector_size; start_time++) { // Initialize the reuse_table. for (uint64_t i = 0; i < reuse_vector_size; i++) { - reuse_table[start_time][i] = 0; + reuse_table[start_time * reuse_vector_size + i] = 0; } // Examine all blocks. for (auto const& block : block_accessed) { @@ -1222,7 +1223,7 @@ void BlockCacheTraceAnalyzer::WriteBlockReuseTimeline( // This block is accessed at start time and at the current time. We // increment reuse_table[start_time][i] since it is reused at the ith // window. - reuse_table[start_time][i]++; + reuse_table[start_time * reuse_vector_size + i]++; } } } @@ -1250,8 +1251,8 @@ void BlockCacheTraceAnalyzer::WriteBlockReuseTimeline( if (j < start_time) { row += "100.0"; } else { - row += std::to_string(percent(reuse_table[start_time][j], - reuse_table[start_time][start_time])); + row += std::to_string(percent(reuse_table[start_time * reuse_vector_size + j], + reuse_table[start_time * reuse_vector_size + start_time])); } } out << row << std::endl; diff --git a/tools/block_cache_analyzer/block_cache_trace_analyzer.h b/tools/block_cache_analyzer/block_cache_trace_analyzer.h index d7abd010010..4a15429e4c0 100644 --- a/tools/block_cache_analyzer/block_cache_trace_analyzer.h +++ b/tools/block_cache_analyzer/block_cache_trace_analyzer.h @@ -289,7 +289,7 @@ class BlockCacheTraceAnalyzer { // The file is named // "block_type_user_access_only_reuse_window_reuse_timeline". The file format // is start_time,0,1,...,N where N equals trace_duration / reuse_window. - void WriteBlockReuseTimeline(uint64_t reuse_window, bool user_access_only, + void WriteBlockReuseTimeline(const uint64_t reuse_window, bool user_access_only, TraceType block_type) const; // Write the Get spatical locality into csv files saved in 'output_dir'. From cfa084babc6b5f12bd363c195fb88c70869ca22a Mon Sep 17 00:00:00 2001 From: Adam Retter Date: Sun, 24 Nov 2019 19:30:54 +0100 Subject: [PATCH 4/4] Correct data type so that compiler supported implicit or manual explicit casting is not needed, fix for msvc --- tools/block_cache_analyzer/block_cache_trace_analyzer.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/block_cache_analyzer/block_cache_trace_analyzer.cc b/tools/block_cache_analyzer/block_cache_trace_analyzer.cc index 55f3989c830..e6b6a2c0572 100644 --- a/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +++ b/tools/block_cache_analyzer/block_cache_trace_analyzer.cc @@ -1674,7 +1674,7 @@ void BlockCacheTraceAnalyzer::PrintAccessCountStats(bool user_access_only, if (bottom_k_index >= bottom_k) { break; } - std::map caller_naccesses; + std::map caller_naccesses; uint64_t naccesses = 0; for (auto const& block_id : naccess_it->second) { BlockAccessInfo* block = block_info_map_.find(block_id)->second;