From 2df3e90028ffd55163574b24aa9b5fc5d0d5bcfa Mon Sep 17 00:00:00 2001 From: Yanqin Jin Date: Tue, 17 Nov 2020 00:43:20 -0800 Subject: [PATCH] Fix the logic of setting read_amp_bytes_per_bit from OPTIONS file (#7680) Summary: Instead of using `EncodeFixed32` which always serialize a integer to little endian, we should use the local machine's endianness when populating a native data structure during options parsing. Without this fix, `read_amp_bytes_per_bit` may be populated incorrectly on big-endian machines. Pull Request resolved: https://github.com/facebook/rocksdb/pull/7680 Test Plan: make check Reviewed By: pdillinger Differential Revision: D24999166 Pulled By: riversand963 fbshipit-source-id: dc603cff6e17f8fa32479ce6df93b93082e6b0c4 --- HISTORY.md | 3 ++- table/block_based/block_based_table_factory.cc | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index d4e816d015..0352a63227 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,7 +1,8 @@ # Rocksdb Change Log ## 6.13.4 (11/15/2020) ### Bug Fixes -* Fix a bug of encoding and parsing BlockBasedTableOptions::read_amp_bytes_per_bit as a 64-bit integer. +* Fixed a bug of encoding and parsing BlockBasedTableOptions::read_amp_bytes_per_bit as a 64-bit integer. +* Fixed the logic of populating native data structure for `read_amp_bytes_per_bit` during OPTIONS file parsing on big-endian architecture. Without this fix, original code introduced in PR7659, when running on big-endian machine, can mistakenly store read_amp_bytes_per_bit (an uint32) in little endian format. Future access to `read_amp_bytes_per_bit` will give wrong values. Little endian architecture is not affected. ## 6.13.3 (10/14/2020) ### Bug Fixes diff --git a/table/block_based/block_based_table_factory.cc b/table/block_based/block_based_table_factory.cc index 7aeda68965..24aa8c59eb 100644 --- a/table/block_based/block_based_table_factory.cc +++ b/table/block_based/block_based_table_factory.cc @@ -345,7 +345,8 @@ static std::unordered_map // generated by affected releases before the fix, we need to // manually parse read_amp_bytes_per_bit with this special hack. uint64_t read_amp_bytes_per_bit = ParseUint64(value); - EncodeFixed32(addr, static_cast(read_amp_bytes_per_bit)); + *(reinterpret_cast(addr)) = + static_cast(read_amp_bytes_per_bit); return Status::OK(); }}}, {"enable_index_compression",