From 6f0c069506cbfea255e245cbda1e6aed82f589de Mon Sep 17 00:00:00 2001 From: radekg Date: Fri, 3 Dec 2021 02:26:37 +0100 Subject: [PATCH] Add utility functions to simplify working with hybrid time --- .compose/yugabytedb-minimal.yml | 4 ++++ utils/hybridtime/hybrid_time.go | 15 ++++++++++++ utils/hybridtime/hybrid_time_test.go | 36 ++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 utils/hybridtime/hybrid_time_test.go diff --git a/.compose/yugabytedb-minimal.yml b/.compose/yugabytedb-minimal.yml index f3337a7..dd13ab2 100644 --- a/.compose/yugabytedb-minimal.yml +++ b/.compose/yugabytedb-minimal.yml @@ -31,6 +31,8 @@ services: container_name: yb-master-2 networks: - yb-client-minimal + ports: + - 7101:7100 command: [ "/home/${YB_USER}/bin/yb-master", "--callhome_enabled=false", "--fs_data_dirs=${YB_MOUNT_PREFIX}/master", @@ -48,6 +50,8 @@ services: container_name: yb-master-3 networks: - yb-client-minimal + ports: + - 7102:7100 command: [ "/home/${YB_USER}/bin/yb-master", "--callhome_enabled=false", "--fs_data_dirs=${YB_MOUNT_PREFIX}/master", diff --git a/utils/hybridtime/hybrid_time.go b/utils/hybridtime/hybrid_time.go index ed6dafc..faabda5 100644 --- a/utils/hybridtime/hybrid_time.go +++ b/utils/hybridtime/hybrid_time.go @@ -38,3 +38,18 @@ func AddDuration(ht uint64, d time.Duration) uint64 { func SubstractDuration(ht uint64, d time.Duration) uint64 { return ht - ClockTimestampToHTTimestamp(uint64(d.Microseconds())) } + +// UnixTimeFromHT takes a hybrid time and returns time.Time. +// Nanoseconds are lost in this conversion. +func UnixTimeFromHT(ht uint64) time.Time { + uints := HTTimestampToPhysicalAndLogical(ht) + sec := int64(uints[0] / 1000000) + return time.Unix(sec, 0) +} + +// UnixTimeToHT takes a time.Time and returns a hybrid time. +// Nanoseconds are lost in this conversion. +func UnixTimeToHT(t time.Time) uint64 { + // drop nanoseconds: + return PhysicalAndLogicalToHTTimestamp(uint64(t.Unix()*1000000), 0) +} diff --git a/utils/hybridtime/hybrid_time_test.go b/utils/hybridtime/hybrid_time_test.go new file mode 100644 index 0000000..3b8bdbe --- /dev/null +++ b/utils/hybridtime/hybrid_time_test.go @@ -0,0 +1,36 @@ +package hybridtime + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestHybridTime(t *testing.T) { + + t.Run("it=handles fixed point in time", func(tt *testing.T) { + // this is a fixed server clock pointing at exactly '2021-12-03 00:27:34 +0000 UTC': + fixedPointInTime := uint64(6711260180246810624) + resultTime := UnixTimeFromHT(fixedPointInTime) + assert.Equal(tt, "2021-12-03 00:27:34 +0000 UTC", resultTime.UTC().String()) + }) + + t.Run("it=converts times correctly", func(tt *testing.T) { + now := time.Now().UTC() + resultHT := UnixTimeToHT(now) + resultTime := UnixTimeFromHT(resultHT) + assert.Equal(tt, now.Unix(), resultTime.Unix()) + }) + + t.Run("it=handles add and substract", func(tt *testing.T) { + now := time.Now().UTC() + resultHT := UnixTimeToHT(now) + afterAddHT := AddDuration(resultHT, time.Duration(time.Hour*48)) + afterSubstractHT := SubstractDuration(afterAddHT, time.Duration(time.Hour*48)) + resultTime := UnixTimeFromHT(afterSubstractHT) + assert.Equal(tt, now.Unix(), resultTime.Unix()) + + }) + +}