You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by al...@apache.org on 2019/06/27 03:05:58 UTC
[kudu] 01/02: KUDU-2867. Optimize delta timestamp decoding
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
commit 7f7d425eadc10886108a00ee0249d7c3d8372ee0
Author: Todd Lipcon <to...@apache.org>
AuthorDate: Tue Jun 18 00:17:04 2019 -0700
KUDU-2867. Optimize delta timestamp decoding
When using hybrid clock, all timestamps require a full 8-byte varint to
be encoded. So, we can inline this fast path in Timestamp::DecodeFrom to
avoid the more complicated/lengthy GetMemcmpableVarint code.
Change-Id: I1665e0aaed874cf4d47ecf5e467246a9505b0bd1
Reviewed-on: http://gerrit.cloudera.org:8080/13667
Tested-by: Kudu Jenkins
Reviewed-by: Grant Henke <gr...@apache.org>
Reviewed-by: Alexey Serbin <as...@cloudera.com>
---
src/kudu/common/timestamp.cc | 5 -----
src/kudu/common/timestamp.h | 21 ++++++++++++++++++++-
2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/src/kudu/common/timestamp.cc b/src/kudu/common/timestamp.cc
index 1d13d4f..1eed806 100644
--- a/src/kudu/common/timestamp.cc
+++ b/src/kudu/common/timestamp.cc
@@ -21,7 +21,6 @@
#include "kudu/gutil/mathlimits.h"
#include "kudu/gutil/strings/substitute.h"
-#include "kudu/util/memcmpable_varint.h"
namespace kudu {
@@ -30,10 +29,6 @@ const Timestamp Timestamp::kMax(MathLimits<Timestamp::val_type>::kMax);
const Timestamp Timestamp::kInitialTimestamp(MathLimits<Timestamp::val_type>::kMin + 1);
const Timestamp Timestamp::kInvalidTimestamp(MathLimits<Timestamp::val_type>::kMax - 1);
-bool Timestamp::DecodeFrom(Slice* input) {
- return GetMemcmpableVarint64(input, &v);
-}
-
void Timestamp::EncodeTo(faststring* dst) const {
PutMemcmpableVarint64(dst, v);
}
diff --git a/src/kudu/common/timestamp.h b/src/kudu/common/timestamp.h
index c9dbad7..7777b64 100644
--- a/src/kudu/common/timestamp.h
+++ b/src/kudu/common/timestamp.h
@@ -22,9 +22,13 @@
#include <iosfwd>
#include <string>
+#include "kudu/gutil/endian.h"
+#include "kudu/gutil/port.h"
+#include "kudu/util/memcmpable_varint.h"
+#include "kudu/util/slice.h"
+
namespace kudu {
class faststring;
-class Slice;
// A transaction timestamp generated by a Clock.
class Timestamp {
@@ -84,6 +88,21 @@ class Timestamp {
std::ostream& operator<<(std::ostream& o, const Timestamp& timestamp);
+inline bool Timestamp::DecodeFrom(Slice* input) {
+ // The most common case is that the timestamp is generated from a
+ // HybridClock, which will always be encoded as an 8-byte varint.
+ // Given this, we can inline fast-path this encoding here and fall
+ // back to GetMemcmpableVarint64 only in the rare case of logical
+ // clocks used in tests.
+ if (PREDICT_TRUE(input->size() >= 9 &&
+ (*input)[0] == 0xff)) {
+ v = BigEndian::Load64(input->data() + 1);
+ input->remove_prefix(9);
+ return true;
+ }
+ return GetMemcmpableVarint64(input, &v);
+}
+
inline int Timestamp::CompareTo(const Timestamp& other) const {
if (v < other.v) {
return -1;