From 34fc435ce5c5aae4c77eb5903c35b9d47e9a89b0 Mon Sep 17 00:00:00 2001 From: cj Date: Mon, 14 Sep 2020 23:23:00 +0800 Subject: [PATCH] Make NettyTransportClient.getCurrentId() thread safe (#1707) Fix issue #1705. - Use CAS to make it thread safe and limited in the declared range. Signed-off-by: cj --- .../sentinel/cluster/client/NettyTransportClient.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/sentinel-cluster/sentinel-cluster-client-default/src/main/java/com/alibaba/csp/sentinel/cluster/client/NettyTransportClient.java b/sentinel-cluster/sentinel-cluster-client-default/src/main/java/com/alibaba/csp/sentinel/cluster/client/NettyTransportClient.java index e2038b500a..23c9f2f453 100644 --- a/sentinel-cluster/sentinel-cluster-client-default/src/main/java/com/alibaba/csp/sentinel/cluster/client/NettyTransportClient.java +++ b/sentinel-cluster/sentinel-cluster-client-default/src/main/java/com/alibaba/csp/sentinel/cluster/client/NettyTransportClient.java @@ -238,10 +238,12 @@ public ClusterResponse sendRequest(ClusterRequest request) throws Exception { } private int getCurrentId() { - if (idGenerator.get() > MAX_ID) { - idGenerator.set(0); - } - return idGenerator.incrementAndGet(); + int pre, next; + do { + pre = idGenerator.get(); + next = pre >= MAX_ID ? MIN_ID : pre + 1; + } while (!idGenerator.compareAndSet(pre, next)); + return next; } /*public CompletableFuture sendRequestAsync(ClusterRequest request) { @@ -266,5 +268,6 @@ private int getCurrentId() { return future; }*/ + private static final int MIN_ID = 1; private static final int MAX_ID = 999_999_999; }