Micro-optimizations to try to inline DeltaKey::DecodeFrom This is a hot function in update-heavy workloads (eg YCSB workload A). This is an attempt to make it inlinable, by marking it "hot" and out-of-lining the error cases into a function marked "noinline".
Change-Id: I0611a3dd1309ab815880c2d151c1270a05f8e406 Reviewed-on: http://gerrit.cloudera.org:8080/6160 Reviewed-by: David Ribeiro Alves <[email protected]> Tested-by: Todd Lipcon <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/kudu/repo Commit: http://git-wip-us.apache.org/repos/asf/kudu/commit/368f4f73 Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/368f4f73 Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/368f4f73 Branch: refs/heads/master Commit: 368f4f734e4acbab2bdb19b824e2ba26cb2cfaa6 Parents: cbb07d2 Author: Todd Lipcon <[email protected]> Authored: Sun Feb 26 19:01:49 2017 -0800 Committer: Todd Lipcon <[email protected]> Committed: Tue Feb 28 21:24:47 2017 +0000 ---------------------------------------------------------------------- src/kudu/tablet/delta_key.cc | 5 +++++ src/kudu/tablet/delta_key.h | 16 +++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kudu/blob/368f4f73/src/kudu/tablet/delta_key.cc ---------------------------------------------------------------------- diff --git a/src/kudu/tablet/delta_key.cc b/src/kudu/tablet/delta_key.cc index 2bfce8f..879e4bd 100644 --- a/src/kudu/tablet/delta_key.cc +++ b/src/kudu/tablet/delta_key.cc @@ -34,5 +34,10 @@ const char* DeltaType_Name(DeltaType t) { return "UNKNOWN"; } +Status DeltaKey::DeltaKeyError(const Slice& orig, const char* err) { + return Status::Corruption(strings::Substitute("Bad delta key: $0", err), + KUDU_REDACT(orig.ToDebugString(20))); +} + } // namespace tablet } // namespace kudu http://git-wip-us.apache.org/repos/asf/kudu/blob/368f4f73/src/kudu/tablet/delta_key.h ---------------------------------------------------------------------- diff --git a/src/kudu/tablet/delta_key.h b/src/kudu/tablet/delta_key.h index 402bb74..be5e946 100644 --- a/src/kudu/tablet/delta_key.h +++ b/src/kudu/tablet/delta_key.h @@ -72,17 +72,20 @@ class DeltaKey { // contain further data after that. // The 'key' slice is mutated so that, upon return, the decoded key has been removed from // its beginning. - Status DecodeFrom(Slice *key) { + // + // This function is called frequently, so is marked HOT to encourage inlining. + Status DecodeFrom(Slice *key) ATTRIBUTE_HOT { Slice orig(*key); if (!PREDICT_TRUE(DecodeRowId(key, &row_idx_))) { - return Status::Corruption("Bad delta key: bad rowid", - KUDU_REDACT(orig.ToDebugString(20))); + // Out-of-line the error case to keep this function small and inlinable. + return DeltaKeyError(orig, "bad rowid"); } if (!PREDICT_TRUE(timestamp_.DecodeFrom(key))) { - return Status::Corruption("Bad delta key: bad timestamp", - KUDU_REDACT(orig.ToDebugString(20))); + // Out-of-line the error case to keep this function small and inlinable. + return DeltaKeyError(orig, "bad timestamp"); } + return Status::OK(); } @@ -102,6 +105,9 @@ class DeltaKey { const Timestamp ×tamp() const { return timestamp_; } private: + // Out-of-line error construction used by DecodeFrom. + static Status DeltaKeyError(const Slice& orig, const char* err); + // The row which has been updated. rowid_t row_idx_;
