From 65f65b70cfb27ccc0cc7178c7a81b43e86ccc538 Mon Sep 17 00:00:00 2001 From: Muthu Chidambaram Date: Thu, 30 Jan 2025 21:14:58 +0000 Subject: [PATCH] [PLAT-15970] Supporting HA across timezones Summary: Issue with timezones not being stored in PG database so changing node timezone had weird effects on HA failovers. By storing the bigint directly we have no ambiguous conversion from pg timestamp to java timestamp and always rely on epoch millisecond time. Test Plan: Set up HA with active (A)/standby (B) on UTC Change standby (B) to America/Chicago Promote standby (B) Change new standby (A) from UTC to America/NewYork Promote standby (A) Reviewers: nsingh Reviewed By: nsingh Subscribers: sanketh, yugaware Differential Revision: https://phorge.dev.yugabyte.com/D41534 --- .../yw/models/HighAvailabilityConfig.java | 15 ++++++++------- ...V391__Alter_High_Availability_lastFailover.sql | 6 ++++++ 2 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 managed/src/main/resources/db/migration/default_/common/V391__Alter_High_Availability_lastFailover.sql diff --git a/managed/src/main/java/com/yugabyte/yw/models/HighAvailabilityConfig.java b/managed/src/main/java/com/yugabyte/yw/models/HighAvailabilityConfig.java index 3af0c429902..9c96f2d95e0 100644 --- a/managed/src/main/java/com/yugabyte/yw/models/HighAvailabilityConfig.java +++ b/managed/src/main/java/com/yugabyte/yw/models/HighAvailabilityConfig.java @@ -30,8 +30,6 @@ import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; -import jakarta.persistence.Temporal; -import jakarta.persistence.TemporalType; import java.util.ArrayList; import java.util.Base64; import java.util.Date; @@ -68,9 +66,7 @@ public class HighAvailabilityConfig extends Model { @JsonProperty("cluster_key") private String clusterKey; - @Temporal(TemporalType.TIMESTAMP) - @JsonProperty("last_failover") - private Date lastFailover; + private Long lastFailover; @OneToMany(mappedBy = "config", cascade = CascadeType.ALL) private List instances; @@ -80,15 +76,20 @@ public class HighAvailabilityConfig extends Model { private boolean acceptAnyCertificate; public void updateLastFailover(Date lastFailover) { - this.lastFailover = lastFailover; + this.lastFailover = lastFailover.getTime(); this.update(); } public void updateLastFailover() { - this.lastFailover = new Date(); + this.lastFailover = new Date().getTime(); this.update(); } + @JsonProperty("last_failover") + public Date getLastFailover() { + return (this.lastFailover != null) ? new Date(this.lastFailover) : null; + } + public void updateAcceptAnyCertificate(boolean acceptAnyCertificate) { this.acceptAnyCertificate = acceptAnyCertificate; this.update(); diff --git a/managed/src/main/resources/db/migration/default_/common/V391__Alter_High_Availability_lastFailover.sql b/managed/src/main/resources/db/migration/default_/common/V391__Alter_High_Availability_lastFailover.sql new file mode 100644 index 00000000000..c98a6664a10 --- /dev/null +++ b/managed/src/main/resources/db/migration/default_/common/V391__Alter_High_Availability_lastFailover.sql @@ -0,0 +1,6 @@ +-- Copyright (c) YugaByte, Inc. + +-- Change last_failover column from timestamp without tz to epoch time in ms +ALTER TABLE high_availability_config +ALTER COLUMN last_failover TYPE bigint +USING (EXTRACT(EPOCH FROM last_failover) * 1000)::bigint; \ No newline at end of file