This is an automated email from the ASF dual-hosted git repository. alexey pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/kudu.git
The following commit(s) were added to refs/heads/master by this push: new cc933107d [common] small optimisation on PartitionContainsRow cc933107d is described below commit cc933107d9be7398b42e6c8473daea6a835ef7d7 Author: Alexey Serbin <ale...@apache.org> AuthorDate: Thu Dec 8 19:03:56 2022 -0800 [common] small optimisation on PartitionContainsRow This patch updates PartitionSchema::PartitionContainsRow() to avoid calling EncodeColumns() twice for the same data. That's to improve performance of Tablet::CheckRowInTablet() which is in a hot path when inserting data into a tablet. Change-Id: Iaf1d8a9ea533a859d218292a6a0e2a0818781111 Reviewed-on: http://gerrit.cloudera.org:8080/19333 Tested-by: Alexey Serbin <ale...@apache.org> Reviewed-by: Yingchun Lai <acelyc1112...@gmail.com> --- src/kudu/common/partition.cc | 20 ++++++++++++-------- src/kudu/common/partition.h | 4 ++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/kudu/common/partition.cc b/src/kudu/common/partition.cc index 475d9d0ed..1669f3f5a 100644 --- a/src/kudu/common/partition.cc +++ b/src/kudu/common/partition.cc @@ -701,8 +701,7 @@ bool PartitionSchema::PartitionContainsRowImpl(const Partition& partition, return false; } } - - return RangePartitionContainsRowImpl(partition, row); + return RangePartitionContainsEncodedKey(partition, range_key); } template<typename Row> @@ -727,12 +726,7 @@ bool PartitionSchema::RangePartitionContainsRowImpl( string key; EncodeColumns(row, range_schema_.column_ids, &key); - // When all hash buckets match, then the row is contained in the partition - // if the row's key is greater or equal to the lower bound, and if there is - // either no upper bound or the row's key is less than the upper bound. - return - (partition.begin().range_key() <= key) && - (partition.end().range_key().empty() || key < partition.end().range_key()); + return RangePartitionContainsEncodedKey(partition, key); } bool PartitionSchema::PartitionContainsRow(const Partition& partition, @@ -1384,6 +1378,16 @@ vector<Partition> PartitionSchema::GenerateHashPartitions( return hash_partitions; } +bool PartitionSchema::RangePartitionContainsEncodedKey( + const Partition& partition, const string& key) { + // When all hash buckets match, then the row is contained in the partition + // if the row's key is greater or equal to the lower bound, and if there is + // either no upper bound or the row's key is less than the upper bound. + return + (partition.begin().range_key() <= key) && + (partition.end().range_key().empty() || key < partition.end().range_key()); +} + Status PartitionSchema::ValidateHashSchema(const Schema& schema, const HashSchema& hash_schema) { set<ColumnId> hash_columns; diff --git a/src/kudu/common/partition.h b/src/kudu/common/partition.h index 575c73218..20c88222e 100644 --- a/src/kudu/common/partition.h +++ b/src/kudu/common/partition.h @@ -564,6 +564,10 @@ class PartitionSchema { const HashSchema& hash_schema, const KeyEncoder<std::string>& hash_encoder); + // Helper for PartitionContainsRowImpl. + static bool RangePartitionContainsEncodedKey(const Partition& partition, + const std::string& key); + // PartitionKeyDebugString implementation for row types. template<typename Row> std::string PartitionKeyDebugStringImpl(const Row& row) const;