From 8ab845868b6c8121105d002c71f20eb03f2ebb1d Mon Sep 17 00:00:00 2001 From: Sean Busbey Date: Thu, 24 May 2018 23:29:10 -0500 Subject: [PATCH] HBASE-20597 ADDENDUM fix inconsistent locking pointed out by findbugs. --- .../replication/HBaseReplicationEndpoint.java | 23 +++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.java index 8286f7db74..2d332fb409 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; import org.apache.hadoop.hbase.zookeeper.ZKListener; import org.apache.yetus.audience.InterfaceAudience; @@ -51,8 +52,17 @@ public abstract class HBaseReplicationEndpoint extends BaseReplicationEndpoint private Object zkwLock = new Object(); private ZKWatcher zkw = null; - private List regionServers = new ArrayList<>(0); - private long lastRegionServerUpdate; + private static class StampedServerNameList { + public final List servers; + public final long lastRegionServerUpdate; + private StampedServerNameList(List servers, long timestamp) { + this.servers = Collections.unmodifiableList(servers); + this.lastRegionServerUpdate = timestamp; + } + } + + private AtomicReference regionServers = + new AtomicReference<>(new StampedServerNameList(new ArrayList<>(0), 0L)); protected void disconnect() { synchronized (zkwLock) { @@ -197,16 +207,15 @@ public abstract class HBaseReplicationEndpoint extends BaseReplicationEndpoint } reconnect(ke); } - return regionServers; + return regionServers.get().servers; } /** * Set the list of region servers for that peer * @param regionServers list of addresses for the region servers */ - public synchronized void setRegionServers(List regionServers) { - this.regionServers = regionServers; - lastRegionServerUpdate = System.currentTimeMillis(); + public void setRegionServers(List regionServers) { + this.regionServers.set(new StampedServerNameList(regionServers, System.currentTimeMillis())); } /** @@ -215,7 +224,7 @@ public abstract class HBaseReplicationEndpoint extends BaseReplicationEndpoint * @return The System.currentTimeMillis at the last time the list of peer region servers changed. */ public long getLastRegionServerUpdate() { - return lastRegionServerUpdate; + return regionServers.get().lastRegionServerUpdate; } /** -- 2.16.1